From 9fc128334778ad9e5a754f5bd066f3a8a609f57c Mon Sep 17 00:00:00 2001 From: fschuett Date: Mon, 21 Apr 2014 20:43:33 +0200 Subject: [PATCH 01/20] added video type ffmpeg --- .../cabrillo/tracker/ExportVideoDialog.java | 15 +- .../cabrillo/tracker/FileDropHandler.java | 3 +- .../cabrillo/tracker/PrefsDialog.java | 145 ++++++++++++------ .../cabrillo/tracker/PropertiesDialog.java | 7 +- .../cabrillo/tracker/TFrame.java | 10 +- .../cabrillo/tracker/TMenuBar.java | 91 +++++++---- .../cabrillo/tracker/Tracker.java | 65 +++++--- .../cabrillo/tracker/TrackerIO.java | 99 ++++++++++-- .../cabrillo/tracker/TrackerPanel.java | 32 ++-- .../cabrillo/tracker/WorldGrid.java | 1 - .../tracker/resources/tracker.properties | 58 ++++--- .../tracker/resources/tracker_de.properties | 38 +++-- 12 files changed, 395 insertions(+), 169 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java index 9098af91..b728e5e3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java @@ -110,15 +110,22 @@ public static ExportVideoDialog getDialog(TrackerPanel panel) { public static void refreshFormats() { formats.clear(); formatDescriptions.clear(); - // unwanted types are quicktime, xuggle or both depending on VideoIO engine + // unwanted types are quicktime, xuggle, ffmpeg or all depending on VideoIO engine ArrayList unwanted = new ArrayList(); - boolean skipQT = VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) + boolean skipQT = VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) + || VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) + || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); + boolean skipFFMPeg = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) + || VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); boolean skipXuggle = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) + || VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); for (String ext: VideoIO.VIDEO_EXTENSIONS) { if (skipQT) unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_QUICKTIME, ext)); + if (skipFFMPeg) + unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_FFMPEG, ext)); if (skipXuggle) unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_XUGGLE, ext)); } @@ -550,7 +557,7 @@ public void setFontLevel(int level) { /** * Gets the smallest acceptable dimension >= a specified width and height. * This is a work-around to avoid image artifacts introduced by the converter - * in xuggle. + * in ffmpeg or xuggle. * * @param w the desired width * @param h the desired height @@ -566,7 +573,7 @@ private Dimension getAcceptedDimension(int w, int h) { } /** - * Determines if a width and height are acceptable (for xuggle). + * Determines if a width and height are acceptable (for ffmpeg or xuggle). * * @param w the width * @param h the height diff --git a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java index f55c25e4..428c03d8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java +++ b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java @@ -258,8 +258,7 @@ public void dragExit(DropTargetEvent dte) { dropList = null; } - @Override - public void drop(DropTargetDropEvent e) { + public void drop(DropTargetDropEvent e) { dropList = null; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index e225a98d..aa7b346e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -80,22 +80,22 @@ public class PrefsDialog extends JDialog { displayPanel; protected TitledBorder checkPanelBorder, lfSubPanelBorder, langSubPanelBorder, hintsSubPanelBorder, unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, - videoTypeSubPanelBorder, xuggleSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, + videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder; protected IntegerField memoryField; protected JLabel memoryLabel, recentSizeLabel, lookFeelLabel, cacheLabel, versionLabel, runLabel; protected JCheckBox defaultMemoryCheckbox, hintsCheckbox, vidWarningCheckbox, - xuggleErrorCheckbox, xuggleVersionCheckbox, variableDurationCheckBox, copyFailedCheckbox; + ffmpegErrorCheckbox, xuggleErrorCheckbox, xuggleVersionCheckbox, variableDurationCheckBox, copyFailedCheckbox; protected int memorySize = Tracker.requestedMemorySize; protected JSpinner recentSizeSpinner, runSpinner; protected JComboBox lookFeelDropdown, languageDropdown, jreDropdown, checkForUpgradeDropdown, versionDropdown, logLevelDropdown, fontSizeDropdown; protected JRadioButton vm32Button, vm64Button; - protected JRadioButton xuggleButton, qtButton, noEngineButton; + protected JRadioButton ffmpegButton, xuggleButton, qtButton, noEngineButton; protected JRadioButton radiansButton, degreesButton; - protected JRadioButton xuggleFastButton, xuggleSlowButton; + protected JRadioButton videoFastButton, videoSlowButton; protected String[] trackerVersions; protected String recent32bitVM, recent64bitVM; private boolean refreshing = false; @@ -104,8 +104,8 @@ public class PrefsDialog extends JDialog { protected Set prevEnabled = new TreeSet(); protected int prevMemory, prevRecentCount, prevUpgradeInterval, prevFontLevel; protected String prevLookFeel, prevLocaleName, prevJRE, prevTrackerJar, prevEngine; - protected boolean prevHints, prevRadians, prevFastXuggle, - prevWarnNoVideoEngine, prevWarnXuggleError, prevWarnXuggleVersion, + protected boolean prevHints, prevRadians, prevFastVideo, + prevWarnNoVideoEngine, prevWarnFFMPegError, prevWarnXuggleError, prevWarnXuggleVersion, prevClearCacheOnExit, prevUse32BitVM, prevWarnCopyFailed; protected File prevCache; protected String[] prevExecutables; @@ -154,7 +154,7 @@ public void setFontLevel(int level) { Object[] borders = new Object[] { checkPanelBorder, lfSubPanelBorder, langSubPanelBorder, hintsSubPanelBorder, unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, - videoTypeSubPanelBorder, xuggleSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, + videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder}; FontSizer.setFonts(borders, level); JComboBox[] dropdowns = new JComboBox[] {lookFeelDropdown, languageDropdown, @@ -573,7 +573,7 @@ public void itemStateChanged(ItemEvent e) { } return; } - // set engine to Xuggle and inform user + // set engine to FFMPeg and inform user xuggleButton.setSelected(true); JOptionPane.showMessageDialog(trackerPanel.getTFrame(), TrackerRes.getString("PrefsDialog.Dialog.SwitchTo64.Message"), //$NON-NLS-1$ @@ -877,15 +877,30 @@ public void actionPerformed(ActionEvent e) { videoTypeSubPanelBorder = BorderFactory.createTitledBorder( TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ videoTypeSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoTypeSubPanelBorder)); + boolean ffmpegInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_FFMPEG); boolean xuggleInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_XUGGLE); + ffmpegButton = new JRadioButton(); + ffmpegButton.setOpaque(false); + ffmpegButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); + ffmpegButton.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + videoFastButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); + videoSlowButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); + ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); + if (!ffmpegButton.isSelected()) return; + Tracker.engineKnown = true; + } + }); + ffmpegButton.setEnabled(ffmpegInstalled); + xuggleButton = new JRadioButton(); xuggleButton.setOpaque(false); xuggleButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); xuggleButton.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { - xuggleFastButton.setEnabled(xuggleButton.isSelected()); - xuggleSlowButton.setEnabled(xuggleButton.isSelected()); + videoFastButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); + videoSlowButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); xuggleErrorCheckbox.setEnabled(xuggleButton.isSelected()); xuggleVersionCheckbox.setEnabled(xuggleButton.isSelected()); if (!xuggleButton.isSelected()) return; @@ -973,32 +988,33 @@ public void itemStateChanged(ItemEvent e) { } }); + videoTypeSubPanel.add(ffmpegButton); videoTypeSubPanel.add(xuggleButton); videoTypeSubPanel.add(qtButton); videoTypeSubPanel.add(noEngineButton); - // xuggle speed subpanel - JPanel xuggleSpeedSubPanel = new JPanel(); - box.add(xuggleSpeedSubPanel); - xuggleSpeedSubPanel.setBackground(color); - xuggleSpeedSubPanelBorder = BorderFactory.createTitledBorder( - TrackerRes.getString("PrefsDialog.Xuggle.Speed.BorderTitle")); //$NON-NLS-1$ - if (!xuggleInstalled) - xuggleSpeedSubPanelBorder.setTitleColor(new Color(153, 153, 153)); - xuggleSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, xuggleSpeedSubPanelBorder)); + // video speed subpanel + JPanel videoSpeedSubPanel = new JPanel(); + box.add(videoSpeedSubPanel); + videoSpeedSubPanel.setBackground(color); + videoSpeedSubPanelBorder = BorderFactory.createTitledBorder( + TrackerRes.getString("PrefsDialog.Video.Speed.BorderTitle")); //$NON-NLS-1$ + if (!ffmpegInstalled && !xuggleInstalled) + videoSpeedSubPanelBorder.setTitleColor(new Color(153, 153, 153)); + videoSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoSpeedSubPanelBorder)); buttonGroup = new ButtonGroup(); - xuggleFastButton = new JRadioButton(); - xuggleFastButton.setOpaque(false); - xuggleFastButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); - xuggleFastButton.setSelected(xuggleInstalled && Tracker.isXuggleFast); - buttonGroup.add(xuggleFastButton); - xuggleSlowButton = new JRadioButton(); - xuggleSlowButton.setOpaque(false); - xuggleSlowButton.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); - xuggleSlowButton.setSelected(xuggleInstalled && !Tracker.isXuggleFast); - buttonGroup.add(xuggleSlowButton); - xuggleSpeedSubPanel.add(xuggleFastButton); - xuggleSpeedSubPanel.add(xuggleSlowButton); + videoFastButton = new JRadioButton(); + videoFastButton.setOpaque(false); + videoFastButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); + videoFastButton.setSelected((ffmpegInstalled || xuggleInstalled) && Tracker.isVideoFast); + buttonGroup.add(videoFastButton); + videoSlowButton = new JRadioButton(); + videoSlowButton.setOpaque(false); + videoSlowButton.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); + videoSlowButton.setSelected((ffmpegInstalled || xuggleInstalled) && !Tracker.isVideoFast); + buttonGroup.add(videoSlowButton); + videoSpeedSubPanel.add(videoFastButton); + videoSpeedSubPanel.add(videoSlowButton); // warnings subpanel vidWarningCheckbox = new JCheckBox(); @@ -1009,6 +1025,14 @@ public void actionPerformed(ActionEvent e) { Tracker.warnNoVideoEngine = vidWarningCheckbox.isSelected(); } }); + ffmpegErrorCheckbox = new JCheckBox(); + ffmpegErrorCheckbox.setOpaque(false); + ffmpegErrorCheckbox.setSelected(Tracker.warnFFMPegError); + ffmpegErrorCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Tracker.warnFFMPegError = ffmpegErrorCheckbox.isSelected(); + } + }); xuggleErrorCheckbox = new JCheckBox(); xuggleErrorCheckbox.setOpaque(false); xuggleErrorCheckbox.setSelected(Tracker.warnXuggleError); @@ -1051,25 +1075,31 @@ public void actionPerformed(ActionEvent e) { warningsNorthPanel.setBackground(color); warningsSubPanel.add(warningsNorthPanel, BorderLayout.NORTH); JPanel warningsCenterPanel = new JPanel(); + warningsCenterPanel.setLayout(new BoxLayout(warningsCenterPanel, BoxLayout.PAGE_AXIS)); warningsCenterPanel.setBackground(color); - JPanel warningsSouthPanel = new JPanel(); - warningsSouthPanel.setBackground(color); - JPanel centerSouthPanel = new JPanel(new BorderLayout()); - centerSouthPanel.add(warningsCenterPanel, BorderLayout.NORTH); - centerSouthPanel.add(warningsSouthPanel, BorderLayout.CENTER); - warningsSubPanel.add(centerSouthPanel, BorderLayout.CENTER); - + warningsSubPanel.add(warningsCenterPanel, BorderLayout.CENTER); + JPanel warningsXugglePanel = new JPanel(); + warningsXugglePanel.setLayout(new BoxLayout(warningsXugglePanel, BoxLayout.LINE_AXIS)); + warningsXugglePanel.setBackground(color); + warningsNorthPanel.add(vidWarningCheckbox); - warningsNorthPanel.add(variableDurationCheckBox); - warningsCenterPanel.add(xuggleErrorCheckbox); - warningsCenterPanel.add(xuggleVersionCheckbox); - warningsSouthPanel.add(copyFailedCheckbox); + ffmpegErrorCheckbox.setAlignmentX(Component.CENTER_ALIGNMENT); + warningsCenterPanel.add(ffmpegErrorCheckbox); + warningsXugglePanel.add(xuggleErrorCheckbox); + warningsXugglePanel.add(xuggleVersionCheckbox); + warningsCenterPanel.add(warningsXugglePanel); + variableDurationCheckBox.setAlignmentX(Component.CENTER_ALIGNMENT); + warningsCenterPanel.add(variableDurationCheckBox); - // set selected states of engine buttons AFTER creating the xugglefast, xuggleslow and warnxuggle buttons + // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg/-xuggle buttons if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) && VideoIO.getVideoType("QT", null)!=null) { //$NON-NLS-1$ qtButton.setSelected(true); } + else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) + && VideoIO.getVideoType("FFMPeg", null)!=null) { //$NON-NLS-1$ + ffmpegButton.setSelected(true); + } else if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) && VideoIO.getVideoType("Xuggle", null)!=null) { //$NON-NLS-1$ xuggleButton.setSelected(true); @@ -1350,13 +1380,15 @@ public void stateChanged(ChangeEvent e) { // add engine buttons to buttongroups buttonGroup = new ButtonGroup(); + buttonGroup.add(ffmpegButton); buttonGroup.add(xuggleButton); buttonGroup.add(qtButton); buttonGroup.add(noEngineButton); // enable/disable buttons - xuggleFastButton.setEnabled(xuggleButton.isSelected()); - xuggleSlowButton.setEnabled(xuggleButton.isSelected()); + videoFastButton.setEnabled(ffmpegButton.isSelected() || xuggleButton.isSelected()); + videoSlowButton.setEnabled(ffmpegButton.isSelected() || xuggleButton.isSelected()); + ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); xuggleErrorCheckbox.setEnabled(xuggleButton.isSelected()); xuggleVersionCheckbox.setEnabled(xuggleButton.isSelected()); if (OSPRuntime.isWindows()) { @@ -1381,11 +1413,12 @@ private void savePrevious() { prevFontLevel = Tracker.preferredFontLevel; prevHints = Tracker.showHintsByDefault; prevRadians = Tracker.isRadians; - prevFastXuggle = Tracker.isXuggleFast; + prevFastVideo = Tracker.isVideoFast; prevJRE = Tracker.preferredJRE; prevTrackerJar = Tracker.preferredTrackerJar; prevExecutables = Tracker.prelaunchExecutables; prevWarnNoVideoEngine = Tracker.warnNoVideoEngine; + prevWarnFFMPegError = Tracker.warnFFMPegError; prevWarnXuggleError = Tracker.warnXuggleError; prevWarnXuggleVersion = Tracker.warnXuggleVersion; prevWarnCopyFailed = Tracker.warnCopyFailed; @@ -1404,11 +1437,12 @@ private void revert() { Tracker.preferredFontLevel = prevFontLevel; Tracker.showHintsByDefault = prevHints; Tracker.isRadians = prevRadians; - Tracker.isXuggleFast = prevFastXuggle; + Tracker.isVideoFast = prevFastVideo; Tracker.preferredJRE = prevJRE; Tracker.preferredTrackerJar = prevTrackerJar; Tracker.prelaunchExecutables = prevExecutables; Tracker.warnNoVideoEngine = prevWarnNoVideoEngine; + Tracker.warnFFMPegError = prevWarnFFMPegError; Tracker.warnXuggleError = prevWarnXuggleError; Tracker.warnXuggleVersion = prevWarnXuggleVersion; Tracker.warnCopyFailed = prevWarnCopyFailed; @@ -1467,15 +1501,17 @@ protected void refreshGUI() { hintsCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.HintsOn")); //$NON-NLS-1$ vm32Button.setText(TrackerRes.getString("PrefsDialog.Checkbox.32BitVM")); //$NON-NLS-1$ vm64Button.setText(TrackerRes.getString("PrefsDialog.Checkbox.64BitVM")); //$NON-NLS-1$ + ffmpegButton.setText(TrackerRes.getString("PrefsDialog.Button.FFMPeg")); //$NON-NLS-1$ xuggleButton.setText(TrackerRes.getString("PrefsDialog.Button.Xuggle")); //$NON-NLS-1$ qtButton.setText(TrackerRes.getString("PrefsDialog.Button.QT")); //$NON-NLS-1$ noEngineButton.setText(TrackerRes.getString("PrefsDialog.Button.NoEngine")); //$NON-NLS-1$ radiansButton.setText(TrackerRes.getString("TMenuBar.MenuItem.Radians")); //$NON-NLS-1$ degreesButton.setText(TrackerRes.getString("TMenuBar.MenuItem.Degrees")); //$NON-NLS-1$ - xuggleFastButton.setText(TrackerRes.getString("PrefsDialog.Xuggle.Fast")); //$NON-NLS-1$ - xuggleSlowButton.setText(TrackerRes.getString("PrefsDialog.Xuggle.Slow")); //$NON-NLS-1$ + videoFastButton.setText(TrackerRes.getString("PrefsDialog.Video.Fast")); //$NON-NLS-1$ + videoSlowButton.setText(TrackerRes.getString("PrefsDialog.Video.Slow")); //$NON-NLS-1$ vidWarningCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfNoEngine")); //$NON-NLS-1$ variableDurationCheckBox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnVariableDuration")); //$NON-NLS-1$ + ffmpegErrorCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfFFMPegError")); //$NON-NLS-1$ xuggleErrorCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfXuggleError")); //$NON-NLS-1$ xuggleVersionCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnXuggleVersion")); //$NON-NLS-1$ copyFailedCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnCopyFailed")); //$NON-NLS-1$ @@ -1598,7 +1634,10 @@ private void applyPrefs() { else Tracker.preferredJRE64 = Tracker.preferredJRE; } // video engine - if (xuggleButton.isSelected() && xuggleButton.isEnabled()) { + if (ffmpegButton.isSelected() && ffmpegButton.isEnabled()) { + VideoIO.setEngine(VideoIO.ENGINE_FFMPEG); + } + else if (xuggleButton.isSelected() && xuggleButton.isEnabled()) { VideoIO.setEngine(VideoIO.ENGINE_XUGGLE); } else if (qtButton.isSelected() && qtButton.isEnabled()) { @@ -1607,7 +1646,7 @@ else if (qtButton.isSelected() && qtButton.isEnabled()) { else VideoIO.setEngine(VideoIO.ENGINE_NONE); Tracker.isRadians = radiansButton.isSelected(); - Tracker.isXuggleFast = xuggleFastButton.isSelected(); + Tracker.isVideoFast = videoFastButton.isSelected(); if (frame!=null) frame.setAnglesInRadians(Tracker.isRadians); // save the tracker and tracker_starter preferences String path = Tracker.savePreferences(); @@ -1661,6 +1700,7 @@ protected void updateDisplay() { // warnings vidWarningCheckbox.setSelected(Tracker.warnNoVideoEngine); variableDurationCheckBox.setSelected(Tracker.warnVariableDuration); + ffmpegErrorCheckbox.setSelected(Tracker.warnFFMPegError); xuggleErrorCheckbox.setSelected(Tracker.warnXuggleError); xuggleVersionCheckbox.setSelected(Tracker.warnXuggleVersion); copyFailedCheckbox.setSelected(Tracker.warnCopyFailed); @@ -1676,6 +1716,9 @@ protected void updateDisplay() { if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME)) { qtButton.setSelected(true); } + else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG)) { + ffmpegButton.setSelected(true); + } else if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE)) { xuggleButton.setSelected(true); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java index cf2c84cc..085875ae 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java @@ -178,11 +178,14 @@ public void actionPerformed(ActionEvent e) { type = videoType==null? video.getClass().getSimpleName(): videoType.getDescription(); - // eliminate extension list and replace with video engine if xuggle or QT + // eliminate extension list and replace with video engine if ffmpeg, xuggle or QT int n = type.lastIndexOf("("); //$NON-NLS-1$ if (n>-1) { type = type.substring(0, n); - if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { + if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + type += "(FFMPeg)"; //$NON-NLS-1$ + } + else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { type += "(Xuggle)"; //$NON-NLS-1$ } else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_QUICKTIME)) { diff --git a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java index dc7aa1e8..ab1c4974 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java @@ -83,7 +83,7 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { protected ArrayList loadedFiles = new ArrayList(); protected boolean anglesInRadians = Tracker.isRadians; protected File tabsetFile; // used when saving tabsets - protected int framesLoaded, prevFramesLoaded; // used when loading xuggle videos + protected int framesLoaded, prevFramesLoaded; // used when loading ffmpeg or xuggle videos // protected JProgressBar monitor; protected PrefsDialog prefsDialog; @@ -672,7 +672,7 @@ public MainTView getMainView(TrackerPanel trackerPanel) { */ public void propertyChange(PropertyChangeEvent e) { String name = e.getPropertyName(); - if (name.equals("progress")) { // from currently loading (xuggle) video //$NON-NLS-1$ + if (name.equals("progress")) { // from currently loading (ffmpeg or xuggle) video //$NON-NLS-1$ Object val = e.getNewValue(); String vidName = XML.forwardSlash((String)e.getOldValue()); try { @@ -691,7 +691,7 @@ public void propertyChange(PropertyChangeEvent e) { } } } - else if (name.equals("stalled")) { // from stalled xuggle video //$NON-NLS-1$ + else if (name.equals("stalled")) { // from stalled ffmpeg or xuggle video //$NON-NLS-1$ String fileName = XML.getName((String)e.getNewValue()); String s = TrackerRes.getString("TFrame.Dialog.StalledVideo.Message0") //$NON-NLS-1$ +"\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message1") //$NON-NLS-1$ //$NON-NLS-2$ @@ -1214,7 +1214,7 @@ public void setFontLevel(int level) { prefsDialog.refreshGUI(); } if (libraryBrowser!=null) { - libraryBrowser.setFontLevel(level); + //TODO libraryBrowser.setFontLevel(level); } if (helpLauncher!=null) { FontSizer.setFonts(helpLauncher, level); @@ -1317,7 +1317,7 @@ public void propertyChange(PropertyChangeEvent e) { showHelp("library", 0); //$NON-NLS-1$ } }); - libraryBrowser.setFontLevel(FontSizer.getLevel()); + //TODO libraryBrowser.setFontLevel(FontSizer.getLevel()); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int x = (dim.width - dialog.getBounds().width) / 2; int y = (dim.height - dialog.getBounds().height) / 2; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java index a16ed465..5ec5c9d6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java @@ -122,7 +122,7 @@ public class TMenuBar extends JMenuBar implements PropertyChangeListener { protected JMenuItem removeImageItem; protected JMenuItem editVideoItem; protected JMenuItem playAllStepsItem; - protected JMenuItem playXuggleSmoothlyItem; + protected JMenuItem playVideoSmoothlyItem; protected JMenuItem aboutVideoItem; protected JMenuItem checkDurationsItem; protected JMenuItem emptyVideoItem; @@ -858,22 +858,34 @@ public void itemStateChanged(ItemEvent e) { } } }); - // play xuggle smoothly item - playXuggleSmoothlyItem = new JCheckBoxMenuItem(TrackerRes.getString("XuggleVideo.MenuItem.SmoothPlay")); //$NON-NLS-1$ - playXuggleSmoothlyItem.addItemListener(new ItemListener() { + // play ffmpeg smoothly item + playVideoSmoothlyItem = new JCheckBoxMenuItem(TrackerRes.getString("Video.MenuItem.SmoothPlay")); //$NON-NLS-1$ + playVideoSmoothlyItem.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { Video video = trackerPanel.getVideo(); - String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ - if (video==null || !(video.getClass().getName().equals(xuggleName))) return; + if (video==null) return; + boolean xuggleVideo = video.getClass().getName().equals("org.opensourcephysics.media.xuggle.XuggleVideo"); + boolean ffmpegVideo = video.getClass().getName().equals("org.opensourcephysics.media.ffmpeg.FFMPegVideo"); + if(!xuggleVideo && !ffmpegVideo) return; if (e.getStateChange() == ItemEvent.SELECTED || e.getStateChange() == ItemEvent.DESELECTED) { - boolean smooth = playXuggleSmoothlyItem.isSelected(); - try { - Class xuggleClass = Class.forName(xuggleName); - Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } + boolean smooth = playVideoSmoothlyItem.isSelected(); + if(ffmpegVideo) { + try { + Class ffmpegClass = Class.forName("org.opensourcephysics.media.ffmpeg.FFMPegVideo"); + Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } + } + else { + try { + Class xuggleClass = Class.forName("org.opensourcephysics.media.xuggle.XuggleVideo"); + Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } + } } } }); @@ -1277,15 +1289,17 @@ public void actionPerformed(ActionEvent e) { } }); diagMenu.add(logItem); - if (Tracker.startLogAction!=null) { - JMenuItem item = diagMenu.add(Tracker.startLogAction); - item.setToolTipText(System.getenv("START_LOG")); //$NON-NLS-1$ - } - diagMenu.addSeparator(); - if (Tracker.aboutJavaAction != null) diagMenu.add(Tracker.aboutJavaAction); - if (Tracker.aboutQTAction != null) diagMenu.add(Tracker.aboutQTAction); - if (Tracker.aboutXuggleAction != null) diagMenu.add(Tracker.aboutXuggleAction); - if (Tracker.aboutThreadsAction != null) diagMenu.add(Tracker.aboutThreadsAction); + diagMenu.addSeparator(); + if (Tracker.aboutJavaAction != null) + diagMenu.add(Tracker.aboutJavaAction); + if (Tracker.aboutQTAction != null) + diagMenu.add(Tracker.aboutQTAction); + if (Tracker.aboutFFMPegAction != null) + diagMenu.add(Tracker.aboutFFMPegAction); + if (Tracker.aboutXuggleAction != null) + diagMenu.add(Tracker.aboutXuggleAction); + if (Tracker.aboutThreadsAction != null) + diagMenu.add(Tracker.aboutThreadsAction); // end diagnostics menu helpMenu.addSeparator(); @@ -1395,18 +1409,31 @@ public synchronized void run() { VideoClip clip = trackerPanel.getPlayer().getVideoClip(); playAllStepsItem.setSelected(clip.isPlayAllSteps()); videoMenu.add(playAllStepsItem); - // smooth play item for xuggle videos + // smooth play item for ffmpeg/xuggle videos VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { + if (videoType!=null) { + if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + try { + Class ffmpegClass = Class.forName(ffmpegName); + Method method = ffmpegClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ + Boolean smooth = (Boolean)method.invoke(video, (Object[])null); + playVideoSmoothlyItem.setSelected(smooth); + videoMenu.add(playVideoSmoothlyItem); + } catch (Exception ex) { + } + } + else if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ - try { - Class xuggleClass = Class.forName(xuggleName); - Method method = xuggleClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ - Boolean smooth = (Boolean)method.invoke(video, (Object[])null); - playXuggleSmoothlyItem.setSelected(smooth); - videoMenu.add(playXuggleSmoothlyItem); - } catch (Exception ex) { - } + try { + Class xuggleClass = Class.forName(xuggleName); + Method method = xuggleClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ + Boolean smooth = (Boolean)method.invoke(video, (Object[])null); + playVideoSmoothlyItem.setSelected(smooth); + videoMenu.add(playVideoSmoothlyItem); + } catch (Exception ex) { + } + } } // video filters menu if (trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 2c571304..49efc56b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -69,7 +69,7 @@ public class Tracker { static final String THETA = TeXParser.parseTeX("$\\theta"); //$NON-NLS-1$ static final String OMEGA = TeXParser.parseTeX("$\\omega"); //$NON-NLS-1$ static final String ALPHA = TeXParser.parseTeX("$\\alpha"); //$NON-NLS-1$ - static final String DEGREES = "º"; //$NON-NLS-1$ + static final String DEGREES = "�"; //$NON-NLS-1$ static final String trackerHome; static final Level DEFAULT_LOG_LEVEL = ConsoleLevel.OUT_CONSOLE; @@ -107,6 +107,7 @@ public class Tracker { "button.xMass", "button.axes", "button.path", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "config.saveWithData", "data.builder", "data.tool"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ static Set defaultConfig; + static boolean ffmpegCopied; static boolean xuggleCopied; static String[] mainArgs; static JFrame splash; @@ -119,7 +120,7 @@ public class Tracker { static String trackerWebsite = "www.cabrillo.edu/~dbrown/tracker"; //$NON-NLS-1$ static String author = "Douglas Brown"; //$NON-NLS-1$ static String osp = "Open Source Physics"; //$NON-NLS-1$ - static AbstractAction aboutQTAction, aboutXuggleAction, aboutThreadsAction; + static AbstractAction aboutQTAction, aboutFFMPegAction, aboutXuggleAction, aboutThreadsAction; static Action aboutTrackerAction, readmeAction; static Action aboutJavaAction, startLogAction; private static Tracker tracker; @@ -155,8 +156,8 @@ public class Tracker { static String preferredTrackerJar; static int checkForUpgradeInterval = 0; static int preferredFontLevel = 0; - static boolean isRadians, isXuggleFast, engineKnown=true; - static boolean warnXuggleError=true, warnNoVideoEngine=true, use32BitMode=false; + static boolean isRadians, isVideoFast, engineKnown=true; + static boolean warnFFMPegError=true, warnXuggleError=true, warnNoVideoEngine=true, use32BitMode=false; static boolean warnXuggleVersion=true, warnVariableDuration=true, warnCopyFailed=true; static String[] prelaunchExecutables = new String[0]; static Collection dataFunctionControls = new HashSet(); @@ -314,14 +315,23 @@ public void mouseDragged(MouseEvent e) { splash.setLocation(x-size.width/2, y-size.height/2); // set up videos extensions to extract from jars - // this list should agree with xuggle video types below + // this list should agree with ffmpeg video types below for (String ext: VideoIO.VIDEO_EXTENSIONS) { // {"mov", "avi", "mp4"} ResourceLoader.addExtractExtension(ext); } is64BitVM = OSPRuntime.getVMBitness()==64; - // add Xuggle video types, if available, using reflection + // add FFMPeg video types, if available using reflection + try { + String ffmpegIOName = "org.opensourcephysics.media.ffmpeg.FFMPegIO"; //$NON-NLS-1$ + Class ffmpegIOClass = Class.forName(ffmpegIOName); + Method method = ffmpegIOClass.getMethod("registerWithVideoIO", (Class[]) null); //$NON-NLS-1$ + method.invoke(null, (Object[]) null); + } catch (Exception ex) { + } + + // add Xuggle video types, if available using reflection try { String xuggleIOName = "org.opensourcephysics.media.xuggle.XuggleIO"; //$NON-NLS-1$ Class xuggleIOClass = Class.forName(xuggleIOName); @@ -383,7 +393,7 @@ else if (argTypes.length==1 && argTypes[0].equals(VideoFileFilter.class)) { opener.setDaemon(true); opener.start(); } - + VideoIO.setDefaultXMLExtension("trk"); //$NON-NLS-1$ // create pdf help button @@ -694,11 +704,16 @@ public void actionPerformed(ActionEvent e) { Diagnostics.aboutQTJava("Tracker"); //$NON-NLS-1$ } }; - aboutXuggleAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutXuggle"), null) { //$NON-NLS-1$ + aboutFFMPegAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutFFMPeg"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { - DiagnosticsForXuggle.aboutXuggle("Tracker"); //$NON-NLS-1$ + DiagnosticsForFFMPeg.aboutFFMPeg("Tracker"); //$NON-NLS-1$ } }; + aboutXuggleAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutXuggle"), null) { //$NON-NLS-1$ + public void actionPerformed(ActionEvent e) { + DiagnosticsForXuggle.aboutXuggle("Tracker"); //$NON-NLS-1$ + } + }; aboutThreadsAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutThreads"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { DiagnosticsForThreads.aboutThreads(); @@ -901,12 +916,14 @@ protected static void setCache(String cachePath) { * @return true if any resources were updated */ protected static boolean updateResources() { - boolean updated = VideoIO.updateEngine("XuggleVideoType"); //$NON-NLS-1$ - if (updated && trackerHome!=null && OSPRuntime.isWindows()) { // xuggle files changed, so copy into Tracker home also - ExtensionsManager.getManager().copyXuggleJarsTo(new File(trackerHome)); + boolean ffmpegUpdated = VideoIO.updateEngine("FFMPegVideoType"); //$NON-NLS-1$ + boolean xuggleUpdated = VideoIO.updateEngine("XuggleVideoType"); //$NON-NLS-1$ + if (trackerHome!=null && OSPRuntime.isWindows()) { // ffmpeg/xuggle files changed, so copy into Tracker home also + if(ffmpegUpdated) ExtensionsManager.getManager().copyFFMPegJarsTo(new File(trackerHome)); + if(xuggleUpdated) ExtensionsManager.getManager().copyXuggleJarsTo(new File(trackerHome)); } - updated = VideoIO.updateEngine("QTVideoType") || updated; //$NON-NLS-1$ - return updated; + boolean qtUpdated = VideoIO.updateEngine("QTVideoType"); //$NON-NLS-1$ + return qtUpdated || xuggleUpdated || ffmpegUpdated; } /** @@ -1116,7 +1133,7 @@ public static void main(String[] args) { else javaPath = null; } boolean needsJavaVM = javaPath!=null && !javaCommand.equals(javaPath); - // update resources like QuickTime and Xuggle + // update resources like QuickTime, Xuggle and FFMPeg boolean updated = updateResources(); // compare memory with requested size(s) @@ -1271,7 +1288,7 @@ public void actionPerformed(ActionEvent e) { // warnNoVideoEngine = false; // for PLATO if (warnNoVideoEngine && VideoIO.getDefaultEngine().equals(VideoIO.ENGINE_NONE)) { - // warn user that there is no working video engine + boolean ffmpegInstalled = ExtensionsManager.getManager().getFFMPegJar()!=null; boolean xuggleInstalled = VideoIO.guessXuggleVersion()!=0; boolean qtInstalled = ExtensionsManager.getManager().getQTJavaZip()!=null; @@ -1580,12 +1597,14 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("show_hints", Tracker.showHintsByDefault); //$NON-NLS-1$ if (Tracker.isRadians) // false by default control.setValue("radians", Tracker.isRadians); //$NON-NLS-1$ - if (Tracker.isXuggleFast) // false by default - control.setValue("xuggle_fast", Tracker.isXuggleFast); //$NON-NLS-1$ + if (Tracker.isVideoFast) // false by default + control.setValue("video_fast", Tracker.isVideoFast); //$NON-NLS-1$ if (!Tracker.warnNoVideoEngine) // true by default control.setValue("warn_no_engine", Tracker.warnNoVideoEngine); //$NON-NLS-1$ if (!Tracker.warnVariableDuration) // true by default control.setValue("warn_variable_frame_duration", Tracker.warnVariableDuration); //$NON-NLS-1$ + if (!Tracker.warnFFMPegError) // true by default + control.setValue("warn_ffmpeg_error", Tracker.warnFFMPegError); //$NON-NLS-1$ if (!Tracker.warnXuggleVersion) // true by default control.setValue("warn_xuggle_version", Tracker.warnXuggleVersion); //$NON-NLS-1$ if (!Tracker.warnXuggleError) // true by default @@ -1679,15 +1698,15 @@ public Object loadObject(XMLControl control, Object obj) { OSPLog.setLevel(logLevel); } Tracker.isRadians = control.getBoolean("radians"); //$NON-NLS-1$ - Tracker.isXuggleFast = control.getBoolean("xuggle_fast"); //$NON-NLS-1$ + Tracker.isVideoFast = control.getBoolean("video_fast"); //$NON-NLS-1$ if (control.getPropertyNames().contains("warn_no_engine")) //$NON-NLS-1$ Tracker.warnNoVideoEngine = control.getBoolean("warn_no_engine"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_xuggle_error")) //$NON-NLS-1$ - Tracker.warnXuggleError = control.getBoolean("warn_xuggle_error"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("warn_ffmpeg_error")) //$NON-NLS-1$ + Tracker.warnFFMPegError = control.getBoolean("warn_ffmpeg_error"); //$NON-NLS-1$ if (control.getPropertyNames().contains("warn_xuggle_version")) //$NON-NLS-1$ Tracker.warnXuggleVersion = control.getBoolean("warn_xuggle_version"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_copy_failed")) //$NON-NLS-1$ - Tracker.warnCopyFailed = control.getBoolean("warn_copy_failed"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("warn_xuggle_error")) //$NON-NLS-1$ + Tracker.warnXuggleError = control.getBoolean("warn_xuggle_error"); //$NON-NLS-1$ if (control.getPropertyNames().contains("warn_variable_frame_duration")) //$NON-NLS-1$ Tracker.warnVariableDuration = control.getBoolean("warn_variable_frame_duration"); //$NON-NLS-1$ if (control.getPropertyNames().contains("show_hints")) { //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java index ba6573d2..c639841d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java @@ -66,8 +66,10 @@ public class TrackerIO extends VideoIO { protected static Map delimiters = new TreeMap(); protected static Map customDelimiters = new TreeMap(); protected static boolean isffmpegError = false; + protected static boolean isXuggleError = false; protected static TFrame theFrame; protected static PropertyChangeListener ffmpegListener; + protected static PropertyChangeListener xuggleListener; protected static boolean loadInSeparateThread = true; protected static Set monitors = new HashSet(); protected static double defaultBadFrameTolerance = 0.2; @@ -78,7 +80,7 @@ public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName().equals("ffmpeg_error")) { //$NON-NLS-1$ if (!isffmpegError) { // first error thrown isffmpegError = true; - if (!Tracker.warnXuggleError) { + if (!Tracker.warnFFMPegError) { if (e.getNewValue()!=null) { String s = e.getNewValue().toString(); int n = s.indexOf("]"); //$NON-NLS-1$ @@ -88,7 +90,7 @@ public void propertyChange(PropertyChangeEvent e) { } return; } - // warn user that a Xuggle error has occurred + // warn user that a FFMPeg error has occurred Box box = Box.createVerticalBox(); box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorFFMPEG.Message1"))); //$NON-NLS-1$ String error = e.getNewValue().toString(); @@ -121,7 +123,7 @@ public void actionPerformed(ActionEvent e) { dontShowAgainButton.setForeground(new Color(0, 0, 102)); dontShowAgainButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Tracker.warnXuggleError = false; + Tracker.warnFFMPegError = false; dialog.setVisible(false); } }); @@ -144,6 +146,76 @@ public void actionPerformed(ActionEvent e) { } }; OSPLog.getOSPLog().addPropertyChangeListener(ffmpegListener); + xuggleListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("xuggle_error")) { //$NON-NLS-1$ + if (!isXuggleError) { // first error thrown + isXuggleError = true; + if (!Tracker.warnXuggleError) { + if (e.getNewValue()!=null) { + String s = e.getNewValue().toString(); + int n = s.indexOf("]"); //$NON-NLS-1$ + if (n>-1) s = s.substring(n+1); + s += TrackerRes.getString("TrackerIO.ErrorXuggle.LogMessage"); //$NON-NLS-1$ + OSPLog.warning(s); + } + return; + } + // warn user that a Xuggle error has occurred + Box box = Box.createVerticalBox(); + box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Message1"))); //$NON-NLS-1$ + String error = e.getNewValue().toString(); + int n = error.lastIndexOf("]"); //$NON-NLS-1$ + if (n>-1) { + error = error.substring(n+1).trim(); + } + box.add(new JLabel(" ")); //$NON-NLS-1$ + JLabel erLabel = new JLabel("\""+error+"\""); //$NON-NLS-1$ //$NON-NLS-2$ + erLabel.setBorder(BorderFactory.createEmptyBorder(0, 60, 0, 0)); + box.add(erLabel); + box.add(new JLabel(" ")); //$NON-NLS-1$ + box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Message2"))); //$NON-NLS-1$ + + box.add(new JLabel(" ")); //$NON-NLS-1$ + box.setBorder(BorderFactory.createEmptyBorder(20, 15, 0, 15)); + + final JDialog dialog = new JDialog(theFrame, false); + JPanel contentPane = new JPanel(new BorderLayout()); + dialog.setContentPane(contentPane); + contentPane.add(box, BorderLayout.CENTER); + JButton closeButton = new JButton(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + closeButton.setForeground(new Color(0, 0, 102)); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + dialog.setVisible(false); + } + }); + JButton dontShowAgainButton = new JButton(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Checkbox")); //$NON-NLS-1$ + dontShowAgainButton.setForeground(new Color(0, 0, 102)); + dontShowAgainButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Tracker.warnXuggleError = false; + dialog.setVisible(false); + } + }); + JPanel buttonbar = new JPanel(); + buttonbar.add(dontShowAgainButton); + buttonbar.add(closeButton); + buttonbar.setBorder(BorderFactory.createEtchedBorder()); + contentPane.add(buttonbar, BorderLayout.SOUTH); + dialog.pack(); + dialog.setTitle(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Title")); //$NON-NLS-1$ + // center dialog on the screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - dialog.getBounds().width) / 2; + int y = (dim.height - dialog.getBounds().height) / 2; + dialog.setLocation(x, y); + dialog.setVisible(true); + } + } + } + }; + OSPLog.getOSPLog().addPropertyChangeListener(xuggleListener); zipFileFilter = new FileFilter() { public boolean accept(File f) { if (f == null) return false; @@ -451,7 +523,7 @@ public static boolean canWrite(File file) { */ public static Video getVideo(String path, VideoType vidType) { boolean logConsole = OSPLog.isConsoleMessagesLogged(); - if (!Tracker.warnXuggleError) + if (!Tracker.warnFFMPegError) OSPLog.setConsoleMessagesLogged(false); if (path.startsWith("file:")) //$NON-NLS-1$ path = ResourceLoader.getNonURIPath(path); @@ -523,6 +595,10 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, String engine = VideoIO.getEngine(); if (requestedType==null) { String ext = XML.getExtension(path); + if (!engine.equals(VideoIO.ENGINE_FFMPEG)) { + VideoType ffmpegType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ + if (ffmpegType!=null) otherEngines.add(ffmpegType); + } if (!engine.equals(VideoIO.ENGINE_XUGGLE)) { VideoType xuggleType = VideoIO.getVideoType("Xuggle", ext); //$NON-NLS-1$ if (xuggleType!=null) otherEngines.add(xuggleType); @@ -542,19 +618,20 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, else { // provide immediate way to open with other engines engine = VideoIO.ENGINE_NONE.equals(engine)? MediaRes.getString("VideoIO.Engine.None"): //$NON-NLS-1$ - VideoIO.ENGINE_XUGGLE.equals(engine)? MediaRes.getString("XuggleVideoType.Description"): //$NON-NLS-1$ + VideoIO.ENGINE_FFMPEG.equals(engine)? MediaRes.getString("FFMPegVideoType.Description"): //$NON-NLS-1$ + VideoIO.ENGINE_XUGGLE.equals(engine)? MediaRes.getString("XuggleVideoType.Description"): //$NON-NLS-1$ MediaRes.getString("QTVideoType.Description"); //$NON-NLS-1$ String message = MediaRes.getString("VideoIO.Dialog.TryDifferentEngine.Message1")+" ("+engine+")."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ message += "\n"+MediaRes.getString("VideoIO.Dialog.TryDifferentEngine.Message2"); //$NON-NLS-1$ //$NON-NLS-2$ message += "\n"+MediaRes.getString("VideoIO.Dialog.Label.Path")+": "+path; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ArrayList optionList = new ArrayList(); for (VideoType next: otherEngines) { - if (next.getClass().getSimpleName().equals("XuggleVideoType")) { //$NON-NLS-1$ - optionList.add(MediaRes.getString("XuggleVideoType.Description")); //$NON-NLS-1$ - } - else if (next.getClass().getSimpleName().equals("QTVideoType")) { //$NON-NLS-1$ - optionList.add(MediaRes.getString("QTVideoType.Description")); //$NON-NLS-1$ - } + if (next.getClass().getSimpleName().equals("FFMPegVideoType")) + optionList.add(MediaRes.getString("FFMPegVideoType.Description")); //$NON-NLS-1$ + else if(next.getClass().getSimpleName().equals("XuggleVideoType")) + optionList.add(MediaRes.getString("XuggleVideoType.Description")); //$NON-NLS-1$ + else if(next.getClass().getSimpleName().equals("QTVideoType")) + optionList.add(MediaRes.getString("QTVideoType.Description")); //$NON-NLS-1$ } optionList.add(MediaRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ Object[] options = optionList.toArray(new String[optionList.size()]); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java index 30f78c66..cc6be7d7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java @@ -1925,17 +1925,29 @@ else if (name.equals("videoclip")) { // from videoPlayer //$NON-NL } if (getVideo() != null) { getVideo().setProperty("measure", null); //$NON-NLS-1$ - // if xuggle video, set smooth play per preferences + // if ffmpeg or xuggle video, set smooth play per preferences VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { - boolean smooth = !Tracker.isXuggleFast; - try { - String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ - Class xuggleClass = Class.forName(xuggleName); - Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } + if (videoType!=null) { + if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + boolean smooth = !Tracker.isVideoFast; + try { + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + Class ffmpegClass = Class.forName(ffmpegName); + Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } + } + else if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { + boolean smooth = !Tracker.isVideoFast; + try { + String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ + Class xuggleClass = Class.forName(xuggleName); + Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } + } } } changed = true; diff --git a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java index 3faf3574..9ad67cf9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java +++ b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java @@ -73,7 +73,6 @@ public WorldGrid() { dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); } - @Override public void draw(DrawingPanel panel, Graphics g) { if (!visible || (!showMajorX && !showMajorY)) return; Graphics2D g2 = (Graphics2D)g; diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties index 7f9dce20..92ee9fb6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties @@ -719,6 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. @@ -734,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.Video.Speed.BorderTitle=Video Playback +PrefsDialog.Video.Slow=Smooth (may be slow) +PrefsDialog.Video.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -816,6 +817,17 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.FFMPeg.com/FFMPegr/downloads/. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's preferred video engine, is not yet installed. +Tracker.Dialog.NoFFMPeg.Message2=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=Missing FFMPeg Tracker.Dialog.NoXuggle.Title=Xuggle not found Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. @@ -823,16 +835,15 @@ Tracker.Action.AboutXuggle=About Xuggle... Tracker.Dialog.AboutXuggle.Title=About Xuggle Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: -Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you -Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. -Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can +Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. +Tracker.Dialog.NoVideoEngine.Message3=To install Xuggle, Tracker's preferred video engine on +Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from +Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine +Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's preferred video engine, is not yet installed. +Tracker.Dialog.NoXuggle.Message2=To install Xuggle, download the latest Tracker installer from +Tracker.Dialog.NoXuggle.Title=Missing Xuggle Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -878,7 +889,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +Video.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -907,12 +918,15 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle version PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.Xuggle=Xuggle loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video @@ -926,12 +940,18 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorXuggle.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorXuggle.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorXuggle.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorXuggle.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorXuggle.Title=Xuggle Error +TrackerIO.ErrorXuggle.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1213,7 +1233,7 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg, Xuggle or QuickTime. Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties index d65b44c4..77e4ff52 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties @@ -726,7 +726,8 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle (recommended) +PrefsDialog.Button.FFMPeg=FFMPeg (recommended) +PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -741,9 +742,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.Video.Speed.BorderTitle=Video Playback +PrefsDialog.Video.Slow=Smooth (may be slow) +PrefsDialog.Video.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -823,6 +824,17 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.FFMPeg.com/FFMPegr/downloads/. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's preferred video engine, is not yet installed. +Tracker.Dialog.NoFFMPeg.Message2=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=Missing FFMPeg Tracker.Dialog.NoXuggle.Title=Xuggle not found Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. @@ -884,7 +896,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +Video.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -913,12 +925,14 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.Xuggle=Xuggle loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video @@ -932,12 +946,18 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorXuggle.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorXuggle.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorXuggle.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorXuggle.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorXuggle.Title=Xuggle Error +TrackerIO.ErrorXuggle.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-04 From f4e2d1d4b948b5ca0fb54defc013355c2e46c2fc Mon Sep 17 00:00:00 2001 From: fschuett Date: Fri, 24 Oct 2014 18:15:18 +0200 Subject: [PATCH 02/20] Remove xuggler from source code. --- .../cabrillo/tracker/ExportVideoDialog.java | 13 +- .../cabrillo/tracker/PrefsDialog.java | 140 +++--------------- .../cabrillo/tracker/PropertiesDialog.java | 5 +- .../cabrillo/tracker/TFrame.java | 6 +- .../cabrillo/tracker/TMenuBar.java | 26 +--- .../cabrillo/tracker/Tracker.java | 77 ++-------- .../cabrillo/tracker/TrackerIO.java | 79 ---------- .../cabrillo/tracker/TrackerPanel.java | 12 +- .../tracker/deploy/TrackerStarter.java | 75 +++++----- .../tracker/resources/tracker.properties | 39 +---- 10 files changed, 87 insertions(+), 385 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java index b728e5e3..9ae9ccc8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java @@ -110,24 +110,17 @@ public static ExportVideoDialog getDialog(TrackerPanel panel) { public static void refreshFormats() { formats.clear(); formatDescriptions.clear(); - // unwanted types are quicktime, xuggle, ffmpeg or all depending on VideoIO engine + // unwanted types are quicktime, ffmpeg or all depending on VideoIO engine ArrayList unwanted = new ArrayList(); boolean skipQT = VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) - || VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); boolean skipFFMPeg = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) - || VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) - || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); - boolean skipXuggle = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) - || VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); for (String ext: VideoIO.VIDEO_EXTENSIONS) { if (skipQT) unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_QUICKTIME, ext)); if (skipFFMPeg) unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_FFMPEG, ext)); - if (skipXuggle) - unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_XUGGLE, ext)); } for (VideoType next: VideoIO.getVideoTypes()) { if (next.canRecord() && !unwanted.contains(next)) { @@ -557,7 +550,7 @@ public void setFontLevel(int level) { /** * Gets the smallest acceptable dimension >= a specified width and height. * This is a work-around to avoid image artifacts introduced by the converter - * in ffmpeg or xuggle. + * in ffmpeg. * * @param w the desired width * @param h the desired height @@ -573,7 +566,7 @@ private Dimension getAcceptedDimension(int w, int h) { } /** - * Determines if a width and height are acceptable (for ffmpeg or xuggle). + * Determines if a width and height are acceptable (for ffmpeg). * * @param w the width * @param h the height diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index aa7b346e..cab5e88e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -87,13 +87,13 @@ public class PrefsDialog extends JDialog { protected JLabel memoryLabel, recentSizeLabel, lookFeelLabel, cacheLabel, versionLabel, runLabel; protected JCheckBox defaultMemoryCheckbox, hintsCheckbox, vidWarningCheckbox, - ffmpegErrorCheckbox, xuggleErrorCheckbox, xuggleVersionCheckbox, variableDurationCheckBox, copyFailedCheckbox; + ffmpegErrorCheckbox, variableDurationCheckBox, copyFailedCheckbox; protected int memorySize = Tracker.requestedMemorySize; protected JSpinner recentSizeSpinner, runSpinner; protected JComboBox lookFeelDropdown, languageDropdown, jreDropdown, checkForUpgradeDropdown, versionDropdown, logLevelDropdown, fontSizeDropdown; protected JRadioButton vm32Button, vm64Button; - protected JRadioButton ffmpegButton, xuggleButton, qtButton, noEngineButton; + protected JRadioButton ffmpegButton, qtButton, noEngineButton; protected JRadioButton radiansButton, degreesButton; protected JRadioButton videoFastButton, videoSlowButton; protected String[] trackerVersions; @@ -105,8 +105,7 @@ public class PrefsDialog extends JDialog { protected int prevMemory, prevRecentCount, prevUpgradeInterval, prevFontLevel; protected String prevLookFeel, prevLocaleName, prevJRE, prevTrackerJar, prevEngine; protected boolean prevHints, prevRadians, prevFastVideo, - prevWarnNoVideoEngine, prevWarnFFMPegError, prevWarnXuggleError, prevWarnXuggleVersion, - prevClearCacheOnExit, prevUse32BitVM, prevWarnCopyFailed; + prevWarnNoVideoEngine, prevWarnFFMPegError, prevClearCacheOnExit, prevUse32BitVM, prevWarnCopyFailed; protected File prevCache; protected String[] prevExecutables; @@ -553,12 +552,11 @@ else if (OSPRuntime.isWindows()) { public void itemStateChanged(ItemEvent e) { if (!vm64Button.isSelected()) return; - double xuggleVersion = VideoIO.guessXuggleVersion(); if (OSPRuntime.isMac()) { Tracker.use32BitMode = false; - if (xuggleButton.isSelected() || noEngineButton.isSelected()) return; - // if no xuggle engine, show warning - if (xuggleVersion==0) { + if (ffmpegButton.isSelected() || noEngineButton.isSelected()) return; + // if no ffmpeg engine, show warning + if (!ffmpegButton.isSelected()) { int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message2")+"\n\n"+ //$NON-NLS-1$ //$NON-NLS-2$ @@ -574,7 +572,7 @@ public void itemStateChanged(ItemEvent e) { return; } // set engine to FFMPeg and inform user - xuggleButton.setSelected(true); + ffmpegButton.setSelected(true); JOptionPane.showMessageDialog(trackerPanel.getTFrame(), TrackerRes.getString("PrefsDialog.Dialog.SwitchTo64.Message"), //$NON-NLS-1$ TrackerRes.getString("PrefsDialog.Dialog.SwitchEngine.Title"), //$NON-NLS-1$ @@ -582,10 +580,10 @@ public void itemStateChanged(ItemEvent e) { } else if (OSPRuntime.isWindows()) { refreshJREDropdown(64); - if (xuggleButton.isSelected() && xuggleVersion==5.4) return; + if (ffmpegButton.isSelected()) return; if (noEngineButton.isSelected()) return; - // if no xuggle 5.4 engine, show warning - if (xuggleVersion==0 || xuggleVersion==3.4) { + // if no ffmpeg engine, show warning + if (!ffmpegButton.isSelected()) { // inform that no engine available in 64-bit VM int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ @@ -601,11 +599,11 @@ else if (OSPRuntime.isWindows()) { } return; } - // set engine to Xuggle and inform user - xuggleButton.setSelected(true); + // set engine to ffmpeg and inform user + ffmpegButton.setSelected(true); JOptionPane.showMessageDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchToXuggle.Message"), //$NON-NLS-1$ - TrackerRes.getString("PrefsDialog.Dialog.SwitchToXuggle.Title"), //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg.Message"), //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg.Title"), //$NON-NLS-1$ JOptionPane.INFORMATION_MESSAGE); } } @@ -878,15 +876,14 @@ public void actionPerformed(ActionEvent e) { TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ videoTypeSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoTypeSubPanelBorder)); boolean ffmpegInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_FFMPEG); - boolean xuggleInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_XUGGLE); ffmpegButton = new JRadioButton(); ffmpegButton.setOpaque(false); ffmpegButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); ffmpegButton.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { - videoFastButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); - videoSlowButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); + videoFastButton.setEnabled(ffmpegButton.isSelected()); + videoSlowButton.setEnabled(ffmpegButton.isSelected()); ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); if (!ffmpegButton.isSelected()) return; Tracker.engineKnown = true; @@ -894,54 +891,6 @@ public void itemStateChanged(ItemEvent e) { }); ffmpegButton.setEnabled(ffmpegInstalled); - xuggleButton = new JRadioButton(); - xuggleButton.setOpaque(false); - xuggleButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); - xuggleButton.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - videoFastButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); - videoSlowButton.setEnabled(xuggleButton.isSelected() || ffmpegButton.isSelected()); - xuggleErrorCheckbox.setEnabled(xuggleButton.isSelected()); - xuggleVersionCheckbox.setEnabled(xuggleButton.isSelected()); - if (!xuggleButton.isSelected()) return; - Tracker.engineKnown = true; - // OSX: if 32-bit, set preferred VM to 64-bit and inform user - if (OSPRuntime.isMac() && vm32Button.isSelected()) { - vm64Button.setSelected(true); - JOptionPane.showMessageDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchToXuggle64.Message"), //$NON-NLS-1$ - TrackerRes.getString("PrefsDialog.Dialog.SwitchVM.Title"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - // Windows: if xuggle 3.4 and 64-bit, set preferred VM to 32-bit and inform user - else if (OSPRuntime.isWindows() && VideoIO.guessXuggleVersion()==3.4 && vm64Button.isSelected()) { - boolean has32BitVM = ExtensionsManager.getManager().getDefaultJRE(32)!=null; - if (has32BitVM) { - vm32Button.setSelected(true); - JOptionPane.showMessageDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchToXuggle32.Message"), //$NON-NLS-1$ - TrackerRes.getString("PrefsDialog.Dialog.SwitchVM.Title"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - } - else { // help user download 32-bit VM - Object[] options = new Object[] { - TrackerRes.getString("PrefsDialog.Button.ShowHelpNow"), //$NON-NLS-1$ - TrackerRes.getString("Dialog.Button.OK")}; //$NON-NLS-1$ - int response = JOptionPane.showOptionDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.No32bitVMXuggle.Message")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("PrefsDialog.Dialog.No32bitVM.Message"), //$NON-NLS-1$ - TrackerRes.getString("PrefsDialog.Dialog.No32bitVM.Title"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); - noEngineButton.setSelected(true); - if (response==0) { - trackerPanel.getTFrame().showHelp("install", 0); //$NON-NLS-1$ - } - } - } - } - }); - xuggleButton.setEnabled(xuggleInstalled); - qtButton = new JRadioButton(); qtButton.setOpaque(false); qtButton.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); @@ -989,7 +938,6 @@ public void itemStateChanged(ItemEvent e) { }); videoTypeSubPanel.add(ffmpegButton); - videoTypeSubPanel.add(xuggleButton); videoTypeSubPanel.add(qtButton); videoTypeSubPanel.add(noEngineButton); @@ -999,19 +947,19 @@ public void itemStateChanged(ItemEvent e) { videoSpeedSubPanel.setBackground(color); videoSpeedSubPanelBorder = BorderFactory.createTitledBorder( TrackerRes.getString("PrefsDialog.Video.Speed.BorderTitle")); //$NON-NLS-1$ - if (!ffmpegInstalled && !xuggleInstalled) + if (!ffmpegInstalled) videoSpeedSubPanelBorder.setTitleColor(new Color(153, 153, 153)); videoSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoSpeedSubPanelBorder)); buttonGroup = new ButtonGroup(); videoFastButton = new JRadioButton(); videoFastButton.setOpaque(false); videoFastButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); - videoFastButton.setSelected((ffmpegInstalled || xuggleInstalled) && Tracker.isVideoFast); + videoFastButton.setSelected((ffmpegInstalled) && Tracker.isVideoFast); buttonGroup.add(videoFastButton); videoSlowButton = new JRadioButton(); videoSlowButton.setOpaque(false); videoSlowButton.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); - videoSlowButton.setSelected((ffmpegInstalled || xuggleInstalled) && !Tracker.isVideoFast); + videoSlowButton.setSelected((ffmpegInstalled) && !Tracker.isVideoFast); buttonGroup.add(videoSlowButton); videoSpeedSubPanel.add(videoFastButton); videoSpeedSubPanel.add(videoSlowButton); @@ -1033,22 +981,6 @@ public void actionPerformed(ActionEvent e) { Tracker.warnFFMPegError = ffmpegErrorCheckbox.isSelected(); } }); - xuggleErrorCheckbox = new JCheckBox(); - xuggleErrorCheckbox.setOpaque(false); - xuggleErrorCheckbox.setSelected(Tracker.warnXuggleError); - xuggleErrorCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Tracker.warnXuggleError = xuggleErrorCheckbox.isSelected(); - } - }); - xuggleVersionCheckbox = new JCheckBox(); - xuggleVersionCheckbox.setOpaque(false); - xuggleVersionCheckbox.setSelected(Tracker.warnXuggleVersion); - xuggleVersionCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Tracker.warnXuggleVersion = xuggleVersionCheckbox.isSelected(); - } - }); copyFailedCheckbox = new JCheckBox(); copyFailedCheckbox.setOpaque(false); copyFailedCheckbox.setSelected(Tracker.warnCopyFailed); @@ -1078,20 +1010,14 @@ public void actionPerformed(ActionEvent e) { warningsCenterPanel.setLayout(new BoxLayout(warningsCenterPanel, BoxLayout.PAGE_AXIS)); warningsCenterPanel.setBackground(color); warningsSubPanel.add(warningsCenterPanel, BorderLayout.CENTER); - JPanel warningsXugglePanel = new JPanel(); - warningsXugglePanel.setLayout(new BoxLayout(warningsXugglePanel, BoxLayout.LINE_AXIS)); - warningsXugglePanel.setBackground(color); warningsNorthPanel.add(vidWarningCheckbox); ffmpegErrorCheckbox.setAlignmentX(Component.CENTER_ALIGNMENT); warningsCenterPanel.add(ffmpegErrorCheckbox); - warningsXugglePanel.add(xuggleErrorCheckbox); - warningsXugglePanel.add(xuggleVersionCheckbox); - warningsCenterPanel.add(warningsXugglePanel); variableDurationCheckBox.setAlignmentX(Component.CENTER_ALIGNMENT); warningsCenterPanel.add(variableDurationCheckBox); - // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg/-xuggle buttons + // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg buttons if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) && VideoIO.getVideoType("QT", null)!=null) { //$NON-NLS-1$ qtButton.setSelected(true); @@ -1100,10 +1026,6 @@ else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) && VideoIO.getVideoType("FFMPeg", null)!=null) { //$NON-NLS-1$ ffmpegButton.setSelected(true); } - else if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) - && VideoIO.getVideoType("Xuggle", null)!=null) { //$NON-NLS-1$ - xuggleButton.setSelected(true); - } else noEngineButton.setSelected(true); @@ -1381,16 +1303,13 @@ public void stateChanged(ChangeEvent e) { // add engine buttons to buttongroups buttonGroup = new ButtonGroup(); buttonGroup.add(ffmpegButton); - buttonGroup.add(xuggleButton); buttonGroup.add(qtButton); buttonGroup.add(noEngineButton); // enable/disable buttons - videoFastButton.setEnabled(ffmpegButton.isSelected() || xuggleButton.isSelected()); - videoSlowButton.setEnabled(ffmpegButton.isSelected() || xuggleButton.isSelected()); + videoFastButton.setEnabled(ffmpegButton.isSelected()); + videoSlowButton.setEnabled(ffmpegButton.isSelected()); ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); - xuggleErrorCheckbox.setEnabled(xuggleButton.isSelected()); - xuggleVersionCheckbox.setEnabled(xuggleButton.isSelected()); if (OSPRuntime.isWindows()) { vm32Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(32).isEmpty()); vm64Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(64).isEmpty()); @@ -1419,8 +1338,6 @@ private void savePrevious() { prevExecutables = Tracker.prelaunchExecutables; prevWarnNoVideoEngine = Tracker.warnNoVideoEngine; prevWarnFFMPegError = Tracker.warnFFMPegError; - prevWarnXuggleError = Tracker.warnXuggleError; - prevWarnXuggleVersion = Tracker.warnXuggleVersion; prevWarnCopyFailed = Tracker.warnCopyFailed; prevCache = ResourceLoader.getOSPCache(); prevUpgradeInterval = Tracker.checkForUpgradeInterval; @@ -1443,8 +1360,6 @@ private void revert() { Tracker.prelaunchExecutables = prevExecutables; Tracker.warnNoVideoEngine = prevWarnNoVideoEngine; Tracker.warnFFMPegError = prevWarnFFMPegError; - Tracker.warnXuggleError = prevWarnXuggleError; - Tracker.warnXuggleVersion = prevWarnXuggleVersion; Tracker.warnCopyFailed = prevWarnCopyFailed; ResourceLoader.setOSPCache(prevCache); Tracker.checkForUpgradeInterval = prevUpgradeInterval; @@ -1502,7 +1417,6 @@ protected void refreshGUI() { vm32Button.setText(TrackerRes.getString("PrefsDialog.Checkbox.32BitVM")); //$NON-NLS-1$ vm64Button.setText(TrackerRes.getString("PrefsDialog.Checkbox.64BitVM")); //$NON-NLS-1$ ffmpegButton.setText(TrackerRes.getString("PrefsDialog.Button.FFMPeg")); //$NON-NLS-1$ - xuggleButton.setText(TrackerRes.getString("PrefsDialog.Button.Xuggle")); //$NON-NLS-1$ qtButton.setText(TrackerRes.getString("PrefsDialog.Button.QT")); //$NON-NLS-1$ noEngineButton.setText(TrackerRes.getString("PrefsDialog.Button.NoEngine")); //$NON-NLS-1$ radiansButton.setText(TrackerRes.getString("TMenuBar.MenuItem.Radians")); //$NON-NLS-1$ @@ -1512,8 +1426,6 @@ protected void refreshGUI() { vidWarningCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfNoEngine")); //$NON-NLS-1$ variableDurationCheckBox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnVariableDuration")); //$NON-NLS-1$ ffmpegErrorCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfFFMPegError")); //$NON-NLS-1$ - xuggleErrorCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnIfXuggleError")); //$NON-NLS-1$ - xuggleVersionCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnXuggleVersion")); //$NON-NLS-1$ copyFailedCheckbox.setText(TrackerRes.getString("PrefsDialog.Checkbox.WarnCopyFailed")); //$NON-NLS-1$ setTabTitle(configPanel, TrackerRes.getString("PrefsDialog.Tab.Configuration.Title")); //$NON-NLS-1$ setTabTitle(runtimePanel, TrackerRes.getString("PrefsDialog.Tab.Runtime.Title")); //$NON-NLS-1$ @@ -1637,9 +1549,6 @@ private void applyPrefs() { if (ffmpegButton.isSelected() && ffmpegButton.isEnabled()) { VideoIO.setEngine(VideoIO.ENGINE_FFMPEG); } - else if (xuggleButton.isSelected() && xuggleButton.isEnabled()) { - VideoIO.setEngine(VideoIO.ENGINE_XUGGLE); - } else if (qtButton.isSelected() && qtButton.isEnabled()) { VideoIO.setEngine(VideoIO.ENGINE_QUICKTIME); } @@ -1701,8 +1610,6 @@ protected void updateDisplay() { vidWarningCheckbox.setSelected(Tracker.warnNoVideoEngine); variableDurationCheckBox.setSelected(Tracker.warnVariableDuration); ffmpegErrorCheckbox.setSelected(Tracker.warnFFMPegError); - xuggleErrorCheckbox.setSelected(Tracker.warnXuggleError); - xuggleVersionCheckbox.setSelected(Tracker.warnXuggleVersion); copyFailedCheckbox.setSelected(Tracker.warnCopyFailed); // locale for (Locale next: Tracker.locales) { @@ -1719,9 +1626,6 @@ protected void updateDisplay() { else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG)) { ffmpegButton.setSelected(true); } - else if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE)) { - xuggleButton.setSelected(true); - } repaint(); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java index 085875ae..d8359a44 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java @@ -178,16 +178,13 @@ public void actionPerformed(ActionEvent e) { type = videoType==null? video.getClass().getSimpleName(): videoType.getDescription(); - // eliminate extension list and replace with video engine if ffmpeg, xuggle or QT + // eliminate extension list and replace with video engine if ffmpeg or QT int n = type.lastIndexOf("("); //$NON-NLS-1$ if (n>-1) { type = type.substring(0, n); if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { type += "(FFMPeg)"; //$NON-NLS-1$ } - else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { - type += "(Xuggle)"; //$NON-NLS-1$ - } else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_QUICKTIME)) { type += "(QuickTime)"; //$NON-NLS-1$ } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java index ab1c4974..3d10ffdf 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java @@ -83,7 +83,7 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { protected ArrayList loadedFiles = new ArrayList(); protected boolean anglesInRadians = Tracker.isRadians; protected File tabsetFile; // used when saving tabsets - protected int framesLoaded, prevFramesLoaded; // used when loading ffmpeg or xuggle videos + protected int framesLoaded, prevFramesLoaded; // used when loading ffmpeg videos // protected JProgressBar monitor; protected PrefsDialog prefsDialog; @@ -672,7 +672,7 @@ public MainTView getMainView(TrackerPanel trackerPanel) { */ public void propertyChange(PropertyChangeEvent e) { String name = e.getPropertyName(); - if (name.equals("progress")) { // from currently loading (ffmpeg or xuggle) video //$NON-NLS-1$ + if (name.equals("progress")) { // from currently loading (ffmpeg) video //$NON-NLS-1$ Object val = e.getNewValue(); String vidName = XML.forwardSlash((String)e.getOldValue()); try { @@ -691,7 +691,7 @@ public void propertyChange(PropertyChangeEvent e) { } } } - else if (name.equals("stalled")) { // from stalled ffmpeg or xuggle video //$NON-NLS-1$ + else if (name.equals("stalled")) { // from stalled ffmpeg video //$NON-NLS-1$ String fileName = XML.getName((String)e.getNewValue()); String s = TrackerRes.getString("TFrame.Dialog.StalledVideo.Message0") //$NON-NLS-1$ +"\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message1") //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java index 5ec5c9d6..c61a5b15 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java @@ -864,9 +864,8 @@ public void itemStateChanged(ItemEvent e) { public void itemStateChanged(ItemEvent e) { Video video = trackerPanel.getVideo(); if (video==null) return; - boolean xuggleVideo = video.getClass().getName().equals("org.opensourcephysics.media.xuggle.XuggleVideo"); boolean ffmpegVideo = video.getClass().getName().equals("org.opensourcephysics.media.ffmpeg.FFMPegVideo"); - if(!xuggleVideo && !ffmpegVideo) return; + if(!ffmpegVideo) return; if (e.getStateChange() == ItemEvent.SELECTED || e.getStateChange() == ItemEvent.DESELECTED) { boolean smooth = playVideoSmoothlyItem.isSelected(); @@ -878,14 +877,6 @@ public void itemStateChanged(ItemEvent e) { } catch (Exception ex) { } } - else { - try { - Class xuggleClass = Class.forName("org.opensourcephysics.media.xuggle.XuggleVideo"); - Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } - } } } }); @@ -1296,8 +1287,6 @@ public void actionPerformed(ActionEvent e) { diagMenu.add(Tracker.aboutQTAction); if (Tracker.aboutFFMPegAction != null) diagMenu.add(Tracker.aboutFFMPegAction); - if (Tracker.aboutXuggleAction != null) - diagMenu.add(Tracker.aboutXuggleAction); if (Tracker.aboutThreadsAction != null) diagMenu.add(Tracker.aboutThreadsAction); // end diagnostics menu @@ -1409,7 +1398,7 @@ public synchronized void run() { VideoClip clip = trackerPanel.getPlayer().getVideoClip(); playAllStepsItem.setSelected(clip.isPlayAllSteps()); videoMenu.add(playAllStepsItem); - // smooth play item for ffmpeg/xuggle videos + // smooth play item for ffmpeg videos VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ if (videoType!=null) { if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { @@ -1423,17 +1412,6 @@ public synchronized void run() { } catch (Exception ex) { } } - else if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { - String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ - try { - Class xuggleClass = Class.forName(xuggleName); - Method method = xuggleClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ - Boolean smooth = (Boolean)method.invoke(video, (Object[])null); - playVideoSmoothlyItem.setSelected(smooth); - videoMenu.add(playVideoSmoothlyItem); - } catch (Exception ex) { - } - } } // video filters menu if (trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 49efc56b..a04fbafe 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -108,7 +108,6 @@ public class Tracker { "config.saveWithData", "data.builder", "data.tool"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ static Set defaultConfig; static boolean ffmpegCopied; - static boolean xuggleCopied; static String[] mainArgs; static JFrame splash; static Icon trackerLogoIcon, ospLogoIcon; @@ -120,7 +119,7 @@ public class Tracker { static String trackerWebsite = "www.cabrillo.edu/~dbrown/tracker"; //$NON-NLS-1$ static String author = "Douglas Brown"; //$NON-NLS-1$ static String osp = "Open Source Physics"; //$NON-NLS-1$ - static AbstractAction aboutQTAction, aboutFFMPegAction, aboutXuggleAction, aboutThreadsAction; + static AbstractAction aboutQTAction, aboutFFMPegAction, aboutThreadsAction; static Action aboutTrackerAction, readmeAction; static Action aboutJavaAction, startLogAction; private static Tracker tracker; @@ -157,8 +156,8 @@ public class Tracker { static int checkForUpgradeInterval = 0; static int preferredFontLevel = 0; static boolean isRadians, isVideoFast, engineKnown=true; - static boolean warnFFMPegError=true, warnXuggleError=true, warnNoVideoEngine=true, use32BitMode=false; - static boolean warnXuggleVersion=true, warnVariableDuration=true, warnCopyFailed=true; + static boolean warnFFMPegError=true, warnNoVideoEngine=true, use32BitMode=false; + static boolean warnVariableDuration=true, warnCopyFailed=true; static String[] prelaunchExecutables = new String[0]; static Collection dataFunctionControls = new HashSet(); @@ -331,15 +330,6 @@ public void mouseDragged(MouseEvent e) { } catch (Exception ex) { } - // add Xuggle video types, if available using reflection - try { - String xuggleIOName = "org.opensourcephysics.media.xuggle.XuggleIO"; //$NON-NLS-1$ - Class xuggleIOClass = Class.forName(xuggleIOName); - Method method = xuggleIOClass.getMethod("registerWithVideoIO", (Class[]) null); //$NON-NLS-1$ - method.invoke(null, (Object[]) null); - } catch (Exception ex) { - } - // add QT video types, if available, using reflection if (!OSPRuntime.isLinux()) { // do this in a separate thread since can be time-consuming @@ -709,11 +699,6 @@ public void actionPerformed(ActionEvent e) { DiagnosticsForFFMPeg.aboutFFMPeg("Tracker"); //$NON-NLS-1$ } }; - aboutXuggleAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutXuggle"), null) { //$NON-NLS-1$ - public void actionPerformed(ActionEvent e) { - DiagnosticsForXuggle.aboutXuggle("Tracker"); //$NON-NLS-1$ - } - }; aboutThreadsAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutThreads"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { DiagnosticsForThreads.aboutThreads(); @@ -917,13 +902,11 @@ protected static void setCache(String cachePath) { */ protected static boolean updateResources() { boolean ffmpegUpdated = VideoIO.updateEngine("FFMPegVideoType"); //$NON-NLS-1$ - boolean xuggleUpdated = VideoIO.updateEngine("XuggleVideoType"); //$NON-NLS-1$ - if (trackerHome!=null && OSPRuntime.isWindows()) { // ffmpeg/xuggle files changed, so copy into Tracker home also + if (trackerHome!=null && OSPRuntime.isWindows()) { // ffmpeg files changed, so copy into Tracker home also if(ffmpegUpdated) ExtensionsManager.getManager().copyFFMPegJarsTo(new File(trackerHome)); - if(xuggleUpdated) ExtensionsManager.getManager().copyXuggleJarsTo(new File(trackerHome)); } boolean qtUpdated = VideoIO.updateEngine("QTVideoType"); //$NON-NLS-1$ - return qtUpdated || xuggleUpdated || ffmpegUpdated; + return qtUpdated || ffmpegUpdated; } /** @@ -1094,7 +1077,7 @@ protected static Cursor getZoomOutCursor() { * @param args array of tracker or video file names */ public static void main(String[] args) { -// String[] vars = {"TRACKER_HOME", "XUGGLE_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ +// String[] vars = {"TRACKER_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ // for (String next: vars) { // OSPLog.warning("Environment variable "+next+": "+System.getenv(next)); //$NON-NLS-1$ //$NON-NLS-2$ // } @@ -1133,7 +1116,7 @@ public static void main(String[] args) { else javaPath = null; } boolean needsJavaVM = javaPath!=null && !javaCommand.equals(javaPath); - // update resources like QuickTime, Xuggle and FFMPeg + // update resources like QuickTime and FFMPeg boolean updated = updateResources(); // compare memory with requested size(s) @@ -1259,8 +1242,8 @@ public void actionPerformed(ActionEvent e) { TrackerRes.getString("Tracker.Dialog.FailedToCopy.Title")+": QuickTime", //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.WARNING_MESSAGE); } - if (System.getenv("XUGGLE_WARNING")!=null) { //$NON-NLS-1$ - String warningString = System.getenv("XUGGLE_WARNING"); //$NON-NLS-1$ + if (System.getenv("FFMPEG_WARNING")!=null) { //$NON-NLS-1$ + String warningString = System.getenv("FFMPEG_WARNING"); //$NON-NLS-1$ String[] lines = warningString.split("\n"); //$NON-NLS-1$ Box box = Box.createVerticalBox(); for (String line: lines) { @@ -1281,7 +1264,7 @@ public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, box, - TrackerRes.getString("Tracker.Dialog.FailedToCopy.Title")+": Xuggle", //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("Tracker.Dialog.FailedToCopy.Title")+": FFMPeg", //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.WARNING_MESSAGE); } } @@ -1289,14 +1272,13 @@ public void actionPerformed(ActionEvent e) { // warnNoVideoEngine = false; // for PLATO if (warnNoVideoEngine && VideoIO.getDefaultEngine().equals(VideoIO.ENGINE_NONE)) { boolean ffmpegInstalled = ExtensionsManager.getManager().getFFMPegJar()!=null; - boolean xuggleInstalled = VideoIO.guessXuggleVersion()!=0; boolean qtInstalled = ExtensionsManager.getManager().getQTJavaZip()!=null; ArrayList message = new ArrayList(); boolean showRelaunchDialog = false; // no engine installed - if (!xuggleInstalled && !qtInstalled) { + if (!ffmpegInstalled && !qtInstalled) { message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message1")); //$NON-NLS-1$ message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message2")); //$NON-NLS-1$ message.add(" "); //$NON-NLS-1$ @@ -1373,35 +1355,6 @@ public void actionPerformed(ActionEvent e) { } -// warnXuggleVersion = false; // for PLATO - if (warnXuggleVersion && VideoIO.guessXuggleVersion()==5.4) { - // warn user that xuggle 5.4 is not recommended - ArrayList message = new ArrayList(); - message.add(TrackerRes.getString("Tracker.Dialog.ReplaceXuggle.Message1")); //$NON-NLS-1$ - message.add(TrackerRes.getString("Tracker.Dialog.ReplaceXuggle.Message2")); //$NON-NLS-1$ - message.add(TrackerRes.getString("Tracker.Dialog.ReplaceXuggle.Message3")); //$NON-NLS-1$ - - Box box = Box.createVerticalBox(); - for (String line: message) { - box.add(new JLabel(line)); - } - - // add "don't show again" checkbox - box.add(new JLabel(" ")); //$NON-NLS-1$ - final JCheckBox checkbox = new JCheckBox(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Checkbox")); //$NON-NLS-1$ - checkbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - warnXuggleVersion = !checkbox.isSelected(); - } - }); - box.add(checkbox); - box.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - - JOptionPane.showMessageDialog(frame, box, - TrackerRes.getString("PrefsDialog.Checkbox.WarnXuggleVersion"), //$NON-NLS-1$ - JOptionPane.INFORMATION_MESSAGE); - - } testPanel = frame.getTrackerPanel(0); } @@ -1605,10 +1558,6 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("warn_variable_frame_duration", Tracker.warnVariableDuration); //$NON-NLS-1$ if (!Tracker.warnFFMPegError) // true by default control.setValue("warn_ffmpeg_error", Tracker.warnFFMPegError); //$NON-NLS-1$ - if (!Tracker.warnXuggleVersion) // true by default - control.setValue("warn_xuggle_version", Tracker.warnXuggleVersion); //$NON-NLS-1$ - if (!Tracker.warnXuggleError) // true by default - control.setValue("warn_xuggle_error", Tracker.warnXuggleError); //$NON-NLS-1$ if (!Tracker.warnCopyFailed) // true by default control.setValue("warn_copy_failed", Tracker.warnCopyFailed); //$NON-NLS-1$ // always save preferred tracker.jar @@ -1703,10 +1652,6 @@ public Object loadObject(XMLControl control, Object obj) { Tracker.warnNoVideoEngine = control.getBoolean("warn_no_engine"); //$NON-NLS-1$ if (control.getPropertyNames().contains("warn_ffmpeg_error")) //$NON-NLS-1$ Tracker.warnFFMPegError = control.getBoolean("warn_ffmpeg_error"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_xuggle_version")) //$NON-NLS-1$ - Tracker.warnXuggleVersion = control.getBoolean("warn_xuggle_version"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_xuggle_error")) //$NON-NLS-1$ - Tracker.warnXuggleError = control.getBoolean("warn_xuggle_error"); //$NON-NLS-1$ if (control.getPropertyNames().contains("warn_variable_frame_duration")) //$NON-NLS-1$ Tracker.warnVariableDuration = control.getBoolean("warn_variable_frame_duration"); //$NON-NLS-1$ if (control.getPropertyNames().contains("show_hints")) { //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java index c639841d..6a40ad10 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java @@ -66,10 +66,8 @@ public class TrackerIO extends VideoIO { protected static Map delimiters = new TreeMap(); protected static Map customDelimiters = new TreeMap(); protected static boolean isffmpegError = false; - protected static boolean isXuggleError = false; protected static TFrame theFrame; protected static PropertyChangeListener ffmpegListener; - protected static PropertyChangeListener xuggleListener; protected static boolean loadInSeparateThread = true; protected static Set monitors = new HashSet(); protected static double defaultBadFrameTolerance = 0.2; @@ -146,76 +144,6 @@ public void actionPerformed(ActionEvent e) { } }; OSPLog.getOSPLog().addPropertyChangeListener(ffmpegListener); - xuggleListener = new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("xuggle_error")) { //$NON-NLS-1$ - if (!isXuggleError) { // first error thrown - isXuggleError = true; - if (!Tracker.warnXuggleError) { - if (e.getNewValue()!=null) { - String s = e.getNewValue().toString(); - int n = s.indexOf("]"); //$NON-NLS-1$ - if (n>-1) s = s.substring(n+1); - s += TrackerRes.getString("TrackerIO.ErrorXuggle.LogMessage"); //$NON-NLS-1$ - OSPLog.warning(s); - } - return; - } - // warn user that a Xuggle error has occurred - Box box = Box.createVerticalBox(); - box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Message1"))); //$NON-NLS-1$ - String error = e.getNewValue().toString(); - int n = error.lastIndexOf("]"); //$NON-NLS-1$ - if (n>-1) { - error = error.substring(n+1).trim(); - } - box.add(new JLabel(" ")); //$NON-NLS-1$ - JLabel erLabel = new JLabel("\""+error+"\""); //$NON-NLS-1$ //$NON-NLS-2$ - erLabel.setBorder(BorderFactory.createEmptyBorder(0, 60, 0, 0)); - box.add(erLabel); - box.add(new JLabel(" ")); //$NON-NLS-1$ - box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Message2"))); //$NON-NLS-1$ - - box.add(new JLabel(" ")); //$NON-NLS-1$ - box.setBorder(BorderFactory.createEmptyBorder(20, 15, 0, 15)); - - final JDialog dialog = new JDialog(theFrame, false); - JPanel contentPane = new JPanel(new BorderLayout()); - dialog.setContentPane(contentPane); - contentPane.add(box, BorderLayout.CENTER); - JButton closeButton = new JButton(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - closeButton.setForeground(new Color(0, 0, 102)); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - dialog.setVisible(false); - } - }); - JButton dontShowAgainButton = new JButton(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Checkbox")); //$NON-NLS-1$ - dontShowAgainButton.setForeground(new Color(0, 0, 102)); - dontShowAgainButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Tracker.warnXuggleError = false; - dialog.setVisible(false); - } - }); - JPanel buttonbar = new JPanel(); - buttonbar.add(dontShowAgainButton); - buttonbar.add(closeButton); - buttonbar.setBorder(BorderFactory.createEtchedBorder()); - contentPane.add(buttonbar, BorderLayout.SOUTH); - dialog.pack(); - dialog.setTitle(TrackerRes.getString("TrackerIO.Dialog.ErrorXuggle.Title")); //$NON-NLS-1$ - // center dialog on the screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - dialog.getBounds().width) / 2; - int y = (dim.height - dialog.getBounds().height) / 2; - dialog.setLocation(x, y); - dialog.setVisible(true); - } - } - } - }; - OSPLog.getOSPLog().addPropertyChangeListener(xuggleListener); zipFileFilter = new FileFilter() { public boolean accept(File f) { if (f == null) return false; @@ -599,10 +527,6 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, VideoType ffmpegType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ if (ffmpegType!=null) otherEngines.add(ffmpegType); } - if (!engine.equals(VideoIO.ENGINE_XUGGLE)) { - VideoType xuggleType = VideoIO.getVideoType("Xuggle", ext); //$NON-NLS-1$ - if (xuggleType!=null) otherEngines.add(xuggleType); - } if (!engine.equals(VideoIO.ENGINE_QUICKTIME)) { VideoType qtType = VideoIO.getVideoType("QT", ext); //$NON-NLS-1$ if (qtType!=null) otherEngines.add(qtType); @@ -619,7 +543,6 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, // provide immediate way to open with other engines engine = VideoIO.ENGINE_NONE.equals(engine)? MediaRes.getString("VideoIO.Engine.None"): //$NON-NLS-1$ VideoIO.ENGINE_FFMPEG.equals(engine)? MediaRes.getString("FFMPegVideoType.Description"): //$NON-NLS-1$ - VideoIO.ENGINE_XUGGLE.equals(engine)? MediaRes.getString("XuggleVideoType.Description"): //$NON-NLS-1$ MediaRes.getString("QTVideoType.Description"); //$NON-NLS-1$ String message = MediaRes.getString("VideoIO.Dialog.TryDifferentEngine.Message1")+" ("+engine+")."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ message += "\n"+MediaRes.getString("VideoIO.Dialog.TryDifferentEngine.Message2"); //$NON-NLS-1$ //$NON-NLS-2$ @@ -628,8 +551,6 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, for (VideoType next: otherEngines) { if (next.getClass().getSimpleName().equals("FFMPegVideoType")) optionList.add(MediaRes.getString("FFMPegVideoType.Description")); //$NON-NLS-1$ - else if(next.getClass().getSimpleName().equals("XuggleVideoType")) - optionList.add(MediaRes.getString("XuggleVideoType.Description")); //$NON-NLS-1$ else if(next.getClass().getSimpleName().equals("QTVideoType")) optionList.add(MediaRes.getString("QTVideoType.Description")); //$NON-NLS-1$ } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java index cc6be7d7..e6c81570 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java @@ -1925,7 +1925,7 @@ else if (name.equals("videoclip")) { // from videoPlayer //$NON-NL } if (getVideo() != null) { getVideo().setProperty("measure", null); //$NON-NLS-1$ - // if ffmpeg or xuggle video, set smooth play per preferences + // if ffmpeg video, set smooth play per preferences VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ if (videoType!=null) { if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { @@ -1938,16 +1938,6 @@ else if (name.equals("videoclip")) { // from videoPlayer //$NON-NL } catch (Exception ex) { } } - else if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_XUGGLE)) { - boolean smooth = !Tracker.isVideoFast; - try { - String xuggleName = "org.opensourcephysics.media.xuggle.XuggleVideo"; //$NON-NLS-1$ - Class xuggleClass = Class.forName(xuggleName); - Method method = xuggleClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } - } } } changed = true; diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java index 0471a525..4d4b725a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java @@ -50,7 +50,7 @@ import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControlElement; import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.tools.DiagnosticsForXuggle; +import org.opensourcephysics.tools.DiagnosticsForFFMPeg; import org.opensourcephysics.tools.ExtensionsManager; /** @@ -67,8 +67,8 @@ public class TrackerStarter { static String newline = "\n"; //$NON-NLS-1$ static String encoding = "UTF-8"; //$NON-NLS-1$ static String exceptions = ""; //$NON-NLS-1$ - static String qtJavaWarning, xuggleWarning; - static String trackerHome, userHome, javaHome, xuggleHome, userDocuments; + static String qtJavaWarning, ffmpegWarning; + static String trackerHome, userHome, javaHome, ffmpegHome, userDocuments; static String startLogPath; static FilenameFilter trackerJarFilter = new TrackerJarFilter(); static File codeBaseDir, starterJarFile; @@ -102,7 +102,7 @@ public class TrackerStarter { exceptions += ex.getClass().getSimpleName() + ": " + ex.getMessage() + newline; //$NON-NLS-1$ } - // get user home, java home and xuggle home + // get user home, java home and ffmpeg home try { userHome = System.getProperty("user.home"); //$NON-NLS-1$ javaHome = System.getProperty("java.home"); //$NON-NLS-1$ @@ -118,7 +118,7 @@ public class TrackerStarter { userDocuments = null; } } - xuggleHome = System.getenv("XUGGLE_HOME"); //$NON-NLS-1$ + ffmpegHome = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ } catch (Exception ex) { exceptions += ex.getClass().getSimpleName() + ": " + ex.getMessage() + newline; //$NON-NLS-1$ @@ -660,14 +660,14 @@ private static void startTracker(String jarPath, String[] args) env.put("MEMORY_SIZE", String.valueOf(memorySize)); //$NON-NLS-1$ showDebugMessage("setting environment variable MEMORY_SIZE = " + String.valueOf(memorySize)); //$NON-NLS-1$ } - if (xuggleWarning!=null) env.put("XUGGLE_WARNING", xuggleWarning); //$NON-NLS-1$ + if (ffmpegWarning!=null) env.put("FFMPEG_WARNING", ffmpegWarning); //$NON-NLS-1$ if (qtJavaWarning!=null) env.put("QTJAVA_WARNING", qtJavaWarning); //$NON-NLS-1$ // on OS X, add DYLD_LIBRARY_PATH to environment here - // note TRACKER_HOME, XUGGLE_HOME must be in environment BEFORE running this + // note TRACKER_HOME must be in environment BEFORE running this if (OSPRuntime.isMac() - && xuggleHome!=null && new File(xuggleHome+"/lib").exists()) { //$NON-NLS-1$ - env.put("DYLD_LIBRARY_PATH", xuggleHome+"/lib"); //$NON-NLS-1$ //$NON-NLS-2$ + && ffmpegHome!=null && new File(ffmpegHome+"/lib").exists()) { //$NON-NLS-1$ + env.put("DYLD_LIBRARY_PATH", ffmpegHome+"/lib"); //$NON-NLS-1$ //$NON-NLS-2$ } // assemble command message for log @@ -885,45 +885,49 @@ private static void showDebugMessage(String message) { } /** - * Copies Xuggle jars and QTJava.zip to target VM extensions directory. + * Copies ffmpeg jars and QTJava.zip to target VM extensions directory. */ private static void refreshVideoEngines() throws Exception { ExtensionsManager manager = ExtensionsManager.getManager(); String jrePath = preferredVM != null ? preferredVM : javaHome; File extDir = new File(jrePath, "lib/ext"); //$NON-NLS-1$ - // Xuggle - if (manager.copyXuggleJarsTo(extDir)) { - showDebugMessage("copied xuggle jars to " + extDir.getAbsolutePath()); //$NON-NLS-1$ + // FFMPeg + if (manager.copyFFMPegJarsTo(extDir)) { + showDebugMessage("copied ffmpeg jars to " + extDir.getAbsolutePath()); //$NON-NLS-1$ } else { - File extFile = new File(extDir, "xuggle-xuggler.jar"); //$NON-NLS-1$ + File extFile = new File(extDir, "ffmpeg-"+DiagnosticsForFFMPeg.FFMPEG_VERSION+".jar"); //$NON-NLS-1$ + File extFile1 = new File(extDir, "ffmpeg.jar"); if (extFile.exists()) { - showDebugMessage("xuggle jars found in " + extDir.getAbsolutePath()); //$NON-NLS-1$ + showDebugMessage("ffmpeg jars found in " + extDir.getAbsolutePath()); //$NON-NLS-1$ + } else if (extFile1.exists()) { + showDebugMessage("ffmpeg jars found in " + extDir.getAbsolutePath()); //$NON-NLS-1$ } else { - String xuggleHome = System.getenv("XUGGLE_HOME"); //$NON-NLS-1$ - if (xuggleHome==null || !new File(xuggleHome+"/share/java/jars/xuggle-xuggler.jar").exists()) { //$NON-NLS-1$ - String message = "xuggle jars not found"; //$NON-NLS-1$ - if (xuggleHome==null) message += ": XUGGLE_HOME is undefined"; //$NON-NLS-1$ - else message += " in "+xuggleHome; //$NON-NLS-1$ + String ffmpegHome = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ + if (ffmpegHome==null || !new File(ffmpegHome,"ffmpeg.jar").exists() + || !new File(ffmpegHome,"ffmpeg-"+DiagnosticsForFFMPeg.FFMPEG_VERSION+".jar").exists()) { //$NON-NLS-1$ + String message = "ffmpeg jars not found"; //$NON-NLS-1$ + if (ffmpegHome==null) message += ": FFMPEG_HOME is undefined"; //$NON-NLS-1$ + else message += " in "+ffmpegHome; //$NON-NLS-1$ showDebugMessage(message); } else { - // failed to copy xuggle jars to ext directory--permissions problem? - String xuggleSourceDir = new File(xuggleHome+"/share/java/jars").getAbsolutePath(); //$NON-NLS-1$ - showDebugMessage("unable to copy xuggle jars from "+xuggleSourceDir+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ + // failed to copy ffmpeg jars to ext directory--permissions problem? + String ffmpegSourceDir = new File(ffmpegHome).getAbsolutePath(); //$NON-NLS-1$ + showDebugMessage("unable to copy ffmpeg jars from "+ffmpegSourceDir+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ - // assemble xuggleWarning to pass to Tracker as an environment variable - xuggleWarning = TrackerRes.getString("TrackerStarter.Warning.FailedToCopy1"); //$NON-NLS-1$ - xuggleWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.FailedToCopy2"); //$NON-NLS-1$ //$NON-NLS-2$ - xuggleWarning += "\n \n"+TrackerRes.getString("TrackerStarter.Warning.FilesToCopy")+" "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - for (String next: DiagnosticsForXuggle.getXuggleJarNames()) { - xuggleWarning += next+", "; //$NON-NLS-1$ + // assemble ffmpegWarning to pass to Tracker as an environment variable + ffmpegWarning = TrackerRes.getString("TrackerStarter.Warning.FailedToCopy1"); //$NON-NLS-1$ + ffmpegWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.FailedToCopy2"); //$NON-NLS-1$ //$NON-NLS-2$ + ffmpegWarning += "\n \n"+TrackerRes.getString("TrackerStarter.Warning.FilesToCopy")+" "; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + for (String next: DiagnosticsForFFMPeg.getFFMPegJarNames()) { + ffmpegWarning += next+", "; //$NON-NLS-1$ } - xuggleWarning = xuggleWarning.substring(0, xuggleWarning.lastIndexOf(", ")); //$NON-NLS-1$ - xuggleWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.CopyFrom")+" "+xuggleSourceDir; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - xuggleWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.CopyTo")+" "+extDir; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ffmpegWarning = ffmpegWarning.substring(0, ffmpegWarning.lastIndexOf(", ")); //$NON-NLS-1$ + ffmpegWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.CopyFrom")+" "+ffmpegSourceDir; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + ffmpegWarning += "\n"+TrackerRes.getString("TrackerStarter.Warning.CopyTo")+" "+extDir; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } @@ -972,14 +976,7 @@ private static void refreshVideoEngines() throws Exception { // String jrePath = preferredVM!=null? preferredVM: javaHome; // ExtensionsManager manager = ExtensionsManager.getManager(); // boolean qtInstalled = manager.getQTJavaZip()!=null; - // double xuggleVersion = VideoIO.guessXuggleVersion(); - // // OSX: use 32-bit VM unless Xuggle version is 3.4 - // if (OSPRuntime.isMac()) { - // use32BitMode = xuggleVersion!=3.4; // } - // // Windows: use 32-bit VM unless no QuickTime and Xuggle version is 5.4 - // else if (OSPRuntime.isWindows()) { - // if (!qtInstalled && xuggleVersion==5.4) { // if (manager.is32BitVM(jrePath)) { // // switch to default 64-bit VM, if any // String jre64 = manager.getDefaultJRE(64); diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties index 92ee9fb6..0cee43ab 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties @@ -720,7 +720,6 @@ PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine PrefsDialog.Button.FFMPeg=FFMPeg -PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -828,22 +827,11 @@ Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's preferred video engine, is not yet installed. Tracker.Dialog.NoFFMPeg.Message2=To install FFMPeg, download the latest Tracker installer from Tracker.Dialog.NoFFMPeg.Title=Missing FFMPeg -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=To install Xuggle, Tracker's preferred video engine on +Tracker.Dialog.NoVideoEngine.Message3=To install FFMPeg, Tracker's preferred video engine on Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's preferred video engine, is not yet installed. -Tracker.Dialog.NoXuggle.Message2=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Missing Xuggle Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -919,15 +907,12 @@ WorldTView.Button.World=World PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle version PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... TFrame.Progress.FFMPeg=FFMPeg loading frame -TFrame.Progress.Xuggle=Xuggle loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -946,12 +931,6 @@ TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open t TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). -TrackerIO.Dialog.ErrorXuggle.Message1=Xuggle has encountered the following error while opening this video: -TrackerIO.Dialog.ErrorXuggle.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorXuggle.Message3=If Xuggle fails, you may be able to open the video with QuickTime. -TrackerIO.Dialog.ErrorXuggle.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorXuggle.Title=Xuggle Error -TrackerIO.ErrorXuggle.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1207,17 +1186,15 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1233,10 +1210,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg, Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 2.3 by reinstalling Tracker (version 4.85 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents @@ -1302,7 +1279,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors TrackerStarter.Warning.FailedToCopy1=Some video engine files could not be copied automatically. TrackerStarter.Warning.FailedToCopy2=The video engine may not work unless they are copied manually. From 3c6d94376ac2b640d5fddf306d7256ab43a3de1b Mon Sep 17 00:00:00 2001 From: fschuett Date: Sun, 16 Nov 2014 10:40:46 +0100 Subject: [PATCH 03/20] Fix merging problems. --- .../opensourcephysics/cabrillo/tracker/Tracker.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 3ff13102..1f94326d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -1207,15 +1207,15 @@ public static void main(String[] args) { needsEnvironment = true; } else { - String xuggleDir = TrackerStarter.findXuggleHome(trackerDir, false); - String xuggleEnv = System.getenv("XUGGLE_HOME"); //$NON-NLS-1$ - if (xuggleDir!=null && !xuggleDir.equals(xuggleEnv)) { + String ffmpegDir = TrackerStarter.findFFMPegHome(trackerDir, false); + String ffmpegEnv = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ + if (ffmpegDir!=null && !ffmpegDir.equals(ffmpegEnv)) { needsEnvironment = true; } else { - if (xuggleDir!=null) { + if (ffmpegDir!=null) { String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ - String xugglePath = xuggleDir+File.separator+subdir; + String xugglePath = ffmpegDir+File.separator+subdir; String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ String pathEnv = System.getenv(pathName); From 5d6b53e226d1e5bd1d933a50257cb06aeb070065 Mon Sep 17 00:00:00 2001 From: fschuett Date: Tue, 2 Dec 2014 17:55:03 +0100 Subject: [PATCH 04/20] Adjust start to use classpath in Linux --- .../cabrillo/tracker/TTrackBar.java | 2 +- .../cabrillo/tracker/Tracker.java | 6 ++-- .../tracker/deploy/TrackerStarter.java | 32 +++++++++++++------ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java b/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java index f84da263..c8a4927e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java @@ -78,7 +78,7 @@ public void actionPerformed(ActionEvent e) { // test action goes here // final TrackerPanel trackerPanel = frame.getTrackerPanel(frame.getSelectedTab()); // show environment -// String[] vars = {"TRACKER_HOME", "XUGGLE_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ +// String[] vars = {"TRACKER_HOME", "FFMPEG_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ // for (String next: vars) { // OSPLog.warning("Environment variable "+next+": "+System.getenv(next)); //$NON-NLS-1$ //$NON-NLS-2$ // } diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 1f94326d..56c50ead 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -1213,13 +1213,13 @@ public static void main(String[] args) { needsEnvironment = true; } else { - if (ffmpegDir!=null) { + if (ffmpegDir!=null && !OSPRuntime.isLinux()) { // not needed in Linux String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ - String xugglePath = ffmpegDir+File.separator+subdir; + String ffmpegPath = ffmpegDir+File.separator+subdir; String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ String pathEnv = System.getenv(pathName); - if (pathEnv==null || !pathEnv.contains(xugglePath)) { + if (pathEnv==null || !pathEnv.contains(ffmpegPath)) { needsEnvironment = true; } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java index 87350cec..cb009965 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java @@ -761,8 +761,26 @@ private static void startTracker(String jarPath, String[] args) cmd.add("-Xdock:name=Tracker"); //$NON-NLS-1$ } - cmd.add("-jar"); //$NON-NLS-1$ - cmd.add(jarPath); + // Linux needs classpath to be set, so launch with different parameters + // -jar / -cp are mutually exclusive + if (OSPRuntime.isLinux()) { + String classpath = jarPath; + if (ffmpegHome != null && new File(ffmpegHome).exists()) { + for (String next : DiagnosticsForFFMPeg.getFFMPegJarNames()) { + next = ffmpegHome+"/"+next; + if (new File(next).exists()) { + classpath += ":" + next; + } + } + } + cmd.add("-cp"); + cmd.add(classpath); + cmd.add("org.opensourcephysics.cabrillo.tracker.Tracker"); + } + else { + cmd.add("-jar"); //$NON-NLS-1$ + cmd.add(jarPath); + } if (args != null && args.length > 0) for (String next : args) { if (next != null) @@ -807,7 +825,8 @@ private static void startTracker(String jarPath, String[] args) String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ String ffmpegPath = ffmpegHome+File.separator+subdir; - if (new File(ffmpegPath).exists()) { + // Linux doesn't need this + if (new File(ffmpegPath).exists() && !OSPRuntime.isLinux()) { // get current PATH String pathValue = env.get(pathEnvironment); if (pathValue==null) pathValue = ""; //$NON-NLS-1$ @@ -904,7 +923,7 @@ else if (errors.indexOf("32-bit")>-1) { //$NON-NLS-1$ showDebugMessage("try to start in 64-bit mode"); //$NON-NLS-1$ // assemble warning to pass to Tracker as an environment variable - starterWarning = "The Java VM was started in 64-bit mode (32-bit not support)."; //$NON-NLS-1$ + starterWarning = "The Java VM was started in 64-bit mode (32-bit not supported)."; //$NON-NLS-1$ startTracker(jarPath, args); } @@ -1054,12 +1073,8 @@ private static void showDebugMessage(String message) { } /** -<<<<<<< HEAD * Copies ffmpeg jars and QTJava.zip to target VM extensions directory. -======= - * Copies Xuggle jars and QTJava.zip to target VM extensions directory. * Deprecated--no longer require extensions as of Oct 2014 ->>>>>>> upstream/master */ @SuppressWarnings("unused") @Deprecated @@ -1131,7 +1146,6 @@ private static void refreshVideoEngines() throws Exception { showDebugMessage("unable to copy "+qtSource.getAbsolutePath()+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ // assemble qtJavaWarning to pass to Tracker as an environment variable - // assemble xuggleWarning to pass to Tracker as an environment variable qtJavaWarning = "Some video engine files could not be copied automatically."; //$NON-NLS-1$ qtJavaWarning += "\nThe video engine may not work unless they are copied manually."; //$NON-NLS-1$ qtJavaWarning += "\n\nFiles to copy: QTJava.zip"; //$NON-NLS-1$ From cceca9ac46cdb02a4c0a3460406d6ad415db8cc9 Mon Sep 17 00:00:00 2001 From: fschuett Date: Tue, 14 Jul 2015 08:35:59 +0200 Subject: [PATCH 05/20] Fix override warnings because of some java classes became interfaces. --- .../cabrillo/tracker/Compass.java | 2 -- .../cabrillo/tracker/CompassFootprint.java | 1 - .../cabrillo/tracker/DataTrackClipControl.java | 17 ----------------- .../cabrillo/tracker/DataTrackTimeControl.java | 1 - .../cabrillo/tracker/ParticleDataTrack.java | 2 -- .../cabrillo/tracker/PrefsDialog.java | 2 +- .../cabrillo/tracker/TMenuBar.java | 2 ++ .../cabrillo/tracker/TrackerPanel.java | 17 ++++++++--------- .../cabrillo/tracker/Undo.java | 3 --- 9 files changed, 11 insertions(+), 36 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/Compass.java b/src/org/opensourcephysics/cabrillo/tracker/Compass.java index 1e9cf8c9..7a9aef91 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Compass.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Compass.java @@ -108,7 +108,6 @@ public void itemStateChanged(ItemEvent e) { radialLineCheckbox.setBorder(BorderFactory.createEmptyBorder()); radialLineCheckbox.setSelected(isRadialLineVisible()); radialLineCheckbox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { setRadialLineVisible(radialLineCheckbox.isSelected()); repaint(); @@ -175,7 +174,6 @@ public void focusLost(FocusEvent e) { // set action for angle field final Action sliderAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { if (angleField.getBackground()!=Color.yellow) { return; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CompassFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/CompassFootprint.java index 083fc844..f9644fb8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CompassFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CompassFootprint.java @@ -172,7 +172,6 @@ public Rectangle getBounds(boolean highlighted) { * * @return the hit shapes */ - @Override public Shape[] getHitShapes() { return hitShapes.toArray(new Shape[hitShapes.size()]); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java b/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java index c1d0f157..f6deb0de 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java @@ -234,7 +234,6 @@ public Dimension getMaximumSize() { return dim; } - @Override public void propertyChange(PropertyChangeEvent e) { refreshSpinners(); // if (e.getPropertyName().equals("dataclip")) { //$NON-NLS-1$ @@ -285,7 +284,6 @@ class MappingGraphic implements Interactive { GeneralPath path = new GeneralPath(); //pig convert to using TPoints & implement interactivity - @Override public void draw(DrawingPanel panel, Graphics g) { VideoPanel vidPanel = dataTrack.getVideoPanel(); if (vidPanel==null) return; @@ -481,11 +479,9 @@ public Shape[] getHitShapes() { public Mark getMark(Point[] points) { return new Mark() { - @Override public void draw(Graphics2D g, boolean highlighted) { } - @Override public Rectangle getBounds(boolean highlighted) { return null; } @@ -493,63 +489,50 @@ public Rectangle getBounds(boolean highlighted) { }; } - @Override public double getXMin() { return 0; } - @Override public double getXMax() { return 100; } - @Override public double getYMin() { return 0; } - @Override public double getYMax() { return 100; } - @Override public boolean isMeasured() { return true; } - @Override public Interactive findInteractive(DrawingPanel panel, int _xpix, int _ypix) { // pig implement return null; } - @Override public void setEnabled(boolean enabled) {} - @Override public boolean isEnabled() { return true; } - @Override public void setXY(double x, double y) {} - @Override public void setX(double x) { // pig implement } - @Override public void setY(double y) {} - @Override public double getX() { // pig implement return 0; } - @Override public double getY() { return 0; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java index 014365ec..47c4411a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java @@ -76,7 +76,6 @@ public Dimension getMaximumSize() { return dim; } - @Override public void propertyChange(PropertyChangeEvent e) { // if (e.getPropertyName().equals("timedata")) { //$NON-NLS-1$ // if (ClipControl.isTimeSource(dataTrack) && videoButton.isSelected()) { diff --git a/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java b/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java index d62f4cb4..2b2f5543 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java @@ -398,13 +398,11 @@ protected void reset() { stepCounter = 0; } - @Override public void setData(Data data, Object source) throws Exception { setData(data); setSource(source); } - @Override public VideoPanel getVideoPanel() { return trackerPanel; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index 4d66f8da..e84f857f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -1072,7 +1072,7 @@ public void actionPerformed(ActionEvent e) { warningsNorthPanel.add(vidWarningCheckbox); warningsNorthPanel.add(variableDurationCheckBox); - warningsCenterPanel.add(xuggleErrorCheckbox); + warningsCenterPanel.add(ffmpegErrorCheckbox); // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg buttons if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java index a854d6d2..6c114236 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java @@ -914,6 +914,7 @@ public void itemStateChanged(ItemEvent e) { } } } + } }); // checkDurationsItem checkDurationsItem = new JMenuItem(TrackerRes.getString("TMenuBar.MenuItem.CheckFrameDurations")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ @@ -1453,6 +1454,7 @@ public synchronized void run() { } catch (Exception ex) { } } + } // video filters menu if (trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ // clear filters menu diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java index 54199cff..b30b92a8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java @@ -1880,18 +1880,17 @@ else if (name.equals("videoclip")) { // from videoPlayer //$NON-NL getVideo().setProperty("measure", null); //$NON-NLS-1$ // if ffmpeg video, set smooth play per preferences VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - if (videoType!=null) { - if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { boolean smooth = !Tracker.isVideoFast; try { - String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ - Class ffmpegClass = Class.forName(ffmpegName); - Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } - } + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + Class ffmpegClass = Class.forName(ffmpegName); + Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } } + } changed = true; } else if (name.equals("stepnumber")) { // from videoPlayer //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/Undo.java b/src/org/opensourcephysics/cabrillo/tracker/Undo.java index 1c6e8ffd..746ed7e1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Undo.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Undo.java @@ -787,7 +787,6 @@ public static XML.ObjectLoader getLoader() { */ static class Loader implements XML.ObjectLoader { - @Override public void saveObject(XMLControl control, Object obj) { TrackProperties props = (TrackProperties)obj; control.setValue("name", props.name); //$NON-NLS-1$ @@ -795,7 +794,6 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("color", props.color); //$NON-NLS-1$ } - @Override public Object createObject(XMLControl control) { String name = control.getString("name"); //$NON-NLS-1$ String footprint = control.getString("footprint"); //$NON-NLS-1$ @@ -803,7 +801,6 @@ public Object createObject(XMLControl control) { return new TrackProperties(name, footprint, color); } - @Override public Object loadObject(XMLControl control, Object obj) { return obj; } From afe0dabfdd502537b00df4db85ba197eeb2b38bd Mon Sep 17 00:00:00 2001 From: fschuett Date: Tue, 14 Jul 2015 19:44:35 +0200 Subject: [PATCH 06/20] Fix encoding. --- .../tracker/resources/tracker_de.properties | 663 +++++++++--------- 1 file changed, 334 insertions(+), 329 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties index 1a23cda7..1e770115 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties @@ -16,18 +16,18 @@ CoordAxes.Name=Achsen CoordAxes.New.Name=Achsen Dialog.Button.Cancel=Abbrechen Dialog.Button.OK=OK -Dialog.Button.Close=Schlie�en +Dialog.Button.Close=Schließen Dialog.Button.All=Alle Dialog.Button.None=Keine Dialog.Button.Copy=Kopieren Dialog.Button.Update=Aktualisieren -Dialog.Button.SelectAll=Alles ausw�hlen +Dialog.Button.SelectAll=Alles auswählen Footprint.Diamond=Raute Footprint.BoldDiamond=Raute, fett -Footprint.SolidDiamond=Raute, gef�llt +Footprint.SolidDiamond=Raute, gefüllt Footprint.Triangle=Dreieck Footprint.BoldTriangle=Dreieck, fett -Footprint.SolidTriangle=Dreieck, gef�llt +Footprint.SolidTriangle=Dreieck, gefüllt Footprint.Circle=Kreis Footprint.BoldCircle=Kreis, fett Footprint.SolidCircle=Kreisscheibe @@ -54,23 +54,23 @@ Footprint.4xArrow=4x Pfeil Footprint.Bold4xArrow=4x Pfeil, fett Footprint.DashArrow=Pfeil, gestrichelt Footprint.BoldDashArrow=Pfeil, gestrichelt, fett -Footprint.BigArrow=gro�er Pfeil -Footprint.BigDashArrow=gro�er Pfeil, gestrichelt +Footprint.BigArrow=großer Pfeil +Footprint.BigDashArrow=großer Pfeil, gestrichelt LineProfile.Name=Farbprofil, Linie LineProfile.New.Name=Farbprofil LineProfile.Data.Brightness=Helligkeit LineProfile.Data.Pixel=Pixel LineProfile.Data.Red=Rot -LineProfile.Data.Green=Gr�n +LineProfile.Data.Green=Grün LineProfile.Data.Blue=Blau -LineProfile.Data.Weighting=Z�hlen +LineProfile.Data.Weighting=Zählen MainTView.Popup.MenuItem.QTPlayer=QuickTime Player MainTView.Popup.MenuItem.Zoom=Zoom MainTView.Popup.MenuItem.ToFit=Anpassen OffsetOrigin.Name=Ursprungsverschiebung (Offset) OffsetOrigin.New.Name=Offset PlotTrackView.Button.PlotCount=Diagramme -PlotTrackView.Button.PlotCount.ToolTip=W�hle die Anzahl der Diagramme +PlotTrackView.Button.PlotCount.ToolTip=Wähle die Anzahl der Diagramme PointMass.Name=Punktmasse PointMass.New.Name=Masse PointMass.MenuItem.VectorsToPosition=Zu positionieren @@ -80,36 +80,36 @@ Star.Name=Stern Star.New.Name=Stern TableTrackView.Action.CopyData=Kopiere Daten TableTrackView.Button.SelectTableData=Daten -TableTrackView.Button.SelectTableData.ToolTip=W�hle angezeigte Variablen +TableTrackView.Button.SelectTableData.ToolTip=Wähle angezeigte Variablen TableTrackView.Popup.MenuItem.Analyze=Analysiere... TableTrackView.Dialog.Border.Title=Sichtbar: TActions.Action.Description=Beschreibung -TActions.Action.ClearTracks=L�schen +TActions.Action.ClearTracks=Löschen TActions.Action.NewTab=Neue Registerkarte TActions.Action.Copy=Kopiere -TActions.Action.Paste=Einf�gen -TActions.Action.Open=�ffne... -TActions.Action.Close=Schlie�e +TActions.Action.Paste=Einfügen +TActions.Action.Open=Öffne... +TActions.Action.Close=Schließe TActions.Action.Import=Importieren... TActions.Action.Save=Sichere TActions.Action.SaveAs=Sichere unter... TActions.Action.Export=Exportieren.. TActions.Action.CaptureVideo=Erfasse Video... -TActions.Action.Delete=L�schen +TActions.Action.Delete=Löschen TActions.Action.Config=Voreinstellungen TActions.Action.AxesVisible=Sichtbar TActions.Action.TapeVisible=Sichtbar TActions.Action.Print=Drucken -TActions.Action.ClearFilters=L�schen +TActions.Action.ClearFilters=Löschen TActions.Action.ImportVideo=Importiere... -TActions.Action.CloseVideo=Schlie�e -TActions.Action.CloseAll=Schlie�e alles +TActions.Action.CloseVideo=Schließe +TActions.Action.CloseAll=Schließe alles TActions.Action.Exit=Beenden TActions.Dialog.PrintError.Message=Ein Druckfehler ist aufgetreten. TActions.Dialog.PrintError.Title=Druckfehler TActions.Dialog.Description.Title=Beschreibung: -TActions.Dialog.DeleteLockedTracks.Message=Einige Tracks sind gesperrt. Trotzdem l�schen? -TActions.Dialog.DeleteLockedTracks.Title=L�schen gesperrter Tracks? +TActions.Dialog.DeleteLockedTracks.Message=Einige Tracks sind gesperrt. Trotzdem löschen? +TActions.Dialog.DeleteLockedTracks.Title=Löschen gesperrter Tracks? TActions.Dialog.Description.Title=Beschreibung: TActions.Dialog.NewPointMass.Title=Neue Punktmasse TapeMeasure.Name=Abstand @@ -135,16 +135,16 @@ TMenuBar.MenuItem.NewTrack=Neu TMenuBar.MenuItem.CoordsLocked=Gesperrt TMenuBar.MenuItem.CoordsFixedOrigin=Festgelegter Ursprung TMenuBar.MenuItem.CoordsFixedAngle=Festgelegter Winkel -TMenuBar.MenuItem.CoordsFixedScale=Festgelegtes Gr��enverh�ltnis +TMenuBar.MenuItem.CoordsFixedScale=Festgelegtes Größenverhältnis TMenuBar.MenuItem.CoordsRefFrame=Bezugssystem TMenuBar.MenuItem.CoordsDefault=Standardeinstellung TMenuBar.MenuItem.WindowRight=Rechtes Fenster TMenuBar.MenuItem.WindowBottom=Unteres Fenster -TMenuBar.MenuItem.PlayAllSteps=F�hre alle Schritte durch +TMenuBar.MenuItem.PlayAllSteps=Führe alle Schritte durch TMenuBar.MenuItem.Record=Aufnehmen -TMenuBar.MenuItem.MatSize=Abmessung der Arbeitsfl�che +TMenuBar.MenuItem.MatSize=Abmessung der Arbeitsfläche TMenuBar.MenuItem.Language=Sprache -TMenuBar.MenuItem.DeleteTrack=L�sche den Track +TMenuBar.MenuItem.DeleteTrack=Lösche den Track TMenuBar.MenuItem.TrackerHelp=Tracker Hilfe... TMenuBar.MenuItem.MessageLog=Konsole TrackControl.Name=Track Kontrolle @@ -152,7 +152,7 @@ TrackControl.Button.NewTrack=Neu TrackControl.Button.NewTrack.ToolTip=Stelle neuen Track auf TrackControl.Button.Trails.ToolTip=Spuren kurz/lang TrackControl.Button.Labels.ToolTip=Beschriftung -TrackControl.Button.StretchVectors.ToolTip=Vergr��ere Vektoren +TrackControl.Button.StretchVectors.ToolTip=Vergrößere Vektoren TrackControl.Button.Accelerations.ToolTip=Beschleunigungen un-/sichtbar TrackControl.Button.Xmass.ToolTip=Multipliziere mit der Masse TrackControl.Button.Vectors.ToolTip=Vektoren @@ -162,30 +162,30 @@ TrackControl.Button.Positions.ToolTip=Positionen un-/sichtbar Tracker.Popup.MenuItem.Snapshot=Bildschirmfoto Tracker.Popup.MenuItem.Help=Hilfe... Tracker.Cursor.Crosshair.Description=Fadenkreuz zum Markieren von Punkten -Tracker.Action.AboutTracker=�ber Tracker... -Tracker.Dialog.AboutTracker.Title=�ber Tracker -Tracker.Action.AboutJava=�ber Java... -Tracker.Dialog.AboutJava.Title=�ber Java +Tracker.Action.AboutTracker=Über Tracker... +Tracker.Dialog.AboutTracker.Title=Über Tracker +Tracker.Action.AboutJava=Über Java... +Tracker.Dialog.AboutJava.Title=Über Java Tracker.Dialog.AboutJava.UnknownVersion=Unbekannt Tracker.Dialog.AboutJava.Message=Java version -Tracker.Action.AboutQT=�ber QuickTime... -Tracker.Dialog.AboutQT.Title=�ber QuickTime +Tracker.Action.AboutQT=Über QuickTime... +Tracker.Dialog.AboutQT.Title=Über QuickTime Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime Version Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava Version Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava Pfad: Tracker.Dialog.NoQT.Title=QTJava.zip nicht gefunden -Tracker.Dialog.NoQT.Message1=QuickTime f�r Java scheint nicht installiert zu sein. +Tracker.Dialog.NoQT.Message1=QuickTime für Java scheint nicht installiert zu sein. Tracker.Dialog.NoQT.Message2=Wenn mit QuickTime Videos analysiert werden sollen, bitte QuickTime neu installieren -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime f�r Java MUSS AUSGEW�HLT WERDEN beim Installieren von QuickTime +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime für Java MUSS AUSGEWÄHLT WERDEN beim Installieren von QuickTime Tracker.Dialog.UpdateQT.Title=Update QTJava.zip Tracker.Dialog.UpdateQT.Message1=Eine neuere Version von QTJava.zip ist gefunden worden bei -Tracker.Dialog.UpdateQT.Message2=M�chten Sie die bestehende Datei updaten? +Tracker.Dialog.UpdateQT.Message2=Möchten Sie die bestehende Datei updaten? Tracker.Dialog.CopyQT.Title=Kopiere QTJava.zip Tracker.Dialog.CopyQT.Message1=QuickTime is installiert, aber bevor Tracker es benutzen kann: -Tracker.Dialog.CopyQT.Message2= �1. QTJava.zip muss kopiert werden -Tracker.Dialog.CopyQT.Message3= ����zu -Tracker.Dialog.CopyQT.Message4= �2. Tracker muss neu gestartet werden. -Tracker.Dialog.CopyQT.Message5=M�chten Sie QTJava.zip jetzt kopieren? +Tracker.Dialog.CopyQT.Message2=  1. QTJava.zip muss kopiert werden +Tracker.Dialog.CopyQT.Message3=     zu +Tracker.Dialog.CopyQT.Message4=  2. Tracker muss neu gestartet werden. +Tracker.Dialog.CopyQT.Message5=Möchten Sie QTJava.zip jetzt kopieren? Tracker.Dialog.CopyFailed.Title=Kopieren war nicht erfolgreich Tracker.Dialog.CopyFailed.Message=QTJava.zip konnte nicht kopiert werden. Tracker.Dialog.CopiedTo.Title=Kopieren war erfolgreich @@ -193,22 +193,22 @@ Tracker.Dialog.CopiedTo.Message1=QTJava.zip ist erfolgreich kopiert worden nach Tracker.Dialog.CopiedTo.Message2=Tracker muss neu gestartet werden und wird jetzt beendet Tracker.Splash.Loading=Ladend... TrackerIO.Dialog.Import.Title=Importieren -TrackerIO.Dialog.Import.Message=W�hlen Sie Elemente f�r den Import aus +TrackerIO.Dialog.Import.Message=Wählen Sie Elemente für den Import aus TrackerIO.Dialog.ImportVideo.Title=Video importieren TrackerIO.Dialog.Export.Title=Exportieren -TrackerIO.Dialog.Export.Message=W�hlen Sie Elemente f�r den Export aus +TrackerIO.Dialog.Export.Message=Wählen Sie Elemente für den Export aus TrackerIO.Dialog.ReplaceFile.Title=Ersetzen der bestehenden Datei? TrackerIO.Dialog.ReplaceFile.Message=existiert bereits. Wollen Sie es ersetzen? TrackerIO.Dialog.NotTrackerXML.Title=Fehler XML -TrackerIO.Dialog.NotTrackerXML.Message=enth�lt XML-Daten f�r eine andere Anwendung. -TrackerIO.Dialog.BadVideo.Message=Video konnte nicht ge�ffnet werden +TrackerIO.Dialog.NotTrackerXML.Message=enthält XML-Daten für eine andere Anwendung. +TrackerIO.Dialog.BadVideo.Message=Video konnte nicht geöffnet werden TrackerPanel.NewTab.Name=Ohne Titel -TrackerPanel.DragToMark.Hint="Umschalt + Ziehen" um zu markieren -TrackerPanel.Klicken SieToMark.Hint="Umschalt + Mausklick" um zu markieren +TrackerPanel.DragToMark.Hint="Shift+Ziehen" um zu markieren +TrackerPanel.ClickToMark.Hint="Shift+Klick" um zu markieren TrackerPanel.Dialog.LoadFailed.Title=Datei wurde nicht geladen TrackerPanel.Dialog.LoadFailed.Message=Datei konnte nicht geladen werden -TrackerPanel.Dialog.SaveChanges.Title=�nderungen sichern -TrackerPanel.Dialog.SaveChanges.Message=Sichern der �nderungen unter +TrackerPanel.Dialog.SaveChanges.Title=Änderungen sichern +TrackerPanel.Dialog.SaveChanges.Message=Sichern der Änderungen unter TrackPlottingPanel.Popup.MenuItem.Lines=Linien TrackPlottingPanel.Popup.MenuItem.Points=Punkte TrackPlottingPanel.Popup.MenuItem.Scale=Skalierung... @@ -224,11 +224,11 @@ TrackPlottingPanelInspector.Label.Min=Min TrackPlottingPanelInspector.Label.Max=Max TrackPlottingPanelInspector.Label.Auto=Auto TToolBar.Button.Footprint.Tooltip=Festlegen der Form -TToolBar.Dropdown.SelectedTrack.Tooltip=Track ausw�hlen +TToolBar.Dropdown.SelectedTrack.Tooltip=Track auswählen TToolBar.Dropdown.SelectedTrack.None=keine Auswahl -TTrack.MenuItem.Delete=L�schen +TTrack.MenuItem.Delete=Löschen TTrack.MenuItem.Color=Farbe... -TTrack.Dialog.Color.Title=Track-Farbe ausw�hlen +TTrack.Dialog.Color.Title=Track-Farbe auswählen TTrack.MenuItem.Name=Name... TTrack.MenuItem.Footprint=Form TTrack.MenuItem.Description=Beschreibung... @@ -237,21 +237,21 @@ TTrack.MenuItem.TrailVisible=Sichtbare Spur TTrack.MenuItem.Autostep=Automatische Wahl der Schrittweite TTrack.MenuItem.MarkByDefault=Standardauswahl TTrack.MenuItem.Locked=Gesperrt -TTrack.MenuItem.Delete=L�schen +TTrack.MenuItem.Delete=Löschen TTrack.Name.None=kein Name TTrack.Dialog.Description.Title=Beschreibung: TTrack.Dialog.Name.Title=Namen definieren TTrack.Dialog.Name.Label=Name: -TViewChooser.Button.Choose.Tooltip=Ansicht w�hlen +TViewChooser.Button.Choose.Tooltip=Ansicht wählen Vector.Name=Vektor Vector.New.Name=Vektor Vector.MenuItem.ToOrigin=Zum Ursprung Vector.MenuItem.Label=Sichtbare Beschriftung VectorSum.Name=Vektorsumme VectorSum.New.Name=Summe -VectorSum.MenuItem.Inspector=Vektor ausw�hlen... +VectorSum.MenuItem.Inspector=Vektor auswählen... VectorSumInspector.Title=Vektorsumme -VectorSumInspector.Border.Title=Vektor ausw�hlen +VectorSumInspector.Border.Title=Vektor auswählen WorldTView.Popup.MenuItem.Projectile=Projektil-Modell # Additions by Doug Brown 2006-11-01 @@ -273,28 +273,28 @@ DynamicParticle.Property.InitialVelocityY=vy LineProfile.MenuItem.Fixed=Gesichert ParticleModel.New.Name=Modell ParticleModel.MenuItem.InspectModel=Modell erstellen... -ParticleModel.Inspector.Button.Undo=R�ckg�ngig machen +ParticleModel.Inspector.Button.Undo=Rückgängig machen ParticleModel.Inspector.Button.Redo=Wiederherstellen -ParticleModel.Inspector.Button.Close=Schlie�en +ParticleModel.Inspector.Button.Close=Schließen ParticleModel.Inspector.Button.Help=Hilfe # Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=X ausschlie�lich -Calibration.Axes.YOnly=Y ausschlie�lich +Calibration.Axes.XOnly=X ausschließlich +Calibration.Axes.YOnly=Y ausschließlich Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Achsen ausw�hlen, die kalibriert werden sollen +Calibration.Spinner.Axes.Tooltip=Achsen auswählen, die kalibriert werden sollen Calibration.Label.Axes=Achsen -Calibration.Dialog.InvalidCoordinates.Title=Ung�ltige Koordinaten -Calibration.Dialog.InvalidCoordinates.Message=Punkte k�nnen nicht die selben Real-Koordinaten haben. -Calibration.Dialog.InvalidXCoordinates.Message=Punkte k�nnen nicht die selben Real-x-Koordinaten haben. -Calibration.Dialog.InvalidYCoordinates.Message=Punkte k�nnen nicht die selben Real-y-Koordinaten haben. +Calibration.Dialog.InvalidCoordinates.Title=Ungültige Koordinaten +Calibration.Dialog.InvalidCoordinates.Message=Punkte können nicht die selben Real-Koordinaten haben. +Calibration.Dialog.InvalidXCoordinates.Message=Punkte können nicht die selben Real-x-Koordinaten haben. +Calibration.Dialog.InvalidYCoordinates.Message=Punkte können nicht die selben Real-y-Koordinaten haben. SpectralLineFilter.Title=Gas Spektrum SpectralLineFilter.H=Wasserstoff SpectralLineFilter.He=Helium SpectralLineFilter.Ne=Neon SpectralLineFilter.Hg=Quecksilber TFrame.View.Unknown=Ansicht -TMenuBar.MenuItem.Undo=R�ckg�ngig machen +TMenuBar.MenuItem.Undo=Rückgängig machen TMenuBar.MenuItem.Redo=Wiederherstellen TMenuBar.MenuItem.Replace=Ersetzen... TMenuBar.Menu.AddImage=Bild importieren @@ -308,8 +308,8 @@ TMenuBar.Menu.CopyImage=Bild kopieren TMenuBar.MenuItem.CopyMainView=Hauptansicht TMenuBar.MenuItem.CopyFrame=gesamtes Fenster TMenuBar.MenuItem.PrintFrame=Drucken... -TrackerIO.Dialog.AddImage.Title=Bild hinzuf�gen -TTrack.Dialog.Name.BadName=ist bereits gew�hlt worden! Bitte w�hlen Sie einen anderen Namen. +TrackerIO.Dialog.AddImage.Title=Bild hinzufügen +TTrack.Dialog.Name.BadName=ist bereits gewählt worden! Bitte wählen Sie einen anderen Namen. VectorStep.Label.Momentum=p VectorStep.Label.Velocity=v VectorStep.Label.NetForce=Resultierende Kraft @@ -318,8 +318,8 @@ VectorStep.Label.Acceleration=a # Additions by Doug Brown 2007-02-19 PlotTView.Label.NoData=Graphische Darstellung der Track-Daten TableTView.Label.NoData=Tabellarische Darstellung der Track-Daten -TrackerPanel.Message.NoData0=Hauptansicht des Registers, f�r den Videoclip -TrackerPanel.Message.NoData1=W�hlen Sie Datei|�ffnen oder Track|Neu um anzufangen. +TrackerPanel.Message.NoData0=Hauptansicht des Registers, für den Videoclip +TrackerPanel.Message.NoData1=Wählen Sie Datei|Öffnen oder Track|Neu um anzufangen. WorldTView.Label.NoData=Ansicht im Bezugssystem # Additions by Doug Brown 2007-03-03 @@ -330,18 +330,18 @@ DynamicParticle.Solver.RK4=Runge-Kutta DynamicParticle.Solver.ODEMultistep=Adaptives Mehrschrittverfahren DynamicParticle.Table.Force.Border.Title=Kraft Funktionen (t, x, y, vx, vy) AnalyticParticle.Table.Functions.Border.Title=Position-Funktionen (t) -ParticleModel.Table.Initial.Border.Title=Anf�ngliche Werte +ParticleModel.Table.Initial.Border.Title=Anfängliche Werte ParticleModel.Property.InitialT=t # Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Bild einf�gen +TMenuBar.MenuItem.PasteImage=Bild einfügen TMenuBar.MenuItem.PasteAfter=Nach diesem Rahmen TMenuBar.MenuItem.PasteBefore=Vor diesem Rahmen TMenuBar.MenuItem.PasteReplace= Video ersetzen # Additions by Doug Brown 2007-07-01 TMenuBar.MenuItem.GettingStarted=Erste Schritte... -Tracker.Splash.HelpMessage=Neuer Benutzer? W�hlen Sie +Tracker.Splash.HelpMessage=Neuer Benutzer? Wählen Sie # Additions by Doug Brown 2007-08-12 CoordAxes.Label.Angle=Winkel @@ -358,7 +358,7 @@ LineProfile.Data.Description.0=Positions Nummer LineProfile.Data.Description.1=x-Komponente der Position LineProfile.Data.Description.2=y-Komponente der Position LineProfile.Data.Description.3=rot -LineProfile.Data.Description.4=gr�n +LineProfile.Data.Description.4=grün LineProfile.Data.Description.5=blau LineProfile.Data.Description.6=wahrgenommene Helligkeit LineProfile.Data.Description.7=Linienbreite @@ -367,7 +367,7 @@ ParticleModel.MenuItem.StepsVisible=Sichtbare Schritte PointMass.Data.Description.0=Zeit PointMass.Data.Description.1=x-Komponente der Position PointMass.Data.Description.2=y-Komponente der Position -PointMass.Data.Description.3=Wegl�nge +PointMass.Data.Description.3=Weglänge PointMass.Data.Description.4=Winkel der Weg-Richtung PointMass.Data.Description.5=x-Komponente der Geschwindigkeit PointMass.Data.Description.6=y-Komponente der Geschwindigkeit @@ -391,7 +391,7 @@ RGBRegion.Data.Description.0=Zeit RGBRegion.Data.Description.1=x-Komponente des Weges RGBRegion.Data.Description.2=y-Komponente des Weges RGBRegion.Data.Description.3=Rot -RGBRegion.Data.Description.4=Gr�n +RGBRegion.Data.Description.4=Grün RGBRegion.Data.Description.5=Blau RGBRegion.Data.Description.6=Wahrgenommene Helligkeit RGBRegion.Data.Description.7=Anzahl der Pixel @@ -408,7 +408,7 @@ Vector.Data.Description.6=y-Komponente der Endposition Vector.Data.Description.7=Schrittnummer Vector.Data.Description.8=Bildnummer # Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Masse dieses K�rpers +ParticleModel.Parameter.Mass.Description=Masse dieses Körpers ParticleModel.Parameter.InitialTime.Description=Anfangs-Zeit AnalyticParticle.PositionFunction.X.Description=x-Komponente des Weges AnalyticParticle.PositionFunction.Y.Description=y-Komponente des Weges @@ -424,12 +424,12 @@ TrackControl.TrailMenu.NoTrail=Keine Strecke TrackControl.TrailMenu.ShortTrail=Kurze Strecke TrackControl.TrailMenu.LongTrail=Lange Strecke TrackControl.TrailMenu.FullTrail=Gesamte Strecke -TrackerPanel.ModelBuilder.Spinner.Tooltip=Gegenw�rtig ausgew�hltes Modell +TrackerPanel.ModelBuilder.Spinner.Tooltip=Gegenwärtig ausgewähltes Modell TrackerPanel.ModelBuilder.LineButton.Text=Linien-Stil -TrackerPanel.ModelBuilder.LineButton.Tooltip=Linien-Stil ausw�hlen +TrackerPanel.ModelBuilder.LineButton.Tooltip=Linien-Stil auswählen ParticleModel.LineStyle.None=Keine Linien ParticleModel.LineStyle.Connect=Schritte verbinden -ParticleModel.LineStyle.Smooth=Gegl�ttete Linie +ParticleModel.LineStyle.Smooth=Geglättete Linie ModelFunctionPanel.Label=Modell AnalyticFunctionPanel.FunctionEditor.Border.Title=Funktiongleichung des Weges DynamicFunctionPanel.FunctionEditor.Border.Title=Funktionsgleichung der Kraft @@ -447,13 +447,13 @@ TActions.SaveClipAs.ProgressMonitor.Progress=Sichern abgeschlossen PlotTrackView.Checkbox.Synchronize=Sync PlotTrackView.Checkbox.Synchronize.Tooltip=Identische Rechtsachsen RGBRegion.MenuItem.FixedRadius=fester Radius -Tracker.VideoZoom.Hint=Klicken zum Vergr��ern, alt-Klicken zum Verkleinern, Doppel-Klicken zum Anpassen -Tracker.PlotZoomIn.Hint=Ziehen zum Vergr��ern, Doppel-Klicken zum Anpassen +Tracker.VideoZoom.Hint=Klicken zum Vergrößern, alt-Klicken zum Verkleinern, Doppel-Klicken zum Anpassen +Tracker.PlotZoomIn.Hint=Ziehen zum Vergrößern, Doppel-Klicken zum Anpassen Tracker.PlotZoomOut.Hint=Klicken zum Verkleinern Tracker.MenuItem.Hints=Zeige Hinweise -TapeMeasure.Label.Length=L�nge +TapeMeasure.Label.Length=Länge TapeMeasure.Label.TapeAngle=Winkel -TapeMeasure.Label.ArcAngle=Winkelma� +TapeMeasure.Label.ArcAngle=Winkelmaß TrackerIO.Dialog.NotAnImage.Title=falscher Dateityp TrackerIO.Dialog.NotAnImage.Message1=ist kein JPG- oder GIF-Bild. TrackerIO.Dialog.NotAnImage.Message2=Wollen Sie fortfahren? @@ -461,8 +461,8 @@ TToolBar.Button.Zoom.Tooltip=Zoomeinstellungen (Im Videofenster: Z-Taste) TrackChooserTView.DropDown.Tooltip=Trackauswahl TapeMeasure.Field.ArcAngle.Tooltip=Angle from tape to protractor arm TapeMeasure.Field.TapeAngle.Tooltip=Winkel zur positiven x-Achse -TapeMeasure.Field.Magnitude.Tooltip=L�nge in ma�stabsgerechten Welteinheiten -TapeMeasure.Readout.Magnitude.Name=L�ngenwert +TapeMeasure.Field.Magnitude.Tooltip=Länge in maßstabsgerechten Welteinheiten +TapeMeasure.Readout.Magnitude.Name=Längenwert TapeMeasure.Readout.Magnitude.Hint=Klicken Sie to set the scale TapeMeasure.Readout.Angle.Name=Winkelwert TapeMeasure.Readout.Angle.Hint=Klicken Sie to set the angle @@ -473,61 +473,61 @@ TapeMeasure.End.Hint=Zur Abstandsmessung ziehen TapeMeasure.Handle.Name=Griff TapeMeasure.Handle.Hint=Zum Bewegen der Messstrecke ziehen Vector.Tip.Name=Spitze -Vector.Tip.Hint=�ndern der Komponenten durch Ziehen oder Eingabe von Koordinaten +Vector.Tip.Hint=Ändern der Komponenten durch Ziehen oder Eingabe von Koordinaten Vector.Handle.Name=Griff Vector.Handle.Hint=Zum Bewegen des Vektors ziehen Vector.ShortHandle.Hint=Zum Bewegen ziehen, alt-Klicken zur Auswahl der Spitze PointMass.Position.Name=Position -PointMass.Position.Hint=�ndern der Position durch Ziehen oder Eingabe von Koordinaten +PointMass.Position.Hint=Ändern der Position durch Ziehen oder Eingabe von Koordinaten PointMass.Velocity.Name=Geschwindigkeit PointMass.Acceleration.Name=Beschleunigung PointMass.Vector.Hint=Zum Bewegen des Vektors ziehen PointMass.Position.Locked.Hint=Klicken zur Auswahl--Ziehen ist blockiert CoordAxes.Handle.Name=+x-Achse -CoordAxes.Handle.Hint=�ndern des Winkels durch Ziehen +CoordAxes.Handle.Hint=Ändern des Winkels durch Ziehen CoordAxes.Origin.Name=Ursprung CoordAxes.Origin.Hint=Verschieben des Achsenursprungs durch Ziehen OffsetOrigin.Position.Name=Position OffsetOrigin.Position.Hint=Verschieben des Ursprungs durch Ziehen oder Eingabe von Koordinaten Calibration.Point.Name=Kalibrierungspunkt -Calibration.Point.Hint=�ndern der Achsen und des Ma�stabs durch Ziehen oder Eingabe von Koordinaten +Calibration.Point.Hint=Ändern der Achsen und des Maßstabs durch Ziehen oder Eingabe von Koordinaten RGBRegion.Position.Name=Position -RGBRegion.Position.Hint=�ndern der Position durch Ziehen oder Eingabe von Koordinaten +RGBRegion.Position.Hint=Ändern der Position durch Ziehen oder Eingabe von Koordinaten LineProfile.End.Name=Endpunkt -LineProfile.End.Hint=�ndern der Profill�nge durch Ziehen +LineProfile.End.Hint=Ändern der Profillänge durch Ziehen LineProfile.Handle.Name=Griff LineProfile.Handle.Hint=Zum Bewegen des Profils ziehen PointMass.Hint=Masse in der Symbolleiste eingeben PointMass.Unmarked.Hint=, Umschalt-Klicken zur Markierung der Position -TTrack.Unselected.Hint=Zur Auswahl und/oder zum �ndern der Eigenschaften klicken +TTrack.Unselected.Hint=Zur Auswahl und/oder zum Ändern der Eigenschaften klicken Vector.Unmarked.Hint=Zum Zeichnen von Vektoren Umschalt-Ziehen OffsetOrigin.Unmarked.Hint=Umschalt-Klicken zur Markierung des verschobenen Ursprungs Calibration.Unmarked.Hint=Umschalt-Klicken zur Markierung des ersten Punktes Calibration.Halfmarked.Hint=Umschalt-Klicken zur erneuten Markierung -CenterOfMass.Empty.Hint=W�hlen Sie die Massen zur Definition des Systems aus -VectorSum.Empty.Hint=W�hlen Sie die zu addierenden Vektoren aus -TapeMeasure.Hint=L�nge und Winkel der Messstrecke k�nnen durch Eingabe vorgegeben werden -CoordAxes.Hint=Geben Sie einen Wert ein, um den Winkel zu �ndern +CenterOfMass.Empty.Hint=Wählen Sie die Massen zur Definition des Systems aus +VectorSum.Empty.Hint=Wählen Sie die zu addierenden Vektoren aus +TapeMeasure.Hint=Länge und Winkel der Messstrecke können durch Eingabe vorgegeben werden +CoordAxes.Hint=Geben Sie einen Wert ein, um den Winkel zu ändern ParticleModel.Hint=Geben Sie Parameter, Anfangswerte und Bewegungsfunktionen ein. Dann Abspielen -RGBRegion.Hint=�ndern des Radius durch Eingabe +RGBRegion.Hint=Ändern des Radius durch Eingabe RGBRegion.Unmarked.Hint=Umschalt-Klicken zur Markierung der Position TTrack.ImportVideo.Hint=Zum Messen der RGB-Werte Video oder Bild importieren -TTrack.Selected.Hint=ausgew�hlt -LineProfile.Hint=Zum �ndern der Profildicke wert eingeben +TTrack.Selected.Hint=ausgewählt +LineProfile.Hint=Zum Ändern der Profildicke wert eingeben LineProfile.Unmarked.Hint=Zum Zeichen der Profillinie Umschalt-ziehen LineProfile.Menu.Orientation=Orientation LineProfile.MenuItem.Horizontal=waagerecht LineProfile.MenuItem.XAxis=parallel zur x-Achse Footprint.PositionVector=Vektor Footprint.BoldPositionVector=Vektor, fett -Tracker.Startup.Hint=Suchen Sie hier f�r Hinweise (abschaltbar in den Einstellungen), Hilfe erhalten Sie durch Dr�cken von F1 -TrackerPanel.NoVideo.Hint=F�r eine Analyse Video oder Bild �ffnen bzw. importieren -TrackerPanel.CalibrateVideo.Hint=Legen Sie den Ma�stab durch Kalibrierung fest. Dazu brauchen Sie ein festes Objekt mit bekannter L�nge -TrackerPanel.NoTracks.Hint=Zum Messen m�ssen Sie einen entsprechenden Track erzeugen +Tracker.Startup.Hint=Suchen Sie hier für Hinweise (abschaltbar in den Einstellungen), Hilfe erhalten Sie durch Drücken von F1 +TrackerPanel.NoVideo.Hint=Für eine Analyse Video oder Bild öffnen bzw. importieren +TrackerPanel.CalibrateVideo.Hint=Legen Sie den Maßstab durch Kalibrierung fest. Dazu brauchen Sie ein festes Objekt mit bekannter Länge +TrackerPanel.NoTracks.Hint=Zum Messen müssen Sie einen entsprechenden Track erzeugen TrackerPanel.SetClip.Hint=Der Videoclip wird in den Clip Einstellungen festgelegt TrackerPanel.ShowAxes.Hint=Legen Sie Ursprung und Winkel der Koordinatenachsen fest -VideoPlayer.Step.Hint=Schritt vorw�rts (PageDown-Taste) -VideoPlayer.Back.Hint=Schritt r�ckw�rts (PageUp-Taste) +VideoPlayer.Step.Hint=Schritt vorwärts (PageDown-Taste) +VideoPlayer.Back.Hint=Schritt rückwärts (PageUp-Taste) TrackerPanel.DVVideo.Hint=Wenden Sie einen Filter an, um Verzerrungen bei DV-formatierten Videos zu korrigieren TrackerIO.DataFileFilter.Description=Tracker-Dateien Tracker.Button.PDFHelp=druckbare PDF Version @@ -536,10 +536,10 @@ TToolbar.Button.TapeVisible.Tooltip=neue Kalibrierungsoption und/oder Anzeige # Additions by Doug Brown 2009-03-06 TMenuBar.MenuItem.TrackControl=Trackkontrolle TMenuBar.MenuItem.Description=Beschreibung -TrackPlottingPanel.RightDrag.Hint=F�r Optionen Rechts-Ziehen -TMenuBar.MenuItem.DeleteSelectedPoint=Ausgew�hlter Punkt -TFrame.InfoDialog.SaveChanges.Title=�nderungen sichern -TFrame.InfoDialog.SaveChanges.Message=M�chten Sie die �nderungen sichern? +TrackPlottingPanel.RightDrag.Hint=Für Optionen Rechts-Ziehen +TMenuBar.MenuItem.DeleteSelectedPoint=Ausgewählter Punkt +TFrame.InfoDialog.SaveChanges.Title=Änderungen sichern +TFrame.InfoDialog.SaveChanges.Message=Möchten Sie die Änderungen sichern? # Additions by Doug Brown 2009-04-27 DynamicParticle.Editor.Button.Cartesian=rechtwinklig @@ -551,9 +551,9 @@ DynamicParticle.Parameter.InitialOmega.Description=Anfangswert Winkelgeschwindig DynamicParticle.ForceFunction.R.Description=Radialkomponente der Kraft DynamicParticle.ForceFunction.Theta.Description=Tangentialkomponente der Kraft DynamicParticlePolar.Name=Dynamisches Modell (Polarkoordinaten) -DynamicTwoBody.Editor.Button.Particle1=K�rper 1 -DynamicTwoBody.Editor.Button.Particle2=K�rper 2 -DynamicTwoBody.Name=Dynamisches Zwei-K�rper-Modell +DynamicTwoBody.Editor.Button.Particle1=Körper 1 +DynamicTwoBody.Editor.Button.Particle2=Körper 2 +DynamicTwoBody.Name=Dynamisches Zwei-Körper-Modell TMenuBar.Menu.DynamicParticle=Dynamisches Modell TMenuBar.MenuItem.Cartesian=rechtwinklige Koordinaten TMenuBar.MenuItem.Polar=Polarkoordinaten @@ -563,7 +563,7 @@ Autotrack.Inspector.Title=Autotrack PointMass.MenuItem.Autotrack=Autotrack... Dialog.Button.Help=Hilfe AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Zur�ck +AutoTracker.Wizard.Button.Back=Zurück AutoTracker.Wizard.Button.Next=Vor AutoTracker.Wizard.Button.Accept=Annehmen AutoTracker.Wizard.Button.Search=Suchen @@ -579,28 +579,28 @@ AutoTracker.TabbedPane.TabTitle.Settings=Annehmen AutoTracker.TabbedPane.TabTitle.Search=Suche AutoTracker.Info.GetStarted=Strg+Shift+Klick auf das automatisch zu verfolgende Objekt. AutoTracker.Info.MaskLocked1=Die Maske ist in Benutzung und gesperrt. -AutoTracker.Info.MaskLocked2=Klicken Sie auf den Reset-Knopf, um alle Markierungen zu l�schen, die Maske zu entsperren und neu zu beginnen. +AutoTracker.Info.MaskLocked2=Klicken Sie auf den Reset-Knopf, um alle Markierungen zu löschen, die Maske zu entsperren und neu zu beginnen. AutoTracker.Info.Target1=Beim Autotracken werden die Positionen am "Ziel" markiert. Das Ziel ist in Bezug auf die Maske definiert. Zum Bewegen des Ziel ziehen Sie daran. AutoTracker.Info.Target2=Tipp: Die Zielposition kann auch nach Abschluss der Markierung verschoben werden. Dadurch werden alle markierten Position entsprechend verschoben. AutoTracker.Info.TargetLocked=Bewegen des Ziels verschiebt alle bestehenden Markierungen. -AutoTracker.Info.Settings1=Scores gr��er als das Akzeptanzniveau werden automatisch markiert. -AutoTracker.Info.Settings2=Tipp: ein geringeres Akzeptanzniveau beschleunigt den Prozess, erh�ht aber die Ungenauigkeit. +AutoTracker.Info.Settings1=Scores größer als das Akzeptanzniveau werden automatisch markiert. +AutoTracker.Info.Settings2=Tipp: ein geringeres Akzeptanzniveau beschleunigt den Prozess, erhöht aber die Ungenauigkeit. AutoTracker.Info.Frame=Bild -AutoTracker.Info.Match=Es wurde eine �bereinstimmung gefunden und das Ziel markiert. -AutoTracker.Info.Possible=Eine m�gliche �bereinstimmung wurde im Suchgebiet gefunden. W�hlen Sie: -AutoTracker.Info.NoMatch=Es wurde keine �bereinstimmung im Suchgebiet gefunden. W�hlen Sie: -AutoTracker.Info.Outside=Das Suchgebiet ist au�erhalb des Bildes. W�hlen Sie: -AutoTracker.Info.Accepted=Die �bereinstimmung wurde vom Nutzer akzeptiert. +AutoTracker.Info.Match=Es wurde eine Übereinstimmung gefunden und das Ziel markiert. +AutoTracker.Info.Possible=Eine mögliche Übereinstimmung wurde im Suchgebiet gefunden. Wählen Sie: +AutoTracker.Info.NoMatch=Es wurde keine Übereinstimmung im Suchgebiet gefunden. Wählen Sie: +AutoTracker.Info.Outside=Das Suchgebiet ist außerhalb des Bildes. Wählen Sie: +AutoTracker.Info.Accepted=Die Übereinstimmung wurde vom Nutzer akzeptiert. AutoTracker.Info.MarkedByUser=Dieses Schritt wurde vom Nutzer manuell markiert. -AutoTracker.Info.NoVideo=Autotracking ben�tigt ein Video. Importieren Sie ein Video oder schlie�en Sie Autotracker. -AutoTracker.Info.Height=H�he +AutoTracker.Info.NoVideo=Autotracking benötigt ein Video. Importieren Sie ein Video oder schließen Sie Autotracker. +AutoTracker.Info.Height=Höhe AutoTracker.Info.Width=Breite AutoTracker.Info.Accept=--Akzeptieren AutoTracker.Info.Retry=--Verschieben des Suchgebiets mit erneuter Suche AutoTracker.Info.Mark=--Umschalt-Klicken zur manuellen Markierung AutoTracker.Info.Skip=--Dieses Bild auslassen und weiter tracken -AutoTracker.Info.Reset=--Zur�cksetzen und neu Beginnen mit neuer Maske -AutoTracker.Info.MatchScore=Score (�bereinstimmungsg�te) +AutoTracker.Info.Reset=--Zurücksetzen und neu Beginnen mit neuer Maske +AutoTracker.Info.MatchScore=Score (Übereinstimmungsgüte) AutoTracker.Dialog.MaskLocked.Title=Maske gesperrt PointMass.Cursor.Autotrack.Description=Autotrack Cursor VideoPlayer.StartFrame.Hint=Ziehen Sie, um das Startbild festzulegen @@ -611,35 +611,35 @@ FileDropHandler.Dialog.BadFile.Title=Nicht erkannte Datei # Additions by Doug Brown 2009-10-27 Dialog.Button.Apply=Anwenden -DynamicParticle.Dialog.Delete.Message=L�schen dieses K�rpers entfernt aus dem System. Trotzdem l�schen? +DynamicParticle.Dialog.Delete.Message=Löschen dieses Körpers entfernt aus dem System. Trotzdem löschen? DynamicParticle.Dialog.Delete.Title=Dynamisches System DynamicParticle.System.In=in DynamicSystem.Empty=leer DynamicSystem.Force.Name.Internal=innere DynamicSystem.ForceFunction.R.Description=Radialkomponente der inneren Kraft DynamicSystem.ForceFunction.Theta.Description=Tangentialkomponente der inneren Kraft -DynamicSystem.MenuItem.Inspector=W�hlen Sie die K�rper... -DynamicSystem.Name=Dynamisches Zwei-K�rper-System +DynamicSystem.MenuItem.Inspector=Wählen Sie die Körper... +DynamicSystem.Name=Dynamisches Zwei-Körper-System DynamicSystem.New.Name=System DynamicSystem.Parameter.Of=von DynamicSystem.Parameter.RelativeTo=relativ zu DynamicSystem.Parameter.Name.Relative=relativ DynamicSystem.Parameter.ParticleMass.Description=Masse von DynamicSystem.Parameter.Mass.Description=Gesamtmasse dieses Systems -DynamicSystemInspector.Border.Title=K�rper -DynamicSystemInspector.Title=Zwei-K�rper-System +DynamicSystemInspector.Border.Title=Körper +DynamicSystemInspector.Title=Zwei-Körper-System DynamicSystemInspector.Button.Change=Change To... DynamicSystemInspector.ParticleName.None=(none) TMenuBar.MenuItem.Clone=Klonen -TMenuBar.MenuItem.TwoBody=Zwei-K�rper-System -TrackerPanel.DataBuilder.Dropdown.Tooltip=Aktuell ausgew�hlter Track +TMenuBar.MenuItem.TwoBody=Zwei-Körper-System +TrackerPanel.DataBuilder.Dropdown.Tooltip=Aktuell ausgewählter Track TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Synchronisierung der Hochachsen TrackControl.Button.Trace.ToolTip=Bahnkurve un-/sichtbar -TToolBar.Button.Open.Tooltip=�ffnen eines Videos oder einer Tracker-Datei in einer neuen Registerkarte +TToolBar.Button.Open.Tooltip=Öffnen eines Videos oder einer Tracker-Datei in einer neuen Registerkarte TToolBar.Button.Save.Tooltip=Sichern der aktuell gezeigten Registerkarte in einer Datei TToolBar.Button.SelectTrack=Auswahl -TToolBar.Button.SelectTrack.Tooltip=W�hlen eines existierenden Track -TTrack.MenuItem.ClearSteps=L�schen der Schritte +TToolBar.Button.SelectTrack.Tooltip=Wählen eines existierenden Track +TTrack.MenuItem.ClearSteps=Löschen der Schritte PointMass.MenuItem.Position=Position TMenuBar.MenuItem.Empty=(Empty) TTrackBar.Button.Memory=genutztes RAM: @@ -647,30 +647,30 @@ TTrackBar.Button.Memory.Tooltip=Kontrolle und Management des RAM TTrackBar.Memory.PopupItem.Launch=Start von Tracker mit RAM TButton.Track.ToolTip=Einstellen der Eigenschaften von Tracker.Dialog.OutOfMemory.Message1=Tracker hat nicht genug RAM. -Tracker.Dialog.OutOfMemory.Message2=Klicken Sie den RAM-Knopf f�r Optionen. -Tracker.Dialog.OutOfMemory.Title=Nicht gen�gend RAM +Tracker.Dialog.OutOfMemory.Message2=Klicken Sie den RAM-Knopf für Optionen. +Tracker.Dialog.OutOfMemory.Title=Nicht genügend RAM # Additions by Doug Brown 2010-12-27 AutoTracker.Label.Original=Initial AutoTracker.Label.NoMask=keine AutoTracker.Label.Rate=Evolutionsrate: -AutoTracker.Info.Mask3=Tipp: Als Schablone funktioniert am Besten ein unverwechselbares Pixelmuster mit hohem Kontrast. Die Gr��e ist unerheblich. +AutoTracker.Info.Mask3=Tipp: Als Schablone funktioniert am Besten ein unverwechselbares Pixelmuster mit hohem Kontrast. Die Größe ist unerheblich. AutoTracker.Wizard.Checkbox.XAxis=nur X-Achse -AutoTracker.Info.SearchOnAxis1=Eine �bereinstimmung wird auf der x-Achse des sichtbaren Rechtecks gesucht. Bewegen oder vergr��ern Sie das Suchgebiet durch Ziehen in der Mitte bzw. am Griff. -AutoTracker.Info.PossibleOnAxis=Eine m�gliche �bereinstimmung wurde auf der x-Achse im Suchgebiet gefunden. W�hlen Sie: -AutoTracker.Info.NoMatchOnAxis=Es wurde keine �bereinstimmung auf der x-Achse im Suchgebiet gefunden. W�hlen Sie: +AutoTracker.Info.SearchOnAxis1=Eine Übereinstimmung wird auf der x-Achse des sichtbaren Rechtecks gesucht. Bewegen oder vergrößern Sie das Suchgebiet durch Ziehen in der Mitte bzw. am Griff. +AutoTracker.Info.PossibleOnAxis=Eine mögliche Übereinstimmung wurde auf der x-Achse im Suchgebiet gefunden. Wählen Sie: +AutoTracker.Info.NoMatchOnAxis=Es wurde keine Übereinstimmung auf der x-Achse im Suchgebiet gefunden. Wählen Sie: AutoTracker.Info.RetryOnAxis=--bewegen Sie das Suchgebiet oder die x-Achse und suchen Sie nochmal -AutoTracker.Wizard.Button.Delete=L�schen dieser Markierung -AutoTracker.Wizard.Button.DeleteMore=L�schen dieser und aller folgenden Markierungen +AutoTracker.Wizard.Button.Delete=Löschen dieser Markierung +AutoTracker.Wizard.Button.DeleteMore=Löschen dieser und aller folgenden Markierungen Button.Define.Tooltip=Definieren Sie neue Funktionen aus bereits vorhandenen Variablen Calibration.Label.Point=Punkt -CalibrationStick.Hint=Bestimmen Sie den Ma�stab zwischen Videobild und Realwelt -CalibrationStick.End.Hint=Ziehen zum Verl�ngern oder Verk�rzen -CalibrationStick.New.Name=Kalibrierungsma�stab -CalibrationTapeMeasure.New.Name=Kalibrierungsma�band -CalibrationTapeMeasure.Readout.Magnitude.Hint=Klicken Sie, um eine bekannte Realweltl�nge einzugeben -CalibrationTapeMeasure.Hint=Bestimmen Sie den Ma�stab zwischen Videobild und Realwelt -DynamicSystem.Data.Description.0=Abstand der K�rper zu einander +CalibrationStick.Hint=Bestimmen Sie den Maßstab zwischen Videobild und Realwelt +CalibrationStick.End.Hint=Ziehen zum Verlängern oder Verkürzen +CalibrationStick.New.Name=Kalibrierungsmaßstab +CalibrationTapeMeasure.New.Name=Kalibrierungsmaßband +CalibrationTapeMeasure.Readout.Magnitude.Hint=Klicken Sie, um eine bekannte Realweltlänge einzugeben +CalibrationTapeMeasure.Hint=Bestimmen Sie den Maßstab zwischen Videobild und Realwelt +DynamicSystem.Data.Description.0=Abstand der Körper zu einander DynamicSystem.Data.Description.1=Winkel untereinander DynamicSystem.Data.Description.2=relative Radialgeschwindigkeit DynamicSystem.Data.Description.3=relative Winkelgeschwindigkeit @@ -679,52 +679,52 @@ ExportDataDialog.Subtitle.Content=Zellen ExportDataDialog.Subtitle.Format=Zahlenformat ExportDataDialog.Subtitle.Delimiter=Trennzeichen ExportDataDialog.Title=Datenexport -ExportDataDialog.Delimiter.Add=F�ge hinzu... +ExportDataDialog.Delimiter.Add=Füge hinzu... ExportDataDialog.Delimiter.Remove=Entferne... ExportDataDialog.Content.AllCells=Alle Zellen -ExportDataDialog.Content.SelectedCells=Ausgew�hlte Zellen +ExportDataDialog.Content.SelectedCells=Ausgewählte Zellen ExportDataDialog.MenuItem.RemoveDelimiter=Entferne eigenes Trennzeichen ExportDataDialog.Chooser.SaveData.Title=Sichere Daten als ExportVideoDialog.Button.SaveAs=Sichern unter... -ExportVideoDialog.Button.FullSize=Volle Gr��e +ExportVideoDialog.Button.FullSize=Volle Größe ExportVideoDialog.Button.DrawnSize=Wie angezeigt ExportVideoDialog.Content.VideoOnly=Nur Video ExportVideoDialog.Content.VideoAndGraphics=Video und Tracks ExportVideoDialog.Content.GraphicsOnly=Nur Tracks ExportVideoDialog.Title=Videoclipexport ExportVideoDialog.Label.ClipSettings=Clipdaten -ExportVideoDialog.Subtitle.Size=Bildgr��e +ExportVideoDialog.Subtitle.Size=Bildgröße ExportVideoDialog.Subtitle.Content=Inhalt ExportVideoDialog.Subtitle.View=Ansichten ExportVideoDialog.Subtitle.Format=Datieformat ExportVideoDialog.Complete.Message1=Das Video wurde gesichert als -ExportVideoDialog.Complete.Message2=Wollen Sie es jetzt in Tracker �ffnen? +ExportVideoDialog.Complete.Message2=Wollen Sie es jetzt in Tracker öffnen? ExportVideoDialog.Complete.Title=Export vollendet -ExportVideoDialog.VideoSize=Videogr��e -ExportVideoDialog.MatSize=Arbeitsfl�chengr��e -ExportVideo.Dialog.HiddenPlots.Message=Plots m�ssen f�r den Export vollst�ndig sichtbar sein. -ExportVideo.Dialog.HiddenPlots.Title=Unvollst�ndige Ansicht +ExportVideoDialog.VideoSize=Videogröße +ExportVideoDialog.MatSize=Arbeitsflächengröße +ExportVideo.Dialog.HiddenPlots.Message=Plots müssen für den Export vollständig sichtbar sein. +ExportVideo.Dialog.HiddenPlots.Title=Unvollständige Ansicht Footprint.DoubleTarget=doppeltes Fadenkreuz Footprint.BoldDoubleTarget=doppeltes Fadenkreuz, fett OffsetOrigin.MenuItem.Fixed=Feste Weltkoordinaten -ParticleModel.Dialog.Offscreen.Message1=Einige Modellierungsschritte sind unmarkiert, weil sie zu weit au�erhalb liegen. -ParticleModel.Dialog.Offscreen.Message2=�ndern Sie das Modell oder den Ma�stab f�r das Video. +ParticleModel.Dialog.Offscreen.Message1=Einige Modellierungsschritte sind unmarkiert, weil sie zu weit außerhalb liegen. +ParticleModel.Dialog.Offscreen.Message2=Ändern Sie das Modell oder den Maßstab für das Video. ParticleModel.Dialog.Offscreen.Title=Out of Bounds PrefsDialog.Tab.Configuration.Title=Konfigurierung -PrefsDialog.Memory.BorderTitle=RAM-Gr��e +PrefsDialog.Memory.BorderTitle=RAM-Größe PrefsDialog.Tab.General.Title=Andere PrefsDialog.RecentFiles.BorderTitle=Zuletzt benutzte Dateien PrefsDialog.Label.RecentSize=Anzahl der Dateien PrefsDialog.Hints.BorderTitle=Hinweise PrefsDialog.Button.Relaunch=Neu starten -PrefsDialog.Button.ClearRecent=L�schen +PrefsDialog.Button.ClearRecent=Löschen PrefsDialog.Checkbox.DefaultSize=Standard verwenden PrefsDialog.Checkbox.HintsOn=Zeige Hinweise PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.FFMPeg=FFMPeg +PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=RAM-Management ist nicht m�glich mit Web-Start. +PrefsDialog.Dialog.WebStart.Message=RAM-Management ist nicht möglich mit Web-Start. PrefsDialog.Dialog.WebStart.Title=Web-Start Modus PrefsDialog.LookFeel.BorderTitle=Look And Feel PrefsDialog.Language.BorderTitle=Sprache @@ -733,13 +733,13 @@ PrefsDialog.Tab.Runtime.Title=Runtime PrefsDialog.Tab.Display.Title=Anzeige PrefsDialog.Language.Default=default PrefsDialog.Upgrades.Always=jedes Mal -PrefsDialog.Upgrades.Weekly=w�chentlich +PrefsDialog.Upgrades.Weekly=wöchentlich PrefsDialog.Upgrades.Monthly=monatlich PrefsDialog.Upgrades.Never=nie PrefsDialog.Button.CheckForUpgrade=Jetzt suchen -PrefsDialog.FFMPeg.Speed.BorderTitle=Abspielen des Videos -PrefsDialog.FFMPeg.Slow=Ruckelfrei (m�glicherweise langsam) -PrefsDialog.FFMPeg.Fast=Schnell (m�glicherweise ruckelnd) +PrefsDialog.Xuggle.Speed.BorderTitle=Abspielen des Videos +PrefsDialog.Xuggle.Slow=Ruckelfrei (möglicherweise langsam) +PrefsDialog.Xuggle.Fast=Schnell (möglicherweise ruckelnd) PrefsDialog.CalibrationTool.BorderTitle=Standard Kalibrierungswerkzeug Protractor.Name=Winkelmesser Protractor.New.Name=Winkelmesser @@ -757,29 +757,29 @@ Protractor.Rotator.Hint=Zum Drehen des Winkelmessers ziehen Protractor.Readout.Name=Anzeige Protractor.Readout.Hint=Winkel zwischen den Schenkeln ProtractorFootprint.Circle3=kleiner Kreis -ProtractorFootprint.Circle5=gro�er Kreis +ProtractorFootprint.Circle5=großer Kreis ProtractorFootprint.Circle3Bold=kleiner Kreis, fett -ProtractorFootprint.Circle5Bold=gro�er Kreis, fett -Stick.Name=Kalibrierungsma�stab -Stick.New.Name=Kalibrierungsma�stab +ProtractorFootprint.Circle5Bold=großer Kreis, fett +Stick.Name=Kalibrierungsmaßstab +Stick.New.Name=Kalibrierungsmaßstab TableTrackView.MenuItem.Unformatted=Alle Nachkommastellen TableTrackView.MenuItem.Formatted=Wie formatiert TableTrackView.Menu.SetDelimiter=Setze Trennzeichen -TableTrackView.MenuItem.AddDelimiter=F�ge hinzu... +TableTrackView.MenuItem.AddDelimiter=Füge hinzu... TableTrackView.MenuItem.RemoveDelimiter=Entferne... TableTrackView.Dialog.CustomDelimiter.Message=Geben Sie ein Trennzeichen ein: -TableTrackView.Dialog.CustomDelimiter.Title=F�ge Trennzeichen hinzu -TableTrackView.Header.Tooltip=Zum Sortieren klicken, f�r Spaltenwahl doppel-klicken -TableTrackView.MenuItem.CopySelectedData=Kopiere ausgew�hlte Daten -TableTrackView.Dialog.RemoveDelimiter.Message=Zum Entfernen Trennzeichen ausw�hlen: +TableTrackView.Dialog.CustomDelimiter.Title=Füge Trennzeichen hinzu +TableTrackView.Header.Tooltip=Zum Sortieren klicken, für Spaltenwahl doppel-klicken +TableTrackView.MenuItem.CopySelectedData=Kopiere ausgewählte Daten +TableTrackView.Dialog.RemoveDelimiter.Message=Zum Entfernen Trennzeichen auswählen: TableTrackView.Dialog.RemoveDelimiter.Title=Entferne Trennzeichen -TableTrackView.Radians.Tooltip=in Bogenma� +TableTrackView.Radians.Tooltip=in Bogenmaß TableTrackView.Degrees.Tooltip=in Grad -TableTrackView.RadiansPerSecond.Tooltip=in Bogenma�/s +TableTrackView.RadiansPerSecond.Tooltip=in Bogenmaß/s TableTrackView.DegreesPerSecond.Tooltip=in Grad/s -TableTrackView.RadiansPerSecondSquared.Tooltip=in Bogenma�/s^2 +TableTrackView.RadiansPerSecondSquared.Tooltip=in Bogenmaß/s^2 TableTrackView.DegreesPerSecondSquared.Tooltip=in Grad/s^2 -TableTrackView.MenuItem.DeleteDataFunction=L�sche Datenfunktion +TableTrackView.MenuItem.DeleteDataFunction=Lösche Datenfunktion TActions.Action.SaveFrame=Sichere Gesamtregister unter... TActions.AboutVideo=Eigenschaften... TActions.Dialog.AboutVideo.Title=Videoeigenschaften @@ -793,13 +793,13 @@ TActions.Dialog.AboutVideo.FramesPerSecond=fps TActions.Dialog.AboutVideo.Path=Dateipfad TActions.Action.ImportTRK=Tracker-Datei... TActions.Action.ProtractorVisible=Sichtbar -TapeMeasure.MenuItem.FixedLength=Fixierte L�nge +TapeMeasure.MenuItem.FixedLength=Fixierte Länge TextTView.Label.NoTab=Anzeige von Text oder HTML-Seiten -TextTView.NewTab.Text1=Doppel-Klicken zum Editieren des Textes oder Titels. Rechts-Klicken f�r weitere Optionen. -TextTView.NewTab.Text2=Anzeige einer HTML-Seite durch Eingabe einer URL oder Rechts-Klicken, um eine Datei zu �ffnen. +TextTView.NewTab.Text1=Doppel-Klicken zum Editieren des Textes oder Titels. Rechts-Klicken für weitere Optionen. +TextTView.NewTab.Text2=Anzeige einer HTML-Seite durch Eingabe einer URL oder Rechts-Klicken, um eine Datei zu öffnen. TextTView.NewTab.Title=ohne Namen TextTView.Dialog.TabTitle.Title=Titel eingeben -TextTView.MenuItem.OpenHTML=�ffne HTML... +TextTView.MenuItem.OpenHTML=Öffne HTML... TextTView.MenuItem.SetTitle=Titel eingeben... TextTView.Button.NewTab=Neu TextTView.TextEdit.Description=Text @@ -815,25 +815,30 @@ TMenuBar.MenuItem.Data=Datendatei... TMenuBar.Menu.CopyObject=Kopiere Objekt TMenuBar.MenuItem.Coords=Koordinatensystem TMenuBar.MenuItem.VideoClip=Videoclip -TMenuBar.Menu.MeasuringTools=Ma�werkzeuge +TMenuBar.Menu.MeasuringTools=Maßwerkzeuge TMenuBar.Menu.AngleUnits=Winkeleinheiten TMenuBar.MenuItem.Degrees=Grad -TMenuBar.MenuItem.Radians=Bogenma� -Tracker.Dialog.NoFFMPeg.Title=FFMPeg nicht gefunden -Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (betriebssytemunabh�ngige Video Engine) nicht installiert -Tracker.Dialog.NoFFMPeg.Message2=Laden Sie FFMPeg von http://www.FFMPeg.com/FFMPegr/downloads/ herunter. -Tracker.Action.AboutFFMPeg=�ber FFMPeg... -Tracker.Dialog.AboutFFMPeg.Title=�ber FFMPeg -Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg Version +TMenuBar.MenuItem.Radians=Bogenmaß +Tracker.Dialog.NoXuggle.Title=Xuggle nicht gefunden +Tracker.Dialog.NoXuggle.Message1=Xuggle (betriebssytemunabhängige Video Engine) nicht installiert +Tracker.Dialog.NoXuggle.Message2=Laden Sie Xuggle von http://www.xuggle.com/xuggler/downloads/ herunter. +Tracker.Action.AboutXuggle=Über Xuggle... +Tracker.Dialog.AboutXuggle.Title=Über Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle Version +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle Pfad: Tracker.Dialog.NoVideoEngine.Message1=Keine Video Engine gefunden! Ohne Video Engine kann Tracker -Tracker.Dialog.NoVideoEngine.Message2=nur Bilder, Bildfolgen oder animierte GIFs �ffnen. -Tracker.Dialog.NoVideoEngine.Message3=Um FFMPeg, Tracker's bevorzugte Video Engine, zu installieren, +Tracker.Dialog.NoVideoEngine.Message2=nur Bilder, Bildfolgen oder animierte GIFs öffnen. +Tracker.Dialog.NoVideoEngine.Message3=Um Xuggle, Tracker's bevorzugte Video Engine, zu installieren, Tracker.Dialog.NoVideoEngine.Message4=laden Sie die die neueste Trackerversion herunter von: Tracker.Dialog.NoVideoEngine.Title=Fehlende Video Engine +Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's bevorzugte Video Engine, ist nicht installiert. +Tracker.Dialog.NoXuggle.Message2=Um Xuggle zu installieren, laden Sie die die neueste Trackerversion herunter von: +Tracker.Dialog.NoXuggle.Title=Fehlendes Xuggle Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Sprache Tracker.Dialog.InsufficientMemory.Title=Unzureichendes RAM -Tracker.Dialog.InsufficientMemory.Message=Die gew�nschte RAM-Gr��e ist zu gro�. +Tracker.Dialog.InsufficientMemory.Message=Die gewünschte RAM-Größe ist zu groß. TrackerIO.Dialog.TabMustBeSaved.Message1=Die Registerkarte TrackerIO.Dialog.TabMustBeSaved.Message2=muss als Tracker-Datei gesichert werden, um im Gesamtregister enthalten zu sein. TrackerIO.Dialog.TabMustBeSaved.Message3=Wollen Sie die Karte sichern? @@ -847,38 +852,38 @@ TrackerIO.Delimiter.Space=Leerzeichen TrackerIO.Delimiter.Comma=Komma TrackerIO.Delimiter.Semicolon=Semikolon TrackerIO.VideoAndDataFileFilter.Description=Video and Tracker Files -TrackerPanel.Dialog.Version.Message1=Sie �ffnen eine Datei einer anderen Trackerversion. -TrackerPanel.Dialog.Version.Message2=Diese k�nnte Merkmale unterst�tzen, +TrackerPanel.Dialog.Version.Message1=Sie öffnen eine Datei einer anderen Trackerversion. +TrackerPanel.Dialog.Version.Message2=Diese könnte Merkmale unterstützen, TrackerPanel.Dialog.Version.Message3=die in laufenden Trackerversion fehlen. -TrackerPanel.Dialog.Version.Message4=Die letzte Version ist verf�gbar unter: +TrackerPanel.Dialog.Version.Message4=Die letzte Version ist verfügbar unter: TrackerPanel.Dialog.Version.Title=Versionen passen nicht TrackerPanel.Label.ModelStart=Start TrackerPanel.Label.ModelEnd=End -TrackerPanel.Spinner.ModelStart.Tooltip=Setzen Sie das Startbild f�r dieses Modell -TrackerPanel.Spinner.ModelEnd.Tooltip=Setzen Sie das Endbild f�r dieses Modell +TrackerPanel.Spinner.ModelStart.Tooltip=Setzen Sie das Startbild für dieses Modell +TrackerPanel.Spinner.ModelEnd.Tooltip=Setzen Sie das Endbild für dieses Modell TToolbar.Button.ProtractorVisible.Tooltip=Zeigen oder Verbergen des Winkelmessers TToolbar.Button.AxesVisible.Tooltip=Koordinatenachsen un-/sichtbar TToolBar.Button.TrackControl.Tooltip=Trackkontrollfenster un-/sichtbar -TTrack.Dialog.StepSizeWarning.Message1=Warnung: Einige Tracks wurden mit einer Schrittweite gr��er als Eins angelegt, sodass ausgelassene Bilder unmarkiert sind. -TTrack.Dialog.StepSizeWarning.Message2=Eine ge�nderte Schrittweite f�hrt daher sehr wahrscheinlich zu L�cken im Datensatz. +TTrack.Dialog.StepSizeWarning.Message1=Warnung: Einige Tracks wurden mit einer Schrittweite größer als Eins angelegt, sodass ausgelassene Bilder unmarkiert sind. +TTrack.Dialog.StepSizeWarning.Message2=Eine geänderte Schrittweite führt daher sehr wahrscheinlich zu Lücken im Datensatz. TTrack.Dialog.StepSizeWarning.Message3=Geschwindigkeiten und Beschleunigungen werden falsch berechnet, solange nicht alle Schritte des Clips markiert sind. TTrack.Dialog.StepSizeWarning.Title=Warnung -TTrack.Dialog.SkippedStepWarning.Message1=Warnung: Das Auslassen von Schritten bei der Markierung f�hrt zu falschen Ergebnissen. +TTrack.Dialog.SkippedStepWarning.Message1=Warnung: Das Auslassen von Schritten bei der Markierung führt zu falschen Ergebnissen. TTrack.Dialog.SkippedStepWarning.Title=Warnung TTrack.Dialog.SkippedStepWarning.Checkbox=Nicht noch Mal zeigen TTrack.Locked.Hint=gesperrt -TTrack.AngleField.Radians.Tooltip=Winkel in Bogenma� +TTrack.AngleField.Radians.Tooltip=Winkel in Bogenmaß TTrack.AngleField.Degrees.Tooltip=Winkel in Grad -TTrack.AngleField.Popup.Radians=Wechsel zu Bogenma� +TTrack.AngleField.Popup.Radians=Wechsel zu Bogenmaß TTrack.AngleField.Popup.Degrees=Wechsel zu Grad -TTrackBar.Memory.Menu.SetSize=Setzen der RAM-Gr��e... -TTrackBar.Button.Version=Jetzt verf�gbar: Version +TTrackBar.Memory.Menu.SetSize=Setzen der RAM-Größe... +TTrackBar.Button.Version=Jetzt verfügbar: Version TTrackBar.Popup.MenuItem.Upgrade=Jetzt neue Version laden... TTrackBar.Popup.MenuItem.Ignore=Ignorieren -FFMPegVideo.MenuItem.SmoothPlay=ruckelfreies Abspielen +XuggleVideo.MenuItem.SmoothPlay=ruckelfreies Abspielen # Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Kalibrierungsma�band +CalibrationTapeMeasure.Name=Kalibrierungsmaßband CircleFootprint.Circle=Kreis CircleFootprint.FilledCircle=Kreisscheibe CircleFootprint.Dialog.Title=Markierung Kreis @@ -887,48 +892,48 @@ CircleFootprint.Dialog.Checkbox.Bold=Fett CircleFootprint.Dialog.Checkbox.CenterSpot=Mittelpunkt LineProfile.Hint.Marking=Farbprofil durch Ziehen erstellen PageTView.Button.Page=Seite -PageTView.MenuItem.ClosePage=Seite schlie�en -PointMass.Hint.Marking=F�r einen neuen Punkt klicken, f�r den Klone des vorherigen Schritts Enter dr�cken +PageTView.MenuItem.ClosePage=Seite schließen +PointMass.Hint.Marking=Für einen neuen Punkt klicken, für den Klone des vorherigen Schritts Enter drücken PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=ist jetzt verf�gbar unter +PrefsDialog.Dialog.NewVersion.Message2=ist jetzt verfügbar unter PrefsDialog.Dialog.NewVersion.None.Message=Im Moment gibt es keine neue Version. RGBRegion.Hint.Marking=Klicken markiert den Mittelpunkt der Farbregion TMenuBar.MenuItem.Restore=Ansichten wiederherstellen -TrackControl.StretchVectors.None=Keine Vergr��erung +TrackControl.StretchVectors.None=Keine Vergrößerung TViewChooser.Maximize.Tooltip=Maximieren dieser Ansicht TViewChooser.Restore.Tooltip=Ansichten wiederherstellen -Vector.Hint.Marking=F�r einen neuen Vektor ziehen, f�r den Klone des vorherigen Schritts Enter dr�cken +Vector.Hint.Marking=Für einen neuen Vektor ziehen, für den Klone des vorherigen Schritts Enter drücken WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnungen PrefsDialog.Checkbox.WarnIfNoEngine=Keine Video Engine -PrefsDialog.Checkbox.WarnIfFFMPegError=FFMPeg-Fehler +PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle-Fehler PropertiesDialog.Title=Eigenschaften -PropertiesDialog.Label.Author=Autor +PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Eigenschaften... -TActions.Action.OpenBrowser=�ffne Library Browser... -TFrame.Progress.FFMPeg=FFMPeg loading frame +TActions.Action.OpenBrowser=Öffne Library Browser... +TFrame.Progress.Xuggle=Xuggle loading frame TFrame.Progress.ClickToCancel=(Zum Abrechen Klicken) TFrame.Dialog.StalledVideo.Title=Fehler beim Laden des Videos -TFrame.Dialog.StalledVideo.Message0=Es gibt Probleme/Verz�gerungen beim Laden des Videos. -TFrame.Dialog.StalledVideo.Message1=Sie k�nnen den Ladevorgang abbrechen oder noch ein bisschen Geduld haben. -TFrame.Dialog.StalledVideo.Message2=Weitere Optionen, um dieses Video zu �ffnen, sind: +TFrame.Dialog.StalledVideo.Message0=Es gibt Probleme/Verzögerungen beim Laden des Videos. +TFrame.Dialog.StalledVideo.Message1=Sie können den Ladevorgang abbrechen oder noch ein bisschen Geduld haben. +TFrame.Dialog.StalledVideo.Message2=Weitere Optionen, um dieses Video zu öffnen, sind: TFrame.Dialog.StalledVideo.Message3=1. Konvertieren Sie das Video mit einem entsprechenden Programm in ein anderes Format. -TFrame.Dialog.StalledVideo.Message4=2. W�hlen Sie QuickTime als Video Engine. +TFrame.Dialog.StalledVideo.Message4=2. Wählen Sie QuickTime als Video Engine. TFrame.Dialog.StalledVideo.MessageMac=2. Starten Sie Tracker mit einer 32-bit Java VM und nutzen Sie QuickTime. TFrame.Dialog.StalledVideo.Button.Stop=Stopp TFrame.Dialog.StalledVideo.Button.Wait=Warten Tracker.Dialog.NoVideoEngine.Checkbox=Nicht wieder anzeigen TrackerIO.ZipFileFilter.Description=ZIP Archive -TrackerIO.Dialog.ErrorFFMPEG.Message1=Beim �ffnen dieses Videos mit FFMPeg gibt es folgenden Fehler: +TrackerIO.Dialog.ErrorFFMPEG.Message1=Beim Öffnen dieses Videos mit Xuggle gibt es folgenden Fehler: TrackerIO.Dialog.ErrorFFMPEG.Message2=Nicht alle Fehler sind fatal. Die komplette Fehlermeldung finden Sie unter Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Falls FFMPeg versagt, klappt es m�glicherweise mit QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Falls Xuggle versagt, klappt es möglicherweise mit QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Bemerkung: Unter Mac OSX muss Tracker dann in einer 32-bit Java VM laufen. -TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Fehler -TrackerIO.ErrorFFMPEG.LogMessage=F�r mehr Details stellen Sie die Warnungen f�r FFMPeg in Bearbeiten|Voreinstellungen ein. -TToolBar.Button.OpenBrowser.Tooltip=�ffnen des OSP Digital Library Browser +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Fehler +TrackerIO.ErrorFFMPEG.LogMessage=Für mehr Details stellen Sie die Warnungen für Xuggle in Bearbeiten|Voreinstellungen ein. +TToolBar.Button.OpenBrowser.Tooltip=Öffnen des OSP Digital Library Browser # Additions by Doug Brown 2011-07-04 VideoFilter.Deinterlace=Deinterlace @@ -939,7 +944,7 @@ VideoFilter.GrayScale=Graustufen VideoFilter.Brightness=Helligkeit VideoFilter.Baseline=Baseline VideoFilter.Sum=Summe -VideoFilter.Resize=Gr��e �ndern +VideoFilter.Resize=Größe ändern VideoFilter.Rotate=Drehung VideoFilter.Perspective=Perspective @@ -951,21 +956,21 @@ TFrame.Dialog.NoTRKInComPADRE.Message=Es wurde keine Tracker-Datei gefunden im N AnalyticParticle.Builder.Title=Punktmasse, kinematisch DynamicParticle.Builder.Title=Punktmasse, dynamisch (rechtwinklige Koordinaten) DynamicParticlePolar.Builder.Title=Punktmasse, dynamisch (Polarkoordinaten) -DynamicSystem.Builder.Title=Dynamisches System (Innere Kr�fte) +DynamicSystem.Builder.Title=Dynamisches System (Innere Kräfte) PropertiesDialog.Button.CopyFilePath=Kopiere Dateipfad PropertiesDialog.Button.CopyVideoPath=Kopiere Videopfad PropertiesDialog.Tab.TrackerFile=Tracker-Datei PropertiesDialog.Tab.Metadata=Metadaten PropertiesDialog.Header.Property=Eigenschaft PropertiesDialog.Header.Value=Wert -TActions.Action.OpenURL=�ffne URL... -TActions.Dialog.OpenURL.Title=�ffne URL +TActions.Action.OpenURL=Öffne URL... +TActions.Dialog.OpenURL.Title=Öffne URL TActions.Dialog.OpenURL.Message=Geben Sie die URL eines Videos, einer Tracker-Datei oder eines Tracker-Ziparchivs ein TActions.Dialog.AboutVideo.Name=Name # Additions by Doug Brown 2011-08-25 PrefsDialog.CacheFiles.BorderTitle=Web-Dateien im Cache -PrefsDialog.Button.ClearCache=L�schen +PrefsDialog.Button.ClearCache=Löschen # Additions by Doug Brown 2011-10-07 PointMass.Remark.Hint=, zum nochmaligen Markieren der hervorgehobenen Position Umschalt-klicken @@ -982,32 +987,32 @@ AutoTracker.Label.Frame=Bild AutoTracker.Label.Point=Punkt AutoTracker.Label.Template=Schablone AutoTracker.Label.Track=Track -AutoTracker.Label.Match=�bereinstimmung +AutoTracker.Label.Match=Übereinstimmung AutoTracker.Label.NoTemplate=Keine Schablone AutoTracker.Label.EvolutionRate=Evolutionsrate AutoTracker.Label.Automark=Akzeptanzniveau -AutoTracker.Info.Instructions=Klicken Sie einen der Such-Buttons, um eine �bereinstimmung im Suchgebiet zu finden. -AutoTracker.Info.KeyFrame.Instructions1=Dieses Bild (key-rame) definiert die Schablone und das Ziel. Klicken Sie einen der Such-Buttons, um eine �bereinstimmung mit der Schablone im Suchgebiet in den n�chsten Bildern zu finden. -AutoTracker.Info.KeyFrame.Instructions2=Ziehen Sie am Ziel, an der Schablone oder dem Suchgebiet, um sie zu verschieben oder zu �ndern. -AutoTracker.Info.MouseOver.Instructions=Bewegen Sie den Cursor �ber die Begriffe, um mehr zu erfahren. -AutoTracker.Info.Mask1=Die Schablone ist die zu suchende Anordnung von Bildpixeln. Sie wird in einem "key frame" festgelegt, entwickelt sich aber von Bild zu Bild, um sich an Form- und Farb�nderungen anzupassen. -AutoTracker.Info.Mask2= Das Akzeptanzniveau legt fest, wie gro� die �bereinstimmung f�r eine automatische Markierung des Ziel sein muss. -AutoTracker.Info.Mask.Instructions=Zum Verschieben oder zur Gr��en�nderung der Schablone ziehen Sie am Rand bzw. am Eckgriff (nur im key frame). Stellen Sie die Evolutionsrate und das Akzeptanzniveau mit den Pfeiltasten ein. -AutoTracker.Info.Mask.Tip=Ein zu niedriges Akzeptanzniveau kann zu falschen �bereinstimmungen f�hren--versuchen Sie es eher mit einer h�heren Evolutionsrate. -AutoTracker.Info.Search=Im Suchgebiet wird nach der besten �bereinstimmung mit der Schablone gesucht. -AutoTracker.Info.SearchOnAxis=Es wird nur auf der x-Achse im Suchgebiet nach der besten �bereinstimmung mit der Schablone gesucht. -AutoTracker.Info.Search.Instructions=Zum Verschieben oder zur Gr��en�nderung des Suchgebiets ziehen Sie am Rand bzw. am Eckgriff. W�hlen Sie ggf. die Optionen x-Achse und Mitbewegt aus. -AutoTracker.Info.Search.Tip=In den meisten F�llen muss das Suchgebiet nicht gro� sein. Die Option "Mitbewegt" bewegt das Suchgebiet automatisch weiter. -AutoTracker.Info.Target=Beim Autotracken wird das "Ziel" f�r den ausgew�hlten Track und Punkt markiert. -AutoTracker.Info.Target.Instructions=Bewegen Sie das Ziel durch Ziehen (nur im key frame). W�hlen Sie den Track und den Punkt aus den Listen. +AutoTracker.Info.Instructions=Klicken Sie einen der Such-Buttons, um eine Übereinstimmung im Suchgebiet zu finden. +AutoTracker.Info.KeyFrame.Instructions1=Dieses Bild (key-rame) definiert die Schablone und das Ziel. Klicken Sie einen der Such-Buttons, um eine Übereinstimmung mit der Schablone im Suchgebiet in den nächsten Bildern zu finden. +AutoTracker.Info.KeyFrame.Instructions2=Ziehen Sie am Ziel, an der Schablone oder dem Suchgebiet, um sie zu verschieben oder zu ändern. +AutoTracker.Info.MouseOver.Instructions=Bewegen Sie den Cursor über die Begriffe, um mehr zu erfahren. +AutoTracker.Info.Mask1=Die Schablone ist die zu suchende Anordnung von Bildpixeln. Sie wird in einem "key frame" festgelegt, entwickelt sich aber von Bild zu Bild, um sich an Form- und Farbänderungen anzupassen. +AutoTracker.Info.Mask2= Das Akzeptanzniveau legt fest, wie groß die Übereinstimmung für eine automatische Markierung des Ziel sein muss. +AutoTracker.Info.Mask.Instructions=Zum Verschieben oder zur Größenänderung der Schablone ziehen Sie am Rand bzw. am Eckgriff (nur im key frame). Stellen Sie die Evolutionsrate und das Akzeptanzniveau mit den Pfeiltasten ein. +AutoTracker.Info.Mask.Tip=Ein zu niedriges Akzeptanzniveau kann zu falschen Übereinstimmungen führen--versuchen Sie es eher mit einer höheren Evolutionsrate. +AutoTracker.Info.Search=Im Suchgebiet wird nach der besten Übereinstimmung mit der Schablone gesucht. +AutoTracker.Info.SearchOnAxis=Es wird nur auf der x-Achse im Suchgebiet nach der besten Übereinstimmung mit der Schablone gesucht. +AutoTracker.Info.Search.Instructions=Zum Verschieben oder zur Größenänderung des Suchgebiets ziehen Sie am Rand bzw. am Eckgriff. Wählen Sie ggf. die Optionen x-Achse und Mitbewegt aus. +AutoTracker.Info.Search.Tip=In den meisten Fällen muss das Suchgebiet nicht groß sein. Die Option "Mitbewegt" bewegt das Suchgebiet automatisch weiter. +AutoTracker.Info.Target=Beim Autotracken wird das "Ziel" für den ausgewählten Track und Punkt markiert. +AutoTracker.Info.Target.Instructions=Bewegen Sie das Ziel durch Ziehen (nur im key frame). Wählen Sie den Track und den Punkt aus den Listen. AutoTracker.Info.Title.Settings=Einstellungen AutoTracker.Info.Title.Tip=Tipp -AutoTracker.Info.SelectTrack=Bitte w�hlen oder erzeugen Sie den Track und den Punkt, die Sie autotracken wollen. -AutoTracker.Info.OutsideXAxis=Die x-Achse liegt nicht im Suchgebiet. Sie haben folgende M�glichkeiten: -AutoTracker.Info.NewKeyFrame=--gehen Sie zur�ck und �ndern Sie die Evolutionsrate oder Umschalt-Strg-Klicken Sie zur Definition eines neuen key frames. +AutoTracker.Info.SelectTrack=Bitte wählen oder erzeugen Sie den Track und den Punkt, die Sie autotracken wollen. +AutoTracker.Info.OutsideXAxis=Die x-Achse liegt nicht im Suchgebiet. Sie haben folgende Möglichkeiten: +AutoTracker.Info.NewKeyFrame=--gehen Sie zurück und ändern Sie die Evolutionsrate oder Umschalt-Strg-Klicken Sie zur Definition eines neuen key frames. AutoTracker.Info.Replace=--akzeptieren Sie den Vorschlag und ersetzen Sie die vorhandene Markierung AutoTracker.Info.Keep=--behalten Sie die vorhandene Markierung -AutoTracker.Info.PossibleReplace=Eine m�gliche �bereinstimmung wurde als Ersatz f�r die vorhandene Markierung gefunden. Sie haben folgende M�glichkeiten: +AutoTracker.Info.PossibleReplace=Eine mögliche Übereinstimmung wurde als Ersatz für die vorhandene Markierung gefunden. Sie haben folgende Möglichkeiten: AutoTracker.Wizard.Button.Accept=Akzeptieren AutoTracker.Wizard.Button.Stop=Stoppen AutoTracker.Wizard.Button.Skip=Auslassen @@ -1015,24 +1020,24 @@ AutoTracker.Wizard.Button.Replace=Ersetzen AutoTracker.Wizard.Button.Keep=Behalten AutoTracker.Wizard.Button.Search=Suche AutoTracker.Wizard.Button.SearchThis=Suche hier -AutoTracker.Wizard.Button.SearchNext=Suche n�chsten -AutoTracker.Wizard.Button.Delete=L�schen +AutoTracker.Wizard.Button.SearchNext=Suche nächsten +AutoTracker.Wizard.Button.Delete=Löschen AutoTracker.Wizard.Button.ShowKeyFrame=Zeige Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=L�sche Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Lösche Key Frame AutoTracker.Wizard.Checkbox.LookAhead=Mitbewegt AutoTracker.Wizard.Checkbox.XAxis=Nur x-Achse AutoTracker.Wizard.Menuitem.DeleteThis=Diese Markierung -AutoTracker.Wizard.Menuitem.DeleteLater=Sp�tere Markierungen +AutoTracker.Wizard.Menuitem.DeleteLater=Spätere Markierungen AutoTracker.Wizard.Menuitem.DeleteAll=Alle Markierungen TToolBar.Button.AutoTracker.Tooltip=Autotrackerfenster un-/sichtbar -MainTView.Popup.MenuItem.ZoomIn=Vergr��ern +MainTView.Popup.MenuItem.ZoomIn=Vergrößern MainTView.Popup.MenuItem.ZoomOut=Verkleinern -MainTView.Popup.MenuItem.ZoomToFit=Gr��e anpassen +MainTView.Popup.MenuItem.ZoomToFit=Größe anpassen TrackerIO.Dialog.DurationVaries.Title=Variable Bilddauer TrackerIO.Dialog.DurationVaries.Message1=Die Anzeigedauer einiger Bilder dieses Videos weicht vom Mittel stark ab; mehr als: -TrackerIO.Dialog.DurationVaries.Message2=F�r genaue Berechnungen der Geschwindigkeit und Beschleunigung sollten Sie diese Bilder -TrackerIO.Dialog.DurationVaries.Message3=durch neues Setzen des Start- und Endbildes des Videoclips ausschlie�en. -TrackerIO.Dialog.DurationVaries.Message4=Auszuschlie�ende Bilder: +TrackerIO.Dialog.DurationVaries.Message2=Für genaue Berechnungen der Geschwindigkeit und Beschleunigung sollten Sie diese Bilder +TrackerIO.Dialog.DurationVaries.Message3=durch neues Setzen des Start- und Endbildes des Videoclips ausschließen. +TrackerIO.Dialog.DurationVaries.Message4=Auszuschließende Bilder: TrackerIO.Dialog.DurationVaries.Message5=Mittlere Anzeigedauer und Bildrate, falls ausgeschlossen: TFrame.Dialog.LibraryError.Title=Fehler TFrame.Dialog.LibraryError.Message=Es konnte keine Datei unter diesem Netzknoten geladen werden: @@ -1040,58 +1045,58 @@ TFrame.Dialog.LibraryError.Message=Es konnte keine Datei unter diesem Netzknoten # Additions by Doug Brown 2011-12-01 TTrack.Label.Unmarked=Markieren durch Umschalt-Klicken PrefsDialog.Label.Path=Pfad -PrefsDialog.Checkbox.ClearCacheOnExit=Beim Verlassen l�schen +PrefsDialog.Checkbox.ClearCacheOnExit=Beim Verlassen löschen PrefsDialog.FileChooser.Title.Cache=Cache festlegen PrefsDialog.FileFilter.Directories=Verzeichnisse -Tracker.Action.AboutThreads=�ber Threads... +Tracker.Action.AboutThreads=Über Threads... PrefsDialog.JRE.BorderTitle=Java Virtual Machine PrefsDialog.FileChooser.Title.JRE=Java VM festlegen PrefsDialog.FileFilter.JRE=Verzeichnisse und Java VMs PrefsDialog.Version.BorderTitle=Tracker Version PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Beim Verlassen l�schen -PrefsDialog.Run.BorderTitle=Beim Starten ausgef�hrte Programme -PrefsDialog.FileChooser.Title.Run=W�hlen Sie ausf�hrbare Dateien aus +PrefsDialog.Tab.ClearCacheOnExit=Beim Verlassen löschen +PrefsDialog.Run.BorderTitle=Beim Starten ausgeführte Programme +PrefsDialog.FileChooser.Title.Run=Wählen Sie ausführbare Dateien aus PrefsDialog.Button.Save=Sichern Tracker.Readme=Tracker README Tracker.Readme.NotFound=README-Datei nicht gefunden Popup.MenuItem.Algorithm=Algorithmen... AlgorithmDialog.Button.FiniteDifference=Finite Differenzen AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=W�hlen Sie den Berechnungsalgorithmus der Geschwindigkeit und Beschleunigung: +AlgorithmDialog.TitledBorder.Choose=Wählen Sie den Berechnungsalgorithmus der Geschwindigkeit und Beschleunigung: AlgorithmDialog.Title=Algorithmen AlgorithmDialog.FiniteDifference.Message1=Dies ist der Standardalgorithmus: AlgorithmDialog.FiniteDifference.Message2=Geschwindigkeit: v[i] = (x[i+1] - x[i-1]) / (2*dt) AlgorithmDialog.FiniteDifference.Message3=Beschleunigung: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Dieser Algorithmus gl�ttet Geschwindigkeit und Beschleunigung, erkennt aber noch abrupte Geschwindigkeits�nderungen. +AlgorithmDialog.BounceDetect.Message1=Dieser Algorithmus glättet Geschwindigkeit und Beschleunigung, erkennt aber noch abrupte Geschwindigkeitsänderungen. AlgorithmDialog.BounceDetect.Message2=Achtung: kann Artefakte produzieren. Weitere Information unter: TMenuBar.Menu.Diagnostics=Diagnostik # Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Ung�ltiges XML +Tracker.Dialog.Invalid.Title=Ungültiges XML Tracker.Dialog.Invalid.Message=Die Datei kann nicht gelesen werden. TrackPlottingPanel.Popup.Menu.CompareWith=Vergleiche mit TrackerPanel.DataBuilder.TrackType.Unknown=unbekannt TrackerPanel.DataBuilder.Button.Load.Tooltip=Lade Datenfunktionen aus einer XML-Datei TrackerPanel.DataBuilder.Button.Save.Tooltip=Sichere Datenfunktionen in einer XML-Datei TrackerPanel.DataBuilder.Load.Title=Datenfunktionen laden -TrackerPanel.DataBuilder.Load.Message=W�hlen Sie die zu ladenden Funktionen: +TrackerPanel.DataBuilder.Load.Message=Wählen Sie die zu ladenden Funktionen: TrackerPanel.DataBuilder.Save.Title=Datenfunktionen sichern -TrackerPanel.DataBuilder.Save.Message=W�hlen Sie die zu sichernden Funktionen: +TrackerPanel.DataBuilder.Save.Message=Wählen Sie die zu sichernden Funktionen: TrackerPanel.DataBuilder.Dialog.Load.Button.All=In Alle laden TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Nur laden in TrackerPanel.DataBuilder.Dialog.Load.Title=Trackauswahl TrackerPanel.DataBuilder.Dialog.Load.Message=Wollen Sie die Funktionen in alle Tracks laden der Art TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Falsche Trackart -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Die Datei definiert Datenfunktionen f�r die Trackart -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Sie passen nicht f�r die Trackarten +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Die Datei definiert Datenfunktionen für die Trackart +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Sie passen nicht für die Trackarten TrackerPanel.DataBuilder.Dialog.WrongType.Title=Falsche Art TrackerPanel.DataBuilder.Dialog.WrongType.Message=Die Datei definiert keine Datenfunktionen. TToolbar.Button.Refresh=Daten und Ansichten neu aufbereiten # Additions by Doug Brown 2012-04-22 ExportTRKDialog.Complete.Message1=Das ZIP-Archiv wurde gesichert in -ExportTRKDialog.Complete.Message2=Wollen Sie sie jetzt in Tracker �ffnen? +ExportTRKDialog.Complete.Message2=Wollen Sie sie jetzt in Tracker öffnen? ExportTRKDialog.Complete.Title=Export vollendet ExportTRKDialog.Title=Export in ein ZIP-Archiv ExportTRKDialog.Message1=Der Export besteht aus: (1) Export des Videoclips, (2) Datensicherung in einer neuen Tracker-Datei. @@ -1115,12 +1120,12 @@ PerspectiveTrack.Corner=Ecke PrefsDialog.LogLevel.BorderTitle=Log-Level der Konsole Protractor.Data.Description.0=Zeit Protractor.Data.Description.1=Winkelmesser Winkel -Protractor.Data.Description.2=Schenkell�nge 1 -Protractor.Data.Description.3=Schenkell�nge 2 +Protractor.Data.Description.2=Schenkellänge 1 +Protractor.Data.Description.3=Schenkellänge 2 Protractor.Data.Description.4=Schrittnummer Protractor.Data.Description.5=Bildnummer TapeMeasure.Data.Description.0=Zeit -TapeMeasure.Data.Description.1=L�nge +TapeMeasure.Data.Description.1=Länge TapeMeasure.Data.Description.2=Winkel zur +x-Achse TapeMeasure.Data.Description.3=Schrittnummer TapeMeasure.Data.Description.4=Bildnummer @@ -1129,17 +1134,17 @@ TapeMeasure.Data.Description.4=Bildnummer AutoTracker.Info.Unsearched=ungesucht AutoTracker.Info.KeyFrame=Key Frame AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Diesen Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Diese �bereinstimmung -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Sp�tere �bereinstimmungen +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Diese Übereinstimmung +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Spätere Übereinstimmungen PrefsDialog.Checkbox.64BitVM=64-bit # Additions by Doug Brown 2012-11-20 AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Hinzuf�gen +Dialog.Button.Add=Hinzufügen Dialog.Button.Remove=Entfernen -PrefsDialog.Button.ClearHost=L�sche Host -PrefsDialog.Button.ClearHost.Tooltip=L�sche alle mit einem ausgew�hlten Web-Host assoziierten Dateien aus dem OSP Cache -PrefsDialog.Button.ClearCache.Tooltip=L�sche alle Dateien im OSP Cache +PrefsDialog.Button.ClearHost=Lösche Host +PrefsDialog.Button.ClearHost.Tooltip=Lösche alle mit einem ausgewählten Web-Host assoziierten Dateien aus dem OSP Cache +PrefsDialog.Button.ClearCache.Tooltip=Lösche alle Dateien im OSP Cache TActions.Action.SaveZip=Exportiere ZIP-Archiv ThumbnailDialog.Title=Exportiere Thumbnail Bild ThumbnailDialog.Settings.Title=Thumbnail Optionen @@ -1155,7 +1160,7 @@ ThumbnailDialog.Chooser.SaveThumbnail.Title=Sichere Thumbnail ThumbnailDialog.Subtitle.Image=Bild TMenuBar.MenuItem.Thumbnail=Thumbnail Bild TToolBar.Button.SaveZip.Tooltip=Exportiere ein ZIP-Archiv in die OSP Digital Library -TTrack.MenuItem.DeletePoint=L�sche ausgew�hlten Schritt +TTrack.MenuItem.DeletePoint=Lösche ausgewählten Schritt ZipResourceDialog.Title=Exportiere ZIP-Archiv ZipResourceDialog.Label.Format=Format ZipResourceDialog.Label.Title=Name @@ -1164,69 +1169,69 @@ ZipResourceDialog.Label.Keywords=Keywords ZipResourceDialog.Label.Link=Externer Link ZipResourceDialog.Label.HTML=HTML Quelle ZipResourceDialog.Complete.Message1=Das ZIP-Archiv wurde gesichert unter -ZipResourceDialog.Complete.Message2=Wollen Sie es jetzt in Tracker �ffnen? -ZipResourceDialog.Complete.Title=Vollst�ndig gesichert +ZipResourceDialog.Complete.Message2=Wollen Sie es jetzt in Tracker öffnen? +ZipResourceDialog.Complete.Title=Vollständig gesichert ZipResourceDialog.Border.Title.Documentation=HTML Dokumentation ZipResourceDialog.Border.Title.Video=Video ZipResourceDialog.Border.Title.Thumbnail=Thumbnail ZipResourceDialog.FileChooser.SaveZip.Title=Exportiere ZIP-Archiv -ZipResourceDialog.FileChooser.AddFile.Title=F�ge Datei zum ZIP-Archiv hinzu -ZipResourceDialog.FileChooser.OpenHTML.Title=�ffne HTML Datei -ZipResourceDialog.Button.AddFiles=F�ge Dateien hinzu +ZipResourceDialog.FileChooser.AddFile.Title=Füge Datei zum ZIP-Archiv hinzu +ZipResourceDialog.FileChooser.OpenHTML.Title=Öffne HTML Datei +ZipResourceDialog.Button.AddFiles=Füge Dateien hinzu ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Optionen ZipResourceDialog.Checkbox.TrimVideo=Auf den Clip beschneiden ZipResourceDialog.AddHTMLInfo.Title=HTML Info Datei ZipResourceDialog.AddHTMLInfo.Message1=Wollen Sie die HTML Infodatei -ZipResourceDialog.AddHTMLInfo.Message2=zum ZIP-Archiv hinzuf�gen? +ZipResourceDialog.AddHTMLInfo.Message2=zum ZIP-Archiv hinzufügen? ZipResourceDialog.HTMLField.DefaultText=Ohne Angabe einer Datei, wird eine neue erzeugt -ZipResourceDialog.Dialog.AddFiles.Title=F�ge HTML und PDF Dateien hinzu +ZipResourceDialog.Dialog.AddFiles.Title=Füge HTML und PDF Dateien hinzu ZipResourceDialog.Tooltip.HTML=Pfad zur HTML Quelldatei (falls ohne, wird eine neue erzeugt) ZipResourceDialog.Tooltip.Author=Autoren dieses Archivs ZipResourceDialog.Tooltip.Title=Titel dieses Archivs (nicht der Dateiname) -ZipResourceDialog.Tooltip.Description=Eine pr�gnante Beschreibung des Archivinhalts -ZipResourceDialog.Tooltip.Keywords=Eine Liste von Stichw�rtern f�r die Suche im DL browser +ZipResourceDialog.Tooltip.Description=Eine prägnante Beschreibung des Archivinhalts +ZipResourceDialog.Tooltip.Keywords=Eine Liste von Stichwörtern für die Suche im DL browser ZipResourceDialog.Tooltip.Contact=Kontaktinformation des Autors (Institution, Email, Webseite, etc.) -ZipResourceDialog.Tooltip.Link=URL einer externen HTML Datei mit weiteren Informationen �ber dieses Archiv -ZipResourceDialog.Tooltip.ThumbnailSettings=�ndern Sie die Thumbnail Ansicht, die Gr��e oder den Dateityp -ZipResourceDialog.Tooltip.AddFiles=F�ge HTML und PDF Dateien zum ZIP-Archiv hinzu -ZipResourceDialog.Tooltip.TrimVideo=H�kchen exportiert den Videoclip, kein H�kchen das Originalvideo -ZipResourceDialog.Tooltip.LoadHTML=W�hlen Sie im Dateimanager eine HTML Infodatei +ZipResourceDialog.Tooltip.Link=URL einer externen HTML Datei mit weiteren Informationen über dieses Archiv +ZipResourceDialog.Tooltip.ThumbnailSettings=Ändern Sie die Thumbnail Ansicht, die Größe oder den Dateityp +ZipResourceDialog.Tooltip.AddFiles=Füge HTML und PDF Dateien zum ZIP-Archiv hinzu +ZipResourceDialog.Tooltip.TrimVideo=Häkchen exportiert den Videoclip, kein Häkchen das Originalvideo +ZipResourceDialog.Tooltip.LoadHTML=Wählen Sie im Dateimanager eine HTML Infodatei # Additions by Doug Brown 2012-12-10 PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=schwankende Bildrate PrefsDialog.Button.NoEngine=Keine PrefsDialog.Dialog.SwitchToQT.Message=Der Wechsel zu QuickTime bedeutet auch einen Wechsel der Java VM zu 32-bit. -PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Der Wechsel zu FFMPeg bedeutet auch einen Wechsel der Java VM zu 32-bit. -PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Der Wechsel zu FFMPeg bedeutet auch einen Wechsel der Java VM zu 64-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Der Wechsel zu Xuggle bedeutet auch einen Wechsel der Java VM zu 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Der Wechsel zu Xuggle bedeutet auch einen Wechsel der Java VM zu 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Wechsel PrefsDialog.Dialog.SwitchTo32.Message=Der Wechsel zu einer 32-bit Java VM bedeutet auch einen Wechsel der Video Engine zu QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Der Wechsel zu einer 64-bit Java VM bedeutet auch einen Wechsel der Video Engine zu FFMPeg. +PrefsDialog.Dialog.SwitchTo64.Message=Der Wechsel zu einer 64-bit Java VM bedeutet auch einen Wechsel der Video Engine zu Xuggle. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine gewechselt -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=F�r eine 64-bit Java VM ist keine Video Engine verf�gbar. -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=Sie k�nnen nur noch Bilder (JPEG, PNG) und animierte GIFs laden. +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Für eine 64-bit Java VM ist keine Video Engine verfügbar. +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=Sie können nur noch Bilder (JPEG, PNG) und animierte GIFs laden. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Wollen Sie wirklich auf eine 64-bit VM wechseln? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Keine 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Bevor FFMPeg verwendet werden kann, muss eine 32-bit Java VM installiert werden. +PrefsDialog.Dialog.No32bitVMXuggle.Message=Bevor Xuggle verwendet werden kann, muss eine 32-bit Java VM installiert werden. PrefsDialog.Dialog.No32bitVMQT.Message=Bevor QuickTime verwendet werden kann, muss eine 32-bit Java VM installiert werden. PrefsDialog.Dialog.No32bitVM.Message=Weitere Informationen unter Tracker Hilfe: Installation. -PrefsDialog.Dialog.No32bitVM.Title=32-bit VM ben�tigt +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM benötigt PrefsDialog.Button.ShowHelpNow=Hilfe anzeigen TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=Nicht KONSTANT TMenuBar.MenuItem.CheckFrameDurations=Bildanzeigedauern TMenuBar.MenuItem.ExportZIP=Tracker Zip -Tracker.Dialog.Install32BitVM.Message=Sie m�ssen eine 32-bit Java VM f�r die Video Engine installieren. -Tracker.Dialog.SwitchTo32BitVM.Message1=Eine oder mehrere installierte Video Engines sind nicht verf�gbar, weil -Tracker.Dialog.SwitchTo32BitVM.Message2=sie eine 32-bit Java VM ben�tigen, aber eine 64-bit VM l�uft. +Tracker.Dialog.Install32BitVM.Message=Sie müssen eine 32-bit Java VM für die Video Engine installieren. +Tracker.Dialog.SwitchTo32BitVM.Message1=Eine oder mehrere installierte Video Engines sind nicht verfügbar, weil +Tracker.Dialog.SwitchTo32BitVM.Message2=sie eine 32-bit Java VM benötigen, aber eine 64-bit VM läuft. Tracker.Dialog.SwitchTo32BitVM.Question=Wollen Sie einen Neustart mit 32 bit VM und der Default Engine? Tracker.Dialog.Button.RelaunchNow=Ja, jetzt neu starten Tracker.Dialog.Button.ShowPrefs=Nein, aber Einstellungen anzeigen Tracker.Dialog.Button.ContinueWithoutEngine=Nein, ohne Video weitermachen Tracker.Dialog.EngineProblems.Message1=Eine oder mehrere installierte Video Engines funktionieren nicht. -Tracker.Dialog.EngineProblems.Message2=Weitere Informationen unter Hilfe|Diagnostik|�ber FFMPeg oder QuickTime. -Tracker.Dialog.ReplaceFFMPeg.Message1=Wir empfehlen, dass Sie ihre aktuelle FFMPeg Video Engine -Tracker.Dialog.ReplaceFFMPeg.Message2=Durch FFMPeg Version 2.3 ersetzen. Re-installieren Sie Tracker (Version 4.75 -Tracker.Dialog.ReplaceFFMPeg.Message3=oder h�her) und w�hlen Sie FFMPeg in den Installationsoptionen. +Tracker.Dialog.EngineProblems.Message2=Weitere Informationen unter Hilfe|Diagnostik|About Xuggle oder QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=Wir empfehlen, dass Sie ihre aktuelle Xuggle Video Engine +Tracker.Dialog.ReplaceXuggle.Message2=Durch Xuggle Version 3.4 ersetzen. Re-installieren Sie Tracker (Version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=oder höher) und wählen Sie Xuggle in den Installationsoptionen. TrackerIO.Dialog.DurationIsConstant.Message=Die Bildrate ist konstant. TrackerIO.ZIPResourceFilter.Description=Tracker ZIP Datei (.trz) TToolbar.Button.Desktop.Tooltip=Zeige assoziierte HTML und/oder PDF Dokumente @@ -1235,9 +1240,9 @@ ZipResourceDialog.BadModels.Message2=Modellierungstracks. Wenn Sie das Video bes ZipResourceDialog.BadModels.Message3=diese Modelle NICHT in das Tracker ZIP-Archiv exportiert. ZipResourceDialog.BadModels.Question=Wollen Sie fortfahren und die Modelle verwerfen? ZipResourceDialog.BadModels.Title=Clip <-> Modell Konflikt -TMenuBar.MenuItem.EditVideoFrames=Bilder hinzuf�gen/entfernen -TMenuBar.Dialog.RequiresMemory.Message1=Um die Bilder zu editieren, m�ssen alle ins RAM geladen werden. Dies erh�ht auch die Wiedergaberate. -TMenuBar.Dialog.RequiresMemory.Message2=Bitte �berpr�fen Sie das verf�gbare RAM und starten Sie ggf. mit mehr RAM neu. +TMenuBar.MenuItem.EditVideoFrames=Bilder hinzufügen/entfernen +TMenuBar.Dialog.RequiresMemory.Message1=Um die Bilder zu editieren, müssen alle ins RAM geladen werden. Dies erhöht auch die Wiedergaberate. +TMenuBar.Dialog.RequiresMemory.Message2=Bitte überprüfen Sie das verfügbare RAM und starten Sie ggf. mit mehr RAM neu. TMenuBar.Dialog.RequiresMemory.Title=RAM-Speicher # Additions by Doug Brown 2013-01-25 @@ -1254,7 +1259,7 @@ TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Verwalten des Autoloadings der TrackerPanel.DataBuilder.Autoload.Title=Autoload Datenfunktionen TrackerPanel.DataBuilder.Autoload.Message=Auswahl der Funktionen zum Autoload: TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Dateien -TrackerIO.Dialog.Open.Title=�ffne +TrackerIO.Dialog.Open.Title=Öffne TToolbar.Button.Refresh.Popup.RefreshNow=Neu aufbereiten TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-Aufbereiten TToolbar.Button.Refresh.Tooltip=Erneutes Aufbereiten der Daten und Ansichten @@ -1264,10 +1269,10 @@ CoordAxes.Origin.Label=Position des Ursprungs in Pixel CoordAxes.Origin.Field.Tooltip=Position des Ursprungs von der linken, oberen Ecke des Video aus gemessen # Additions by Doug Brown 2013-08-24 -MainTView.Popup.MenuItem.Select=Punkte ausw�hlen -MainTView.Popup.MenuItem.Deselect=Punkte abw�hlen +MainTView.Popup.MenuItem.Select=Punkte auswählen +MainTView.Popup.MenuItem.Deselect=Punkte abwählen ZipResourceDialog.Checkbox.PreviewThumbnail=Vorschau -ZipResourceDialog.Dialog.BadFileName.Message=Dateinamen d�rfen folgende Zeichen nicht enthalten: +ZipResourceDialog.Dialog.BadFileName.Message=Dateinamen dürfen folgende Zeichen nicht enthalten: ZipResourceDialog.Dialog.BadFileName.Title=Unerlaubter Dateiname ZipResourceDialog.Dialog.ExportFailed.Message=Das ZIP-Archive konnte nicht angelegt werden ZipResourceDialog.Dialog.ExportFailed.Title=Fehlgeschlagener Export @@ -1276,15 +1281,15 @@ PrefsDialog.Button.SetCache=Cache festlegen # Additions by Doug Brown 2013-12-17 Tracker.StartLog=Start-Log Tracker.StartLog.NotFound=Start-Log nicht gefunden -Tracker.Dialog.MemoryReduced.Title=Gew�nschte RAM-Menge reduziert -Tracker.Dialog.MemoryReduced.Message1=Tracker konnte nicht mit dem gew�nschten +Tracker.Dialog.MemoryReduced.Title=Gewünschte RAM-Menge reduziert +Tracker.Dialog.MemoryReduced.Message1=Tracker konnte nicht mit dem gewünschten Tracker.Dialog.MemoryReduced.Message2=RAM gestartet werden. RAM reduziert auf Tracker.Dialog.MemoryReduced.Message3=Weitere Informationen unter Hilfe|Diagnostik|Start-Log TrackPlottingPanel.Popup.MenuItem.ShowZero=Zeige TableTrackView.Menu.TextColumn.Text=Textspalten TableTrackView.Menu.TextColumn.Tooltip=Verwalten der editierbaren Textspalten TableTrackView.Action.CreateTextColumn.Text=Erzeugen... -TableTrackView.Action.DeleteTextColumn.Text=L�schen +TableTrackView.Action.DeleteTextColumn.Text=Löschen TableTrackView.Action.RenameTextColumn.Text=Umbenennen TableTrackView.Dialog.NameColumn.Message=Geben Sie bitte einen Spaltennamen ein. TableTrackView.Dialog.NameColumn.TryAgain=Dieser Name ist schon vergeben. @@ -1292,7 +1297,7 @@ TableTrackView.Dialog.NameColumn.Title=Textspalte TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine Dateikopierfehler TrackerStarter.Warning.FailedToCopy1=Einige Video Engine Dateien konnten nicht automatisch kopiert werden. TrackerStarter.Warning.FailedToCopy2=Kopieren Sie die Dateien manuell, um die Funktion der Video Engine zu garantieren. @@ -1302,12 +1307,12 @@ TrackerStarter.Warning.CopyTo=Kopieren nach: Tracker.Dialog.FailedToCopy.Title=Dateikopierfehler Velocity.Dialog.Color.Title=Auswahl Farbe der Geschwindigkeit Acceleration.Dialog.Color.Title=Auswahl Farbe der Beschleunigung -TMenuBar.Menu.FontSize=Fontgr��e +TMenuBar.Menu.FontSize=Fontgröße TMenuBar.MenuItem.DefaultFontSize=Default -PrefsDialog.FontSize.BorderTitle=Fontgr��e +PrefsDialog.FontSize.BorderTitle=Fontgröße TrackerPanel.Label.Booster=Launcher TrackerPanel.Booster.None=(kein) -TrackerPanel.Dropdown.Booster.Tooltip=Vorhandene Punktmasse (Track) f�r die Anfangsbedingungen dieses Modells +TrackerPanel.Dropdown.Booster.Tooltip=Vorhandene Punktmasse (Track) für die Anfangsbedingungen dieses Modells CoordAxes.Checkbox.Grid=Gitter CoordAxes.Checkbox.Grid.Tooltip=Anzeige eines Gitters CoordAxes.Button.Grid.Tooltip=Stellen Sie Farbe und Durchsichtigkeit des Gitters ein @@ -1316,11 +1321,11 @@ CoordAxes.MenuItem.GridColor=Gitterfarbe... CoordAxes.MenuItem.GridOpacity=Opacity... CoordAxes.Dialog.GridOpacity.Title=Gitterfarbe festlegen DynamicSystem.Dialog.RemoveBooster.Title=Launcher Konflikt -DynamicSystem.Dialog.RemoveBooster.Message1=Punktmassen in einem System k�nnen sich nicht gegenseitig die -DynamicSystem.Dialog.RemoveBooster.Message2=Anfangsbedingungen vorgeben. Der "unm�gliche" Launcher wird -DynamicSystem.Dialog.RemoveBooster.Message3=entfernt bevor am System etwas ge�ndert wird. +DynamicSystem.Dialog.RemoveBooster.Message1=Punktmassen in einem System können sich nicht gegenseitig die +DynamicSystem.Dialog.RemoveBooster.Message2=Anfangsbedingungen vorgeben. Der "unmögliche" Launcher wird +DynamicSystem.Dialog.RemoveBooster.Message3=entfernt bevor am System etwas geändert wird. # Additions by Doug Brown 2014-05-09 -PageTView.MenuItem.OpenInBrowser=�ffne Seite in Browser +PageTView.MenuItem.OpenInBrowser=Öffne Seite in Browser TToolbar.Button.Desktop.Menu.OpenPage=Seiten TToolbar.Button.Desktop.Menu.OpenFile=Dateien # Additions by Doug Brown 2014-10-24 From fe3805f0d99c4af24b7f2a64ec399ec38e697fc8 Mon Sep 17 00:00:00 2001 From: fschuett Date: Tue, 14 Jul 2015 20:01:46 +0200 Subject: [PATCH 07/20] Fix download location for ffmpeg. --- .../tracker/resources/tracker_de.properties | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties index 1e770115..561b1e2d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties @@ -722,7 +722,7 @@ PrefsDialog.Checkbox.DefaultSize=Standard verwenden PrefsDialog.Checkbox.HintsOn=Zeige Hinweise PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=RAM-Management ist nicht möglich mit Web-Start. PrefsDialog.Dialog.WebStart.Title=Web-Start Modus @@ -737,9 +737,9 @@ PrefsDialog.Upgrades.Weekly=w PrefsDialog.Upgrades.Monthly=monatlich PrefsDialog.Upgrades.Never=nie PrefsDialog.Button.CheckForUpgrade=Jetzt suchen -PrefsDialog.Xuggle.Speed.BorderTitle=Abspielen des Videos -PrefsDialog.Xuggle.Slow=Ruckelfrei (möglicherweise langsam) -PrefsDialog.Xuggle.Fast=Schnell (möglicherweise ruckelnd) +PrefsDialog.FFMPeg.Speed.BorderTitle=Abspielen des Videos +PrefsDialog.FFMPeg.Slow=Ruckelfrei (möglicherweise langsam) +PrefsDialog.FFMPeg.Fast=Schnell (möglicherweise ruckelnd) PrefsDialog.CalibrationTool.BorderTitle=Standard Kalibrierungswerkzeug Protractor.Name=Winkelmesser Protractor.New.Name=Winkelmesser @@ -819,22 +819,22 @@ TMenuBar.Menu.MeasuringTools=Ma TMenuBar.Menu.AngleUnits=Winkeleinheiten TMenuBar.MenuItem.Degrees=Grad TMenuBar.MenuItem.Radians=Bogenmaß -Tracker.Dialog.NoXuggle.Title=Xuggle nicht gefunden -Tracker.Dialog.NoXuggle.Message1=Xuggle (betriebssytemunabhängige Video Engine) nicht installiert -Tracker.Dialog.NoXuggle.Message2=Laden Sie Xuggle von http://www.xuggle.com/xuggler/downloads/ herunter. -Tracker.Action.AboutXuggle=Über Xuggle... -Tracker.Dialog.AboutXuggle.Title=Über Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle Version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle Pfad: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg nicht gefunden +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (betriebssytemunabhängige Video Engine) nicht installiert +Tracker.Dialog.NoFFMPeg.Message2=Laden Sie FFMPeg von http://www.ffmpeg.org herunter. +Tracker.Action.AboutFFMPeg=Über FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Über FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg Version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg Pfad: Tracker.Dialog.NoVideoEngine.Message1=Keine Video Engine gefunden! Ohne Video Engine kann Tracker Tracker.Dialog.NoVideoEngine.Message2=nur Bilder, Bildfolgen oder animierte GIFs öffnen. -Tracker.Dialog.NoVideoEngine.Message3=Um Xuggle, Tracker's bevorzugte Video Engine, zu installieren, +Tracker.Dialog.NoVideoEngine.Message3=Um FFMPeg, Tracker's bevorzugte Video Engine, zu installieren, Tracker.Dialog.NoVideoEngine.Message4=laden Sie die die neueste Trackerversion herunter von: Tracker.Dialog.NoVideoEngine.Title=Fehlende Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's bevorzugte Video Engine, ist nicht installiert. -Tracker.Dialog.NoXuggle.Message2=Um Xuggle zu installieren, laden Sie die die neueste Trackerversion herunter von: -Tracker.Dialog.NoXuggle.Title=Fehlendes Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's bevorzugte Video Engine, ist nicht installiert. +Tracker.Dialog.NoFFMPeg.Message2=Um FFMPeg zu installieren, laden Sie die die neueste Trackerversion herunter von: +Tracker.Dialog.NoFFMPeg.Title=Fehlendes FFMPeg Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Sprache Tracker.Dialog.InsufficientMemory.Title=Unzureichendes RAM @@ -880,7 +880,7 @@ TTrackBar.Memory.Menu.SetSize=Setzen der RAM-Gr TTrackBar.Button.Version=Jetzt verfügbar: Version TTrackBar.Popup.MenuItem.Upgrade=Jetzt neue Version laden... TTrackBar.Popup.MenuItem.Ignore=Ignorieren -XuggleVideo.MenuItem.SmoothPlay=ruckelfreies Abspielen +FFMPegVideo.MenuItem.SmoothPlay=ruckelfreies Abspielen # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibrierungsmaßband @@ -908,13 +908,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnungen PrefsDialog.Checkbox.WarnIfNoEngine=Keine Video Engine -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle-Fehler +PrefsDialog.Checkbox.WarnIfFFMPegError=FFMPeg-Fehler PropertiesDialog.Title=Eigenschaften PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Eigenschaften... TActions.Action.OpenBrowser=Öffne Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(Zum Abrechen Klicken) TFrame.Dialog.StalledVideo.Title=Fehler beim Laden des Videos TFrame.Dialog.StalledVideo.Message0=Es gibt Probleme/Verzögerungen beim Laden des Videos. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stopp TFrame.Dialog.StalledVideo.Button.Wait=Warten Tracker.Dialog.NoVideoEngine.Checkbox=Nicht wieder anzeigen TrackerIO.ZipFileFilter.Description=ZIP Archive -TrackerIO.Dialog.ErrorFFMPEG.Message1=Beim Öffnen dieses Videos mit Xuggle gibt es folgenden Fehler: +TrackerIO.Dialog.ErrorFFMPEG.Message1=Beim Öffnen dieses Videos mit FFMPeg gibt es folgenden Fehler: TrackerIO.Dialog.ErrorFFMPEG.Message2=Nicht alle Fehler sind fatal. Die komplette Fehlermeldung finden Sie unter Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Falls Xuggle versagt, klappt es möglicherweise mit QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Falls FFMPeg versagt, klappt es möglicherweise mit QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Bemerkung: Unter Mac OSX muss Tracker dann in einer 32-bit Java VM laufen. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Fehler -TrackerIO.ErrorFFMPEG.LogMessage=Für mehr Details stellen Sie die Warnungen für Xuggle in Bearbeiten|Voreinstellungen ein. +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Fehler +TrackerIO.ErrorFFMPEG.LogMessage=Für mehr Details stellen Sie die Warnungen für FFMPeg in Bearbeiten|Voreinstellungen ein. TToolBar.Button.OpenBrowser.Tooltip=Öffnen des OSP Digital Library Browser # Additions by Doug Brown 2011-07-04 @@ -1202,17 +1202,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=schwankende Bildrate PrefsDialog.Button.NoEngine=Keine PrefsDialog.Dialog.SwitchToQT.Message=Der Wechsel zu QuickTime bedeutet auch einen Wechsel der Java VM zu 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Der Wechsel zu Xuggle bedeutet auch einen Wechsel der Java VM zu 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Der Wechsel zu Xuggle bedeutet auch einen Wechsel der Java VM zu 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Der Wechsel zu FFMPeg bedeutet auch einen Wechsel der Java VM zu 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Der Wechsel zu FFMPeg bedeutet auch einen Wechsel der Java VM zu 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Wechsel PrefsDialog.Dialog.SwitchTo32.Message=Der Wechsel zu einer 32-bit Java VM bedeutet auch einen Wechsel der Video Engine zu QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Der Wechsel zu einer 64-bit Java VM bedeutet auch einen Wechsel der Video Engine zu Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Der Wechsel zu einer 64-bit Java VM bedeutet auch einen Wechsel der Video Engine zu FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine gewechselt PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Für eine 64-bit Java VM ist keine Video Engine verfügbar. PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=Sie können nur noch Bilder (JPEG, PNG) und animierte GIFs laden. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Wollen Sie wirklich auf eine 64-bit VM wechseln? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Keine 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=Bevor Xuggle verwendet werden kann, muss eine 32-bit Java VM installiert werden. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Bevor FFMPeg verwendet werden kann, muss eine 32-bit Java VM installiert werden. PrefsDialog.Dialog.No32bitVMQT.Message=Bevor QuickTime verwendet werden kann, muss eine 32-bit Java VM installiert werden. PrefsDialog.Dialog.No32bitVM.Message=Weitere Informationen unter Tracker Hilfe: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM benötigt @@ -1228,10 +1228,10 @@ Tracker.Dialog.Button.RelaunchNow=Ja, jetzt neu starten Tracker.Dialog.Button.ShowPrefs=Nein, aber Einstellungen anzeigen Tracker.Dialog.Button.ContinueWithoutEngine=Nein, ohne Video weitermachen Tracker.Dialog.EngineProblems.Message1=Eine oder mehrere installierte Video Engines funktionieren nicht. -Tracker.Dialog.EngineProblems.Message2=Weitere Informationen unter Hilfe|Diagnostik|About Xuggle oder QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Wir empfehlen, dass Sie ihre aktuelle Xuggle Video Engine -Tracker.Dialog.ReplaceXuggle.Message2=Durch Xuggle Version 3.4 ersetzen. Re-installieren Sie Tracker (Version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=oder höher) und wählen Sie Xuggle in den Installationsoptionen. +Tracker.Dialog.EngineProblems.Message2=Weitere Informationen unter Hilfe|Diagnostik|About FFMPeg oder QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Wir empfehlen, dass Sie ihre aktuelle FFMPeg Video Engine +Tracker.Dialog.ReplaceFFMPeg.Message2=Durch FFMPeg Version 3.4 ersetzen. Re-installieren Sie Tracker (Version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=oder höher) und wählen Sie FFMPeg in den Installationsoptionen. TrackerIO.Dialog.DurationIsConstant.Message=Die Bildrate ist konstant. TrackerIO.ZIPResourceFilter.Description=Tracker ZIP Datei (.trz) TToolbar.Button.Desktop.Tooltip=Zeige assoziierte HTML und/oder PDF Dokumente @@ -1297,7 +1297,7 @@ TableTrackView.Dialog.NameColumn.Title=Textspalte TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine Dateikopierfehler TrackerStarter.Warning.FailedToCopy1=Einige Video Engine Dateien konnten nicht automatisch kopiert werden. TrackerStarter.Warning.FailedToCopy2=Kopieren Sie die Dateien manuell, um die Funktion der Video Engine zu garantieren. From 8ada65704a54f6bd788b7a37f1a1e4ddf932d11b Mon Sep 17 00:00:00 2001 From: fschuett Date: Sat, 12 Sep 2015 16:35:04 +0200 Subject: [PATCH 08/20] Convert line endings to lf. --- .../tracker/AnalyticFunctionPanel.java | 140 +- .../cabrillo/tracker/AnalyticParticle.java | 384 +- .../cabrillo/tracker/ArrowFootprint.java | 408 +- .../cabrillo/tracker/AttachmentDialog.java | 1020 +-- .../cabrillo/tracker/AutoTracker.java | 6804 ++++++++--------- .../cabrillo/tracker/BounceDerivatives.java | 844 +- .../cabrillo/tracker/BounceMatrix.java | 792 +- .../cabrillo/tracker/BounceModel.java | 836 +- .../cabrillo/tracker/BounceParameters.java | 416 +- .../cabrillo/tracker/Calibration.java | 1718 ++--- .../cabrillo/tracker/CalibrationStep.java | 1176 +-- .../cabrillo/tracker/CenterOfMass.java | 1080 +-- .../tracker/CenterOfMassInspector.java | 480 +- .../cabrillo/tracker/CircleFootprint.java | 958 +-- .../cabrillo/tracker/Configuration.java | 246 +- .../cabrillo/tracker/CoordAxes.java | 1366 ++-- .../cabrillo/tracker/CoordAxesStep.java | 952 +-- .../cabrillo/tracker/Derivative.java | 112 +- .../tracker/DerivativeAlgorithmDialog.java | 432 +- .../tracker/DoubleArrowFootprint.java | 426 +- .../tracker/DoubleCrosshairFootprint.java | 304 +- .../tracker/DynamicFunctionPanel.java | 140 +- .../cabrillo/tracker/DynamicParticle.java | 1438 ++-- .../tracker/DynamicParticlePolar.java | 514 +- .../cabrillo/tracker/DynamicSystem.java | 2072 ++--- .../tracker/DynamicSystemInspector.java | 852 +-- .../cabrillo/tracker/ExportDataDialog.java | 796 +- .../cabrillo/tracker/ExportZipDialog.java | 3492 ++++----- .../cabrillo/tracker/FileDropHandler.java | 536 +- .../cabrillo/tracker/FirstDerivative.java | 220 +- .../cabrillo/tracker/Footprint.java | 236 +- .../cabrillo/tracker/LineFootprint.java | 696 +- .../cabrillo/tracker/LineProfile.java | 1430 ++-- .../cabrillo/tracker/MainTView.java | 1536 ++-- .../cabrillo/tracker/Mark.java | 108 +- .../cabrillo/tracker/ModelFunctionPanel.java | 378 +- .../cabrillo/tracker/OffsetOrigin.java | 1156 +-- .../cabrillo/tracker/OffsetOriginStep.java | 526 +- .../cabrillo/tracker/OutlineFootprint.java | 288 +- .../cabrillo/tracker/PageTView.java | 2024 ++--- .../cabrillo/tracker/PerspectiveStep.java | 266 +- .../cabrillo/tracker/PerspectiveTrack.java | 560 +- .../cabrillo/tracker/PlotTView.java | 402 +- .../cabrillo/tracker/PointShapeFootprint.java | 744 +- .../tracker/PositionVectorFootprint.java | 214 +- .../cabrillo/tracker/PropertiesDialog.java | 764 +- .../cabrillo/tracker/Protractor.java | 1518 ++-- .../cabrillo/tracker/ProtractorFootprint.java | 790 +- .../cabrillo/tracker/RGBRegion.java | 1892 ++--- .../cabrillo/tracker/RGBStep.java | 812 +- .../cabrillo/tracker/ReferenceFrame.java | 392 +- .../cabrillo/tracker/SecondDerivative.java | 256 +- .../cabrillo/tracker/ShapeIcon.java | 308 +- .../cabrillo/tracker/SpectralLineFilter.java | 688 +- .../cabrillo/tracker/StepSet.java | 378 +- .../cabrillo/tracker/TButton.java | 444 +- .../cabrillo/tracker/TMat.java | 556 +- .../cabrillo/tracker/TRegion.java | 522 +- .../cabrillo/tracker/TView.java | 182 +- .../cabrillo/tracker/TViewChooser.java | 1086 +-- .../cabrillo/tracker/TableTView.java | 964 +-- .../cabrillo/tracker/TableTrackView.java | 3122 ++++---- .../cabrillo/tracker/TapeMeasure.java | 2346 +++--- .../cabrillo/tracker/ThumbnailDialog.java | 1026 +-- .../cabrillo/tracker/TrackChooserTView.java | 950 +-- .../cabrillo/tracker/TrackControl.java | 468 +- .../cabrillo/tracker/TrackRenderer.java | 128 +- .../cabrillo/tracker/TrackView.java | 232 +- .../cabrillo/tracker/Vector.java | 1518 ++-- .../cabrillo/tracker/VectorChain.java | 570 +- .../cabrillo/tracker/VectorSum.java | 1018 +-- .../cabrillo/tracker/VectorSumInspector.java | 524 +- .../cabrillo/tracker/WorldGrid.java | 612 +- .../tracker/deploy/TrackerJarFilter.java | 158 +- .../cabrillo/tracker/deploy/WinRegistry.java | 842 +- .../tracker/resources/tracker_ar.properties | 2508 +++--- .../tracker/resources/tracker_cs.properties | 2498 +++--- .../tracker/resources/tracker_da.properties | 2378 +++--- .../resources/tracker_el_GR.properties | 2466 +++--- .../tracker/resources/tracker_fi.properties | 2514 +++--- .../tracker/resources/tracker_fr.properties | 2398 +++--- .../tracker/resources/tracker_in.properties | 2544 +++--- .../tracker/resources/tracker_it.properties | 2388 +++--- .../resources/tracker_iw_IL.properties | 2590 +++---- .../tracker/resources/tracker_ko.properties | 2398 +++--- .../resources/tracker_nl_NL.properties | 2526 +++--- .../resources/tracker_pt_BR.properties | 2380 +++--- .../tracker/resources/tracker_sk.properties | 2566 +++---- .../tracker/resources/tracker_sl.properties | 2382 +++--- .../tracker/resources/tracker_sv.properties | 2392 +++--- .../resources/tracker_th_TH.properties | 2382 +++--- .../resources/tracker_zh_CN.properties | 2354 +++--- .../resources/tracker_zh_TW.properties | 2380 +++--- 93 files changed, 55314 insertions(+), 55314 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/AnalyticFunctionPanel.java b/src/org/opensourcephysics/cabrillo/tracker/AnalyticFunctionPanel.java index 985ac018..da336bda 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AnalyticFunctionPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AnalyticFunctionPanel.java @@ -1,70 +1,70 @@ -/* - * Open Source Physics software is free software as described near the bottom of this code file. - * - * For additional information and documentation on Open Source Physics please see: - * - */ - -package org.opensourcephysics.cabrillo.tracker; - -import org.opensourcephysics.tools.*; - -/** - * This is a FunctionPanel for analytic particles. - * - * @author Douglas Brown - */ -public class AnalyticFunctionPanel extends ModelFunctionPanel { - - /** - * Constructor with user function editor. - * - * @param editor the user function editor - * @param track an AnalyticParticle - */ - public AnalyticFunctionPanel(UserFunctionEditor editor, AnalyticParticle track) { - super(editor, track); - } - - /** - * Returns the position functions. - * - * @return the x and y UserFunctions - */ - public UserFunction[] getPositionFunctions() { - return ((UserFunctionEditor)functionEditor).getMainFunctions(); - } - - /** - * Refreshes the GUI. - */ - protected void refreshGUI() { - super.refreshGUI(); - functionEditor.setBorderTitle(TrackerRes.getString("AnalyticFunctionPanel.FunctionEditor.Border.Title")); //$NON-NLS-1$ - } - -} - -/* - * Open Source Physics software is free software; you can redistribute - * it and/or modify it under the terms of the GNU General Public License (GPL) as - * published by the Free Software Foundation; either version 3 of the License, - * or(at your option) any later version. - - * Code that uses any portion of the code in the org.opensourcephysics package - * or any subpackage (subdirectory) of this package must must also be be released - * under the GNU GPL license. - * - * This software 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; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at http://www.gnu.org/copyleft/gpl.html - * - * Copyright (c) 2007 The Open Source Physics project - * http://www.opensourcephysics.org - */ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker; + +import org.opensourcephysics.tools.*; + +/** + * This is a FunctionPanel for analytic particles. + * + * @author Douglas Brown + */ +public class AnalyticFunctionPanel extends ModelFunctionPanel { + + /** + * Constructor with user function editor. + * + * @param editor the user function editor + * @param track an AnalyticParticle + */ + public AnalyticFunctionPanel(UserFunctionEditor editor, AnalyticParticle track) { + super(editor, track); + } + + /** + * Returns the position functions. + * + * @return the x and y UserFunctions + */ + public UserFunction[] getPositionFunctions() { + return ((UserFunctionEditor)functionEditor).getMainFunctions(); + } + + /** + * Refreshes the GUI. + */ + protected void refreshGUI() { + super.refreshGUI(); + functionEditor.setBorderTitle(TrackerRes.getString("AnalyticFunctionPanel.FunctionEditor.Border.Title")); //$NON-NLS-1$ + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 3 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java b/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java index 4aa21144..ac7ed6e9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java @@ -1,192 +1,192 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.geom.*; - -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; -import org.opensourcephysics.tools.UserFunction; -import org.opensourcephysics.tools.UserFunctionEditor; - -/** - * AnalyticParticle models a particle using time functions. - * - * @author W. Christian, D. Brown - */ -public class AnalyticParticle - extends ParticleModel { - - UserFunction[] functions; - - /** - * Constructor. - */ - public AnalyticParticle() { - } - - /** - * Creates and initializes an AnalyticFunctionPanel. - */ - protected void initializeFunctionPanel() { - // create panel - functionEditor = new UserFunctionEditor(); - functionPanel = new AnalyticFunctionPanel(functionEditor, this); - // add mass and initial time parameters - createMassAndTimeParameters(); - // set main position functions "x" and "y" - String[] t = new String[] {"t"}; //$NON-NLS-1$ - UserFunction[] ff = new UserFunction[2]; - ff[0] = new UserFunction("x"); //$NON-NLS-1$ - ff[0].setNameEditable(false); - ff[0].setExpression("0", t); //$NON-NLS-1$ - ff[0].setDescription(TrackerRes.getString("AnalyticParticle.PositionFunction.X.Description")); //$NON-NLS-1$ - ff[1] = new UserFunction("y"); //$NON-NLS-1$ - ff[1].setNameEditable(false); - ff[1].setExpression("0", t); //$NON-NLS-1$ - ff[1].setDescription(TrackerRes.getString("AnalyticParticle.PositionFunction.Y.Description")); //$NON-NLS-1$ - functionEditor.setMainFunctions(ff); - } - - /** - * Gets the next trace position. Subclasses override to get positions based - * on model. - */ - protected Point2D[] getNextTracePositions() { - double x = functions[0].evaluate(time); - double y = functions[1].evaluate(time); - point.setLocation(x, y); - return new Point2D[] {point}; - } - - /** - * Resets model parameters and sets position(s) for start frame. - */ - protected void reset() { - super.reset(); - t0 = getInitialValues()[0]; // time at start frame - functions = getFunctionEditor().getMainFunctions(); - if (trackerPanel != null) { - erase(); - dt = trackerPanel.getPlayer().getMeanStepDuration() / (1000*tracePtsPerStep); - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - // find last frame included in both model and clip - int end = Math.min(getEndFrame(), clip.getFrameCount()-1); - while (end>getStartFrame() && !clip.includesFrame(end)) { - end--; - } - // check if end and start frame are same - if (end==getStartFrame() && !clip.includesFrame(getStartFrame())) { - // no frames to be marked, so clear! - steps.setLength(1); - steps.setStep(0, null); - for (TrackerPanel panel: panels) { - getVArray(panel).setLength(0); - getAArray(panel).setLength(0); - } - traceX = new double[0]; - traceY = new double[0]; - support.firePropertyChange("steps", null, null); //$NON-NLS-1$ - return; - } - // find first frame included in both model and clip - int firstFrameInClip = getStartFrame(); - while (firstFrameInClip + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.geom.*; + +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; +import org.opensourcephysics.tools.UserFunction; +import org.opensourcephysics.tools.UserFunctionEditor; + +/** + * AnalyticParticle models a particle using time functions. + * + * @author W. Christian, D. Brown + */ +public class AnalyticParticle + extends ParticleModel { + + UserFunction[] functions; + + /** + * Constructor. + */ + public AnalyticParticle() { + } + + /** + * Creates and initializes an AnalyticFunctionPanel. + */ + protected void initializeFunctionPanel() { + // create panel + functionEditor = new UserFunctionEditor(); + functionPanel = new AnalyticFunctionPanel(functionEditor, this); + // add mass and initial time parameters + createMassAndTimeParameters(); + // set main position functions "x" and "y" + String[] t = new String[] {"t"}; //$NON-NLS-1$ + UserFunction[] ff = new UserFunction[2]; + ff[0] = new UserFunction("x"); //$NON-NLS-1$ + ff[0].setNameEditable(false); + ff[0].setExpression("0", t); //$NON-NLS-1$ + ff[0].setDescription(TrackerRes.getString("AnalyticParticle.PositionFunction.X.Description")); //$NON-NLS-1$ + ff[1] = new UserFunction("y"); //$NON-NLS-1$ + ff[1].setNameEditable(false); + ff[1].setExpression("0", t); //$NON-NLS-1$ + ff[1].setDescription(TrackerRes.getString("AnalyticParticle.PositionFunction.Y.Description")); //$NON-NLS-1$ + functionEditor.setMainFunctions(ff); + } + + /** + * Gets the next trace position. Subclasses override to get positions based + * on model. + */ + protected Point2D[] getNextTracePositions() { + double x = functions[0].evaluate(time); + double y = functions[1].evaluate(time); + point.setLocation(x, y); + return new Point2D[] {point}; + } + + /** + * Resets model parameters and sets position(s) for start frame. + */ + protected void reset() { + super.reset(); + t0 = getInitialValues()[0]; // time at start frame + functions = getFunctionEditor().getMainFunctions(); + if (trackerPanel != null) { + erase(); + dt = trackerPanel.getPlayer().getMeanStepDuration() / (1000*tracePtsPerStep); + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + // find last frame included in both model and clip + int end = Math.min(getEndFrame(), clip.getFrameCount()-1); + while (end>getStartFrame() && !clip.includesFrame(end)) { + end--; + } + // check if end and start frame are same + if (end==getStartFrame() && !clip.includesFrame(getStartFrame())) { + // no frames to be marked, so clear! + steps.setLength(1); + steps.setStep(0, null); + for (TrackerPanel panel: panels) { + getVArray(panel).setLength(0); + getAArray(panel).setLength(0); + } + traceX = new double[0]; + traceY = new double[0]; + support.firePropertyChange("steps", null, null); //$NON-NLS-1$ + return; + } + // find first frame included in both model and clip + int firstFrameInClip = getStartFrame(); + while (firstFrameInClip - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.Area; - -import javax.swing.*; - -/** - * An ArrowFootprint returns an arrow shape for a Point array of length 2. - * - * @author Douglas Brown - */ -public class ArrowFootprint extends LineFootprint { - - // instance fields - protected double stretch = 1; - protected int tipLength = 16; - protected int tipWidth = 4; - boolean openHead = true; - protected BasicStroke headStroke = new BasicStroke(); - - /** - * Constructs an ArrowFootprint. - * - * @param name the name - */ - public ArrowFootprint(String name) { - super(name); - } - - /** - * Sets the stretch. The length of the arrow is stretched by this factor. - * - * @param stretch the desired stretch - */ - public void setStretch(double stretch) { - this.stretch = stretch; - } - - /** - * Gets the stretch. - * - * @return the stretch - */ - public double getStretch() { - return stretch; - } - - /** - * Sets the length of the arrow tip. - * - * @param tipLength the desired tip length in pixels - */ - public void setTipLength(int tipLength) { - tipLength = Math.max(32, tipLength); - tipWidth = tipLength / 4; - this.tipLength = 4 * tipWidth; - } - - /** - * Sets the solid arrowhead property. - * - * @param solid true for a filled arrowhead - */ - public void setSolidHead(boolean solid) { - openHead = !solid; - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - @Override - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - super.setStroke(stroke); - headStroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - null, - stroke.getDashPhase()); - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; - double prevStretch = stretch; - stretch = 1; - Shape shape = getShape(points); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - stretch = prevStretch; - return icon; - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @return the shape - */ - public synchronized Shape getShape(Point[] points) { - Point p1 = points[0]; - Point p2 = points[1]; - double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); - - transform.setToRotation(theta, p1.x, p1.y); - transform.translate(p1.x, p1.y); - highlight = transform.createTransformedShape(HIGHLIGHT); - - transform.setToRotation(theta, p2.x, p2.y); - transform.translate(p2.x, p2.y); - float d = (float)(stretch * p1.distance(p2)); // length of the arrow - // set arrowhead dimensions and stroke - int tipL = Math.min(tipLength, Math.round(d-4)); - tipL = Math.max(8, tipL); - int tipW = Math.max(tipL/4, 2); - float f = stroke.getLineWidth(); - BasicStroke s = f < tipL/4? stroke: - new BasicStroke(Math.max(tipL/4, 0.8f), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - try { - // set up tip hitShape using full length - path.reset(); - path.moveTo(d-4, 0); - path.lineTo(d-6, -2); - path.lineTo(d, 0); - path.lineTo(d-6, 2); - path.closePath(); - hitShapes[0] = transform.createTransformedShape(path); // for tip - // shorten d to account for the width of the stroke - // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 - d = d - (float)(s.getLineWidth()*1.58) + 1; - // set up shaft hitShape - path.reset(); - path.moveTo(0, 0); - path.lineTo(d-tipL, 0); - hitShapes[2] = transform.createTransformedShape(path); // for shaft - hitShapes[1] = new Rectangle(p2.x-1, p2.y-1, 2, 2); // for tail - // set up draw shape - path.reset(); - path.moveTo(0, 0); - path.lineTo(d-tipL+tipW, 0); - Shape shaft = transform.createTransformedShape(path); - shaft = s.createStrokedShape(shaft); - Area area = new Area(shaft); - path.reset(); - path.moveTo(d-tipL+tipW, 0); - path.lineTo(d-tipL, -tipW); - path.lineTo(d, 0); - path.lineTo(d-tipL, tipW); - path.closePath(); - Shape head = transform.createTransformedShape(path); - if (openHead) { - head = headStroke.createStrokedShape(head); - } - area.add(new Area(head)); - if (!openHead) { - area.add(new Area(headStroke.createStrokedShape(head))); - } - return area; - } catch (Exception e) { // occasionally throws path exception for reasons unknown! - d = (float)(stretch * p1.distance(p2)); - java.awt.geom.Line2D line = new java.awt.geom.Line2D.Double(0, 0, d, 0); - return s.createStrokedShape(transform.createTransformedShape(line)); - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.Area; + +import javax.swing.*; + +/** + * An ArrowFootprint returns an arrow shape for a Point array of length 2. + * + * @author Douglas Brown + */ +public class ArrowFootprint extends LineFootprint { + + // instance fields + protected double stretch = 1; + protected int tipLength = 16; + protected int tipWidth = 4; + boolean openHead = true; + protected BasicStroke headStroke = new BasicStroke(); + + /** + * Constructs an ArrowFootprint. + * + * @param name the name + */ + public ArrowFootprint(String name) { + super(name); + } + + /** + * Sets the stretch. The length of the arrow is stretched by this factor. + * + * @param stretch the desired stretch + */ + public void setStretch(double stretch) { + this.stretch = stretch; + } + + /** + * Gets the stretch. + * + * @return the stretch + */ + public double getStretch() { + return stretch; + } + + /** + * Sets the length of the arrow tip. + * + * @param tipLength the desired tip length in pixels + */ + public void setTipLength(int tipLength) { + tipLength = Math.max(32, tipLength); + tipWidth = tipLength / 4; + this.tipLength = 4 * tipWidth; + } + + /** + * Sets the solid arrowhead property. + * + * @param solid true for a filled arrowhead + */ + public void setSolidHead(boolean solid) { + openHead = !solid; + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + @Override + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + super.setStroke(stroke); + headStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + null, + stroke.getDashPhase()); + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; + double prevStretch = stretch; + stretch = 1; + Shape shape = getShape(points); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + stretch = prevStretch; + return icon; + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @return the shape + */ + public synchronized Shape getShape(Point[] points) { + Point p1 = points[0]; + Point p2 = points[1]; + double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); + + transform.setToRotation(theta, p1.x, p1.y); + transform.translate(p1.x, p1.y); + highlight = transform.createTransformedShape(HIGHLIGHT); + + transform.setToRotation(theta, p2.x, p2.y); + transform.translate(p2.x, p2.y); + float d = (float)(stretch * p1.distance(p2)); // length of the arrow + // set arrowhead dimensions and stroke + int tipL = Math.min(tipLength, Math.round(d-4)); + tipL = Math.max(8, tipL); + int tipW = Math.max(tipL/4, 2); + float f = stroke.getLineWidth(); + BasicStroke s = f < tipL/4? stroke: + new BasicStroke(Math.max(tipL/4, 0.8f), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + try { + // set up tip hitShape using full length + path.reset(); + path.moveTo(d-4, 0); + path.lineTo(d-6, -2); + path.lineTo(d, 0); + path.lineTo(d-6, 2); + path.closePath(); + hitShapes[0] = transform.createTransformedShape(path); // for tip + // shorten d to account for the width of the stroke + // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 + d = d - (float)(s.getLineWidth()*1.58) + 1; + // set up shaft hitShape + path.reset(); + path.moveTo(0, 0); + path.lineTo(d-tipL, 0); + hitShapes[2] = transform.createTransformedShape(path); // for shaft + hitShapes[1] = new Rectangle(p2.x-1, p2.y-1, 2, 2); // for tail + // set up draw shape + path.reset(); + path.moveTo(0, 0); + path.lineTo(d-tipL+tipW, 0); + Shape shaft = transform.createTransformedShape(path); + shaft = s.createStrokedShape(shaft); + Area area = new Area(shaft); + path.reset(); + path.moveTo(d-tipL+tipW, 0); + path.lineTo(d-tipL, -tipW); + path.lineTo(d, 0); + path.lineTo(d-tipL, tipW); + path.closePath(); + Shape head = transform.createTransformedShape(path); + if (openHead) { + head = headStroke.createStrokedShape(head); + } + area.add(new Area(head)); + if (!openHead) { + area.add(new Area(headStroke.createStrokedShape(head))); + } + return area; + } catch (Exception e) { // occasionally throws path exception for reasons unknown! + d = (float)(stretch * p1.distance(p2)); + java.awt.geom.Line2D line = new java.awt.geom.Line2D.Double(0, 0, d, 0); + return s.createStrokedShape(transform.createTransformedShape(line)); + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java index 6ad1aa06..d8216752 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java @@ -1,510 +1,510 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.table.DefaultTableModel; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; - -import org.opensourcephysics.media.core.TPoint; -import org.opensourcephysics.media.core.VideoClip; -import org.opensourcephysics.tools.FontSizer; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; - -/** - * This displays and sets point attachments. - * - * @author Douglas Brown - */ -public class AttachmentDialog extends JDialog - implements PropertyChangeListener { - - - // instance fields - protected TTrack measuringTool; - protected int endPointCount; - protected TTrack[] attachedMass; - protected String[] endPointName; - - protected TrackerPanel trackerPanel; - protected boolean isVisible; - protected JButton closeButton, helpButton; - protected ArrayList masses; - protected PointMass dummyMass; - protected JTable table; - protected int cellheight = 28; // depends on font level - protected JComboBox rendererDropdown, editorDropdown, measuringToolDropdown; - protected Icon dummyIcon = new ShapeIcon(null, 21, 16); - protected JScrollPane scrollPane; - protected AttachmentCellRenderer attachmentCellRenderer = new AttachmentCellRenderer(); - protected TTrackRenderer trackRenderer = new TTrackRenderer(); - - - /** - * Constructs an AttachmentControl. - * - * @param track the measuring tool - */ - public AttachmentDialog(TTrack track) { - super(JOptionPane.getFrameForComponent(track.trackerPanel), false); - createGUI(); - setMeasuringTool(track); - refreshDropdowns(); - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - refreshDisplay(); - } - - /** - * Responds to property change events. This listens for the - * following events: "tab" from TFrame. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (trackerPanel != null && e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - else if (e.getPropertyName().equals("track")) { //$NON-NLS-1$ - TTrack deleted = (TTrack)e.getOldValue(); - if (deleted!=null) { - deleted.removePropertyChangeListener("step", this); //$NON-NLS-1$ - deleted.removePropertyChangeListener("steps", this); //$NON-NLS-1$ - deleted.removePropertyChangeListener("name", this); //$NON-NLS-1$ - deleted.removePropertyChangeListener("color", this); //$NON-NLS-1$ - deleted.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - for (int i = 0; i < endPointCount; i++) { - if (deleted==attachedMass[i] || deleted==measuringTool) { - attachedMass[i] = null; - } - } - refreshMeasuringTool(); - } - refreshDropdowns(); - refreshDisplay(); - } - else if (e.getPropertyName().equals("step") //$NON-NLS-1$ - || e.getPropertyName().equals("steps")) { //$NON-NLS-1$ - refreshMeasuringTool(); - } - else refreshDisplay(); - } - - /** - * Overrides JDialog setVisible method. - * - * @param vis true to show this inspector - */ - public void setVisible(boolean vis) { - super.setVisible(vis); - isVisible = vis; - } - - /** - * Disposes of this inspector. - */ - public void dispose() { - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - for (TTrack p: masses) { - p.removePropertyChangeListener("name", this); //$NON-NLS-1$ - p.removePropertyChangeListener("color", this); //$NON-NLS-1$ - p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - super.dispose(); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - setResizable(false); - // create GUI components - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - - JPanel north = new JPanel(); - north.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); - measuringToolDropdown = new JComboBox(); - measuringToolDropdown.setRenderer(trackRenderer); - measuringToolDropdown.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - TTrack tool = (TTrack)measuringToolDropdown.getSelectedItem(); - if (tool==measuringTool) return; - setMeasuringTool(tool); - } - }); - north.add(measuringToolDropdown); - contentPane.add(north, BorderLayout.NORTH); - - dummyMass = new PointMass(); - - rendererDropdown = new JComboBox(new AttachmentComboBoxModel()); - rendererDropdown.setRenderer(trackRenderer); - editorDropdown = new JComboBox(new AttachmentComboBoxModel()); - editorDropdown.setRenderer(trackRenderer); - - table = new JTable(new AttachmentTableModel()) { - @Override - public void setFont(Font font) { - super.setFont(font); - cellheight = font.getSize()+16; - setRowHeight(cellheight); - int w = (int)(60*(1+FontSizer.getLevel()*0.3)); - getColumnModel().getColumn(0).setPreferredWidth(w); - getColumnModel().getColumn(1).setPreferredWidth(2*w); - getTableHeader().setPreferredSize(new Dimension(w, cellheight)); - } - }; - attachmentCellRenderer = new AttachmentCellRenderer(); - table.setDefaultRenderer(PointMass.class, attachmentCellRenderer); - table.setDefaultRenderer(String.class, attachmentCellRenderer); - table.setRowHeight(cellheight); - - TableCellEditor editor = new AttachmentCellEditor(); - table.getColumnModel().getColumn(1).setCellEditor(editor); - scrollPane = new JScrollPane(table) { - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = 3*cellheight+8; - dim.width= table.getPreferredSize().width; - return dim; - } - }; - JPanel center = new JPanel(new GridLayout(1,1)); - contentPane.add(center, BorderLayout.CENTER); - center.add(scrollPane); - center.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8)); - - // create buttons and buttonbar - helpButton = new JButton(); - helpButton.setForeground(new Color(0, 0, 102)); - helpButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - String keyword = measuringTool instanceof Protractor? "protractor": "tape"; //$NON-NLS-1$ //$NON-NLS-2$ - trackerPanel.getTFrame().showHelp(keyword+"#attach", 0); //$NON-NLS-1$ - } - }); - closeButton = new JButton(); - closeButton.setForeground(new Color(0, 0, 102)); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - JPanel buttonbar = new JPanel(); - contentPane.add(buttonbar, BorderLayout.SOUTH); - buttonbar.add(helpButton); - buttonbar.add(closeButton); - } - - protected void setMeasuringTool(TTrack tool) { - measuringTool = tool; - if (tool!=null) { - trackerPanel = measuringTool.trackerPanel; - endPointCount = tool instanceof TapeMeasure? 2: 3; - endPointName = new String[endPointCount]; - attachedMass = measuringTool.attachments==null? new TTrack[endPointCount]: measuringTool.attachments; - } - else { - endPointCount = 0; - endPointName = new String[0]; - attachedMass = new TTrack[0]; - } - DefaultTableModel dm = (DefaultTableModel)table.getModel(); - dm.fireTableDataChanged(); - refreshDisplay(); - } - - /** - * Updates the system to reflect the current particle selection. - */ - private void refreshMeasuringTool() { - measuringTool.attachments = attachedMass; - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - for (int i = 0; i < endPointCount; i++) { - if (attachedMass[i]!=null) { - if (measuringTool instanceof TapeMeasure) - ((TapeMeasure)measuringTool).setFixedPosition(false); - else if (measuringTool instanceof Protractor) - ((Protractor)measuringTool).setFixed(false); - for (int n = clip.getStartFrameNumber(); n<=clip.getEndFrameNumber(); n++) { - Step step = attachedMass[i].getStep(n); - TPoint p = measuringTool.getStep(n).getPoints()[i]; - if (step==null) { - p.detach(); - continue; - } - TPoint target = step.getPoints()[0]; - p.attachTo(target); - } - } - else { // attached mass is null - for (int n = clip.getStartFrameNumber(); n<=clip.getEndFrameNumber(); n++) { - TPoint p = measuringTool.getStep(n).getPoints()[i]; - p.detach(); - } - } - } - measuringTool.getToolbarTrackComponents(trackerPanel); - } - - /** - * Refreshes the attachment and measuring tool dropdowns. - */ - protected void refreshDropdowns() { - masses = trackerPanel.getDrawables(PointMass.class); - for (TTrack p: masses) { - p.removePropertyChangeListener("step", this); //$NON-NLS-1$ - p.removePropertyChangeListener("steps", this); //$NON-NLS-1$ - p.removePropertyChangeListener("name", this); //$NON-NLS-1$ - p.removePropertyChangeListener("color", this); //$NON-NLS-1$ - p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - p.addPropertyChangeListener("step", this); //$NON-NLS-1$ - p.addPropertyChangeListener("steps", this); //$NON-NLS-1$ - p.addPropertyChangeListener("name", this); //$NON-NLS-1$ - p.addPropertyChangeListener("color", this); //$NON-NLS-1$ - p.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - FontSizer.setFonts(rendererDropdown, FontSizer.getLevel()); - rendererDropdown.setModel(new AttachmentComboBoxModel()); - FontSizer.setFonts(editorDropdown, FontSizer.getLevel()); - editorDropdown.setModel(new AttachmentComboBoxModel()); - - FontSizer.setFonts(measuringToolDropdown, FontSizer.getLevel()); - Object tool = measuringToolDropdown.getSelectedItem(); - java.util.Vector tools = new java.util.Vector(); - for (TTrack track: trackerPanel.getTracks()) { - if (track instanceof TapeMeasure) { - TapeMeasure tape = (TapeMeasure)track; -// if (tape.isViewable()) - tools.add(tape); - } - else if (track instanceof Protractor) { - tools.add(track); - } - } - for (TTrack p: tools) { - p.removePropertyChangeListener("name", this); //$NON-NLS-1$ - p.removePropertyChangeListener("color", this); //$NON-NLS-1$ - p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - p.addPropertyChangeListener("name", this); //$NON-NLS-1$ - p.addPropertyChangeListener("color", this); //$NON-NLS-1$ - p.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - measuringToolDropdown.setModel(new DefaultComboBoxModel(tools)); - if (tool==measuringTool) { - setMeasuringTool(tools.isEmpty()? null: tools.get(0)); - } - } - - /** - * Updates this inspector to show the system's current particles. - */ - protected void refreshDisplay() { - setTitle(TrackerRes.getString("AttachmentInspector.Title")); //$NON-NLS-1$ - helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ - closeButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - dummyMass.setName(TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ - if (endPointCount>0 && measuringTool!=null) { - if (measuringTool instanceof Protractor) { - endPointName[0] = TrackerRes.getString("AttachmentInspector.Label.Vertex"); //$NON-NLS-1$ - endPointName[1] = TrackerRes.getString("AttachmentInspector.Label.End")+" 1"; //$NON-NLS-1$ //$NON-NLS-2$ - endPointName[2] = TrackerRes.getString("AttachmentInspector.Label.End")+" 2"; //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - endPointName[0] = TrackerRes.getString("AttachmentInspector.Label.End")+" 1"; //$NON-NLS-1$ //$NON-NLS-2$ - endPointName[1] = TrackerRes.getString("AttachmentInspector.Label.End")+" 2"; //$NON-NLS-1$ //$NON-NLS-2$ - } - measuringToolDropdown.setSelectedItem(measuringTool); - } - pack(); - repaint(); - } - - public void setFontLevel(int level) { - FontSizer.setFonts(this, level); - FontSizer.setFonts(attachmentCellRenderer.label, level); - FontSizer.setFonts(table, level); - refreshDropdowns(); - pack(); - } - - - - /** - * A class to provide model data for the attachment table. - */ - class AttachmentTableModel extends DefaultTableModel { - public int getRowCount() {return endPointCount;} - - public int getColumnCount() {return 2;} - - public Object getValueAt(int row, int col) {return col==0? endPointName[row]: attachedMass[row];} - - public String getColumnName(int col) { - return col==0? TrackerRes.getString("AttachmentInspector.Header.PointName"): //$NON-NLS-1$ - TrackerRes.getString("AttachmentInspector.Header.AttachedTo"); //$NON-NLS-1$ - } - - public boolean isCellEditable(int row, int col) {return col==1;} - - public Class getColumnClass(int col) {return col==0? String.class: PointMass.class;} - - public void setValueAt(Object val, int row, int col) {} // empty method - - } - - /** - * A class to render attachment table cells. - */ - class AttachmentCellRenderer implements TableCellRenderer { - - JLabel label; - - AttachmentCellRenderer() { - label = new JLabel(); - label.setHorizontalAlignment(SwingConstants.CENTER); - label.setBackground(Color.white); - } - - public Component getTableCellRendererComponent(JTable table, Object val, - boolean selected, boolean hasFocus, int row, int col) { - - if (col==0) { - label.setText((String)val); - label.validate(); - return label; - } - - rendererDropdown.setSelectedItem(val==null? dummyMass: val); - return rendererDropdown; - } - - } - - /** - * A class to edit PointMass table cells in a JComboBox. - */ - class AttachmentCellEditor extends DefaultCellEditor { - - AttachmentCellEditor() { - super(editorDropdown); - } - - public Component getTableCellEditorComponent(JTable table, Object value, - boolean isSelected, int row, int column) { - editorDropdown.setSelectedItem(value==null? dummyMass: value); - return super.getTableCellEditorComponent(table, value, isSelected, row, column); - } - - public Object getCellEditorValue() { - Object obj = super.getCellEditorValue(); - int row = table.getSelectedRow(); - if (row<0) return null; - attachedMass[row] = obj==dummyMass? null: (PointMass)obj; - refreshMeasuringTool(); - return obj; - } - - } - - /** - * A class to render track labels for the attachment JComboBoxes. - */ - class TTrackRenderer extends JLabel implements ListCellRenderer { - - TTrackRenderer() { - setOpaque(true); - setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 0)); - } - - public Component getListCellRendererComponent(JList list, Object val, int index, - boolean selected, boolean hasFocus) { - - if (selected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - if (val!=null) { - TTrack track = (TTrack)val; - setText(track.getName()); - setIcon(track==dummyMass? dummyIcon: track.getFootprint().getIcon(21, 16)); - } - return this; - } - - } - - /** - * A class to provide model data for the attachment JComboBoxes. - */ - class AttachmentComboBoxModel extends AbstractListModel implements ComboBoxModel { - - Object selected = dummyMass; - - public int getSize() { - return masses==null? 1: masses.size()+1; - } - - public Object getElementAt(int index) { - return index==0? dummyMass: masses.get(index-1); - } - - public void setSelectedItem(Object anItem) { - selected = anItem; - } - - public Object getSelectedItem() { - return selected==null? dummyMass: selected; - } - - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; + +import org.opensourcephysics.media.core.TPoint; +import org.opensourcephysics.media.core.VideoClip; +import org.opensourcephysics.tools.FontSizer; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeEvent; + +/** + * This displays and sets point attachments. + * + * @author Douglas Brown + */ +public class AttachmentDialog extends JDialog + implements PropertyChangeListener { + + + // instance fields + protected TTrack measuringTool; + protected int endPointCount; + protected TTrack[] attachedMass; + protected String[] endPointName; + + protected TrackerPanel trackerPanel; + protected boolean isVisible; + protected JButton closeButton, helpButton; + protected ArrayList masses; + protected PointMass dummyMass; + protected JTable table; + protected int cellheight = 28; // depends on font level + protected JComboBox rendererDropdown, editorDropdown, measuringToolDropdown; + protected Icon dummyIcon = new ShapeIcon(null, 21, 16); + protected JScrollPane scrollPane; + protected AttachmentCellRenderer attachmentCellRenderer = new AttachmentCellRenderer(); + protected TTrackRenderer trackRenderer = new TTrackRenderer(); + + + /** + * Constructs an AttachmentControl. + * + * @param track the measuring tool + */ + public AttachmentDialog(TTrack track) { + super(JOptionPane.getFrameForComponent(track.trackerPanel), false); + createGUI(); + setMeasuringTool(track); + refreshDropdowns(); + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + refreshDisplay(); + } + + /** + * Responds to property change events. This listens for the + * following events: "tab" from TFrame. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (trackerPanel != null && e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + else if (e.getPropertyName().equals("track")) { //$NON-NLS-1$ + TTrack deleted = (TTrack)e.getOldValue(); + if (deleted!=null) { + deleted.removePropertyChangeListener("step", this); //$NON-NLS-1$ + deleted.removePropertyChangeListener("steps", this); //$NON-NLS-1$ + deleted.removePropertyChangeListener("name", this); //$NON-NLS-1$ + deleted.removePropertyChangeListener("color", this); //$NON-NLS-1$ + deleted.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + for (int i = 0; i < endPointCount; i++) { + if (deleted==attachedMass[i] || deleted==measuringTool) { + attachedMass[i] = null; + } + } + refreshMeasuringTool(); + } + refreshDropdowns(); + refreshDisplay(); + } + else if (e.getPropertyName().equals("step") //$NON-NLS-1$ + || e.getPropertyName().equals("steps")) { //$NON-NLS-1$ + refreshMeasuringTool(); + } + else refreshDisplay(); + } + + /** + * Overrides JDialog setVisible method. + * + * @param vis true to show this inspector + */ + public void setVisible(boolean vis) { + super.setVisible(vis); + isVisible = vis; + } + + /** + * Disposes of this inspector. + */ + public void dispose() { + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + for (TTrack p: masses) { + p.removePropertyChangeListener("name", this); //$NON-NLS-1$ + p.removePropertyChangeListener("color", this); //$NON-NLS-1$ + p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.dispose(); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + setResizable(false); + // create GUI components + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + JPanel north = new JPanel(); + north.setBorder(BorderFactory.createEmptyBorder(4, 0, 0, 0)); + measuringToolDropdown = new JComboBox(); + measuringToolDropdown.setRenderer(trackRenderer); + measuringToolDropdown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + TTrack tool = (TTrack)measuringToolDropdown.getSelectedItem(); + if (tool==measuringTool) return; + setMeasuringTool(tool); + } + }); + north.add(measuringToolDropdown); + contentPane.add(north, BorderLayout.NORTH); + + dummyMass = new PointMass(); + + rendererDropdown = new JComboBox(new AttachmentComboBoxModel()); + rendererDropdown.setRenderer(trackRenderer); + editorDropdown = new JComboBox(new AttachmentComboBoxModel()); + editorDropdown.setRenderer(trackRenderer); + + table = new JTable(new AttachmentTableModel()) { + @Override + public void setFont(Font font) { + super.setFont(font); + cellheight = font.getSize()+16; + setRowHeight(cellheight); + int w = (int)(60*(1+FontSizer.getLevel()*0.3)); + getColumnModel().getColumn(0).setPreferredWidth(w); + getColumnModel().getColumn(1).setPreferredWidth(2*w); + getTableHeader().setPreferredSize(new Dimension(w, cellheight)); + } + }; + attachmentCellRenderer = new AttachmentCellRenderer(); + table.setDefaultRenderer(PointMass.class, attachmentCellRenderer); + table.setDefaultRenderer(String.class, attachmentCellRenderer); + table.setRowHeight(cellheight); + + TableCellEditor editor = new AttachmentCellEditor(); + table.getColumnModel().getColumn(1).setCellEditor(editor); + scrollPane = new JScrollPane(table) { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = 3*cellheight+8; + dim.width= table.getPreferredSize().width; + return dim; + } + }; + JPanel center = new JPanel(new GridLayout(1,1)); + contentPane.add(center, BorderLayout.CENTER); + center.add(scrollPane); + center.setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8)); + + // create buttons and buttonbar + helpButton = new JButton(); + helpButton.setForeground(new Color(0, 0, 102)); + helpButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String keyword = measuringTool instanceof Protractor? "protractor": "tape"; //$NON-NLS-1$ //$NON-NLS-2$ + trackerPanel.getTFrame().showHelp(keyword+"#attach", 0); //$NON-NLS-1$ + } + }); + closeButton = new JButton(); + closeButton.setForeground(new Color(0, 0, 102)); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + JPanel buttonbar = new JPanel(); + contentPane.add(buttonbar, BorderLayout.SOUTH); + buttonbar.add(helpButton); + buttonbar.add(closeButton); + } + + protected void setMeasuringTool(TTrack tool) { + measuringTool = tool; + if (tool!=null) { + trackerPanel = measuringTool.trackerPanel; + endPointCount = tool instanceof TapeMeasure? 2: 3; + endPointName = new String[endPointCount]; + attachedMass = measuringTool.attachments==null? new TTrack[endPointCount]: measuringTool.attachments; + } + else { + endPointCount = 0; + endPointName = new String[0]; + attachedMass = new TTrack[0]; + } + DefaultTableModel dm = (DefaultTableModel)table.getModel(); + dm.fireTableDataChanged(); + refreshDisplay(); + } + + /** + * Updates the system to reflect the current particle selection. + */ + private void refreshMeasuringTool() { + measuringTool.attachments = attachedMass; + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + for (int i = 0; i < endPointCount; i++) { + if (attachedMass[i]!=null) { + if (measuringTool instanceof TapeMeasure) + ((TapeMeasure)measuringTool).setFixedPosition(false); + else if (measuringTool instanceof Protractor) + ((Protractor)measuringTool).setFixed(false); + for (int n = clip.getStartFrameNumber(); n<=clip.getEndFrameNumber(); n++) { + Step step = attachedMass[i].getStep(n); + TPoint p = measuringTool.getStep(n).getPoints()[i]; + if (step==null) { + p.detach(); + continue; + } + TPoint target = step.getPoints()[0]; + p.attachTo(target); + } + } + else { // attached mass is null + for (int n = clip.getStartFrameNumber(); n<=clip.getEndFrameNumber(); n++) { + TPoint p = measuringTool.getStep(n).getPoints()[i]; + p.detach(); + } + } + } + measuringTool.getToolbarTrackComponents(trackerPanel); + } + + /** + * Refreshes the attachment and measuring tool dropdowns. + */ + protected void refreshDropdowns() { + masses = trackerPanel.getDrawables(PointMass.class); + for (TTrack p: masses) { + p.removePropertyChangeListener("step", this); //$NON-NLS-1$ + p.removePropertyChangeListener("steps", this); //$NON-NLS-1$ + p.removePropertyChangeListener("name", this); //$NON-NLS-1$ + p.removePropertyChangeListener("color", this); //$NON-NLS-1$ + p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + p.addPropertyChangeListener("step", this); //$NON-NLS-1$ + p.addPropertyChangeListener("steps", this); //$NON-NLS-1$ + p.addPropertyChangeListener("name", this); //$NON-NLS-1$ + p.addPropertyChangeListener("color", this); //$NON-NLS-1$ + p.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + FontSizer.setFonts(rendererDropdown, FontSizer.getLevel()); + rendererDropdown.setModel(new AttachmentComboBoxModel()); + FontSizer.setFonts(editorDropdown, FontSizer.getLevel()); + editorDropdown.setModel(new AttachmentComboBoxModel()); + + FontSizer.setFonts(measuringToolDropdown, FontSizer.getLevel()); + Object tool = measuringToolDropdown.getSelectedItem(); + java.util.Vector tools = new java.util.Vector(); + for (TTrack track: trackerPanel.getTracks()) { + if (track instanceof TapeMeasure) { + TapeMeasure tape = (TapeMeasure)track; +// if (tape.isViewable()) + tools.add(tape); + } + else if (track instanceof Protractor) { + tools.add(track); + } + } + for (TTrack p: tools) { + p.removePropertyChangeListener("name", this); //$NON-NLS-1$ + p.removePropertyChangeListener("color", this); //$NON-NLS-1$ + p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + p.addPropertyChangeListener("name", this); //$NON-NLS-1$ + p.addPropertyChangeListener("color", this); //$NON-NLS-1$ + p.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + measuringToolDropdown.setModel(new DefaultComboBoxModel(tools)); + if (tool==measuringTool) { + setMeasuringTool(tools.isEmpty()? null: tools.get(0)); + } + } + + /** + * Updates this inspector to show the system's current particles. + */ + protected void refreshDisplay() { + setTitle(TrackerRes.getString("AttachmentInspector.Title")); //$NON-NLS-1$ + helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + dummyMass.setName(TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ + if (endPointCount>0 && measuringTool!=null) { + if (measuringTool instanceof Protractor) { + endPointName[0] = TrackerRes.getString("AttachmentInspector.Label.Vertex"); //$NON-NLS-1$ + endPointName[1] = TrackerRes.getString("AttachmentInspector.Label.End")+" 1"; //$NON-NLS-1$ //$NON-NLS-2$ + endPointName[2] = TrackerRes.getString("AttachmentInspector.Label.End")+" 2"; //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + endPointName[0] = TrackerRes.getString("AttachmentInspector.Label.End")+" 1"; //$NON-NLS-1$ //$NON-NLS-2$ + endPointName[1] = TrackerRes.getString("AttachmentInspector.Label.End")+" 2"; //$NON-NLS-1$ //$NON-NLS-2$ + } + measuringToolDropdown.setSelectedItem(measuringTool); + } + pack(); + repaint(); + } + + public void setFontLevel(int level) { + FontSizer.setFonts(this, level); + FontSizer.setFonts(attachmentCellRenderer.label, level); + FontSizer.setFonts(table, level); + refreshDropdowns(); + pack(); + } + + + + /** + * A class to provide model data for the attachment table. + */ + class AttachmentTableModel extends DefaultTableModel { + public int getRowCount() {return endPointCount;} + + public int getColumnCount() {return 2;} + + public Object getValueAt(int row, int col) {return col==0? endPointName[row]: attachedMass[row];} + + public String getColumnName(int col) { + return col==0? TrackerRes.getString("AttachmentInspector.Header.PointName"): //$NON-NLS-1$ + TrackerRes.getString("AttachmentInspector.Header.AttachedTo"); //$NON-NLS-1$ + } + + public boolean isCellEditable(int row, int col) {return col==1;} + + public Class getColumnClass(int col) {return col==0? String.class: PointMass.class;} + + public void setValueAt(Object val, int row, int col) {} // empty method + + } + + /** + * A class to render attachment table cells. + */ + class AttachmentCellRenderer implements TableCellRenderer { + + JLabel label; + + AttachmentCellRenderer() { + label = new JLabel(); + label.setHorizontalAlignment(SwingConstants.CENTER); + label.setBackground(Color.white); + } + + public Component getTableCellRendererComponent(JTable table, Object val, + boolean selected, boolean hasFocus, int row, int col) { + + if (col==0) { + label.setText((String)val); + label.validate(); + return label; + } + + rendererDropdown.setSelectedItem(val==null? dummyMass: val); + return rendererDropdown; + } + + } + + /** + * A class to edit PointMass table cells in a JComboBox. + */ + class AttachmentCellEditor extends DefaultCellEditor { + + AttachmentCellEditor() { + super(editorDropdown); + } + + public Component getTableCellEditorComponent(JTable table, Object value, + boolean isSelected, int row, int column) { + editorDropdown.setSelectedItem(value==null? dummyMass: value); + return super.getTableCellEditorComponent(table, value, isSelected, row, column); + } + + public Object getCellEditorValue() { + Object obj = super.getCellEditorValue(); + int row = table.getSelectedRow(); + if (row<0) return null; + attachedMass[row] = obj==dummyMass? null: (PointMass)obj; + refreshMeasuringTool(); + return obj; + } + + } + + /** + * A class to render track labels for the attachment JComboBoxes. + */ + class TTrackRenderer extends JLabel implements ListCellRenderer { + + TTrackRenderer() { + setOpaque(true); + setBorder(BorderFactory.createEmptyBorder(3, 4, 3, 0)); + } + + public Component getListCellRendererComponent(JList list, Object val, int index, + boolean selected, boolean hasFocus) { + + if (selected) { + setBackground(list.getSelectionBackground()); + setForeground(list.getSelectionForeground()); + } else { + setBackground(list.getBackground()); + setForeground(list.getForeground()); + } + if (val!=null) { + TTrack track = (TTrack)val; + setText(track.getName()); + setIcon(track==dummyMass? dummyIcon: track.getFootprint().getIcon(21, 16)); + } + return this; + } + + } + + /** + * A class to provide model data for the attachment JComboBoxes. + */ + class AttachmentComboBoxModel extends AbstractListModel implements ComboBoxModel { + + Object selected = dummyMass; + + public int getSize() { + return masses==null? 1: masses.size()+1; + } + + public Object getElementAt(int index) { + return index==0? dummyMass: masses.get(index-1); + } + + public void setSelectedItem(Object anItem) { + selected = anItem; + } + + public Object getSelectedItem() { + return selected==null? dummyMass: selected; + } + + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java b/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java index 40414c89..b93bfb36 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java @@ -1,3402 +1,3402 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.font.FontRenderContext; -import java.awt.geom.*; -import java.awt.image.BufferedImage; -import java.beans.*; -import java.text.NumberFormat; -import java.text.ParseException; - -import javax.swing.*; -import javax.swing.Timer; -import javax.swing.border.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.tools.ResourceLoader; - -/** - * A class to automatically track a feature of interest in a video. - * This uses a TemplateMatcher to find a match to the feature in each frame - * and, if found, marks the active track at the target location. - * - * @author Douglas Brown - */ -public class AutoTracker implements Interactive, Trackable, PropertyChangeListener { - - // static fields - private static Rectangle hitRect = new Rectangle(-4, -4, 8, 8); - private static TPoint hitPt = new TPoint(); - private static Shape selectionShape; - private static AffineTransform transform = new AffineTransform(); - private static Footprint target_footprint - = PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"); //$NON-NLS-1$ - private static Footprint inactive_target_footprint - = PointShapeFootprint.getFootprint("Footprint.Crosshair"); //$NON-NLS-1$ - private static Footprint corner_footprint - = PointShapeFootprint.getFootprint("Footprint.SolidSquare"); //$NON-NLS-1$ - private static final float[] DOTTED_LINE = new float[] {2, 2}; - private static final float[] DASHED_LINE = new float[] {2, 8}; - private static NumberFormat format = NumberFormat.getNumberInstance(); - private static double cornerFactor = 0.9; - private static BasicStroke solidBold = new BasicStroke(2), solid = new BasicStroke(); - private static BasicStroke dotted, dashed; - private static int maxEvolveRate = 100; // percent - private static int defaultEvolveRate = maxEvolveRate/5; - private static Icon searchIcon, stopIcon, graySearchIcon; - private static double[] defaultMaskSize = {9, 9}; - private static double[] defaultSearchSize = {40, 40}; - private static int templateIconMagnification = 2; - private static int predictionLookback = 4; - - static { - dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); - dashed = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DASHED_LINE,0); - selectionShape = solidBold.createStrokedShape(hitRect); - format.setMinimumIntegerDigits(1); - format.setMinimumFractionDigits(1); - format.setMaximumFractionDigits(1); - String path = "/org/opensourcephysics/cabrillo/tracker/resources/images/green_light.gif"; //$NON-NLS-1$ - searchIcon = ResourceLoader.getIcon(path); - path = "/org/opensourcephysics/cabrillo/tracker/resources/images/red_light.gif"; //$NON-NLS-1$ - stopIcon = ResourceLoader.getIcon(path); - path = "/org/opensourcephysics/cabrillo/tracker/resources/images/gray_light.gif"; //$NON-NLS-1$ - graySearchIcon = ResourceLoader.getIcon(path); - } - - // instance fields - private TrackerPanel trackerPanel; - private TTrack track; - private Wizard wizard; - private Shape match = new Ellipse2D.Double(); - private double minMaskRadius = 4; - private Handle maskHandle = new Handle(); - private Corner maskCorner = new Corner(); - private TPoint maskCenter = new TPoint(); - private Handle searchHandle = new Handle(); - private Corner searchCorner = new Corner(); - private TPoint searchCenter = new TPoint(); - private TPoint predictedTarget = new TPoint(); - private Rectangle2D searchRect2D = new Rectangle2D.Double(); - private Shape searchShape, maskShape, matchShape; - private Shape searchHitShape, maskHitShape; - private Mark mark; // draws the mask, target and/or search area - private Point[] screenPoints = {new Point()}; // used for footprints - private boolean maskVisible, targetVisible, searchVisible; - private Runnable stepper; - private boolean stepping, active, paused, marking, lookAhead=true; - private int goodMatch=4, possibleMatch=1, evolveAlpha=63; - /* trackFrameData maps tracks to indexFrameData which maps point index - to frameData which maps frame number to individual FrameData objects */ - private Map>> trackFrameData - = new HashMap>>(); - private int lineSpread = -1; // positive for 1D, negative for 2D tracking - private boolean isInteracting; - private double[][] derivatives1 = new double[predictionLookback-1][]; - private double[][] derivatives2 = new double[predictionLookback-1][]; - private double[][] derivatives3 = new double[predictionLookback-1][]; - - - /** - * Constructs an AutoTracker for a specified TrackerPanel. - * - * @param panel the TrackerPanel - */ - public AutoTracker(TrackerPanel panel) { - trackerPanel = panel; - trackerPanel.addDrawable(this); - trackerPanel.addPropertyChangeListener("selectedpoint", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("selectedtrack", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("video", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - stepper = new Runnable() { - public void run() { - if (!active || track==null) { - return; - } - if (markCurrentFrame(true)) { - // successfully found/marked a good match - if (!canStep()) { // reached the end - stop(true, true); - return; - } - if (stepping) { // move to the next step - wizard.refreshInfo(); - repaint(); - trackerPanel.getPlayer().step(); - return; - } - // not stepping, so stop - stop(true, true); - } - else { // failed to find or mark a match, so pause or stop - if (!stepping) - stop(true, false); - else { - paused = true; - if (track instanceof PointMass) { - PointMass pointMass = (PointMass)track; - pointMass.updateDerivatives(); - } - track.firePropertyChange("steps", null, null); //$NON-NLS-1$ - wizard.refreshGUI(); - } - } - repaint(); - } - }; - wizard = new Wizard(); - // center on screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - wizard.getBounds().width) / 2; - int y = (dim.height - wizard.getBounds().height) / 2; - wizard.setLocation(x, y); - } - - /** - * Sets the track to mark when matches are found. - * - * @param aTrack the track - */ - protected void setTrack(TTrack aTrack) { - if (aTrack!=null && !aTrack.isAutoTrackable()) - aTrack = null; - if (track==aTrack) return; - if (track!=null) { - track.removePropertyChangeListener("step", this); //$NON-NLS-1$ - track.removePropertyChangeListener("name", this); //$NON-NLS-1$ - track.removePropertyChangeListener("color", this); //$NON-NLS-1$ - track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - track = aTrack; - if (track!=null) - trackerPanel.setSelectedTrack(track); - if (track!=null) { - track.addPropertyChangeListener("step", this); //$NON-NLS-1$ - track.addPropertyChangeListener("name", this); //$NON-NLS-1$ - track.addPropertyChangeListener("color", this); //$NON-NLS-1$ - track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.setVisible(true); - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - TPoint[] searchPts = frame.getSearchPoints(true); - if (searchPts != null) - setSearchPoints(searchPts[0], searchPts[1]); - } - wizard.refreshGUI(); - } - - /** - * Adds a key frame for a given track point and mask center position. - * - * @param p the track point - * @param x the mask center x - * @param y the mask center y - */ - protected void addKeyFrame(TPoint p, double x, double y) { - int n = trackerPanel.getFrameNumber(); - Target target = new Target(); - Shape mask = new Ellipse2D.Double(); - maskCenter.setLocation(x, y); - maskCorner.setLocation(x+defaultMaskSize[0], y+defaultMaskSize[1]); - searchCenter.setLocation(x, y); - searchCorner.setLocation(x+defaultSearchSize[0], y+defaultSearchSize[1]); - Map frames = getFrameData(); - KeyFrame keyFrame = new KeyFrame(p, mask, target); - frames.put(n, keyFrame); - clearSearchPointsDownstream(); - refreshSearchRect(); - refreshKeyFrame(keyFrame); - getWizard().setVisible(true); -// getWizard().refreshGUI(); -// search(false, false); // don't skip this frame and don't keep stepping - trackerPanel.repaint(); - } - - /** - * Starts the search process. - * - * @param startWithThis true to search the current frame - * @param keepGoing true to continue stepping after the first search - */ - protected void search(boolean startWithThis, boolean keepGoing) { - stepping = stepping || keepGoing; - wizard.changed = false; - active = true; // actively searching - paused = false; - if (!startWithThis || markCurrentFrame(false)) { - if (canStep() && (!startWithThis||stepping)) { - trackerPanel.getPlayer().step(); - return; - } - if (startWithThis && !stepping) { // mark this frame only - active = false; - } - // reached end frame, so stop - else { - stop(true, true); - } - } - else { - // tried to mark this frame and failed - paused = true; - } - getWizard().refreshGUI(); - getWizard().helpButton.requestFocusInWindow(); - repaint(); - } - - /** - * Stops the search process. - * - * @param now true to stop now - * @param update true to update derivatives - */ - protected void stop(boolean now, boolean update) { - stepping = false; // don't keep stepping - active = !now && !paused; - paused = false; - wizard.refreshGUI(); - if (update) { - if (track instanceof PointMass) { - PointMass pointMass = (PointMass)track; - pointMass.updateDerivatives(); - } - track.firePropertyChange("steps", null, null); //$NON-NLS-1$ - } - } - - /** - * Marks a new step in the current frame if a match is found. - * - * @param predictLoc true to use look-ahead prediction for setting the search loc - * @return true if a new step was marked - */ - public boolean markCurrentFrame(boolean predictLoc) { - if (track==null) return false; - trackerPanel.setSelectedTrack(track); - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - KeyFrame keyFrame = frame.getKeyFrame(); - if (keyFrame!=null && !track.isStepComplete(n)) { - TPoint p = findMatchTarget(predictLoc); - double[] peakWidthAndHeight = frame.getMatchWidthAndHeight(); - if (p!=null - && (Double.isInfinite(peakWidthAndHeight[1]) - || peakWidthAndHeight[1]>=goodMatch)) { - marking = true; - track.autoTrackerMarking = track.isAutoAdvance(); - p = track.autoMarkAt(n, p.x, p.y); - frame.setAutoMarkPoint(p); - track.autoTrackerMarking = false; - return true; - } - if (p==null) { - frame.setMatchIcon(null); - } - } - return false; - } - - /** - * Gets the predicted target point in a specified video frame, - * based on previously marked steps. - * - * @param frameNumber the frame number - * @return the predicted target - */ - public TPoint getPredictedMatchTarget(int frameNumber) { - boolean success = false; - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - int stepNumber = clip.frameToStep(frameNumber); - - // get position data at previous steps - TPoint[] prevPoints = new TPoint[predictionLookback]; - if (stepNumber>0 && track!=null) { - for (int j = 0; j= 0) { - int n = clip.stepToFrame(stepNumber-j-1); - FrameData frame = getFrame(n); - if (track.steps.isAutofill() && !frame.searched) - prevPoints[j] = null; - else { - prevPoints[j] = frame.getMarkedPoint(); - } - } - } - } - - // return null (no prediction) if there is no recent position data - if (prevPoints[0]==null) - return null; - - // set predictedTarget to prev position - predictedTarget.setLocation(prevPoints[0].getX(), prevPoints[0].getY()); - if (!lookAhead || prevPoints[1]==null) { - // no recent velocity or acceleration data available - success = true; - } - - if (!success) { - // get derivatives - double[][] veloc = getDerivatives(prevPoints, 1); - double[][] accel = getDerivatives(prevPoints, 2); - double[][] jerk = getDerivatives(prevPoints, 3); - - double vxmax=0, vxmean=0, vymax=0, vymean=0; - int n = 0; - for (int i=0; i< veloc.length; i++) { - if (veloc[i]!=null) { - n++; - vxmax = Math.max(vxmax, Math.abs(veloc[i][0])); - vxmean += veloc[i][0]; - vymax = Math.max(vymax, Math.abs(veloc[i][1])); - vymean += veloc[i][1]; - } - } - vxmean = Math.abs(vxmean/n); - vymean = Math.abs(vymean/n); - - double axmax=0, axmean=0, aymax=0, aymean=0; - n = 0; - for (int i=0; i< accel.length; i++) { - if (accel[i]!=null) { - n++; - axmax = Math.max(axmax, Math.abs(accel[i][0])); - axmean += accel[i][0]; - aymax = Math.max(aymax, Math.abs(accel[i][1])); - aymean += accel[i][1]; - } - } - axmean = Math.abs(axmean/n); - aymean = Math.abs(aymean/n); - - double jxmax=0, jxmean=0, jymax=0, jymean=0; - n = 0; - for (int i=0; i< jerk.length; i++) { - if (jerk[i]!=null) { - n++; - jxmax = Math.max(jxmax, Math.abs(jerk[i][0])); - jxmean += jerk[i][0]; - jymax = Math.max(jymax, Math.abs(jerk[i][1])); - jymean += jerk[i][1]; - } - } - jxmean = Math.abs(jxmean/n); - jymean = Math.abs(jymean/n); - - boolean xVelocValid = prevPoints[2]==null || Math.abs(accel[0][0])-1 && i!=track.getTargetIndex()) { - track.setTargetIndex(i); - - // get frame for new index and reposition search points and mask - frame = getFrame(n); - TPoint[] searchPts = frame.getSearchPoints(true); - if (searchPts != null) - setSearchPoints(searchPts[0], searchPts[1]); - - keyFrame = frame.getKeyFrame(); - if (keyFrame!=null) { - maskCenter.setLocation(keyFrame.getMaskPoints()[0]); - maskCorner.setLocation(keyFrame.getMaskPoints()[1]); - } - - wizard.refreshGUI(); - needsRepaint = true; - } - } - if (needsRepaint) repaint(); - } - else if (name.equals("selectedtrack") && wizard!=null) { //$NON-NLS-1$ -// setTrack((TTrack)e.getNewValue()); - wizard.refreshGUI(); - } - - if (wizard==null || !wizard.isVisible()) return; - - if (name.equals("video") || name.equals("name") //$NON-NLS-1$ //$NON-NLS-2$ - || name.equals("color") || name.equals("footprint")) { //$NON-NLS-1$ //$NON-NLS-2$ - wizard.refreshGUI(); - } - else if (track==null && name.equals("stepnumber")) { //$NON-NLS-1$ - wizard.refreshGUI(); - } - - if (track==null || trackerPanel.getVideo()==null) { - return; - } - if (name.equals("step") && wizard.isVisible()) { //$NON-NLS-1$ - if (!marking) { // not marked by this autotracker - n = ((Integer)e.getNewValue()).intValue(); - frame = getFrame(n); - frame.decided = true; // point dragged by user? - if (track.getStep(n)==null) { // step was deleted - frame.clear(); - } - else if (!frame.isKeyFrame()) { // step was marked or moved - frame.setMatchIcon(null); - paused = false; - } - } - wizard.refreshGUI(); - marking = false; - } - else if (name.equals("stepnumber")) { //$NON-NLS-1$ - TPoint[] searchPts = frame.getSearchPoints(true); - if (searchPts != null) - setSearchPoints(searchPts[0], searchPts[1]); - else if (lookAhead && keyFrame!=null) { - TPoint prediction = getPredictedMatchTarget(n); - if (prediction != null) { - setSearchPoints(getMatchCenter(prediction), null); - // save search center and corner points - TPoint[] pts = new TPoint[] {new TPoint(searchCenter), new TPoint(searchCorner)}; - frame.setSearchPoints(pts); - } - else { - repaint(); - } - } - if (active && !paused) { // actively tracking - if (SwingUtilities.isEventDispatchThread()) - stepper.run(); - else - SwingUtilities.invokeLater(stepper); - } - else if (stepping) { // user set the frame number, so stop stepping - stop(true, false); - } - else wizard.refreshGUI(); - } - } - - // implements Interactive & Measurable methods - public void setEnabled(boolean enabled) {} - public boolean isEnabled() {return true;} - public void setXY(double x, double y) {} - public void setX(double x) {} - public void setY(double y) {} - public double getX() {return 0;} - public double getY() {return 0;} - public double getXMin() {return 0;} - public double getXMax() {return 0;} - public double getYMin() {return 0;} - public double getYMax() {return 0;} - public boolean isMeasured() {return false;} - -//_______________________________ protected methods _________________________ - - /** - * Finds the target for the best match found within the specified - * searchRect. Also saves match width, height, center and corner. - * - * @param searchRect the search rectangle - * @return the target, or null if no match found - */ - protected TPoint findMatchTarget(Rectangle searchRect) { - Video video = trackerPanel.getVideo(); - if (video == null) return null; - TemplateMatcher matcher = getTemplateMatcher(); - if (matcher == null) return null; - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - frame.decided = false; // default - - // set template to be matched - matcher.setTemplate(frame.getTemplateToMatch()); - - // get location, width and height of match - TPoint p = null; - BufferedImage image = video.getImage(); - if (lineSpread>=0) { - double theta = trackerPanel.getCoords().getAngle(n); - double x0 = trackerPanel.getCoords().getOriginX(n); - double y0 = trackerPanel.getCoords().getOriginY(n); - p = matcher.getMatchLocation(image, searchRect, x0, y0, theta, lineSpread); // may be null - } - else { - p = matcher.getMatchLocation(image, searchRect); // may be null - } - double[] matchWidthAndHeight = matcher.getMatchWidthAndHeight(); - if (matchWidthAndHeight[1]=goodMatch) { - buildEvolvedTemplate(frame); - return getMatchTarget(center); - } - - return null; - } - - /** - * Builds an evolved template based on data in the specified FrameData - * and the current video image. - * - * @param frame the FrameData frame - */ - protected void buildEvolvedTemplate(FrameData frame) { - TPoint[] matchPts = frame.getMatchPoints(); - if (matchPts==null) return; // can't build template without a match -// System.out.println("building evolved for "+frame.getFrameNumber()); - TemplateMatcher matcher = getTemplateMatcher(); - matcher.setTemplate(frame.getTemplate()); - matcher.setWorkingPixels(frame.getWorkingPixels()); - Rectangle rect = frame.getKeyFrame().getMask().getBounds(); - // get new image to rebuild template - int x = (int)Math.round(matchPts[2].getX()); - int y = (int)Math.round(matchPts[2].getY()); - BufferedImage source = trackerPanel.getVideo().getImage(); - BufferedImage matchImage = new BufferedImage( - rect.width, rect.height, BufferedImage.TYPE_INT_RGB); - matchImage.createGraphics().drawImage(source, -x, -y, null); - matcher.buildTemplate(matchImage, evolveAlpha, 0); - matcher.setIndex(frame.getFrameNumber()); - } - - - /** - * Creates a TemplateMatcher based on the current image and mask. - * - * @return a newly created template matcher, or null if no video image exists - */ - protected TemplateMatcher createTemplateMatcher() { - Video video = trackerPanel.getVideo(); - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - KeyFrame keyFrame = frame.getKeyFrame(); - if (video!=null && keyFrame!=null) { - // create template image - Shape mask = keyFrame.getMask(); - BufferedImage source = video.getImage(); - Rectangle rect = mask.getBounds(); - BufferedImage templateImage = new BufferedImage( - rect.width, rect.height, BufferedImage.TYPE_INT_RGB); - templateImage.createGraphics().drawImage(source, -rect.x, -rect.y, null); - // translate mask to (0, 0) relative to template - transform.setToTranslation(-rect.x, -rect.y); - Shape templateRegion = transform.createTransformedShape(mask); - return new TemplateMatcher(templateImage, templateRegion); - } - return null; - } - - // indexFrameData maps point index to frameData - protected Map> getIndexFrameData() { - Map> indexFrameData = trackFrameData.get(track); - if (indexFrameData==null) { - indexFrameData = new TreeMap>(); - trackFrameData.put(track, indexFrameData); - } - return indexFrameData; - } - - // frameData maps frame number to individual FrameData objects - protected Map getFrameData(int index) { - Map frameData = getIndexFrameData().get(index); - if (frameData==null) { - frameData = new TreeMap(); - getIndexFrameData().put(index, frameData); - } - return frameData; - } - - protected Map getFrameData() { - int index = track==null? 0: track.getTargetIndex(); - return getFrameData(index); - } - - protected FrameData getFrame(int frameNumber) { - FrameData frame = getFrameData().get(frameNumber); - if (frame==null) { - int index = track==null? 0: track.getTargetIndex(); - frame = new FrameData(index, frameNumber); - getFrameData().put(frameNumber, frame); - } - return frame; - } - - protected int getIndex(TPoint p) { - int n = p.getFrameNumber(trackerPanel); - Step step = track.getStep(n); // non-null if marked - if (step!=null) { - for (int i=0; i< step.points.length; i++) { - if (p.equals(step.points[i])) { - return i; - } - } - } - return -1; - } - - protected TTrack getTrack() { - return track; - } - - /** - * Erases the current mark. - */ - protected void erase() { - if (mark != null) - trackerPanel.addDirtyRegion(mark.getBounds(false)); // old bounds - mark = null; - } - - /** - * Repaints this object. - */ - protected void repaint() { - erase(); - if (getMark() != null) - trackerPanel.addDirtyRegion(mark.getBounds(false)); // new bounds - trackerPanel.repaintDirtyRegion(); - } - - /** - * Cleans up resources. - */ - protected void cleanup() { - trackerPanel.removeDrawable(this); - trackerPanel.removePropertyChangeListener(this); - setTrack(null); - wizard.dispose(); - } - - /** - * Gets the drawing mark. - * - * @return the mark - */ - protected Mark getMark() { - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - KeyFrame keyFrame = frame.getKeyFrame(); - if (track==null || keyFrame==null) return null; - if (mark==null) { - int k = getStatusCode(n); - // refresh target icon on wizard label - Color c = track.getFootprint().getColor(); - target_footprint.setColor(c); - inactive_target_footprint.setColor(c); - corner_footprint.setColor(c); - // define marks for center, corners, target and selection - Mark searchCornerMark=null, maskCornerMark=null, - targetMark=null, selectionMark=null; - // set up transform - AffineTransform toScreen = trackerPanel.getPixelTransform(); - if (!trackerPanel.isDrawingInImageSpace()) { - toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); - } - // get selected point and define the corresponding screen point - final TPoint selection = trackerPanel.getSelectedPoint(); - Point selectionPt = null; - // refresh search and mask draw and hit shapes - try { - searchShape = toScreen.createTransformedShape(searchRect2D); - searchHitShape = solid.createStrokedShape(searchShape); - maskShape = toScreen.createTransformedShape(keyFrame.getMask()); - maskHitShape = solid.createStrokedShape(maskShape); - } catch (Exception e) { - return null; - } - // check to see if a handle is selected - if (selection == maskHandle) - selectionPt = maskVisible? maskHandle.getScreenPosition(trackerPanel): null; - else if (selection == searchHandle) - selectionPt = searchVisible? searchHandle.getScreenPosition(trackerPanel): null; - // create mask corner mark - if (frame.isKeyFrame()) { - maskCenter.setLocation(keyFrame.getMaskPoints()[0]); - maskCorner.setLocation(keyFrame.getMaskPoints()[1]); - } - screenPoints[0] = maskCorner.getScreenPosition(trackerPanel); - if (selection == maskCorner) { - selectionPt = maskVisible? screenPoints[0]: null; - } - else { - maskCornerMark = corner_footprint.getMark(screenPoints); - } - // create search corner mark - screenPoints[0] = searchCorner.getScreenPosition(trackerPanel); - if (selection == searchCorner) { - selectionPt = searchVisible? screenPoints[0]: null; - } - else { - searchCornerMark = corner_footprint.getMark(screenPoints); - } - // create target mark - screenPoints[0] = keyFrame.getTarget().getScreenPosition(trackerPanel); - if (selection == keyFrame.getTarget()) - selectionPt = targetVisible? screenPoints[0]: null; - else { - targetMark = target_footprint.getMark(screenPoints); - } - // if a match has been found, create match shapes - TPoint[] matchPts = frame.getMatchPoints(); - if (matchPts == null || frame.isKeyFrame() || k==5) - matchShape = null; - else { - Point p1 = matchPts[0].getScreenPosition(trackerPanel); - Point p2 = maskCenter.getScreenPosition(trackerPanel); - transform.setToTranslation(p1.x-p2.x, p1.y-p2.y); - matchShape = toScreen.createTransformedShape(getMatchShape(matchPts)); - screenPoints[0] = getMatchTarget(matchPts[0]).getScreenPosition(trackerPanel); -// matchTargetMark = inactive_target_footprint.getMark(screenPoints); - } - // if anything is selected, create a selection mark - if (selectionPt != null) { - transform.setToTranslation(selectionPt.x, selectionPt.y); - final Shape selectedShape - = transform.createTransformedShape(selectionShape); - selectionMark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(selectedShape); - } - public Rectangle getBounds(boolean highlighted) { - return selectedShape.getBounds(); - } - }; - } - // create final mark - final Mark markMaskCorner = maskCornerMark; - final Mark markSearchCorner = searchCornerMark; - final Mark markTarget = targetMark; - final Mark markSelection = selectionMark; - mark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - Color c = track.getFootprint().getColor(); - g.setPaint(c); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - BasicStroke stroke = (BasicStroke)g.getStroke(); - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - boolean isKeyFrame = frame!=null && frame.isKeyFrame(); - if (targetVisible) { - // draw the target - if (isKeyFrame) { - if (markTarget != null) - markTarget.draw(g, false); - } - } - if (matchShape!=null && !isKeyFrame) { - g.setStroke(dotted); - g.draw(matchShape); - } - if (maskVisible && isKeyFrame) { - g.setStroke(stroke); - g.draw(maskShape); - if (markMaskCorner != null) - markMaskCorner.draw(g, false); - } - if (searchVisible || !isKeyFrame) { - // draw the searchRect - g.setStroke(dashed); - g.draw(searchShape); - if (markSearchCorner != null) - markSearchCorner.draw(g, false); - } - // draw the selected point - if (markSelection != null) markSelection.draw(g, false); - g.setStroke(stroke); - g.setPaint(gpaint); - } - public Rectangle getBounds(boolean highlighted) { - Rectangle bounds = searchShape.getBounds(); - if (markMaskCorner != null) bounds.add(markMaskCorner.getBounds(highlighted)); - if (markSearchCorner != null) bounds.add(markSearchCorner.getBounds(highlighted)); - if (markTarget != null) bounds.add(markTarget.getBounds(highlighted)); - if (markSelection != null) bounds.add(markSelection.getBounds(highlighted)); - if (maskVisible) bounds.add(maskShape.getBounds()); - if (matchShape != null) { - bounds.add(matchShape.getBounds()); -// bounds.add(matchTargetMark.getBounds(highlighted)); - } - return bounds; - } - }; - } - return mark; - } - - /** - * Returns the target for a specified match center point. - * - * @param center the center point - * @return the target - */ - protected TPoint getMatchTarget(TPoint center) { - int n = trackerPanel.getFrameNumber(); - double[] offset = getFrame(n).getTargetOffset(); - return new TPoint(center.x+offset[0], center.y+offset[1]); - } - - /** - * Returns the center point for a specified match target. - * - * @param target the target - * @return the center - */ - protected TPoint getMatchCenter(TPoint target) { - int n = trackerPanel.getFrameNumber(); - double[] offset = getFrame(n).getTargetOffset(); - return new TPoint(target.x-offset[0], target.y-offset[1]); - } - - /** - * Deletes the match data at a specified frame number. - * - * @param n the frame number - */ - protected void delete(int n) { - trackerPanel.repaint(); - FrameData frame = getFrame(n); - frame.clear(); - } - - /** - * Clears all existing steps and match data for the current point index. - */ - protected void reset() { - mark = null; - // clear all frames and identify the key frame - Map frameData = getFrameData(); - KeyFrame keyFrame = null; - ArrayList toRemove = new ArrayList(); - for (int i: frameData.keySet()) { - FrameData frame = frameData.get(i); - frame.clear(); - if (keyFrame==null && frame.isKeyFrame()) - keyFrame = (KeyFrame)frame; - toRemove.add(i); - } - for (int i: toRemove) { - frameData.remove(i); - } - // delete all steps unless always marked - boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; - if (!isAlwaysMarked) { - for (int n = 0; n < track.getSteps().length; n++) { - track.steps.setStep(n, null); - } - } - stop(true, true); - // set the step number to key frame - if (keyFrame!=null) { - int n = keyFrame.getFrameNumber(); - VideoPlayer player = trackerPanel.getPlayer(); - player.setStepNumber(player.getVideoClip().frameToStep(n)); - } - repaint(); - } - - /** - * Refreshes the key frame to reflect current center and corner positions. - * - * @param keyFrame the KeyFrame - */ - protected void refreshKeyFrame(KeyFrame keyFrame) { - Shape mask = keyFrame.getMask(); - if (mask instanceof Ellipse2D.Double) { - // prevent the mask from being too small to contain any pixels - keyFrame.getMaskPoints()[0].setLocation(maskCenter); - keyFrame.getMaskPoints()[1].setLocation(maskCorner); - Ellipse2D.Double ellipse = (Ellipse2D.Double)mask; - double sin = maskCenter.sin(maskCorner); - double cos = maskCenter.cos(maskCorner); - if (Double.isNaN(sin)) { - sin = -0.707; - cos = 0.707; - } - double d = Math.max(minMaskRadius, maskCenter.distance(maskCorner)); - double dx = d*cornerFactor*cos; - double dy = -d*cornerFactor*sin; - if (Math.abs(dx) < 1) { - if (dx > 0) dx = 1; - else dx = -1; - } - if (Math.abs(dy) < 1) { - if (dy > 0) dy = 1; - else dy = -1; - } - ellipse.setFrameFromCenter(maskCenter.x, maskCenter.y, - maskCenter.x + dx, maskCenter.y + dy); - } - wizard.replaceIcons(keyFrame); - // get the marked point and set target position AFTER refreshing keyFrame - TPoint p = keyFrame.getMarkedPoint(); - if (p!=null) - keyFrame.getTarget().setXY(p.getX(), p.getY()); - search(true, false); // search this frame only - repaint(); - wizard.repaint(); - } - - protected BufferedImage createMagnifiedImage(BufferedImage source) { - BufferedImage image = new BufferedImage( - templateIconMagnification*source.getWidth(), - templateIconMagnification*source.getHeight(), - BufferedImage.TYPE_INT_ARGB); - image.createGraphics().drawImage(source, 0, 0, image.getWidth(), image.getHeight(), null); - return image; - } - - /** - * Gets the match shape for the specified center and frame corner positions. - * - * @param pts TPoint[] {center, frame corner} - * @return a shape suitable for drawing - */ - protected Shape getMatchShape(TPoint[] pts) { - if (match instanceof Ellipse2D.Double) { - Ellipse2D.Double ellipse = (Ellipse2D.Double)match; - ellipse.setFrameFromCenter(pts[0], pts[1]); - return ellipse; - } - return null; - } - - /** - * Determines the status code for a given frame. The status codes are: - * 0: a key frame - * 1: automarked with a good match - * 2: possible match, not marked - * 3: searched but no match found - * 4: unable to search--search area outside image or x-axis - * 5: manually marked by the user - * 6: match accepted by the user - * 7: never searched - * 8: possible match but previously marked - * 9: no match found but previously marked - * 10: calibration tool possible match - * - * @param n the frame number - * @return the status code - */ - protected int getStatusCode(int n) { - FrameData frame = getFrame(n); - if (frame.isKeyFrame()) return 0; // key frame - double[] widthAndHeight = frame.getMatchWidthAndHeight(); - if (frame.isMarked()) { // frame is marked (includes always-marked tracks like axes, calibration points, etc) - if (frame.isAutoMarked()) { // automarked - if (widthAndHeight[1]> goodMatch) return 1; // automarked with good match - return 6; // accepted by user - } - // not automarked - boolean isCalibrationTool = track instanceof CoordAxes - || track instanceof OffsetOrigin - || track instanceof Calibration; - if (track instanceof TapeMeasure) { - TapeMeasure tape = (TapeMeasure)track; - isCalibrationTool = !tape.isReadOnly(); - } - if (frame.searched) { - if (isCalibrationTool) { - if (widthAndHeight[1]>possibleMatch) return 8; // possible match for calibration - return 9; // no match found, existing mark or calibration - } - if (frame.decided) return 5; // manually marked by user - if (widthAndHeight[1]>possibleMatch) return 8; // possible match, already marked - return 9; // no match found, existing mark or calibration - } - return 7; // never searched - } - if (frame.searched) { // frame unmarked but searched - if (widthAndHeight[1] frameData = getFrameData(); - for (Integer i: frameData.keySet()) { - if (i<=n) continue; - FrameData frame = frameData.get(i); - if (frame.isKeyFrame()) // only to the next key frame - break; - frame.setSearchPoints(null); - } - - } - - protected boolean moveRectIntoImage(Rectangle2D searchRect) { - // if needed, modify search rectangle to keep it within the video image - BufferedImage image = trackerPanel.getVideo().getImage(); - int w = image.getWidth(); - int h = image.getHeight(); - Point2D corner = new Point2D.Double(searchRect.getX(), searchRect.getY()); - Dimension dim = new Dimension((int)searchRect.getWidth(), (int)searchRect.getHeight()); - - boolean changed = false; - // reduce size if needed - if (w < dim.width || h < dim.height) { - changed = true; - dim.setSize(Math.min(w, dim.width), Math.min(h, dim.height)); - searchRect.setFrame(corner, dim); - } - - // move corner point if needed - double x = Math.max(0, corner.getX()); - x = Math.min(x, w-dim.width); - double y = Math.max(0, corner.getY()); - y = Math.min(y, h-dim.height); - if (x!=corner.getX() || y!=corner.getY()) { - changed = true; - corner.setLocation(x, y); - searchRect.setFrame(corner, dim); - } - - return changed; - } - - /** - * Gets the available derivatives of the specified order. These are NOT time - * derivatives, but simply differences in pixel units: order 1 is deltaPosition, - * order 2 is change in deltaPosition, order 3 is change in order 2. Note the - * TPoint positions are in image units, not world units. - * - * @param positions an array of positions - * @param order may be 1 (v), 2 (a) or 3 (jerk) - * @return the derivative data - */ - protected double[][] getDerivatives(TPoint[] positions, int order) { - // return null if insufficient data - if (positions.length=positions.length-1) { - derivatives1[i] = null; - continue; - } - TPoint loc0 = positions[i+1]; - TPoint loc1 = positions[i]; - if (loc0==null || loc1==null) { - derivatives1[i] = null; - continue; - } - double x = loc1.getX() -loc0.getX(); - double y = loc1.getY() -loc0.getY(); - derivatives1[i] = new double[] {x, y}; - } - return derivatives1; - } - else if (order==2) { // acceleration - for (int i=0; i=positions.length-2) { - derivatives2[i] = null; - continue; - } - TPoint loc0 = positions[i+2]; - TPoint loc1 = positions[i+1]; - TPoint loc2 = positions[i]; - if (loc0==null || loc1==null || loc2==null) { - derivatives2[i] = null; - continue; - } - double x = loc2.getX() - 2*loc1.getX() + loc0.getX(); - double y = loc2.getY() - 2*loc1.getY() + loc0.getY(); - derivatives2[i] = new double[] {x, y}; - } - return derivatives2; - } - else if (order==3) { // jerk - for (int i=0; i=positions.length-3) { - derivatives3[i] = null; - continue; - } - TPoint loc0 = positions[i+3]; - TPoint loc1 = positions[i+2]; - TPoint loc2 = positions[i+1]; - TPoint loc3 = positions[i]; - if (loc0==null || loc1==null || loc2==null || loc3==null) { - derivatives3[i] = null; - continue; - } - double x = loc3.getX() - 3*loc2.getX() + 3*loc1.getX() - loc0.getX(); - double y = loc3.getY() - 3*loc2.getY() + 3*loc1.getY() - loc0.getY(); - derivatives3[i] = new double[] {x, y}; - } - return derivatives3; - } - return null; - } - -//____________________ inner TPoint classes ______________________ - - /** - * An edge point used for translation. - */ - protected class Handle extends TPoint { - - /** - * Overrides TPoint setXY method. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public void setXY(double x, double y) { - double dx = x-getX(); - double dy = y-getY(); - super.setXY(x, y); - int n = trackerPanel.getFrameNumber(); - if (this == searchHandle) { - searchCenter.x += dx; - searchCenter.y += dy; - searchCorner.x += dx; - searchCorner.y += dy; - refreshSearchRect(); - wizard.setChanged(); - } - else { - maskCenter.x += dx; - maskCenter.y += dy; - maskCorner.x += dx; - maskCorner.y += dy; - KeyFrame keyFrame = getFrame(n).getKeyFrame(); - keyFrame.getMaskPoints()[0].setLocation(maskCenter); - keyFrame.getMaskPoints()[1].setLocation(maskCorner); - Target target = keyFrame.getTarget(); - keyFrame.setTargetOffset(target.x-maskCenter.x, target.y-maskCenter.y); - refreshKeyFrame(keyFrame); - } - clearSearchPointsDownstream(); - } - - /** - * Sets the location of this point to the specified screen position. - * - * @param x the x screen position - * @param y the y screen position - * @param vidPanel the trackerPanel doing the drawing - */ - public void setScreenLocation(int x, int y, VideoPanel vidPanel) { - if (screenPt == null) screenPt = new Point(); - if (worldPt == null) worldPt = new Point2D.Double(); - screenPt.setLocation(x, y); - AffineTransform toScreen = vidPanel.getPixelTransform(); - try { - toScreen.inverseTransform(screenPt, worldPt); - } catch(NoninvertibleTransformException ex) { - ex.printStackTrace(); - } - setLocation(worldPt); - repaint(); - } - } - - /** - * A corner point used for resizing. - */ - protected class Corner extends TPoint { - - /** - * Overrides TPoint setXY method. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public void setXY(double x, double y) { - super.setXY(x, y); - int n = trackerPanel.getFrameNumber(); - if (this == searchCorner) { - refreshSearchRect(); - wizard.setChanged(); - } - else { - refreshKeyFrame(getFrame(n).getKeyFrame()); - } - clearSearchPointsDownstream(); - } - } - - /** - * A point that defines the target location relative to the mask center. - * Tracks are "marked" at this point when auto-tracking. - */ - protected class Target extends TPoint { - - /** - * Overrides TPoint setXY method. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public void setXY(double x, double y) { - super.setXY(x, y); - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - KeyFrame keyFrame = frame.getKeyFrame(); - keyFrame.setTargetOffset(x-maskCenter.x, y-maskCenter.y); - track.autoTrackerMarking = track.isAutoAdvance(); - TPoint p = track.autoMarkAt(n, getX(), getY()); - frame.setAutoMarkPoint(p); - track.autoTrackerMarking = false; - repaint(); - track.repaint(); - } - } - - /** - * A class to hold frame data. - */ - protected class FrameData { - - private int index, frameNum, templateAlpha, matcherHashCode; - private double[] targetOffset = {0, 0}; - private double[] matchWidthAndHeight; - private TPoint[] matchPoints; - private TPoint[] searchPoints; - TPoint trackPoint; - private double[] autoMarkLoc; - private BufferedImage template; - private Icon templateIcon; // shows template used for search - private Icon matchIcon; // only if match is found - boolean searched; // true when searched - boolean decided; // true when accepted, skipped or marked point is dragged; assumed false for calibration tools and axes - int[] workingPixels; - - FrameData(int pointIndex, int frameNumber) { - index = pointIndex; - frameNum = frameNumber; - } - - FrameData(KeyFrame keyFrame) { - index = keyFrame.getIndex(); - frameNum = keyFrame.getFrameNumber(); - matchWidthAndHeight = keyFrame.getMatchWidthAndHeight(); - matchPoints = keyFrame.getMatchPoints(); - searchPoints = keyFrame.getSearchPoints(false); - targetOffset = keyFrame.getTargetOffset(); - matchIcon = keyFrame.getMatchIcon(); - templateIcon = keyFrame.getTemplateIcon(); - autoMarkLoc = keyFrame.getAutoMarkLoc(); - trackPoint = keyFrame.trackPoint; - searched = keyFrame.searched; - } - - int getFrameNumber() { - return frameNum; - } - - Icon getTemplateIcon() { - return templateIcon; - } - - void setTemplateIcon(Icon icon) { - templateIcon = icon; - } - - Icon getMatchIcon() { - return matchIcon; - } - - void setMatchIcon(Icon icon) { - matchIcon = icon; - } - - /** - * Sets the template to the current template of a TemplateMatcher. - * - * @param matcher the template matcher - */ - void setTemplate(TemplateMatcher matcher) { - template = matcher.getTemplate(); - templateAlpha = matcher.getAlphas()[0]; - workingPixels = matcher.getWorkingPixels(workingPixels); - matcherHashCode = matcher.hashCode(); - // refresh icons - setMatchIcon(null); - BufferedImage img = createMagnifiedImage(template); - setTemplateIcon(new ImageIcon(img)); - } - - /** - * Returns the template to match. Replaces the existing template if - * a new one exists. - */ - BufferedImage getTemplateToMatch() { - if (template==null || newTemplateExists()) { - // replace current template with new one - setTemplate(getTemplateMatcher()); - } - return template; - } - - /** - * Returns true if the evolved template is both different and appropriate. - */ - boolean newTemplateExists() { - if (isKeyFrame()) return false; - TemplateMatcher matcher = getTemplateMatcher(); - if (matcher==null) return false; - boolean different = matcher.getAlphas()[0]!=templateAlpha - || matcher.hashCode()!=matcherHashCode; - boolean appropriate = matcher.getIndex() frames = getFrameData(index); - for (int i=frameNum; i>=0; i--) { - FrameData frame = frames.get(i); - if (frame!=null) { - if (frame.searchPoints!=null || frame.isKeyFrame()) { - return frame.searchPoints; - } - } - } - return null; - } - - void setMatchPoints(TPoint[] points) { - matchPoints = points; - } - - TPoint[] getMatchPoints() { - return matchPoints; - } - - void setMatchWidthAndHeight(double[] matchData) { - matchWidthAndHeight = matchData; - } - - double[] getMatchWidthAndHeight() { - return matchWidthAndHeight; - } - - KeyFrame getKeyFrame() { - if (this.isKeyFrame()) return (KeyFrame)this; - Map frames = getFrameData(index); - for (int i=frameNum; i>=0; i--) { - FrameData frame = frames.get(i); - if (frame!=null && frame.isKeyFrame()) - return (KeyFrame)frame; - } - return null; - } - - int getIndex() { - return index; - } - - boolean isMarked() { - return track!=null && track.getStep(frameNum)!=null; - } - - boolean isAutoMarked() { - if (autoMarkLoc==null || trackPoint==null) return false; - if (trackPoint instanceof CoordAxes.AnglePoint) { - ImageCoordSystem coords = trackerPanel.getCoords(); - double theta = coords.getAngle(frameNum); - CoordAxes.AnglePoint p = (CoordAxes.AnglePoint)trackPoint; - return Math.abs(theta-p.getAngle())<0.001; - } - // return false if trackPoint has moved from marked location by more than 0.01 pixels - return Math.abs(autoMarkLoc[0]-trackPoint.getX())<0.01 - && Math.abs(autoMarkLoc[1]-trackPoint.getY())<0.01; - } - - void setAutoMarkPoint(TPoint point) { - trackPoint = point; - autoMarkLoc = point==null? null: new double[] {point.getX(), point.getY()}; - } - - double[] getAutoMarkLoc() { - return autoMarkLoc; - } - - boolean isKeyFrame() { - return false; - } - - TPoint getMarkedPoint() { - if (!isMarked()) return null; - if (trackPoint!=null) return trackPoint; - return track.getMarkedPoint(frameNum, index); - } - - void clear() { - matchPoints = null; - matchWidthAndHeight = null; - matchIcon = null; - autoMarkLoc = null; - searched = false; - decided = false; - trackPoint = null; - workingPixels = null; - matcherHashCode = 0; - if (!isKeyFrame()) { - searchPoints = null; - templateIcon = null; - templateAlpha = 0; - template = null; - } - } - } - - /** - * A class to hold keyframe data. - */ - protected class KeyFrame extends FrameData { - - private Shape mask; - private Target target; - private TPoint[] maskPoints = {new TPoint(), new TPoint()}; - private TemplateMatcher matcher; - - KeyFrame(TPoint keyPt, Shape mask, Target target) { - super(AutoTracker.this.getIndex(keyPt), keyPt.getFrameNumber(trackerPanel)); - this.mask = mask; - this.target = target; - maskPoints[0].setLocation(maskCenter); - maskPoints[1].setLocation(maskCorner); - } - - boolean isKeyFrame() { - return true; - } - - Shape getMask() { - return mask; - } - - Target getTarget() { - return target; - } - - TPoint[] getMaskPoints() { - return maskPoints; - } - - void setTemplateMatcher(TemplateMatcher matcher) { - this.matcher = matcher; - } - - boolean isFirstKeyFrame() { - Map frames = getFrameData(getIndex()); - for (int i=getFrameNumber()-1; i>=0; i--) { - FrameData frame = frames.get(i); - if (frame!=null && frame.isKeyFrame()) - return false; - } - return true; - } - - } - - /** - * A wizard to guide users of AutoTracker. - */ - protected class Wizard extends JDialog - implements PropertyChangeListener { - - // instance fields - private JButton startButton, searchNextButton, searchThisButton; - private JButton closeButton, helpButton, deleteButton, keyFrameButton; - private JButton acceptButton, skipButton; - private JSpinner evolveSpinner, acceptSpinner; - private JComboBox trackDropdown, pointDropdown; - private boolean isVisible, changed; - private JTextArea textPane; - protected JToolBar templateToolbar, searchToolbar, targetToolbar, imageToolbar, trackToolbar; - private JPanel startPanel, followupPanel, infoPanel, northPanel, targetPanel; - private JLabel templateImageLabel, matchImageLabel, acceptLabel, templateLabel; - private JLabel frameLabel, evolveRateLabel, searchLabel, targetLabel; - private JLabel pointLabel, trackLabel; - protected Dimension textPaneSize; - private JCheckBox lookAheadCheckbox, oneDCheckbox; - private Object mouseOverObj; - private MouseAdapter mouseOverListener; - private Timer timer; - - /** - * Constructs a Wizard. - */ - public Wizard() { - super(trackerPanel.getTFrame(), false); - createGUI(); - pack(); - } - - /** - * Responds to property change events. This listens for "tab" from TFrame. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (trackerPanel != null && e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - } - - /** - * Sets the changed flag - */ - public void setChanged() { - if (!changed) { - changed = true; - refreshGUI(); - } - } - - - /** - * Overrides JDialog setVisible method. - * - * @param vis true to show this inspector - */ - public void setVisible(boolean vis) { - super.setVisible(vis); - TToolBar toolbar = TToolBar.getToolbar(trackerPanel); - toolbar.autotrackerButton.setSelected(vis); - isVisible = vis; - if (!vis) { - erase(); - trackerPanel.repaintDirtyRegion(); - } - else { - TTrack track = trackerPanel.getSelectedTrack(); - if (track!=null) setTrack(track); - } - refreshGUI(); - } - - /** - * Sets the font level. - * - * @param level the desired font level - */ - public void setFontLevel(int level) { - FontSizer.setFonts(this, FontSizer.getLevel()); - Object[] buttons = new Object[] {acceptButton, skipButton}; - FontSizer.setFonts(buttons, FontSizer.getLevel()); - // private JComboBox trackDropdown, pointDropdown; - JComboBox[] dropdowns = new JComboBox[] {trackDropdown, pointDropdown}; - for (JComboBox next: dropdowns) { - int n = next.getSelectedIndex(); - Object[] items = new Object[next.getItemCount()]; - for (int i=0; i=max) alpha = 255; - if (evolveRate<=0) alpha = 0; - evolveAlpha=alpha; - } - - /** - * Creates the visible components. - */ - protected void createGUI() { - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - } -// setResizable(false); - KeyListener kl = new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - switch (e.getKeyCode()) { - case KeyEvent.VK_PAGE_UP: - if (e.isShiftDown()) { - int n = trackerPanel.getPlayer().getStepNumber()-5; - trackerPanel.getPlayer().setStepNumber(n); - } - else trackerPanel.getPlayer().back(); - break; - case KeyEvent.VK_PAGE_DOWN: - if (e.isShiftDown()) { - int n = trackerPanel.getPlayer().getStepNumber()+5; - trackerPanel.getPlayer().setStepNumber(n); - } - else trackerPanel.getPlayer().step(); - break; - case KeyEvent.VK_HOME: - trackerPanel.getPlayer().setStepNumber(0); - break; - case KeyEvent.VK_END: - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); - break; - } - } - public void keyReleased(KeyEvent e) { - // handle shift key release when wizard takes focus from TrackerPanel - if (e.getKeyCode()==KeyEvent.VK_SHIFT) { - trackerPanel.isShiftKeyDown = false; - } - } - }; - - int delay = 500; // 1/2 second delay for mouseover action - timer = new Timer(delay, new ActionListener() { - public void actionPerformed(ActionEvent e) { - refreshInfo(); - refreshDrawingFlags(); - erase(); - trackerPanel.repaint(); - } - }); - timer.setInitialDelay(delay); - - mouseOverListener = new MouseAdapter() { - public void mouseEntered(MouseEvent e) { - Component c = (Component)e.getSource(); - while (c.getParent()!=null) { - if (c==templateToolbar - || c==searchToolbar - || c==targetToolbar - || c==imageToolbar) { - mouseOverObj = c; - isInteracting = c==targetToolbar; - isInteracting = true; - break; - } - c = c.getParent(); - } - if (mouseOverObj==null) { - // refresh immediately - refreshInfo(); - refreshDrawingFlags(); - erase(); - trackerPanel.repaint(); - } - else { - // restart timer to refresh - timer.restart(); - } - } - public void mouseExited(MouseEvent e) { - // restart timer to refresh - timer.restart(); - mouseOverObj = null; - isInteracting = false; - } - }; - addWindowFocusListener(new java.awt.event.WindowAdapter() { - public void windowGainedFocus(java.awt.event.WindowEvent e) { - if (track!=null) trackerPanel.setSelectedTrack(track); - } - }); - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - - // create trackDropdown early since need it for spinners - trackDropdown = new JComboBox() { - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height-=1; - return dim; - } - }; - trackDropdown.addMouseListener(mouseOverListener); - for (int i = 0; i=0); - oneDCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - lineSpread = oneDCheckbox.isSelected()? 0: -1; - setChanged(); - if (oneDCheckbox.isSelected()) { - int n = trackerPanel.getFrameNumber(); - CoordAxes axes = trackerPanel.getAxes(); - KeyFrame frame = getFrame(n).getKeyFrame(); - if (frame!=null) { - n = frame.getFrameNumber(); - TPoint[] maskPts = frame.getMaskPoints(); - axes.getOrigin().setXY(maskPts[0].x, maskPts[0].y); - } - axes.setVisible(true); - } - trackerPanel.repaint(); - } - }); - lookAheadCheckbox = new JCheckBox(); - lookAheadCheckbox.addMouseListener(mouseOverListener); - lookAheadCheckbox.setOpaque(false); - lookAheadCheckbox.setSelected(lookAhead); - lookAheadCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - lookAhead = lookAheadCheckbox.isSelected(); - setChanged(); - } - }); - flowpanel = new JPanel(); - flowpanel.setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0)); - flowpanel.setOpaque(false); - flowpanel.add(oneDCheckbox); - flowpanel.add(lookAheadCheckbox); - searchToolbar.add(searchLabel); - searchToolbar.add(flowpanel); - - // create target toolbar - targetToolbar = new JToolBar(); - targetToolbar.setFloatable(false); - targetToolbar.addMouseListener(mouseOverListener); - targetLabel = new JLabel(); - targetLabel.setOpaque(false); - targetLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 6)); - - trackLabel = new JLabel(); - trackLabel.setOpaque(false); - - pointLabel = new JLabel(); - pointLabel.setOpaque(false); - pointLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - - pointDropdown = new JComboBox() { - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = trackDropdown.getPreferredSize().height; - return dim; - } - }; - pointDropdown.addMouseListener(mouseOverListener); - for (int i = 0; i frameData = getFrameData(); - int nextKey = -1; // later key frame, if any - - // if this is first key frame, look for later one - for (Integer i: frameData.keySet()) { - FrameData frame = frameData.get(i); - if (frame.isKeyFrame()) { // found first key frame - if (frame==keyFrame) { - // we are deleting the first key frame, so find the next, then confirm with user - for (int j: frameData.keySet()) { - if (j>i) { - FrameData next = frameData.get(j); - if (next.isKeyFrame()) { - nextKey = j; - break; - } - } - } - break; - } - } - } - - // replace keyframe with non-key frame - FrameData newFrame = new FrameData(keyFrame); - frameData.put(n, newFrame); - - // get earlier keyframe, if any - keyFrame = getFrame(n).getKeyFrame(); - if (keyFrame!=null) { // earlier keyframe exists - maskCenter.setLocation(keyFrame.getMaskPoints()[0]); - maskCorner.setLocation(keyFrame.getMaskPoints()[1]); - } - else { // no earlier key frame, so clear all matches up to nextKey - ArrayList toRemove = new ArrayList(); - for (int i: frameData.keySet()) { - if (nextKey>-1 && i>=nextKey) break; - FrameData frame = frameData.get(i); - frame.clear(); - toRemove.add(i); - } - for (int i: toRemove) { - frameData.remove(i); - } - } - - if (track.getStep(n)==null) { - FrameData frame = getFrame(n); - if (frame!=null) { - frame.setTemplateIcon(null); - frame.setSearchPoints(null); - } - for (int i: frameData.keySet()) { - if (i<=n) continue; - frame = frameData.get(i); - if (!frame.isKeyFrame() && track.getStep(i)==null) - frame.clear(); - } - } - refreshGUI(); - AutoTracker.this.repaint(); - trackerPanel.repaint(); - } - }; - - final Action deleteThisAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - // clear this match and step - int n = trackerPanel.getFrameNumber(); - Map frameData = getFrameData(); - FrameData frame = frameData.get(n); - if (!frame.isKeyFrame()) { - frameData.get(n).clear(); - frameData.remove(n); - } - else { - frame.clear(); - } - - boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; - if (!isAlwaysMarked && track.getSteps().length>n) - track.getSteps()[n] = null; - refreshGUI(); - AutoTracker.this.repaint(); - trackerPanel.repaint(); - } - }; - - final Action deleteLaterAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - // clear later matches and steps - int n = trackerPanel.getFrameNumber(); - ArrayList toRemove = new ArrayList(); - Map frameData = getFrameData(); - for (int i: frameData.keySet()) { - if (i<=n) continue; - FrameData frame = frameData.get(i); - frame.clear(); - toRemove.add(i); - } - for (int i: toRemove) { - frameData.remove(i); - } - boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; - if (!isAlwaysMarked) { - Step[] steps = track.getSteps(); - for (int i = n+1; i < steps.length; i++) { - steps[i] = null; - } - } - refreshGUI(); - AutoTracker.this.repaint(); - } - }; - - final Action deleteAllAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - // clears all matches and steps - reset(); - } - }; - - deleteButton = new JButton(); - deleteButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // first determine what can be deleted - int n = trackerPanel.getFrameNumber(); - boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; - boolean hasThis = false; - boolean isKeyFrame = getFrame(n).isKeyFrame(); - - // count steps and look for this and later points/matches - int stepCount = 0; - boolean hasLater = false; - if (isAlwaysMarked) { - Map frameData = getFrameData(); - for (Integer i: frameData.keySet()) { - FrameData frame = frameData.get(i); - if (frame.trackPoint==null) continue; - hasLater = hasLater || i>n; - hasThis = hasThis || i==n; - stepCount++; - } - } - else { - hasThis = track.getStep(n)!=null; - Step[] steps = track.getSteps(); - for (int i = 0; i< steps.length; i++) { - if (steps[i]!=null) { - hasLater = hasLater || i>n; - stepCount++; - } - } - } - - // now build the popup menu with suitable delete items - JPopupMenu popup = new JPopupMenu(); - if (isKeyFrame) { - JMenuItem item = new JMenuItem(TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(deleteKeyFrameAction); - } - if (hasThis) { - JMenuItem item = new JMenuItem(isAlwaysMarked? - TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThisMatch"): //$NON-NLS-1$ - TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThis")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(deleteThisAction); - } - if (hasLater) { - JMenuItem item = new JMenuItem(isAlwaysMarked? - TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteLaterMatches"): //$NON-NLS-1$ - TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteLater")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(deleteLaterAction); - } - if (stepCount>0 && !(stepCount==1 && hasThis)) { - JMenuItem item = new JMenuItem(TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteAll")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(deleteAllAction); - } - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(deleteButton, 0, deleteButton.getHeight()); - } - }); - deleteButton.addKeyListener(kl); - - keyFrameButton = new JButton(); - keyFrameButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // find all key frames - ArrayList keyFrames = new ArrayList(); - Map frameData = getFrameData(); - for (Integer i: frameData.keySet()) { - FrameData frame = frameData.get(i); - if (frame.isKeyFrame()) - keyFrames.add(i); - } - Action keyAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - int i = Integer.parseInt(e.getActionCommand()); - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - trackerPanel.getPlayer().setStepNumber(clip.frameToStep(i)); - } - }; - JPopupMenu popup = new JPopupMenu(); - for (Integer i: keyFrames) { - String s = TrackerRes.getString("AutoTracker.Label.Frame"); //$NON-NLS-1$ - JMenuItem item = new JMenuItem(s+" "+i); //$NON-NLS-1$ - item.addActionListener(keyAction); - item.setActionCommand(String.valueOf(i)); - popup.add(item); - } - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(keyFrameButton, 0, keyFrameButton.getHeight()); - } - }); - keyFrameButton.addKeyListener(kl); - - // assemble content - infoPanel = new JPanel(new BorderLayout()) { - public Dimension getPreferredSize() { - if (textPaneSize!=null) return textPaneSize; - return super.getPreferredSize(); - } - }; - Border empty = BorderFactory.createEmptyBorder(4, 6, 4, 6); - Border etch = BorderFactory.createEtchedBorder(); - infoPanel.setBorder(BorderFactory.createCompoundBorder(etch, empty)); - infoPanel.setBackground(textPane.getBackground()); - infoPanel.add(textPane, BorderLayout.CENTER); - infoPanel.add(followupPanel, BorderLayout.SOUTH); - - JPanel controlPanel = new JPanel(new GridLayout(0, 1)); - controlPanel.add(templateToolbar); - controlPanel.add(searchToolbar); - controlPanel.add(targetToolbar); - - northPanel = new JPanel(new BorderLayout()); - northPanel.add(startPanel, BorderLayout.NORTH); - northPanel.add(imageToolbar, BorderLayout.SOUTH); - - JPanel center = new JPanel(new BorderLayout()); - center.add(controlPanel, BorderLayout.NORTH); - center.add(infoPanel, BorderLayout.CENTER); - - JPanel south = new JPanel(new FlowLayout()); - south.add(helpButton); - south.add(keyFrameButton); - south.add(deleteButton); - south.add(closeButton); - - contentPane.add(northPanel, BorderLayout.NORTH); - contentPane.add(center, BorderLayout.CENTER); - contentPane.add(south, BorderLayout.SOUTH); - - refreshGUI(); - } - - /** - * Refreshes the preferred size of the text pane. - */ - protected void refreshTextPaneSize() { - textPaneSize = null; - followupPanel.removeAll(); - followupPanel.add(acceptButton); - textPane.setText(getTemplateInstructions()); - Dimension dim = infoPanel.getPreferredSize(); - textPane.setText(getTargetInstructions()); - dim.height = Math.max(dim.height, infoPanel.getPreferredSize().height); - textPane.setText(getSearchInstructions()); - dim.height = Math.max(dim.height, infoPanel.getPreferredSize().height); - dim.height += 6; - textPaneSize = dim; - refreshButtons(); - refreshInfo(); - } - - /** - * Refreshes the titles and labels. - */ - protected void refreshStrings() { - Runnable runner = new Runnable() { - public void run() { - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - FrameData keyFrame = frame.getKeyFrame(); - - // set titles and labels of GUI elements - String title = TrackerRes.getString("AutoTracker.Wizard.Title"); //$NON-NLS-1$ - if (track!=null) { - int index = track.getTargetIndex(); - title += ": "+track.getName()+" "+track.getTargetDescription(index); //$NON-NLS-1$ //$NON-NLS-2$ - } - setTitle(title); - - frameLabel.setText(TrackerRes.getString("AutoTracker.Label.Frame")+" "+n+":"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - searchLabel.setText( - TrackerRes.getString("AutoTracker.Label.Search") + ":"); //$NON-NLS-1$ //$NON-NLS-2$ - targetLabel.setText( - TrackerRes.getString("AutoTracker.Label.Target")+":"); //$NON-NLS-1$ //$NON-NLS-2$ - templateLabel.setText( - TrackerRes.getString("AutoTracker.Label.Template")+":"); //$NON-NLS-1$ //$NON-NLS-2$ - acceptLabel.setText(TrackerRes.getString("AutoTracker.Label.Automark")); //$NON-NLS-1$ - trackLabel.setText(TrackerRes.getString("AutoTracker.Label.Track")); //$NON-NLS-1$ - pointLabel.setText(TrackerRes.getString("AutoTracker.Label.Point")); //$NON-NLS-1$ - evolveRateLabel.setText(TrackerRes.getString("AutoTracker.Label.EvolutionRate")); //$NON-NLS-1$ - closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ - acceptButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Accept")); //$NON-NLS-1$ - keyFrameButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.ShowKeyFrame")); //$NON-NLS-1$ - deleteButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Delete")); //$NON-NLS-1$ - oneDCheckbox.setText(TrackerRes.getString("AutoTracker.Wizard.Checkbox.XAxis")); //$NON-NLS-1$ - lookAheadCheckbox.setText(TrackerRes.getString("AutoTracker.Wizard.Checkbox.LookAhead")); //$NON-NLS-1$ - matchImageLabel.setText(frame.getMatchIcon()==null? null: - TrackerRes.getString("AutoTracker.Label.Match")); //$NON-NLS-1$ - templateImageLabel.setText(keyFrame==null? null: - TrackerRes.getString("AutoTracker.Label.Template")); //$NON-NLS-1$ - - if (trackerPanel.getVideo()!=null) { - boolean running = stepping && !paused; - startButton.setIcon(stepping? stopIcon: searchIcon); - startButton.setText(stepping? - TrackerRes.getString("AutoTracker.Wizard.Button.Stop"): //$NON-NLS-1$ - TrackerRes.getString("AutoTracker.Wizard.Button.Search")); //$NON-NLS-1$ - searchThisButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchThis")); //$NON-NLS-1$ - searchThisButton.setEnabled(!running); - searchNextButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchNext")); //$NON-NLS-1$ - searchNextButton.setEnabled(!running); - } - - // set label sizes - FontRenderContext frc = new FontRenderContext(null, false, false); - Font font = frameLabel.getFont(); - int w = 0; - Rectangle2D rect = font.getStringBounds(searchLabel.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+4); - rect = font.getStringBounds(frameLabel.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+4); - rect = font.getStringBounds(templateLabel.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+4); - rect = font.getStringBounds(targetLabel.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+4); - Dimension labelSize = new Dimension(w, 20); - frameLabel.setPreferredSize(labelSize); - templateLabel.setPreferredSize(labelSize); - searchLabel.setPreferredSize(labelSize); - targetLabel.setPreferredSize(labelSize); - } - }; - if (SwingUtilities.isEventDispatchThread()) runner.run(); - else SwingUtilities.invokeLater(runner); - } - - /** - * Refreshes the buttons and layout. - */ - protected void refreshButtons() { - Runnable runner = new Runnable() { - public void run() { - int n = trackerPanel.getFrameNumber(); - FrameData frame = getFrame(n); - - // enable the search buttons - int code = getStatusCode(n); - KeyFrame keyFrame = frame.getKeyFrame(); - boolean initialized = keyFrame!=null && track!=null; - boolean notStepping = paused || !stepping; - boolean stable = frame.searched && !frame.newTemplateExists(); - boolean canSearchThis = !stable || code==5 || (changed&&code!=0) || (frame==keyFrame && frame.getMarkedPoint()==null); - startButton.setEnabled(initialized); - searchThisButton.setEnabled(initialized && notStepping && canSearchThis); - searchNextButton.setEnabled(initialized && canStep() && notStepping); - - // refresh template image labels and panel - if (templateImageLabel.getIcon()==null && matchImageLabel.getIcon()==null) { - templateImageLabel.setText(TrackerRes.getString("AutoTracker.Label.NoTemplate")); //$NON-NLS-1$ - matchImageLabel.setText(null); - imageToolbar.setPreferredSize(templateToolbar.getPreferredSize()); - templateImageLabel.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0)); - } - else { - imageToolbar.setPreferredSize(null); - templateImageLabel.setBorder(null); - } - - // refresh the delete and keyframe buttons - boolean deleteButtonEnabled = track!=null; - if (deleteButtonEnabled) { - boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; - if (isAlwaysMarked) { - boolean hasFrameData = false; - Map frameData = getFrameData(); - for (Integer i: frameData.keySet()) { - FrameData next = frameData.get(i); - if (next.trackPoint!=null) { - hasFrameData = true; - break; - } - } - deleteButtonEnabled = hasFrameData || frame==keyFrame; - } - else { - deleteButtonEnabled = frame==keyFrame || !track.isEmpty(); - } - } - - deleteButton.setEnabled(deleteButtonEnabled); - keyFrameButton.setEnabled(keyFrame!=null); - - // rebuild followup panel - followupPanel.removeAll(); - if (code==2 || code==8) { // possible match - acceptButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Accept")); //$NON-NLS-1$ - followupPanel.add(acceptButton); - } - if (code==2 || code==3 || code==4 || code==8 || code==9) { // searched but not automarked - skipButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Skip")); //$NON-NLS-1$ - followupPanel.add(skipButton); - } - repaint(); - } - }; - if (SwingUtilities.isEventDispatchThread()) runner.run(); - else SwingUtilities.invokeLater(runner); - } - - /** - * Refreshes the drawing flags. - */ - protected void refreshDrawingFlags() { - // refresh drawing flags - if (mouseOverObj==templateToolbar || mouseOverObj==imageToolbar) { - // show mask and search - maskVisible = true; - targetVisible = searchVisible = false; - } - else if (mouseOverObj==targetToolbar) { - // show target - targetVisible = true; - searchVisible = maskVisible = false; - } - else if (mouseOverObj==searchToolbar) { - // show searchRect and mask - searchVisible = true; - targetVisible = maskVisible = false; - } - else { - searchVisible = targetVisible = maskVisible = true; - } - } - - /** - * Refreshes the visible components of this wizard. - */ - protected void refreshGUI() { - if (track!=null && this.isVisible()) - track.setMarkByDefault(false); - Runnable runner = new Runnable() { - public void run() { - refreshDropdowns(); - refreshStrings(); - refreshIcons(); - refreshButtons(); - refreshInfo(); - refreshDrawingFlags(); - pack(); - if (textPaneSize==null) - refreshTextPaneSize(); - } - }; - if (SwingUtilities.isEventDispatchThread()) runner.run(); - else SwingUtilities.invokeLater(runner); - } - - /** - * Refreshes the dropdown lists. - */ - protected void refreshDropdowns() { - // refresh trackDropdown - Object toSelect = null; - trackDropdown.setName("refresh"); //$NON-NLS-1$ - trackDropdown.removeAllItems(); - for (TTrack next: trackerPanel.getTracks()) { - if (!next.isAutoTrackable()) continue; - Icon icon = next.getFootprint().getIcon(21, 16); - Object[] item = new Object[] {icon, next.getName()}; - trackDropdown.addItem(item); - if (next==track) { - toSelect = item; - } - } - if (track==null) { - Object[] emptyItem = new Object[] {null, " "}; //$NON-NLS-1$ - trackDropdown.insertItemAt(emptyItem, 0); - toSelect = emptyItem; - } - // select desired item - if (toSelect!=null) { - trackDropdown.setSelectedItem(toSelect); - } - trackDropdown.setName(null); - - // refresh pointDropdown - toSelect = null; - pointDropdown.setName("refresh"); //$NON-NLS-1$ - pointDropdown.removeAllItems(); - if (track!=null) { - int target = track.getTargetIndex(); - toSelect = track.getTargetDescription(target); - for (int i = 0; i=0) - buf.append(TrackerRes.getString("AutoTracker.Info.SearchOnAxis")); //$NON-NLS-1$ - else - buf.append(TrackerRes.getString("AutoTracker.Info.Search")); //$NON-NLS-1$ - buf.append("\n\n"); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Title.Settings")); //$NON-NLS-1$ - buf.append(": "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Search.Instructions")); //$NON-NLS-1$ - buf.append("\n\n"); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Title.Tip")); //$NON-NLS-1$ - buf.append(": "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Search.Tip")); //$NON-NLS-1$ - return buf.toString(); - } - - /** - * Returns the target instructions. - * - * @return the instructions - */ - protected String getTargetInstructions() { - StringBuffer buf = new StringBuffer(); - buf.append(TrackerRes.getString("AutoTracker.Info.Target")); //$NON-NLS-1$ - buf.append("\n\n"); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Title.Settings")); //$NON-NLS-1$ - buf.append(": "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Target.Instructions")); //$NON-NLS-1$ - return buf.toString(); - } - - /** - * Returns the status text for a given frame number and status code. - * - * @param code the status code (integer 0-9) - * @param n the frame number - * @param peakWidthAndHeight the match data - * @return the status text - */ - protected String getStatusInfo(int code, int n, double[] peakWidthAndHeight) { - StringBuffer buf = new StringBuffer(); - buf.append(TrackerRes.getString("AutoTracker.Info.Frame")+" "+n); //$NON-NLS-1$ //$NON-NLS-2$ - switch(code) { - case 0: // keyframe - textPane.setForeground(Color.blue); - buf.append(" ("); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame").toLowerCase()); //$NON-NLS-1$ - buf.append("): "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame.Instructions1")); //$NON-NLS-1$ - buf.append("\n\n"); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame.Instructions2")); //$NON-NLS-1$ - buf.append(" "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.MouseOver.Instructions")); //$NON-NLS-1$ - break; - case 1: // good match was found and marked - textPane.setForeground(Color.green.darker()); - buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(TrackerRes.getString("AutoTracker.Info.Match")); //$NON-NLS-1$ - break; - case 2: // possible match was found, not marked - textPane.setForeground(Color.red); - buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ - if (lineSpread>=0) { - buf.append(TrackerRes.getString("AutoTracker.Info.PossibleOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Accept")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - buf.append(TrackerRes.getString("AutoTracker.Info.Possible")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Accept")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ - if (canStep()) - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - case 3: // no match was found - textPane.setForeground(Color.red); - buf.append(": "); //$NON-NLS-1$ - if (lineSpread>=0) { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ - if (canStep()) - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - case 4: // searchRect failed (no video image or x-axis inside) - textPane.setForeground(Color.red); - buf.append(": "); //$NON-NLS-1$ - if (lineSpread>=0) { // 1D tracking - buf.append(TrackerRes.getString("AutoTracker.Info.OutsideXAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { // 2D tracking - buf.append(TrackerRes.getString("AutoTracker.Info.Outside")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ - if (canStep()) - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - case 5: // target marked manually - textPane.setForeground(Color.blue); - buf.append(": "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.MarkedByUser")); //$NON-NLS-1$ - break; - case 6: // match accepted - textPane.setForeground(Color.green.darker()); - buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(TrackerRes.getString("AutoTracker.Info.Accepted")); //$NON-NLS-1$ - break; - case 7: // not searched or marked - textPane.setForeground(Color.blue); - buf.append(" ("); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Unsearched")); //$NON-NLS-1$ - buf.append("): "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.Instructions")); //$NON-NLS-1$ - buf.append(" "); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.GetStarted")); //$NON-NLS-1$ - buf.append("\n\n"); //$NON-NLS-1$ - buf.append(TrackerRes.getString("AutoTracker.Info.MouseOver.Instructions")); //$NON-NLS-1$ - break; - case 8: // possible match found, existing mark or calibration tool - textPane.setForeground(Color.blue); - buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ - if (lineSpread>=0) { - buf.append(TrackerRes.getString("AutoTracker.Info.PossibleReplace")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Replace")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - buf.append(TrackerRes.getString("AutoTracker.Info.PossibleReplace")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Replace")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - case 9: // no match found, existing mark or calibration tool - textPane.setForeground(Color.red); - buf.append(": "); //$NON-NLS-1$ - if (lineSpread>=0) { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - if (canStep()) - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - case 10: // no match found, already marked - textPane.setForeground(Color.red); - buf.append(": "); //$NON-NLS-1$ - if (lineSpread>=0) { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ - } - if (canStep()) - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ - buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ - break; - } - return buf.toString(); - } - - } - - /** - * Spinner with same preferred height as another component. - */ - class TallSpinner extends JSpinner { - Component comp; - TallSpinner(SpinnerModel model, Component heightComponent) { - super(model); - comp = heightComponent; - } - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height=comp.getPreferredSize().height; - return dim; - } - } - - /** - * Spinner model to continuously cycle through all choices - */ - static class SpinnerTumbleModel extends SpinnerListModel { - SpinnerTumbleModel(ArrayList values) { - super(values); - } - public Object getNextValue() { - Object value = super.getNextValue(); - if((value==null)&&(getList().size()>0)) { - value = getList().get(0); - } - return value; - } - public Object getPreviousValue() { - Object value = super.getPreviousValue(); - int n = getList().size(); - if((value==null)&&(n>0)) { - value = getList().get(n-1); - } - return value; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.font.FontRenderContext; +import java.awt.geom.*; +import java.awt.image.BufferedImage; +import java.beans.*; +import java.text.NumberFormat; +import java.text.ParseException; + +import javax.swing.*; +import javax.swing.Timer; +import javax.swing.border.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.tools.ResourceLoader; + +/** + * A class to automatically track a feature of interest in a video. + * This uses a TemplateMatcher to find a match to the feature in each frame + * and, if found, marks the active track at the target location. + * + * @author Douglas Brown + */ +public class AutoTracker implements Interactive, Trackable, PropertyChangeListener { + + // static fields + private static Rectangle hitRect = new Rectangle(-4, -4, 8, 8); + private static TPoint hitPt = new TPoint(); + private static Shape selectionShape; + private static AffineTransform transform = new AffineTransform(); + private static Footprint target_footprint + = PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"); //$NON-NLS-1$ + private static Footprint inactive_target_footprint + = PointShapeFootprint.getFootprint("Footprint.Crosshair"); //$NON-NLS-1$ + private static Footprint corner_footprint + = PointShapeFootprint.getFootprint("Footprint.SolidSquare"); //$NON-NLS-1$ + private static final float[] DOTTED_LINE = new float[] {2, 2}; + private static final float[] DASHED_LINE = new float[] {2, 8}; + private static NumberFormat format = NumberFormat.getNumberInstance(); + private static double cornerFactor = 0.9; + private static BasicStroke solidBold = new BasicStroke(2), solid = new BasicStroke(); + private static BasicStroke dotted, dashed; + private static int maxEvolveRate = 100; // percent + private static int defaultEvolveRate = maxEvolveRate/5; + private static Icon searchIcon, stopIcon, graySearchIcon; + private static double[] defaultMaskSize = {9, 9}; + private static double[] defaultSearchSize = {40, 40}; + private static int templateIconMagnification = 2; + private static int predictionLookback = 4; + + static { + dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); + dashed = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DASHED_LINE,0); + selectionShape = solidBold.createStrokedShape(hitRect); + format.setMinimumIntegerDigits(1); + format.setMinimumFractionDigits(1); + format.setMaximumFractionDigits(1); + String path = "/org/opensourcephysics/cabrillo/tracker/resources/images/green_light.gif"; //$NON-NLS-1$ + searchIcon = ResourceLoader.getIcon(path); + path = "/org/opensourcephysics/cabrillo/tracker/resources/images/red_light.gif"; //$NON-NLS-1$ + stopIcon = ResourceLoader.getIcon(path); + path = "/org/opensourcephysics/cabrillo/tracker/resources/images/gray_light.gif"; //$NON-NLS-1$ + graySearchIcon = ResourceLoader.getIcon(path); + } + + // instance fields + private TrackerPanel trackerPanel; + private TTrack track; + private Wizard wizard; + private Shape match = new Ellipse2D.Double(); + private double minMaskRadius = 4; + private Handle maskHandle = new Handle(); + private Corner maskCorner = new Corner(); + private TPoint maskCenter = new TPoint(); + private Handle searchHandle = new Handle(); + private Corner searchCorner = new Corner(); + private TPoint searchCenter = new TPoint(); + private TPoint predictedTarget = new TPoint(); + private Rectangle2D searchRect2D = new Rectangle2D.Double(); + private Shape searchShape, maskShape, matchShape; + private Shape searchHitShape, maskHitShape; + private Mark mark; // draws the mask, target and/or search area + private Point[] screenPoints = {new Point()}; // used for footprints + private boolean maskVisible, targetVisible, searchVisible; + private Runnable stepper; + private boolean stepping, active, paused, marking, lookAhead=true; + private int goodMatch=4, possibleMatch=1, evolveAlpha=63; + /* trackFrameData maps tracks to indexFrameData which maps point index + to frameData which maps frame number to individual FrameData objects */ + private Map>> trackFrameData + = new HashMap>>(); + private int lineSpread = -1; // positive for 1D, negative for 2D tracking + private boolean isInteracting; + private double[][] derivatives1 = new double[predictionLookback-1][]; + private double[][] derivatives2 = new double[predictionLookback-1][]; + private double[][] derivatives3 = new double[predictionLookback-1][]; + + + /** + * Constructs an AutoTracker for a specified TrackerPanel. + * + * @param panel the TrackerPanel + */ + public AutoTracker(TrackerPanel panel) { + trackerPanel = panel; + trackerPanel.addDrawable(this); + trackerPanel.addPropertyChangeListener("selectedpoint", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("selectedtrack", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("video", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + stepper = new Runnable() { + public void run() { + if (!active || track==null) { + return; + } + if (markCurrentFrame(true)) { + // successfully found/marked a good match + if (!canStep()) { // reached the end + stop(true, true); + return; + } + if (stepping) { // move to the next step + wizard.refreshInfo(); + repaint(); + trackerPanel.getPlayer().step(); + return; + } + // not stepping, so stop + stop(true, true); + } + else { // failed to find or mark a match, so pause or stop + if (!stepping) + stop(true, false); + else { + paused = true; + if (track instanceof PointMass) { + PointMass pointMass = (PointMass)track; + pointMass.updateDerivatives(); + } + track.firePropertyChange("steps", null, null); //$NON-NLS-1$ + wizard.refreshGUI(); + } + } + repaint(); + } + }; + wizard = new Wizard(); + // center on screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - wizard.getBounds().width) / 2; + int y = (dim.height - wizard.getBounds().height) / 2; + wizard.setLocation(x, y); + } + + /** + * Sets the track to mark when matches are found. + * + * @param aTrack the track + */ + protected void setTrack(TTrack aTrack) { + if (aTrack!=null && !aTrack.isAutoTrackable()) + aTrack = null; + if (track==aTrack) return; + if (track!=null) { + track.removePropertyChangeListener("step", this); //$NON-NLS-1$ + track.removePropertyChangeListener("name", this); //$NON-NLS-1$ + track.removePropertyChangeListener("color", this); //$NON-NLS-1$ + track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + track = aTrack; + if (track!=null) + trackerPanel.setSelectedTrack(track); + if (track!=null) { + track.addPropertyChangeListener("step", this); //$NON-NLS-1$ + track.addPropertyChangeListener("name", this); //$NON-NLS-1$ + track.addPropertyChangeListener("color", this); //$NON-NLS-1$ + track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.setVisible(true); + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + TPoint[] searchPts = frame.getSearchPoints(true); + if (searchPts != null) + setSearchPoints(searchPts[0], searchPts[1]); + } + wizard.refreshGUI(); + } + + /** + * Adds a key frame for a given track point and mask center position. + * + * @param p the track point + * @param x the mask center x + * @param y the mask center y + */ + protected void addKeyFrame(TPoint p, double x, double y) { + int n = trackerPanel.getFrameNumber(); + Target target = new Target(); + Shape mask = new Ellipse2D.Double(); + maskCenter.setLocation(x, y); + maskCorner.setLocation(x+defaultMaskSize[0], y+defaultMaskSize[1]); + searchCenter.setLocation(x, y); + searchCorner.setLocation(x+defaultSearchSize[0], y+defaultSearchSize[1]); + Map frames = getFrameData(); + KeyFrame keyFrame = new KeyFrame(p, mask, target); + frames.put(n, keyFrame); + clearSearchPointsDownstream(); + refreshSearchRect(); + refreshKeyFrame(keyFrame); + getWizard().setVisible(true); +// getWizard().refreshGUI(); +// search(false, false); // don't skip this frame and don't keep stepping + trackerPanel.repaint(); + } + + /** + * Starts the search process. + * + * @param startWithThis true to search the current frame + * @param keepGoing true to continue stepping after the first search + */ + protected void search(boolean startWithThis, boolean keepGoing) { + stepping = stepping || keepGoing; + wizard.changed = false; + active = true; // actively searching + paused = false; + if (!startWithThis || markCurrentFrame(false)) { + if (canStep() && (!startWithThis||stepping)) { + trackerPanel.getPlayer().step(); + return; + } + if (startWithThis && !stepping) { // mark this frame only + active = false; + } + // reached end frame, so stop + else { + stop(true, true); + } + } + else { + // tried to mark this frame and failed + paused = true; + } + getWizard().refreshGUI(); + getWizard().helpButton.requestFocusInWindow(); + repaint(); + } + + /** + * Stops the search process. + * + * @param now true to stop now + * @param update true to update derivatives + */ + protected void stop(boolean now, boolean update) { + stepping = false; // don't keep stepping + active = !now && !paused; + paused = false; + wizard.refreshGUI(); + if (update) { + if (track instanceof PointMass) { + PointMass pointMass = (PointMass)track; + pointMass.updateDerivatives(); + } + track.firePropertyChange("steps", null, null); //$NON-NLS-1$ + } + } + + /** + * Marks a new step in the current frame if a match is found. + * + * @param predictLoc true to use look-ahead prediction for setting the search loc + * @return true if a new step was marked + */ + public boolean markCurrentFrame(boolean predictLoc) { + if (track==null) return false; + trackerPanel.setSelectedTrack(track); + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + KeyFrame keyFrame = frame.getKeyFrame(); + if (keyFrame!=null && !track.isStepComplete(n)) { + TPoint p = findMatchTarget(predictLoc); + double[] peakWidthAndHeight = frame.getMatchWidthAndHeight(); + if (p!=null + && (Double.isInfinite(peakWidthAndHeight[1]) + || peakWidthAndHeight[1]>=goodMatch)) { + marking = true; + track.autoTrackerMarking = track.isAutoAdvance(); + p = track.autoMarkAt(n, p.x, p.y); + frame.setAutoMarkPoint(p); + track.autoTrackerMarking = false; + return true; + } + if (p==null) { + frame.setMatchIcon(null); + } + } + return false; + } + + /** + * Gets the predicted target point in a specified video frame, + * based on previously marked steps. + * + * @param frameNumber the frame number + * @return the predicted target + */ + public TPoint getPredictedMatchTarget(int frameNumber) { + boolean success = false; + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + int stepNumber = clip.frameToStep(frameNumber); + + // get position data at previous steps + TPoint[] prevPoints = new TPoint[predictionLookback]; + if (stepNumber>0 && track!=null) { + for (int j = 0; j= 0) { + int n = clip.stepToFrame(stepNumber-j-1); + FrameData frame = getFrame(n); + if (track.steps.isAutofill() && !frame.searched) + prevPoints[j] = null; + else { + prevPoints[j] = frame.getMarkedPoint(); + } + } + } + } + + // return null (no prediction) if there is no recent position data + if (prevPoints[0]==null) + return null; + + // set predictedTarget to prev position + predictedTarget.setLocation(prevPoints[0].getX(), prevPoints[0].getY()); + if (!lookAhead || prevPoints[1]==null) { + // no recent velocity or acceleration data available + success = true; + } + + if (!success) { + // get derivatives + double[][] veloc = getDerivatives(prevPoints, 1); + double[][] accel = getDerivatives(prevPoints, 2); + double[][] jerk = getDerivatives(prevPoints, 3); + + double vxmax=0, vxmean=0, vymax=0, vymean=0; + int n = 0; + for (int i=0; i< veloc.length; i++) { + if (veloc[i]!=null) { + n++; + vxmax = Math.max(vxmax, Math.abs(veloc[i][0])); + vxmean += veloc[i][0]; + vymax = Math.max(vymax, Math.abs(veloc[i][1])); + vymean += veloc[i][1]; + } + } + vxmean = Math.abs(vxmean/n); + vymean = Math.abs(vymean/n); + + double axmax=0, axmean=0, aymax=0, aymean=0; + n = 0; + for (int i=0; i< accel.length; i++) { + if (accel[i]!=null) { + n++; + axmax = Math.max(axmax, Math.abs(accel[i][0])); + axmean += accel[i][0]; + aymax = Math.max(aymax, Math.abs(accel[i][1])); + aymean += accel[i][1]; + } + } + axmean = Math.abs(axmean/n); + aymean = Math.abs(aymean/n); + + double jxmax=0, jxmean=0, jymax=0, jymean=0; + n = 0; + for (int i=0; i< jerk.length; i++) { + if (jerk[i]!=null) { + n++; + jxmax = Math.max(jxmax, Math.abs(jerk[i][0])); + jxmean += jerk[i][0]; + jymax = Math.max(jymax, Math.abs(jerk[i][1])); + jymean += jerk[i][1]; + } + } + jxmean = Math.abs(jxmean/n); + jymean = Math.abs(jymean/n); + + boolean xVelocValid = prevPoints[2]==null || Math.abs(accel[0][0])-1 && i!=track.getTargetIndex()) { + track.setTargetIndex(i); + + // get frame for new index and reposition search points and mask + frame = getFrame(n); + TPoint[] searchPts = frame.getSearchPoints(true); + if (searchPts != null) + setSearchPoints(searchPts[0], searchPts[1]); + + keyFrame = frame.getKeyFrame(); + if (keyFrame!=null) { + maskCenter.setLocation(keyFrame.getMaskPoints()[0]); + maskCorner.setLocation(keyFrame.getMaskPoints()[1]); + } + + wizard.refreshGUI(); + needsRepaint = true; + } + } + if (needsRepaint) repaint(); + } + else if (name.equals("selectedtrack") && wizard!=null) { //$NON-NLS-1$ +// setTrack((TTrack)e.getNewValue()); + wizard.refreshGUI(); + } + + if (wizard==null || !wizard.isVisible()) return; + + if (name.equals("video") || name.equals("name") //$NON-NLS-1$ //$NON-NLS-2$ + || name.equals("color") || name.equals("footprint")) { //$NON-NLS-1$ //$NON-NLS-2$ + wizard.refreshGUI(); + } + else if (track==null && name.equals("stepnumber")) { //$NON-NLS-1$ + wizard.refreshGUI(); + } + + if (track==null || trackerPanel.getVideo()==null) { + return; + } + if (name.equals("step") && wizard.isVisible()) { //$NON-NLS-1$ + if (!marking) { // not marked by this autotracker + n = ((Integer)e.getNewValue()).intValue(); + frame = getFrame(n); + frame.decided = true; // point dragged by user? + if (track.getStep(n)==null) { // step was deleted + frame.clear(); + } + else if (!frame.isKeyFrame()) { // step was marked or moved + frame.setMatchIcon(null); + paused = false; + } + } + wizard.refreshGUI(); + marking = false; + } + else if (name.equals("stepnumber")) { //$NON-NLS-1$ + TPoint[] searchPts = frame.getSearchPoints(true); + if (searchPts != null) + setSearchPoints(searchPts[0], searchPts[1]); + else if (lookAhead && keyFrame!=null) { + TPoint prediction = getPredictedMatchTarget(n); + if (prediction != null) { + setSearchPoints(getMatchCenter(prediction), null); + // save search center and corner points + TPoint[] pts = new TPoint[] {new TPoint(searchCenter), new TPoint(searchCorner)}; + frame.setSearchPoints(pts); + } + else { + repaint(); + } + } + if (active && !paused) { // actively tracking + if (SwingUtilities.isEventDispatchThread()) + stepper.run(); + else + SwingUtilities.invokeLater(stepper); + } + else if (stepping) { // user set the frame number, so stop stepping + stop(true, false); + } + else wizard.refreshGUI(); + } + } + + // implements Interactive & Measurable methods + public void setEnabled(boolean enabled) {} + public boolean isEnabled() {return true;} + public void setXY(double x, double y) {} + public void setX(double x) {} + public void setY(double y) {} + public double getX() {return 0;} + public double getY() {return 0;} + public double getXMin() {return 0;} + public double getXMax() {return 0;} + public double getYMin() {return 0;} + public double getYMax() {return 0;} + public boolean isMeasured() {return false;} + +//_______________________________ protected methods _________________________ + + /** + * Finds the target for the best match found within the specified + * searchRect. Also saves match width, height, center and corner. + * + * @param searchRect the search rectangle + * @return the target, or null if no match found + */ + protected TPoint findMatchTarget(Rectangle searchRect) { + Video video = trackerPanel.getVideo(); + if (video == null) return null; + TemplateMatcher matcher = getTemplateMatcher(); + if (matcher == null) return null; + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + frame.decided = false; // default + + // set template to be matched + matcher.setTemplate(frame.getTemplateToMatch()); + + // get location, width and height of match + TPoint p = null; + BufferedImage image = video.getImage(); + if (lineSpread>=0) { + double theta = trackerPanel.getCoords().getAngle(n); + double x0 = trackerPanel.getCoords().getOriginX(n); + double y0 = trackerPanel.getCoords().getOriginY(n); + p = matcher.getMatchLocation(image, searchRect, x0, y0, theta, lineSpread); // may be null + } + else { + p = matcher.getMatchLocation(image, searchRect); // may be null + } + double[] matchWidthAndHeight = matcher.getMatchWidthAndHeight(); + if (matchWidthAndHeight[1]=goodMatch) { + buildEvolvedTemplate(frame); + return getMatchTarget(center); + } + + return null; + } + + /** + * Builds an evolved template based on data in the specified FrameData + * and the current video image. + * + * @param frame the FrameData frame + */ + protected void buildEvolvedTemplate(FrameData frame) { + TPoint[] matchPts = frame.getMatchPoints(); + if (matchPts==null) return; // can't build template without a match +// System.out.println("building evolved for "+frame.getFrameNumber()); + TemplateMatcher matcher = getTemplateMatcher(); + matcher.setTemplate(frame.getTemplate()); + matcher.setWorkingPixels(frame.getWorkingPixels()); + Rectangle rect = frame.getKeyFrame().getMask().getBounds(); + // get new image to rebuild template + int x = (int)Math.round(matchPts[2].getX()); + int y = (int)Math.round(matchPts[2].getY()); + BufferedImage source = trackerPanel.getVideo().getImage(); + BufferedImage matchImage = new BufferedImage( + rect.width, rect.height, BufferedImage.TYPE_INT_RGB); + matchImage.createGraphics().drawImage(source, -x, -y, null); + matcher.buildTemplate(matchImage, evolveAlpha, 0); + matcher.setIndex(frame.getFrameNumber()); + } + + + /** + * Creates a TemplateMatcher based on the current image and mask. + * + * @return a newly created template matcher, or null if no video image exists + */ + protected TemplateMatcher createTemplateMatcher() { + Video video = trackerPanel.getVideo(); + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + KeyFrame keyFrame = frame.getKeyFrame(); + if (video!=null && keyFrame!=null) { + // create template image + Shape mask = keyFrame.getMask(); + BufferedImage source = video.getImage(); + Rectangle rect = mask.getBounds(); + BufferedImage templateImage = new BufferedImage( + rect.width, rect.height, BufferedImage.TYPE_INT_RGB); + templateImage.createGraphics().drawImage(source, -rect.x, -rect.y, null); + // translate mask to (0, 0) relative to template + transform.setToTranslation(-rect.x, -rect.y); + Shape templateRegion = transform.createTransformedShape(mask); + return new TemplateMatcher(templateImage, templateRegion); + } + return null; + } + + // indexFrameData maps point index to frameData + protected Map> getIndexFrameData() { + Map> indexFrameData = trackFrameData.get(track); + if (indexFrameData==null) { + indexFrameData = new TreeMap>(); + trackFrameData.put(track, indexFrameData); + } + return indexFrameData; + } + + // frameData maps frame number to individual FrameData objects + protected Map getFrameData(int index) { + Map frameData = getIndexFrameData().get(index); + if (frameData==null) { + frameData = new TreeMap(); + getIndexFrameData().put(index, frameData); + } + return frameData; + } + + protected Map getFrameData() { + int index = track==null? 0: track.getTargetIndex(); + return getFrameData(index); + } + + protected FrameData getFrame(int frameNumber) { + FrameData frame = getFrameData().get(frameNumber); + if (frame==null) { + int index = track==null? 0: track.getTargetIndex(); + frame = new FrameData(index, frameNumber); + getFrameData().put(frameNumber, frame); + } + return frame; + } + + protected int getIndex(TPoint p) { + int n = p.getFrameNumber(trackerPanel); + Step step = track.getStep(n); // non-null if marked + if (step!=null) { + for (int i=0; i< step.points.length; i++) { + if (p.equals(step.points[i])) { + return i; + } + } + } + return -1; + } + + protected TTrack getTrack() { + return track; + } + + /** + * Erases the current mark. + */ + protected void erase() { + if (mark != null) + trackerPanel.addDirtyRegion(mark.getBounds(false)); // old bounds + mark = null; + } + + /** + * Repaints this object. + */ + protected void repaint() { + erase(); + if (getMark() != null) + trackerPanel.addDirtyRegion(mark.getBounds(false)); // new bounds + trackerPanel.repaintDirtyRegion(); + } + + /** + * Cleans up resources. + */ + protected void cleanup() { + trackerPanel.removeDrawable(this); + trackerPanel.removePropertyChangeListener(this); + setTrack(null); + wizard.dispose(); + } + + /** + * Gets the drawing mark. + * + * @return the mark + */ + protected Mark getMark() { + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + KeyFrame keyFrame = frame.getKeyFrame(); + if (track==null || keyFrame==null) return null; + if (mark==null) { + int k = getStatusCode(n); + // refresh target icon on wizard label + Color c = track.getFootprint().getColor(); + target_footprint.setColor(c); + inactive_target_footprint.setColor(c); + corner_footprint.setColor(c); + // define marks for center, corners, target and selection + Mark searchCornerMark=null, maskCornerMark=null, + targetMark=null, selectionMark=null; + // set up transform + AffineTransform toScreen = trackerPanel.getPixelTransform(); + if (!trackerPanel.isDrawingInImageSpace()) { + toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); + } + // get selected point and define the corresponding screen point + final TPoint selection = trackerPanel.getSelectedPoint(); + Point selectionPt = null; + // refresh search and mask draw and hit shapes + try { + searchShape = toScreen.createTransformedShape(searchRect2D); + searchHitShape = solid.createStrokedShape(searchShape); + maskShape = toScreen.createTransformedShape(keyFrame.getMask()); + maskHitShape = solid.createStrokedShape(maskShape); + } catch (Exception e) { + return null; + } + // check to see if a handle is selected + if (selection == maskHandle) + selectionPt = maskVisible? maskHandle.getScreenPosition(trackerPanel): null; + else if (selection == searchHandle) + selectionPt = searchVisible? searchHandle.getScreenPosition(trackerPanel): null; + // create mask corner mark + if (frame.isKeyFrame()) { + maskCenter.setLocation(keyFrame.getMaskPoints()[0]); + maskCorner.setLocation(keyFrame.getMaskPoints()[1]); + } + screenPoints[0] = maskCorner.getScreenPosition(trackerPanel); + if (selection == maskCorner) { + selectionPt = maskVisible? screenPoints[0]: null; + } + else { + maskCornerMark = corner_footprint.getMark(screenPoints); + } + // create search corner mark + screenPoints[0] = searchCorner.getScreenPosition(trackerPanel); + if (selection == searchCorner) { + selectionPt = searchVisible? screenPoints[0]: null; + } + else { + searchCornerMark = corner_footprint.getMark(screenPoints); + } + // create target mark + screenPoints[0] = keyFrame.getTarget().getScreenPosition(trackerPanel); + if (selection == keyFrame.getTarget()) + selectionPt = targetVisible? screenPoints[0]: null; + else { + targetMark = target_footprint.getMark(screenPoints); + } + // if a match has been found, create match shapes + TPoint[] matchPts = frame.getMatchPoints(); + if (matchPts == null || frame.isKeyFrame() || k==5) + matchShape = null; + else { + Point p1 = matchPts[0].getScreenPosition(trackerPanel); + Point p2 = maskCenter.getScreenPosition(trackerPanel); + transform.setToTranslation(p1.x-p2.x, p1.y-p2.y); + matchShape = toScreen.createTransformedShape(getMatchShape(matchPts)); + screenPoints[0] = getMatchTarget(matchPts[0]).getScreenPosition(trackerPanel); +// matchTargetMark = inactive_target_footprint.getMark(screenPoints); + } + // if anything is selected, create a selection mark + if (selectionPt != null) { + transform.setToTranslation(selectionPt.x, selectionPt.y); + final Shape selectedShape + = transform.createTransformedShape(selectionShape); + selectionMark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(selectedShape); + } + public Rectangle getBounds(boolean highlighted) { + return selectedShape.getBounds(); + } + }; + } + // create final mark + final Mark markMaskCorner = maskCornerMark; + final Mark markSearchCorner = searchCornerMark; + final Mark markTarget = targetMark; + final Mark markSelection = selectionMark; + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + Color c = track.getFootprint().getColor(); + g.setPaint(c); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + BasicStroke stroke = (BasicStroke)g.getStroke(); + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + boolean isKeyFrame = frame!=null && frame.isKeyFrame(); + if (targetVisible) { + // draw the target + if (isKeyFrame) { + if (markTarget != null) + markTarget.draw(g, false); + } + } + if (matchShape!=null && !isKeyFrame) { + g.setStroke(dotted); + g.draw(matchShape); + } + if (maskVisible && isKeyFrame) { + g.setStroke(stroke); + g.draw(maskShape); + if (markMaskCorner != null) + markMaskCorner.draw(g, false); + } + if (searchVisible || !isKeyFrame) { + // draw the searchRect + g.setStroke(dashed); + g.draw(searchShape); + if (markSearchCorner != null) + markSearchCorner.draw(g, false); + } + // draw the selected point + if (markSelection != null) markSelection.draw(g, false); + g.setStroke(stroke); + g.setPaint(gpaint); + } + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = searchShape.getBounds(); + if (markMaskCorner != null) bounds.add(markMaskCorner.getBounds(highlighted)); + if (markSearchCorner != null) bounds.add(markSearchCorner.getBounds(highlighted)); + if (markTarget != null) bounds.add(markTarget.getBounds(highlighted)); + if (markSelection != null) bounds.add(markSelection.getBounds(highlighted)); + if (maskVisible) bounds.add(maskShape.getBounds()); + if (matchShape != null) { + bounds.add(matchShape.getBounds()); +// bounds.add(matchTargetMark.getBounds(highlighted)); + } + return bounds; + } + }; + } + return mark; + } + + /** + * Returns the target for a specified match center point. + * + * @param center the center point + * @return the target + */ + protected TPoint getMatchTarget(TPoint center) { + int n = trackerPanel.getFrameNumber(); + double[] offset = getFrame(n).getTargetOffset(); + return new TPoint(center.x+offset[0], center.y+offset[1]); + } + + /** + * Returns the center point for a specified match target. + * + * @param target the target + * @return the center + */ + protected TPoint getMatchCenter(TPoint target) { + int n = trackerPanel.getFrameNumber(); + double[] offset = getFrame(n).getTargetOffset(); + return new TPoint(target.x-offset[0], target.y-offset[1]); + } + + /** + * Deletes the match data at a specified frame number. + * + * @param n the frame number + */ + protected void delete(int n) { + trackerPanel.repaint(); + FrameData frame = getFrame(n); + frame.clear(); + } + + /** + * Clears all existing steps and match data for the current point index. + */ + protected void reset() { + mark = null; + // clear all frames and identify the key frame + Map frameData = getFrameData(); + KeyFrame keyFrame = null; + ArrayList toRemove = new ArrayList(); + for (int i: frameData.keySet()) { + FrameData frame = frameData.get(i); + frame.clear(); + if (keyFrame==null && frame.isKeyFrame()) + keyFrame = (KeyFrame)frame; + toRemove.add(i); + } + for (int i: toRemove) { + frameData.remove(i); + } + // delete all steps unless always marked + boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; + if (!isAlwaysMarked) { + for (int n = 0; n < track.getSteps().length; n++) { + track.steps.setStep(n, null); + } + } + stop(true, true); + // set the step number to key frame + if (keyFrame!=null) { + int n = keyFrame.getFrameNumber(); + VideoPlayer player = trackerPanel.getPlayer(); + player.setStepNumber(player.getVideoClip().frameToStep(n)); + } + repaint(); + } + + /** + * Refreshes the key frame to reflect current center and corner positions. + * + * @param keyFrame the KeyFrame + */ + protected void refreshKeyFrame(KeyFrame keyFrame) { + Shape mask = keyFrame.getMask(); + if (mask instanceof Ellipse2D.Double) { + // prevent the mask from being too small to contain any pixels + keyFrame.getMaskPoints()[0].setLocation(maskCenter); + keyFrame.getMaskPoints()[1].setLocation(maskCorner); + Ellipse2D.Double ellipse = (Ellipse2D.Double)mask; + double sin = maskCenter.sin(maskCorner); + double cos = maskCenter.cos(maskCorner); + if (Double.isNaN(sin)) { + sin = -0.707; + cos = 0.707; + } + double d = Math.max(minMaskRadius, maskCenter.distance(maskCorner)); + double dx = d*cornerFactor*cos; + double dy = -d*cornerFactor*sin; + if (Math.abs(dx) < 1) { + if (dx > 0) dx = 1; + else dx = -1; + } + if (Math.abs(dy) < 1) { + if (dy > 0) dy = 1; + else dy = -1; + } + ellipse.setFrameFromCenter(maskCenter.x, maskCenter.y, + maskCenter.x + dx, maskCenter.y + dy); + } + wizard.replaceIcons(keyFrame); + // get the marked point and set target position AFTER refreshing keyFrame + TPoint p = keyFrame.getMarkedPoint(); + if (p!=null) + keyFrame.getTarget().setXY(p.getX(), p.getY()); + search(true, false); // search this frame only + repaint(); + wizard.repaint(); + } + + protected BufferedImage createMagnifiedImage(BufferedImage source) { + BufferedImage image = new BufferedImage( + templateIconMagnification*source.getWidth(), + templateIconMagnification*source.getHeight(), + BufferedImage.TYPE_INT_ARGB); + image.createGraphics().drawImage(source, 0, 0, image.getWidth(), image.getHeight(), null); + return image; + } + + /** + * Gets the match shape for the specified center and frame corner positions. + * + * @param pts TPoint[] {center, frame corner} + * @return a shape suitable for drawing + */ + protected Shape getMatchShape(TPoint[] pts) { + if (match instanceof Ellipse2D.Double) { + Ellipse2D.Double ellipse = (Ellipse2D.Double)match; + ellipse.setFrameFromCenter(pts[0], pts[1]); + return ellipse; + } + return null; + } + + /** + * Determines the status code for a given frame. The status codes are: + * 0: a key frame + * 1: automarked with a good match + * 2: possible match, not marked + * 3: searched but no match found + * 4: unable to search--search area outside image or x-axis + * 5: manually marked by the user + * 6: match accepted by the user + * 7: never searched + * 8: possible match but previously marked + * 9: no match found but previously marked + * 10: calibration tool possible match + * + * @param n the frame number + * @return the status code + */ + protected int getStatusCode(int n) { + FrameData frame = getFrame(n); + if (frame.isKeyFrame()) return 0; // key frame + double[] widthAndHeight = frame.getMatchWidthAndHeight(); + if (frame.isMarked()) { // frame is marked (includes always-marked tracks like axes, calibration points, etc) + if (frame.isAutoMarked()) { // automarked + if (widthAndHeight[1]> goodMatch) return 1; // automarked with good match + return 6; // accepted by user + } + // not automarked + boolean isCalibrationTool = track instanceof CoordAxes + || track instanceof OffsetOrigin + || track instanceof Calibration; + if (track instanceof TapeMeasure) { + TapeMeasure tape = (TapeMeasure)track; + isCalibrationTool = !tape.isReadOnly(); + } + if (frame.searched) { + if (isCalibrationTool) { + if (widthAndHeight[1]>possibleMatch) return 8; // possible match for calibration + return 9; // no match found, existing mark or calibration + } + if (frame.decided) return 5; // manually marked by user + if (widthAndHeight[1]>possibleMatch) return 8; // possible match, already marked + return 9; // no match found, existing mark or calibration + } + return 7; // never searched + } + if (frame.searched) { // frame unmarked but searched + if (widthAndHeight[1] frameData = getFrameData(); + for (Integer i: frameData.keySet()) { + if (i<=n) continue; + FrameData frame = frameData.get(i); + if (frame.isKeyFrame()) // only to the next key frame + break; + frame.setSearchPoints(null); + } + + } + + protected boolean moveRectIntoImage(Rectangle2D searchRect) { + // if needed, modify search rectangle to keep it within the video image + BufferedImage image = trackerPanel.getVideo().getImage(); + int w = image.getWidth(); + int h = image.getHeight(); + Point2D corner = new Point2D.Double(searchRect.getX(), searchRect.getY()); + Dimension dim = new Dimension((int)searchRect.getWidth(), (int)searchRect.getHeight()); + + boolean changed = false; + // reduce size if needed + if (w < dim.width || h < dim.height) { + changed = true; + dim.setSize(Math.min(w, dim.width), Math.min(h, dim.height)); + searchRect.setFrame(corner, dim); + } + + // move corner point if needed + double x = Math.max(0, corner.getX()); + x = Math.min(x, w-dim.width); + double y = Math.max(0, corner.getY()); + y = Math.min(y, h-dim.height); + if (x!=corner.getX() || y!=corner.getY()) { + changed = true; + corner.setLocation(x, y); + searchRect.setFrame(corner, dim); + } + + return changed; + } + + /** + * Gets the available derivatives of the specified order. These are NOT time + * derivatives, but simply differences in pixel units: order 1 is deltaPosition, + * order 2 is change in deltaPosition, order 3 is change in order 2. Note the + * TPoint positions are in image units, not world units. + * + * @param positions an array of positions + * @param order may be 1 (v), 2 (a) or 3 (jerk) + * @return the derivative data + */ + protected double[][] getDerivatives(TPoint[] positions, int order) { + // return null if insufficient data + if (positions.length=positions.length-1) { + derivatives1[i] = null; + continue; + } + TPoint loc0 = positions[i+1]; + TPoint loc1 = positions[i]; + if (loc0==null || loc1==null) { + derivatives1[i] = null; + continue; + } + double x = loc1.getX() -loc0.getX(); + double y = loc1.getY() -loc0.getY(); + derivatives1[i] = new double[] {x, y}; + } + return derivatives1; + } + else if (order==2) { // acceleration + for (int i=0; i=positions.length-2) { + derivatives2[i] = null; + continue; + } + TPoint loc0 = positions[i+2]; + TPoint loc1 = positions[i+1]; + TPoint loc2 = positions[i]; + if (loc0==null || loc1==null || loc2==null) { + derivatives2[i] = null; + continue; + } + double x = loc2.getX() - 2*loc1.getX() + loc0.getX(); + double y = loc2.getY() - 2*loc1.getY() + loc0.getY(); + derivatives2[i] = new double[] {x, y}; + } + return derivatives2; + } + else if (order==3) { // jerk + for (int i=0; i=positions.length-3) { + derivatives3[i] = null; + continue; + } + TPoint loc0 = positions[i+3]; + TPoint loc1 = positions[i+2]; + TPoint loc2 = positions[i+1]; + TPoint loc3 = positions[i]; + if (loc0==null || loc1==null || loc2==null || loc3==null) { + derivatives3[i] = null; + continue; + } + double x = loc3.getX() - 3*loc2.getX() + 3*loc1.getX() - loc0.getX(); + double y = loc3.getY() - 3*loc2.getY() + 3*loc1.getY() - loc0.getY(); + derivatives3[i] = new double[] {x, y}; + } + return derivatives3; + } + return null; + } + +//____________________ inner TPoint classes ______________________ + + /** + * An edge point used for translation. + */ + protected class Handle extends TPoint { + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + double dx = x-getX(); + double dy = y-getY(); + super.setXY(x, y); + int n = trackerPanel.getFrameNumber(); + if (this == searchHandle) { + searchCenter.x += dx; + searchCenter.y += dy; + searchCorner.x += dx; + searchCorner.y += dy; + refreshSearchRect(); + wizard.setChanged(); + } + else { + maskCenter.x += dx; + maskCenter.y += dy; + maskCorner.x += dx; + maskCorner.y += dy; + KeyFrame keyFrame = getFrame(n).getKeyFrame(); + keyFrame.getMaskPoints()[0].setLocation(maskCenter); + keyFrame.getMaskPoints()[1].setLocation(maskCorner); + Target target = keyFrame.getTarget(); + keyFrame.setTargetOffset(target.x-maskCenter.x, target.y-maskCenter.y); + refreshKeyFrame(keyFrame); + } + clearSearchPointsDownstream(); + } + + /** + * Sets the location of this point to the specified screen position. + * + * @param x the x screen position + * @param y the y screen position + * @param vidPanel the trackerPanel doing the drawing + */ + public void setScreenLocation(int x, int y, VideoPanel vidPanel) { + if (screenPt == null) screenPt = new Point(); + if (worldPt == null) worldPt = new Point2D.Double(); + screenPt.setLocation(x, y); + AffineTransform toScreen = vidPanel.getPixelTransform(); + try { + toScreen.inverseTransform(screenPt, worldPt); + } catch(NoninvertibleTransformException ex) { + ex.printStackTrace(); + } + setLocation(worldPt); + repaint(); + } + } + + /** + * A corner point used for resizing. + */ + protected class Corner extends TPoint { + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + super.setXY(x, y); + int n = trackerPanel.getFrameNumber(); + if (this == searchCorner) { + refreshSearchRect(); + wizard.setChanged(); + } + else { + refreshKeyFrame(getFrame(n).getKeyFrame()); + } + clearSearchPointsDownstream(); + } + } + + /** + * A point that defines the target location relative to the mask center. + * Tracks are "marked" at this point when auto-tracking. + */ + protected class Target extends TPoint { + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + super.setXY(x, y); + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + KeyFrame keyFrame = frame.getKeyFrame(); + keyFrame.setTargetOffset(x-maskCenter.x, y-maskCenter.y); + track.autoTrackerMarking = track.isAutoAdvance(); + TPoint p = track.autoMarkAt(n, getX(), getY()); + frame.setAutoMarkPoint(p); + track.autoTrackerMarking = false; + repaint(); + track.repaint(); + } + } + + /** + * A class to hold frame data. + */ + protected class FrameData { + + private int index, frameNum, templateAlpha, matcherHashCode; + private double[] targetOffset = {0, 0}; + private double[] matchWidthAndHeight; + private TPoint[] matchPoints; + private TPoint[] searchPoints; + TPoint trackPoint; + private double[] autoMarkLoc; + private BufferedImage template; + private Icon templateIcon; // shows template used for search + private Icon matchIcon; // only if match is found + boolean searched; // true when searched + boolean decided; // true when accepted, skipped or marked point is dragged; assumed false for calibration tools and axes + int[] workingPixels; + + FrameData(int pointIndex, int frameNumber) { + index = pointIndex; + frameNum = frameNumber; + } + + FrameData(KeyFrame keyFrame) { + index = keyFrame.getIndex(); + frameNum = keyFrame.getFrameNumber(); + matchWidthAndHeight = keyFrame.getMatchWidthAndHeight(); + matchPoints = keyFrame.getMatchPoints(); + searchPoints = keyFrame.getSearchPoints(false); + targetOffset = keyFrame.getTargetOffset(); + matchIcon = keyFrame.getMatchIcon(); + templateIcon = keyFrame.getTemplateIcon(); + autoMarkLoc = keyFrame.getAutoMarkLoc(); + trackPoint = keyFrame.trackPoint; + searched = keyFrame.searched; + } + + int getFrameNumber() { + return frameNum; + } + + Icon getTemplateIcon() { + return templateIcon; + } + + void setTemplateIcon(Icon icon) { + templateIcon = icon; + } + + Icon getMatchIcon() { + return matchIcon; + } + + void setMatchIcon(Icon icon) { + matchIcon = icon; + } + + /** + * Sets the template to the current template of a TemplateMatcher. + * + * @param matcher the template matcher + */ + void setTemplate(TemplateMatcher matcher) { + template = matcher.getTemplate(); + templateAlpha = matcher.getAlphas()[0]; + workingPixels = matcher.getWorkingPixels(workingPixels); + matcherHashCode = matcher.hashCode(); + // refresh icons + setMatchIcon(null); + BufferedImage img = createMagnifiedImage(template); + setTemplateIcon(new ImageIcon(img)); + } + + /** + * Returns the template to match. Replaces the existing template if + * a new one exists. + */ + BufferedImage getTemplateToMatch() { + if (template==null || newTemplateExists()) { + // replace current template with new one + setTemplate(getTemplateMatcher()); + } + return template; + } + + /** + * Returns true if the evolved template is both different and appropriate. + */ + boolean newTemplateExists() { + if (isKeyFrame()) return false; + TemplateMatcher matcher = getTemplateMatcher(); + if (matcher==null) return false; + boolean different = matcher.getAlphas()[0]!=templateAlpha + || matcher.hashCode()!=matcherHashCode; + boolean appropriate = matcher.getIndex() frames = getFrameData(index); + for (int i=frameNum; i>=0; i--) { + FrameData frame = frames.get(i); + if (frame!=null) { + if (frame.searchPoints!=null || frame.isKeyFrame()) { + return frame.searchPoints; + } + } + } + return null; + } + + void setMatchPoints(TPoint[] points) { + matchPoints = points; + } + + TPoint[] getMatchPoints() { + return matchPoints; + } + + void setMatchWidthAndHeight(double[] matchData) { + matchWidthAndHeight = matchData; + } + + double[] getMatchWidthAndHeight() { + return matchWidthAndHeight; + } + + KeyFrame getKeyFrame() { + if (this.isKeyFrame()) return (KeyFrame)this; + Map frames = getFrameData(index); + for (int i=frameNum; i>=0; i--) { + FrameData frame = frames.get(i); + if (frame!=null && frame.isKeyFrame()) + return (KeyFrame)frame; + } + return null; + } + + int getIndex() { + return index; + } + + boolean isMarked() { + return track!=null && track.getStep(frameNum)!=null; + } + + boolean isAutoMarked() { + if (autoMarkLoc==null || trackPoint==null) return false; + if (trackPoint instanceof CoordAxes.AnglePoint) { + ImageCoordSystem coords = trackerPanel.getCoords(); + double theta = coords.getAngle(frameNum); + CoordAxes.AnglePoint p = (CoordAxes.AnglePoint)trackPoint; + return Math.abs(theta-p.getAngle())<0.001; + } + // return false if trackPoint has moved from marked location by more than 0.01 pixels + return Math.abs(autoMarkLoc[0]-trackPoint.getX())<0.01 + && Math.abs(autoMarkLoc[1]-trackPoint.getY())<0.01; + } + + void setAutoMarkPoint(TPoint point) { + trackPoint = point; + autoMarkLoc = point==null? null: new double[] {point.getX(), point.getY()}; + } + + double[] getAutoMarkLoc() { + return autoMarkLoc; + } + + boolean isKeyFrame() { + return false; + } + + TPoint getMarkedPoint() { + if (!isMarked()) return null; + if (trackPoint!=null) return trackPoint; + return track.getMarkedPoint(frameNum, index); + } + + void clear() { + matchPoints = null; + matchWidthAndHeight = null; + matchIcon = null; + autoMarkLoc = null; + searched = false; + decided = false; + trackPoint = null; + workingPixels = null; + matcherHashCode = 0; + if (!isKeyFrame()) { + searchPoints = null; + templateIcon = null; + templateAlpha = 0; + template = null; + } + } + } + + /** + * A class to hold keyframe data. + */ + protected class KeyFrame extends FrameData { + + private Shape mask; + private Target target; + private TPoint[] maskPoints = {new TPoint(), new TPoint()}; + private TemplateMatcher matcher; + + KeyFrame(TPoint keyPt, Shape mask, Target target) { + super(AutoTracker.this.getIndex(keyPt), keyPt.getFrameNumber(trackerPanel)); + this.mask = mask; + this.target = target; + maskPoints[0].setLocation(maskCenter); + maskPoints[1].setLocation(maskCorner); + } + + boolean isKeyFrame() { + return true; + } + + Shape getMask() { + return mask; + } + + Target getTarget() { + return target; + } + + TPoint[] getMaskPoints() { + return maskPoints; + } + + void setTemplateMatcher(TemplateMatcher matcher) { + this.matcher = matcher; + } + + boolean isFirstKeyFrame() { + Map frames = getFrameData(getIndex()); + for (int i=getFrameNumber()-1; i>=0; i--) { + FrameData frame = frames.get(i); + if (frame!=null && frame.isKeyFrame()) + return false; + } + return true; + } + + } + + /** + * A wizard to guide users of AutoTracker. + */ + protected class Wizard extends JDialog + implements PropertyChangeListener { + + // instance fields + private JButton startButton, searchNextButton, searchThisButton; + private JButton closeButton, helpButton, deleteButton, keyFrameButton; + private JButton acceptButton, skipButton; + private JSpinner evolveSpinner, acceptSpinner; + private JComboBox trackDropdown, pointDropdown; + private boolean isVisible, changed; + private JTextArea textPane; + protected JToolBar templateToolbar, searchToolbar, targetToolbar, imageToolbar, trackToolbar; + private JPanel startPanel, followupPanel, infoPanel, northPanel, targetPanel; + private JLabel templateImageLabel, matchImageLabel, acceptLabel, templateLabel; + private JLabel frameLabel, evolveRateLabel, searchLabel, targetLabel; + private JLabel pointLabel, trackLabel; + protected Dimension textPaneSize; + private JCheckBox lookAheadCheckbox, oneDCheckbox; + private Object mouseOverObj; + private MouseAdapter mouseOverListener; + private Timer timer; + + /** + * Constructs a Wizard. + */ + public Wizard() { + super(trackerPanel.getTFrame(), false); + createGUI(); + pack(); + } + + /** + * Responds to property change events. This listens for "tab" from TFrame. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (trackerPanel != null && e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + } + + /** + * Sets the changed flag + */ + public void setChanged() { + if (!changed) { + changed = true; + refreshGUI(); + } + } + + + /** + * Overrides JDialog setVisible method. + * + * @param vis true to show this inspector + */ + public void setVisible(boolean vis) { + super.setVisible(vis); + TToolBar toolbar = TToolBar.getToolbar(trackerPanel); + toolbar.autotrackerButton.setSelected(vis); + isVisible = vis; + if (!vis) { + erase(); + trackerPanel.repaintDirtyRegion(); + } + else { + TTrack track = trackerPanel.getSelectedTrack(); + if (track!=null) setTrack(track); + } + refreshGUI(); + } + + /** + * Sets the font level. + * + * @param level the desired font level + */ + public void setFontLevel(int level) { + FontSizer.setFonts(this, FontSizer.getLevel()); + Object[] buttons = new Object[] {acceptButton, skipButton}; + FontSizer.setFonts(buttons, FontSizer.getLevel()); + // private JComboBox trackDropdown, pointDropdown; + JComboBox[] dropdowns = new JComboBox[] {trackDropdown, pointDropdown}; + for (JComboBox next: dropdowns) { + int n = next.getSelectedIndex(); + Object[] items = new Object[next.getItemCount()]; + for (int i=0; i=max) alpha = 255; + if (evolveRate<=0) alpha = 0; + evolveAlpha=alpha; + } + + /** + * Creates the visible components. + */ + protected void createGUI() { + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + } +// setResizable(false); + KeyListener kl = new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + switch (e.getKeyCode()) { + case KeyEvent.VK_PAGE_UP: + if (e.isShiftDown()) { + int n = trackerPanel.getPlayer().getStepNumber()-5; + trackerPanel.getPlayer().setStepNumber(n); + } + else trackerPanel.getPlayer().back(); + break; + case KeyEvent.VK_PAGE_DOWN: + if (e.isShiftDown()) { + int n = trackerPanel.getPlayer().getStepNumber()+5; + trackerPanel.getPlayer().setStepNumber(n); + } + else trackerPanel.getPlayer().step(); + break; + case KeyEvent.VK_HOME: + trackerPanel.getPlayer().setStepNumber(0); + break; + case KeyEvent.VK_END: + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); + break; + } + } + public void keyReleased(KeyEvent e) { + // handle shift key release when wizard takes focus from TrackerPanel + if (e.getKeyCode()==KeyEvent.VK_SHIFT) { + trackerPanel.isShiftKeyDown = false; + } + } + }; + + int delay = 500; // 1/2 second delay for mouseover action + timer = new Timer(delay, new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshInfo(); + refreshDrawingFlags(); + erase(); + trackerPanel.repaint(); + } + }); + timer.setInitialDelay(delay); + + mouseOverListener = new MouseAdapter() { + public void mouseEntered(MouseEvent e) { + Component c = (Component)e.getSource(); + while (c.getParent()!=null) { + if (c==templateToolbar + || c==searchToolbar + || c==targetToolbar + || c==imageToolbar) { + mouseOverObj = c; + isInteracting = c==targetToolbar; + isInteracting = true; + break; + } + c = c.getParent(); + } + if (mouseOverObj==null) { + // refresh immediately + refreshInfo(); + refreshDrawingFlags(); + erase(); + trackerPanel.repaint(); + } + else { + // restart timer to refresh + timer.restart(); + } + } + public void mouseExited(MouseEvent e) { + // restart timer to refresh + timer.restart(); + mouseOverObj = null; + isInteracting = false; + } + }; + addWindowFocusListener(new java.awt.event.WindowAdapter() { + public void windowGainedFocus(java.awt.event.WindowEvent e) { + if (track!=null) trackerPanel.setSelectedTrack(track); + } + }); + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + // create trackDropdown early since need it for spinners + trackDropdown = new JComboBox() { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height-=1; + return dim; + } + }; + trackDropdown.addMouseListener(mouseOverListener); + for (int i = 0; i=0); + oneDCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + lineSpread = oneDCheckbox.isSelected()? 0: -1; + setChanged(); + if (oneDCheckbox.isSelected()) { + int n = trackerPanel.getFrameNumber(); + CoordAxes axes = trackerPanel.getAxes(); + KeyFrame frame = getFrame(n).getKeyFrame(); + if (frame!=null) { + n = frame.getFrameNumber(); + TPoint[] maskPts = frame.getMaskPoints(); + axes.getOrigin().setXY(maskPts[0].x, maskPts[0].y); + } + axes.setVisible(true); + } + trackerPanel.repaint(); + } + }); + lookAheadCheckbox = new JCheckBox(); + lookAheadCheckbox.addMouseListener(mouseOverListener); + lookAheadCheckbox.setOpaque(false); + lookAheadCheckbox.setSelected(lookAhead); + lookAheadCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + lookAhead = lookAheadCheckbox.isSelected(); + setChanged(); + } + }); + flowpanel = new JPanel(); + flowpanel.setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 0)); + flowpanel.setOpaque(false); + flowpanel.add(oneDCheckbox); + flowpanel.add(lookAheadCheckbox); + searchToolbar.add(searchLabel); + searchToolbar.add(flowpanel); + + // create target toolbar + targetToolbar = new JToolBar(); + targetToolbar.setFloatable(false); + targetToolbar.addMouseListener(mouseOverListener); + targetLabel = new JLabel(); + targetLabel.setOpaque(false); + targetLabel.setBorder(BorderFactory.createEmptyBorder(0, 6, 0, 6)); + + trackLabel = new JLabel(); + trackLabel.setOpaque(false); + + pointLabel = new JLabel(); + pointLabel.setOpaque(false); + pointLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + + pointDropdown = new JComboBox() { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = trackDropdown.getPreferredSize().height; + return dim; + } + }; + pointDropdown.addMouseListener(mouseOverListener); + for (int i = 0; i frameData = getFrameData(); + int nextKey = -1; // later key frame, if any + + // if this is first key frame, look for later one + for (Integer i: frameData.keySet()) { + FrameData frame = frameData.get(i); + if (frame.isKeyFrame()) { // found first key frame + if (frame==keyFrame) { + // we are deleting the first key frame, so find the next, then confirm with user + for (int j: frameData.keySet()) { + if (j>i) { + FrameData next = frameData.get(j); + if (next.isKeyFrame()) { + nextKey = j; + break; + } + } + } + break; + } + } + } + + // replace keyframe with non-key frame + FrameData newFrame = new FrameData(keyFrame); + frameData.put(n, newFrame); + + // get earlier keyframe, if any + keyFrame = getFrame(n).getKeyFrame(); + if (keyFrame!=null) { // earlier keyframe exists + maskCenter.setLocation(keyFrame.getMaskPoints()[0]); + maskCorner.setLocation(keyFrame.getMaskPoints()[1]); + } + else { // no earlier key frame, so clear all matches up to nextKey + ArrayList toRemove = new ArrayList(); + for (int i: frameData.keySet()) { + if (nextKey>-1 && i>=nextKey) break; + FrameData frame = frameData.get(i); + frame.clear(); + toRemove.add(i); + } + for (int i: toRemove) { + frameData.remove(i); + } + } + + if (track.getStep(n)==null) { + FrameData frame = getFrame(n); + if (frame!=null) { + frame.setTemplateIcon(null); + frame.setSearchPoints(null); + } + for (int i: frameData.keySet()) { + if (i<=n) continue; + frame = frameData.get(i); + if (!frame.isKeyFrame() && track.getStep(i)==null) + frame.clear(); + } + } + refreshGUI(); + AutoTracker.this.repaint(); + trackerPanel.repaint(); + } + }; + + final Action deleteThisAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + // clear this match and step + int n = trackerPanel.getFrameNumber(); + Map frameData = getFrameData(); + FrameData frame = frameData.get(n); + if (!frame.isKeyFrame()) { + frameData.get(n).clear(); + frameData.remove(n); + } + else { + frame.clear(); + } + + boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; + if (!isAlwaysMarked && track.getSteps().length>n) + track.getSteps()[n] = null; + refreshGUI(); + AutoTracker.this.repaint(); + trackerPanel.repaint(); + } + }; + + final Action deleteLaterAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + // clear later matches and steps + int n = trackerPanel.getFrameNumber(); + ArrayList toRemove = new ArrayList(); + Map frameData = getFrameData(); + for (int i: frameData.keySet()) { + if (i<=n) continue; + FrameData frame = frameData.get(i); + frame.clear(); + toRemove.add(i); + } + for (int i: toRemove) { + frameData.remove(i); + } + boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; + if (!isAlwaysMarked) { + Step[] steps = track.getSteps(); + for (int i = n+1; i < steps.length; i++) { + steps[i] = null; + } + } + refreshGUI(); + AutoTracker.this.repaint(); + } + }; + + final Action deleteAllAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + // clears all matches and steps + reset(); + } + }; + + deleteButton = new JButton(); + deleteButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // first determine what can be deleted + int n = trackerPanel.getFrameNumber(); + boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; + boolean hasThis = false; + boolean isKeyFrame = getFrame(n).isKeyFrame(); + + // count steps and look for this and later points/matches + int stepCount = 0; + boolean hasLater = false; + if (isAlwaysMarked) { + Map frameData = getFrameData(); + for (Integer i: frameData.keySet()) { + FrameData frame = frameData.get(i); + if (frame.trackPoint==null) continue; + hasLater = hasLater || i>n; + hasThis = hasThis || i==n; + stepCount++; + } + } + else { + hasThis = track.getStep(n)!=null; + Step[] steps = track.getSteps(); + for (int i = 0; i< steps.length; i++) { + if (steps[i]!=null) { + hasLater = hasLater || i>n; + stepCount++; + } + } + } + + // now build the popup menu with suitable delete items + JPopupMenu popup = new JPopupMenu(); + if (isKeyFrame) { + JMenuItem item = new JMenuItem(TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(deleteKeyFrameAction); + } + if (hasThis) { + JMenuItem item = new JMenuItem(isAlwaysMarked? + TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThisMatch"): //$NON-NLS-1$ + TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteThis")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(deleteThisAction); + } + if (hasLater) { + JMenuItem item = new JMenuItem(isAlwaysMarked? + TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteLaterMatches"): //$NON-NLS-1$ + TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteLater")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(deleteLaterAction); + } + if (stepCount>0 && !(stepCount==1 && hasThis)) { + JMenuItem item = new JMenuItem(TrackerRes.getString("AutoTracker.Wizard.Menuitem.DeleteAll")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(deleteAllAction); + } + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(deleteButton, 0, deleteButton.getHeight()); + } + }); + deleteButton.addKeyListener(kl); + + keyFrameButton = new JButton(); + keyFrameButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // find all key frames + ArrayList keyFrames = new ArrayList(); + Map frameData = getFrameData(); + for (Integer i: frameData.keySet()) { + FrameData frame = frameData.get(i); + if (frame.isKeyFrame()) + keyFrames.add(i); + } + Action keyAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + int i = Integer.parseInt(e.getActionCommand()); + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + trackerPanel.getPlayer().setStepNumber(clip.frameToStep(i)); + } + }; + JPopupMenu popup = new JPopupMenu(); + for (Integer i: keyFrames) { + String s = TrackerRes.getString("AutoTracker.Label.Frame"); //$NON-NLS-1$ + JMenuItem item = new JMenuItem(s+" "+i); //$NON-NLS-1$ + item.addActionListener(keyAction); + item.setActionCommand(String.valueOf(i)); + popup.add(item); + } + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(keyFrameButton, 0, keyFrameButton.getHeight()); + } + }); + keyFrameButton.addKeyListener(kl); + + // assemble content + infoPanel = new JPanel(new BorderLayout()) { + public Dimension getPreferredSize() { + if (textPaneSize!=null) return textPaneSize; + return super.getPreferredSize(); + } + }; + Border empty = BorderFactory.createEmptyBorder(4, 6, 4, 6); + Border etch = BorderFactory.createEtchedBorder(); + infoPanel.setBorder(BorderFactory.createCompoundBorder(etch, empty)); + infoPanel.setBackground(textPane.getBackground()); + infoPanel.add(textPane, BorderLayout.CENTER); + infoPanel.add(followupPanel, BorderLayout.SOUTH); + + JPanel controlPanel = new JPanel(new GridLayout(0, 1)); + controlPanel.add(templateToolbar); + controlPanel.add(searchToolbar); + controlPanel.add(targetToolbar); + + northPanel = new JPanel(new BorderLayout()); + northPanel.add(startPanel, BorderLayout.NORTH); + northPanel.add(imageToolbar, BorderLayout.SOUTH); + + JPanel center = new JPanel(new BorderLayout()); + center.add(controlPanel, BorderLayout.NORTH); + center.add(infoPanel, BorderLayout.CENTER); + + JPanel south = new JPanel(new FlowLayout()); + south.add(helpButton); + south.add(keyFrameButton); + south.add(deleteButton); + south.add(closeButton); + + contentPane.add(northPanel, BorderLayout.NORTH); + contentPane.add(center, BorderLayout.CENTER); + contentPane.add(south, BorderLayout.SOUTH); + + refreshGUI(); + } + + /** + * Refreshes the preferred size of the text pane. + */ + protected void refreshTextPaneSize() { + textPaneSize = null; + followupPanel.removeAll(); + followupPanel.add(acceptButton); + textPane.setText(getTemplateInstructions()); + Dimension dim = infoPanel.getPreferredSize(); + textPane.setText(getTargetInstructions()); + dim.height = Math.max(dim.height, infoPanel.getPreferredSize().height); + textPane.setText(getSearchInstructions()); + dim.height = Math.max(dim.height, infoPanel.getPreferredSize().height); + dim.height += 6; + textPaneSize = dim; + refreshButtons(); + refreshInfo(); + } + + /** + * Refreshes the titles and labels. + */ + protected void refreshStrings() { + Runnable runner = new Runnable() { + public void run() { + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + FrameData keyFrame = frame.getKeyFrame(); + + // set titles and labels of GUI elements + String title = TrackerRes.getString("AutoTracker.Wizard.Title"); //$NON-NLS-1$ + if (track!=null) { + int index = track.getTargetIndex(); + title += ": "+track.getName()+" "+track.getTargetDescription(index); //$NON-NLS-1$ //$NON-NLS-2$ + } + setTitle(title); + + frameLabel.setText(TrackerRes.getString("AutoTracker.Label.Frame")+" "+n+":"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + searchLabel.setText( + TrackerRes.getString("AutoTracker.Label.Search") + ":"); //$NON-NLS-1$ //$NON-NLS-2$ + targetLabel.setText( + TrackerRes.getString("AutoTracker.Label.Target")+":"); //$NON-NLS-1$ //$NON-NLS-2$ + templateLabel.setText( + TrackerRes.getString("AutoTracker.Label.Template")+":"); //$NON-NLS-1$ //$NON-NLS-2$ + acceptLabel.setText(TrackerRes.getString("AutoTracker.Label.Automark")); //$NON-NLS-1$ + trackLabel.setText(TrackerRes.getString("AutoTracker.Label.Track")); //$NON-NLS-1$ + pointLabel.setText(TrackerRes.getString("AutoTracker.Label.Point")); //$NON-NLS-1$ + evolveRateLabel.setText(TrackerRes.getString("AutoTracker.Label.EvolutionRate")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ + acceptButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Accept")); //$NON-NLS-1$ + keyFrameButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.ShowKeyFrame")); //$NON-NLS-1$ + deleteButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Delete")); //$NON-NLS-1$ + oneDCheckbox.setText(TrackerRes.getString("AutoTracker.Wizard.Checkbox.XAxis")); //$NON-NLS-1$ + lookAheadCheckbox.setText(TrackerRes.getString("AutoTracker.Wizard.Checkbox.LookAhead")); //$NON-NLS-1$ + matchImageLabel.setText(frame.getMatchIcon()==null? null: + TrackerRes.getString("AutoTracker.Label.Match")); //$NON-NLS-1$ + templateImageLabel.setText(keyFrame==null? null: + TrackerRes.getString("AutoTracker.Label.Template")); //$NON-NLS-1$ + + if (trackerPanel.getVideo()!=null) { + boolean running = stepping && !paused; + startButton.setIcon(stepping? stopIcon: searchIcon); + startButton.setText(stepping? + TrackerRes.getString("AutoTracker.Wizard.Button.Stop"): //$NON-NLS-1$ + TrackerRes.getString("AutoTracker.Wizard.Button.Search")); //$NON-NLS-1$ + searchThisButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchThis")); //$NON-NLS-1$ + searchThisButton.setEnabled(!running); + searchNextButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchNext")); //$NON-NLS-1$ + searchNextButton.setEnabled(!running); + } + + // set label sizes + FontRenderContext frc = new FontRenderContext(null, false, false); + Font font = frameLabel.getFont(); + int w = 0; + Rectangle2D rect = font.getStringBounds(searchLabel.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+4); + rect = font.getStringBounds(frameLabel.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+4); + rect = font.getStringBounds(templateLabel.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+4); + rect = font.getStringBounds(targetLabel.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+4); + Dimension labelSize = new Dimension(w, 20); + frameLabel.setPreferredSize(labelSize); + templateLabel.setPreferredSize(labelSize); + searchLabel.setPreferredSize(labelSize); + targetLabel.setPreferredSize(labelSize); + } + }; + if (SwingUtilities.isEventDispatchThread()) runner.run(); + else SwingUtilities.invokeLater(runner); + } + + /** + * Refreshes the buttons and layout. + */ + protected void refreshButtons() { + Runnable runner = new Runnable() { + public void run() { + int n = trackerPanel.getFrameNumber(); + FrameData frame = getFrame(n); + + // enable the search buttons + int code = getStatusCode(n); + KeyFrame keyFrame = frame.getKeyFrame(); + boolean initialized = keyFrame!=null && track!=null; + boolean notStepping = paused || !stepping; + boolean stable = frame.searched && !frame.newTemplateExists(); + boolean canSearchThis = !stable || code==5 || (changed&&code!=0) || (frame==keyFrame && frame.getMarkedPoint()==null); + startButton.setEnabled(initialized); + searchThisButton.setEnabled(initialized && notStepping && canSearchThis); + searchNextButton.setEnabled(initialized && canStep() && notStepping); + + // refresh template image labels and panel + if (templateImageLabel.getIcon()==null && matchImageLabel.getIcon()==null) { + templateImageLabel.setText(TrackerRes.getString("AutoTracker.Label.NoTemplate")); //$NON-NLS-1$ + matchImageLabel.setText(null); + imageToolbar.setPreferredSize(templateToolbar.getPreferredSize()); + templateImageLabel.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0)); + } + else { + imageToolbar.setPreferredSize(null); + templateImageLabel.setBorder(null); + } + + // refresh the delete and keyframe buttons + boolean deleteButtonEnabled = track!=null; + if (deleteButtonEnabled) { + boolean isAlwaysMarked = track.steps.isAutofill() || track instanceof CoordAxes; + if (isAlwaysMarked) { + boolean hasFrameData = false; + Map frameData = getFrameData(); + for (Integer i: frameData.keySet()) { + FrameData next = frameData.get(i); + if (next.trackPoint!=null) { + hasFrameData = true; + break; + } + } + deleteButtonEnabled = hasFrameData || frame==keyFrame; + } + else { + deleteButtonEnabled = frame==keyFrame || !track.isEmpty(); + } + } + + deleteButton.setEnabled(deleteButtonEnabled); + keyFrameButton.setEnabled(keyFrame!=null); + + // rebuild followup panel + followupPanel.removeAll(); + if (code==2 || code==8) { // possible match + acceptButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Accept")); //$NON-NLS-1$ + followupPanel.add(acceptButton); + } + if (code==2 || code==3 || code==4 || code==8 || code==9) { // searched but not automarked + skipButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.Skip")); //$NON-NLS-1$ + followupPanel.add(skipButton); + } + repaint(); + } + }; + if (SwingUtilities.isEventDispatchThread()) runner.run(); + else SwingUtilities.invokeLater(runner); + } + + /** + * Refreshes the drawing flags. + */ + protected void refreshDrawingFlags() { + // refresh drawing flags + if (mouseOverObj==templateToolbar || mouseOverObj==imageToolbar) { + // show mask and search + maskVisible = true; + targetVisible = searchVisible = false; + } + else if (mouseOverObj==targetToolbar) { + // show target + targetVisible = true; + searchVisible = maskVisible = false; + } + else if (mouseOverObj==searchToolbar) { + // show searchRect and mask + searchVisible = true; + targetVisible = maskVisible = false; + } + else { + searchVisible = targetVisible = maskVisible = true; + } + } + + /** + * Refreshes the visible components of this wizard. + */ + protected void refreshGUI() { + if (track!=null && this.isVisible()) + track.setMarkByDefault(false); + Runnable runner = new Runnable() { + public void run() { + refreshDropdowns(); + refreshStrings(); + refreshIcons(); + refreshButtons(); + refreshInfo(); + refreshDrawingFlags(); + pack(); + if (textPaneSize==null) + refreshTextPaneSize(); + } + }; + if (SwingUtilities.isEventDispatchThread()) runner.run(); + else SwingUtilities.invokeLater(runner); + } + + /** + * Refreshes the dropdown lists. + */ + protected void refreshDropdowns() { + // refresh trackDropdown + Object toSelect = null; + trackDropdown.setName("refresh"); //$NON-NLS-1$ + trackDropdown.removeAllItems(); + for (TTrack next: trackerPanel.getTracks()) { + if (!next.isAutoTrackable()) continue; + Icon icon = next.getFootprint().getIcon(21, 16); + Object[] item = new Object[] {icon, next.getName()}; + trackDropdown.addItem(item); + if (next==track) { + toSelect = item; + } + } + if (track==null) { + Object[] emptyItem = new Object[] {null, " "}; //$NON-NLS-1$ + trackDropdown.insertItemAt(emptyItem, 0); + toSelect = emptyItem; + } + // select desired item + if (toSelect!=null) { + trackDropdown.setSelectedItem(toSelect); + } + trackDropdown.setName(null); + + // refresh pointDropdown + toSelect = null; + pointDropdown.setName("refresh"); //$NON-NLS-1$ + pointDropdown.removeAllItems(); + if (track!=null) { + int target = track.getTargetIndex(); + toSelect = track.getTargetDescription(target); + for (int i = 0; i=0) + buf.append(TrackerRes.getString("AutoTracker.Info.SearchOnAxis")); //$NON-NLS-1$ + else + buf.append(TrackerRes.getString("AutoTracker.Info.Search")); //$NON-NLS-1$ + buf.append("\n\n"); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Title.Settings")); //$NON-NLS-1$ + buf.append(": "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Search.Instructions")); //$NON-NLS-1$ + buf.append("\n\n"); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Title.Tip")); //$NON-NLS-1$ + buf.append(": "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Search.Tip")); //$NON-NLS-1$ + return buf.toString(); + } + + /** + * Returns the target instructions. + * + * @return the instructions + */ + protected String getTargetInstructions() { + StringBuffer buf = new StringBuffer(); + buf.append(TrackerRes.getString("AutoTracker.Info.Target")); //$NON-NLS-1$ + buf.append("\n\n"); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Title.Settings")); //$NON-NLS-1$ + buf.append(": "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Target.Instructions")); //$NON-NLS-1$ + return buf.toString(); + } + + /** + * Returns the status text for a given frame number and status code. + * + * @param code the status code (integer 0-9) + * @param n the frame number + * @param peakWidthAndHeight the match data + * @return the status text + */ + protected String getStatusInfo(int code, int n, double[] peakWidthAndHeight) { + StringBuffer buf = new StringBuffer(); + buf.append(TrackerRes.getString("AutoTracker.Info.Frame")+" "+n); //$NON-NLS-1$ //$NON-NLS-2$ + switch(code) { + case 0: // keyframe + textPane.setForeground(Color.blue); + buf.append(" ("); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame").toLowerCase()); //$NON-NLS-1$ + buf.append("): "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame.Instructions1")); //$NON-NLS-1$ + buf.append("\n\n"); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.KeyFrame.Instructions2")); //$NON-NLS-1$ + buf.append(" "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.MouseOver.Instructions")); //$NON-NLS-1$ + break; + case 1: // good match was found and marked + textPane.setForeground(Color.green.darker()); + buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(TrackerRes.getString("AutoTracker.Info.Match")); //$NON-NLS-1$ + break; + case 2: // possible match was found, not marked + textPane.setForeground(Color.red); + buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ + if (lineSpread>=0) { + buf.append(TrackerRes.getString("AutoTracker.Info.PossibleOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Accept")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + buf.append(TrackerRes.getString("AutoTracker.Info.Possible")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Accept")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ + if (canStep()) + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 3: // no match was found + textPane.setForeground(Color.red); + buf.append(": "); //$NON-NLS-1$ + if (lineSpread>=0) { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ + if (canStep()) + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 4: // searchRect failed (no video image or x-axis inside) + textPane.setForeground(Color.red); + buf.append(": "); //$NON-NLS-1$ + if (lineSpread>=0) { // 1D tracking + buf.append(TrackerRes.getString("AutoTracker.Info.OutsideXAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { // 2D tracking + buf.append(TrackerRes.getString("AutoTracker.Info.Outside")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Mark")); //$NON-NLS-1$ //$NON-NLS-2$ + if (canStep()) + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Skip")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 5: // target marked manually + textPane.setForeground(Color.blue); + buf.append(": "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.MarkedByUser")); //$NON-NLS-1$ + break; + case 6: // match accepted + textPane.setForeground(Color.green.darker()); + buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(TrackerRes.getString("AutoTracker.Info.Accepted")); //$NON-NLS-1$ + break; + case 7: // not searched or marked + textPane.setForeground(Color.blue); + buf.append(" ("); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Unsearched")); //$NON-NLS-1$ + buf.append("): "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.Instructions")); //$NON-NLS-1$ + buf.append(" "); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.GetStarted")); //$NON-NLS-1$ + buf.append("\n\n"); //$NON-NLS-1$ + buf.append(TrackerRes.getString("AutoTracker.Info.MouseOver.Instructions")); //$NON-NLS-1$ + break; + case 8: // possible match found, existing mark or calibration tool + textPane.setForeground(Color.blue); + buf.append(" ("+TrackerRes.getString("AutoTracker.Info.MatchScore")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append(" "+format.format(peakWidthAndHeight[1])+"): "); //$NON-NLS-1$ //$NON-NLS-2$ + if (lineSpread>=0) { + buf.append(TrackerRes.getString("AutoTracker.Info.PossibleReplace")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Replace")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + buf.append(TrackerRes.getString("AutoTracker.Info.PossibleReplace")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Replace")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 9: // no match found, existing mark or calibration tool + textPane.setForeground(Color.red); + buf.append(": "); //$NON-NLS-1$ + if (lineSpread>=0) { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + if (canStep()) + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + case 10: // no match found, already marked + textPane.setForeground(Color.red); + buf.append(": "); //$NON-NLS-1$ + if (lineSpread>=0) { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatchOnAxis")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.RetryOnAxis")); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + buf.append(TrackerRes.getString("AutoTracker.Info.NoMatch")+"\n"); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Retry")); //$NON-NLS-1$ //$NON-NLS-2$ + } + if (canStep()) + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.Keep")); //$NON-NLS-1$ //$NON-NLS-2$ + buf.append("\n"+TrackerRes.getString("AutoTracker.Info.NewKeyFrame")); //$NON-NLS-1$ //$NON-NLS-2$ + break; + } + return buf.toString(); + } + + } + + /** + * Spinner with same preferred height as another component. + */ + class TallSpinner extends JSpinner { + Component comp; + TallSpinner(SpinnerModel model, Component heightComponent) { + super(model); + comp = heightComponent; + } + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height=comp.getPreferredSize().height; + return dim; + } + } + + /** + * Spinner model to continuously cycle through all choices + */ + static class SpinnerTumbleModel extends SpinnerListModel { + SpinnerTumbleModel(ArrayList values) { + super(values); + } + public Object getNextValue() { + Object value = super.getNextValue(); + if((value==null)&&(getList().size()>0)) { + value = getList().get(0); + } + return value; + } + public Object getPreviousValue() { + Object value = super.getPreviousValue(); + int n = getList().size(); + if((value==null)&&(n>0)) { + value = getList().get(n-1); + } + return value; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java b/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java index 2385aa62..912efbef 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java @@ -1,422 +1,422 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ - -package org.opensourcephysics.cabrillo.tracker; - -import java.util.Arrays; -import java.util.Comparator; - -/** - * This implements an algorithm for estimating both the first and second - * derivatives (in 2 dimensions) from a sequence of uniformly spaced samples. - * - * This assumes there may be spikes in the second derivative ("bounces"), - * causing steps in the first derivative. - * - * The returned result of evaluate is - * result[0] = xDeriv1 (double[]) - * result[1] = yDeriv1 (double[]) - * result[2] = xDeriv2 (double[]) - * result[3] = yDeriv2 (double[]) - * - * Mon Oct 31 15:29:48 PDT 2011 Kevin Karplus - * - * @author Kevin Karplus - */ -public class BounceDerivatives implements Derivative -{ - // window_size is the number of data points used for fitting a model - private int window_size; - - // degree is the complexity of the polynomial model - private final int degree=2; // constant acceleration model - - // a simple polynomial model - private BounceModel poly_model; - - // model that tries to fit both the time and size of the step - private BounceModel step_model; - - - /** - * Evaluates two derivatives - * at count points (start, start+index_step, ...) - * (with t=0 at subscript start and t=1 at subscript start+index_step) - * The returned arrays are the same length and use the same subscripts as the input arrays. - * - * Input data: - * data[0] = parameters (int[] {spill, start, stepsize, count}) - * data[1] = xData (double[]) - * data[2] = yData (double[]) - * data[3] = validData (boolean[]) - * - * Returned result: - * result[0] = xDeriv1 (double[]) - * result[1] = yDeriv1 (double[]) - * result[2] = xDeriv2 (double[]) - * result[3] = yDeriv2 (double[]) - * - * @param data the input data - * @return Object array containing the result - */ - public Object[] evaluate(Object[] data) - { - int[] params = (int[])data[0]; - window_size = 1+params[0]*2; - int start = params[1]; - int index_step = params[2]; - int count = params[3]; - double[] x = (double[])data[1]; - double[] y = (double[])data[2]; - boolean[] validData = (boolean[])data[3]; - - int length=x.length; - assert(x.length==y.length); - - double[] xDeriv1, yDeriv1, xDeriv2, yDeriv2; - - double[][] result = new double[4][]; - - result[0] = xDeriv1 =new double[length]; - result[1] = yDeriv1 =new double[length]; - result[2] = xDeriv2 =new double[length]; - result[3] = yDeriv2 =new double[length]; - - for (int n = 0; n < length; n++) - { // mark all the outputs as invalid - xDeriv1[n] = yDeriv1[n] = Double.NaN; - xDeriv2[n] = yDeriv2[n] = Double.NaN; - - // make sure that the input data arrays are marked with NaNs - if (!validData[n]) - { x[n] = y[n] = Double.NaN; - } - } - - if (start>=length) - { // this was a dummy call, probably with initial (empty) data arrays - return result; - } - - // reset count so indexing does not run over - count = Math.min(count, (length-start)/index_step); - -// System.out.format("DEBUG: start=%d, index_step=%d, count=%d, length=%d\n", -// start, index_step, count, length); - assert (start>=0); - assert (start0); - - poly_model = new BounceModel(window_size, degree, 0); - BounceParameters[] poly_fit=new BounceParameters[count]; - // poly_fit[c] are the parameters for polynomial fitted for a window around cth time step - - step_model = new BounceModel(window_size, degree, Double.NaN); - BounceParameters[] step_fit=new BounceParameters[count]; - // step_fit[c] are the parameters for model with unspecified step fit - // They are initially created for windows looking for steps around each c value, - // but are later sorted into - - - int[] c_at = new int[count]; - // c_at[i] is the position of c in the window for the model fitted around cth time step - - // fit models at each step - fit_models: - for(int c=0; c=0; in_w--) - { int index=i + index_step*(in_w-c_at[c]); - if (index<0 || index>=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) - { highest_bad_index = in_w; - break; - } - } -// System.out.format("DEBUG: At %d, highest_bad=%d, that is step %d\n", i, highest_bad_index, i-c_at[c]+highest_bad_index); - if (highest_bad_index>=0) - { // The default window won't work. - // We need to try shifting the window. - - int lowest_bad_index=window_size; - for (int in_w=0; in_w=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) - { lowest_bad_index = in_w; - break; - } - } - - // We either want to move the window up so it starts after highest_bad_index - // (subtracting highest_bad_index+1 from c_at[c]) - // or move the window down so it ends before lowest_bad_index, - // (subtracting lowest_bad_index-window_size from c_at[c]) - // whichever is closest - - int move_up = highest_bad_index+1; - int move_down = window_size-lowest_bad_index; - c_at[c] -= (move_up<=move_down)? move_up: (0-move_down); - - for (int in_w=window_size-1; in_w>=0; in_w--) - { int index=i + index_step*(in_w-c_at[c]); - if (index<0 || index>=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) - { -// System.out.format("DEBUG: At %d, no window\n", i); - continue fit_models; // moved window also failed - } - } - - } - -// System.out.format("DEBUG: At %d, window is %d to %d\n", i, i-c_at[c], i-c_at[c]+window_size-1); - - poly_fit[c] = poly_model.fit_xy(x,y, i-c_at[c]*index_step, index_step); - step_fit[c] = step_model.fit_xy(x,y, i-c_at[c]*index_step, index_step); - -//DEBUG -// if (step_fit[c] != null) -// { System.out.format("DEBUG: frame %d, step at %.3f, saves %.4g = %.2f%%\n", -// i, i+index_step*(step_fit[c].getStepAt()-c_at[c]), poly_fit[c].getError()-step_fit[c].getError(), -// 100.*(poly_fit[c].getError()-step_fit[c].getError())/ poly_fit[c].getError()); -// } -//END DEBUG - - } - -//DEBUG -// System.out.format("DEBUG: possible step times (skipping 0s):\n"); -// for(int c=0; c= count) continue; - if (! (0<=c_wind && c_wind() - { public int compare(final Integer o1, final Integer o2) - { return Double.compare(step_value[o2],step_value[o1]); - } - }); - - -//DEBUG -// System.out.format("DEBUG: steps by decreasing value:\n"); -// for(int loc=0; loc=length) continue; // out of range - if (c_step_time <= c_wind-c_at[c_wind]) - continue; // step before window for c_wind - if (c_step_time >= c_wind-c_at[c_wind]+window_size-1) - continue; // step after window for c_wind - if (use_model[c_wind]!=null) continue; // already have a model here - if (null==poly_fit[c_wind]) continue; // no fit here -// double poly_err = poly_fit[c_wind].getError(); -//DEBUG -// System.out.format("DEBUG: refitting, window starting at %d stepping %d, step_in_wind at %.3f\n", -// i_wind-c_at[c_wind]*index_step, index_step, -// c_step_time-c_wind+c_at[c_wind]); -//END DEBUG - BounceParameters refit = - poly_model.fit_xy(x,y, i_wind-c_at[c_wind]*index_step, index_step, - c_step_time-c_wind+c_at[c_wind], step_size); -// double step_err = refit.getError(); - use_model[c_wind] = refit; - } - - } - - apply_models: - for(int c=0; c + * + * For additional Tracker information and documentation, please see + * . + */ + +package org.opensourcephysics.cabrillo.tracker; + +import java.util.Arrays; +import java.util.Comparator; + +/** + * This implements an algorithm for estimating both the first and second + * derivatives (in 2 dimensions) from a sequence of uniformly spaced samples. + * + * This assumes there may be spikes in the second derivative ("bounces"), + * causing steps in the first derivative. + * + * The returned result of evaluate is + * result[0] = xDeriv1 (double[]) + * result[1] = yDeriv1 (double[]) + * result[2] = xDeriv2 (double[]) + * result[3] = yDeriv2 (double[]) + * + * Mon Oct 31 15:29:48 PDT 2011 Kevin Karplus + * + * @author Kevin Karplus + */ +public class BounceDerivatives implements Derivative +{ + // window_size is the number of data points used for fitting a model + private int window_size; + + // degree is the complexity of the polynomial model + private final int degree=2; // constant acceleration model + + // a simple polynomial model + private BounceModel poly_model; + + // model that tries to fit both the time and size of the step + private BounceModel step_model; + + + /** + * Evaluates two derivatives + * at count points (start, start+index_step, ...) + * (with t=0 at subscript start and t=1 at subscript start+index_step) + * The returned arrays are the same length and use the same subscripts as the input arrays. + * + * Input data: + * data[0] = parameters (int[] {spill, start, stepsize, count}) + * data[1] = xData (double[]) + * data[2] = yData (double[]) + * data[3] = validData (boolean[]) + * + * Returned result: + * result[0] = xDeriv1 (double[]) + * result[1] = yDeriv1 (double[]) + * result[2] = xDeriv2 (double[]) + * result[3] = yDeriv2 (double[]) + * + * @param data the input data + * @return Object array containing the result + */ + public Object[] evaluate(Object[] data) + { + int[] params = (int[])data[0]; + window_size = 1+params[0]*2; + int start = params[1]; + int index_step = params[2]; + int count = params[3]; + double[] x = (double[])data[1]; + double[] y = (double[])data[2]; + boolean[] validData = (boolean[])data[3]; + + int length=x.length; + assert(x.length==y.length); + + double[] xDeriv1, yDeriv1, xDeriv2, yDeriv2; + + double[][] result = new double[4][]; + + result[0] = xDeriv1 =new double[length]; + result[1] = yDeriv1 =new double[length]; + result[2] = xDeriv2 =new double[length]; + result[3] = yDeriv2 =new double[length]; + + for (int n = 0; n < length; n++) + { // mark all the outputs as invalid + xDeriv1[n] = yDeriv1[n] = Double.NaN; + xDeriv2[n] = yDeriv2[n] = Double.NaN; + + // make sure that the input data arrays are marked with NaNs + if (!validData[n]) + { x[n] = y[n] = Double.NaN; + } + } + + if (start>=length) + { // this was a dummy call, probably with initial (empty) data arrays + return result; + } + + // reset count so indexing does not run over + count = Math.min(count, (length-start)/index_step); + +// System.out.format("DEBUG: start=%d, index_step=%d, count=%d, length=%d\n", +// start, index_step, count, length); + assert (start>=0); + assert (start0); + + poly_model = new BounceModel(window_size, degree, 0); + BounceParameters[] poly_fit=new BounceParameters[count]; + // poly_fit[c] are the parameters for polynomial fitted for a window around cth time step + + step_model = new BounceModel(window_size, degree, Double.NaN); + BounceParameters[] step_fit=new BounceParameters[count]; + // step_fit[c] are the parameters for model with unspecified step fit + // They are initially created for windows looking for steps around each c value, + // but are later sorted into + + + int[] c_at = new int[count]; + // c_at[i] is the position of c in the window for the model fitted around cth time step + + // fit models at each step + fit_models: + for(int c=0; c=0; in_w--) + { int index=i + index_step*(in_w-c_at[c]); + if (index<0 || index>=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) + { highest_bad_index = in_w; + break; + } + } +// System.out.format("DEBUG: At %d, highest_bad=%d, that is step %d\n", i, highest_bad_index, i-c_at[c]+highest_bad_index); + if (highest_bad_index>=0) + { // The default window won't work. + // We need to try shifting the window. + + int lowest_bad_index=window_size; + for (int in_w=0; in_w=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) + { lowest_bad_index = in_w; + break; + } + } + + // We either want to move the window up so it starts after highest_bad_index + // (subtracting highest_bad_index+1 from c_at[c]) + // or move the window down so it ends before lowest_bad_index, + // (subtracting lowest_bad_index-window_size from c_at[c]) + // whichever is closest + + int move_up = highest_bad_index+1; + int move_down = window_size-lowest_bad_index; + c_at[c] -= (move_up<=move_down)? move_up: (0-move_down); + + for (int in_w=window_size-1; in_w>=0; in_w--) + { int index=i + index_step*(in_w-c_at[c]); + if (index<0 || index>=length || Double.isNaN(x[index]) || Double.isNaN(y[index])) + { +// System.out.format("DEBUG: At %d, no window\n", i); + continue fit_models; // moved window also failed + } + } + + } + +// System.out.format("DEBUG: At %d, window is %d to %d\n", i, i-c_at[c], i-c_at[c]+window_size-1); + + poly_fit[c] = poly_model.fit_xy(x,y, i-c_at[c]*index_step, index_step); + step_fit[c] = step_model.fit_xy(x,y, i-c_at[c]*index_step, index_step); + +//DEBUG +// if (step_fit[c] != null) +// { System.out.format("DEBUG: frame %d, step at %.3f, saves %.4g = %.2f%%\n", +// i, i+index_step*(step_fit[c].getStepAt()-c_at[c]), poly_fit[c].getError()-step_fit[c].getError(), +// 100.*(poly_fit[c].getError()-step_fit[c].getError())/ poly_fit[c].getError()); +// } +//END DEBUG + + } + +//DEBUG +// System.out.format("DEBUG: possible step times (skipping 0s):\n"); +// for(int c=0; c= count) continue; + if (! (0<=c_wind && c_wind() + { public int compare(final Integer o1, final Integer o2) + { return Double.compare(step_value[o2],step_value[o1]); + } + }); + + +//DEBUG +// System.out.format("DEBUG: steps by decreasing value:\n"); +// for(int loc=0; loc=length) continue; // out of range + if (c_step_time <= c_wind-c_at[c_wind]) + continue; // step before window for c_wind + if (c_step_time >= c_wind-c_at[c_wind]+window_size-1) + continue; // step after window for c_wind + if (use_model[c_wind]!=null) continue; // already have a model here + if (null==poly_fit[c_wind]) continue; // no fit here +// double poly_err = poly_fit[c_wind].getError(); +//DEBUG +// System.out.format("DEBUG: refitting, window starting at %d stepping %d, step_in_wind at %.3f\n", +// i_wind-c_at[c_wind]*index_step, index_step, +// c_step_time-c_wind+c_at[c_wind]); +//END DEBUG + BounceParameters refit = + poly_model.fit_xy(x,y, i_wind-c_at[c_wind]*index_step, index_step, + c_step_time-c_wind+c_at[c_wind], step_size); +// double step_err = refit.getError(); + use_model[c_wind] = refit; + } + + } + + apply_models: + for(int c=0; c - * - * For additional Tracker information and documentation, please see - * . - */ - -package org.opensourcephysics.cabrillo.tracker; - -/** - * A subset of methods from the Jama Matrix class used for the BounceModel. - * This incorporates the LUDecomposition and QRDecomposition classes as static - * inner classes. - * Almost all javadoc and other comments have been removed for compactness. - * - * The entire JAMA matrix package including full documentation is available from - * http://math.nist.gov/javanumerics/jama - * - * @author The MathWorks, Inc. and the National Institute of Standards and Technology. - * @author Doug Brown (this file) - * @version 5 August 1998 (Jama), 12 Jan 2012 (this file) -*/ - @SuppressWarnings("javadoc") -public class BounceMatrix { - - private double[][] A; - private int m, n; - - public BounceMatrix (int m, int n) { - this.m = m; - this.n = n; - A = new double[m][n]; - } - - public BounceMatrix (double[][] A) { - m = A.length; - n = A[0].length; - for (int i = 0; i < m; i++) { - if (A[i].length != n) { - throw new IllegalArgumentException("All rows must have the same length."); //$NON-NLS-1$ - } - } - this.A = A; - } - - public BounceMatrix (double[][] A, int m, int n) { - this.A = A; - this.m = m; - this.n = n; - } - - public double[][] getArray () { - return A; - } - - public double[][] getArrayCopy () { - double[][] C = new double[m][n]; - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - C[i][j] = A[i][j]; - } - } - return C; - } - - public int getRowDimension () { - return m; - } - - public int getColumnDimension () { - return n; - } - - public double get (int i, int j) { - return A[i][j]; - } - - public BounceMatrix getMatrix (int i0, int i1, int j0, int j1) { - BounceMatrix X = new BounceMatrix(i1-i0+1,j1-j0+1); - double[][] B = X.getArray(); - try { - for (int i = i0; i <= i1; i++) { - for (int j = j0; j <= j1; j++) { - B[i-i0][j-j0] = A[i][j]; - } - } - } catch(ArrayIndexOutOfBoundsException e) { - throw new ArrayIndexOutOfBoundsException("Submatrix indices"); //$NON-NLS-1$ - } - return X; - } - - public BounceMatrix getMatrix (int[] r, int j0, int j1) { - BounceMatrix X = new BounceMatrix(r.length,j1-j0+1); - double[][] B = X.getArray(); - try { - for (int i = 0; i < r.length; i++) { - for (int j = j0; j <= j1; j++) { - B[i][j-j0] = A[r[i]][j]; - } - } - } catch(ArrayIndexOutOfBoundsException e) { - throw new ArrayIndexOutOfBoundsException("Submatrix indices"); //$NON-NLS-1$ - } - return X; - } - - public BounceMatrix minus (BounceMatrix B) { - if (B.m != m || B.n != n) { - throw new IllegalArgumentException("Matrix dimensions must agree."); //$NON-NLS-1$ - } - BounceMatrix X = new BounceMatrix(m,n); - double[][] C = X.getArray(); - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - C[i][j] = A[i][j] - B.A[i][j]; - } - } - return X; - } - - public BounceMatrix times (BounceMatrix B) { - if (B.m != n) { - throw new IllegalArgumentException("Matrix inner dimensions must agree."); //$NON-NLS-1$ - } - BounceMatrix X = new BounceMatrix(m,B.n); - double[][] C = X.getArray(); - double[] Bcolj = new double[n]; - for (int j = 0; j < B.n; j++) { - for (int k = 0; k < n; k++) { - Bcolj[k] = B.A[k][j]; - } - for (int i = 0; i < m; i++) { - double[] Arowi = A[i]; - double s = 0; - for (int k = 0; k < n; k++) { - s += Arowi[k]*Bcolj[k]; - } - C[i][j] = s; - } - } - return X; - } - - public BounceMatrix solve (BounceMatrix B) { - return (m == n ? (new LUDecomposition(this)).solve(B) : - (new QRDecomposition(this)).solve(B)); - } - - public BounceMatrix inverse () { - return solve(identity(m,m)); - } - - public static BounceMatrix identity (int m, int n) { - BounceMatrix A = new BounceMatrix(m,n); - double[][] X = A.getArray(); - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - X[i][j] = (i == j ? 1.0 : 0.0); - } - } - return A; - } - -//_______________________ LUDecomposition class __________________________ - - static class LUDecomposition { - - private double[][] LU; - private int m, n, pivsign; - private int[] piv; - - public LUDecomposition (BounceMatrix A) { - - LU = A.getArrayCopy(); - m = A.getRowDimension(); - n = A.getColumnDimension(); - piv = new int[m]; - for (int i = 0; i < m; i++) { - piv[i] = i; - } - pivsign = 1; - double[] LUrowi; - double[] LUcolj = new double[m]; - - for (int j = 0; j < n; j++) { - - for (int i = 0; i < m; i++) { - LUcolj[i] = LU[i][j]; - } - - for (int i = 0; i < m; i++) { - LUrowi = LU[i]; - int kmax = Math.min(i,j); - double s = 0.0; - for (int k = 0; k < kmax; k++) { - s += LUrowi[k]*LUcolj[k]; - } - LUrowi[j] = LUcolj[i] -= s; - } - - int p = j; - for (int i = j+1; i < m; i++) { - if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) { - p = i; - } - } - if (p != j) { - for (int k = 0; k < n; k++) { - double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t; - } - int k = piv[p]; piv[p] = piv[j]; piv[j] = k; - pivsign = -pivsign; - } - - if (j < m & LU[j][j] != 0.0) { - for (int i = j+1; i < m; i++) { - LU[i][j] /= LU[j][j]; - } - } - } - } - - public boolean isNonsingular () { - for (int j = 0; j < n; j++) { - if (LU[j][j] == 0) - return false; - } - return true; - } - - public BounceMatrix solve (BounceMatrix B) { - if (B.getRowDimension() != m) { - throw new IllegalArgumentException("Matrix row dimensions must agree."); //$NON-NLS-1$ - } - if (!this.isNonsingular()) { - throw new RuntimeException("Matrix is singular."); //$NON-NLS-1$ - } - // Copy right hand side with pivoting - int nx = B.getColumnDimension(); - BounceMatrix Xmat = B.getMatrix(piv,0,nx-1); - double[][] X = Xmat.getArray(); - - // Solve L*Y = B(piv,:) - for (int k = 0; k < n; k++) { - for (int i = k+1; i < n; i++) { - for (int j = 0; j < nx; j++) { - X[i][j] -= X[k][j]*LU[i][k]; - } - } - } - // Solve U*X = Y; - for (int k = n-1; k >= 0; k--) { - for (int j = 0; j < nx; j++) { - X[k][j] /= LU[k][k]; - } - for (int i = 0; i < k; i++) { - for (int j = 0; j < nx; j++) { - X[i][j] -= X[k][j]*LU[i][k]; - } - } - } - return Xmat; - } - } - -//_________________________ QRDecomposition class __________________________ - - static class QRDecomposition { - - private double[][] QR; - private int m, n; - private double[] Rdiag; - - public QRDecomposition (BounceMatrix A) { - QR = A.getArrayCopy(); - m = A.getRowDimension(); - n = A.getColumnDimension(); - Rdiag = new double[n]; - - for (int k = 0; k < n; k++) { - // Compute 2-norm of k-th column without under/overflow. - double nrm = 0; - for (int i = k; i < m; i++) { - nrm = hypot(nrm,QR[i][k]); - } - - if (nrm != 0.0) { - // Form k-th Householder vector. - if (QR[k][k] < 0) { - nrm = -nrm; - } - for (int i = k; i < m; i++) { - QR[i][k] /= nrm; - } - QR[k][k] += 1.0; - - // Apply transformation to remaining columns. - for (int j = k+1; j < n; j++) { - double s = 0.0; - for (int i = k; i < m; i++) { - s += QR[i][k]*QR[i][j]; - } - s = -s/QR[k][k]; - for (int i = k; i < m; i++) { - QR[i][j] += s*QR[i][k]; - } - } - } - Rdiag[k] = -nrm; - } - } - - public boolean isFullRank () { - for (int j = 0; j < n; j++) { - if (Rdiag[j] == 0) - return false; - } - return true; - } - - public BounceMatrix solve (BounceMatrix B) { - if (B.getRowDimension() != m) { - throw new IllegalArgumentException("Matrix row dimensions must agree."); //$NON-NLS-1$ - } - if (!this.isFullRank()) { - throw new RuntimeException("Matrix is rank deficient."); //$NON-NLS-1$ - } - - // Copy right hand side - int nx = B.getColumnDimension(); - double[][] X = B.getArrayCopy(); - - // Compute Y = transpose(Q)*B - for (int k = 0; k < n; k++) { - for (int j = 0; j < nx; j++) { - double s = 0.0; - for (int i = k; i < m; i++) { - s += QR[i][k]*X[i][j]; - } - s = -s/QR[k][k]; - for (int i = k; i < m; i++) { - X[i][j] += s*QR[i][k]; - } - } - } - // Solve R*X = Y; - for (int k = n-1; k >= 0; k--) { - for (int j = 0; j < nx; j++) { - X[k][j] /= Rdiag[k]; - } - for (int i = 0; i < k; i++) { - for (int j = 0; j < nx; j++) { - X[i][j] -= X[k][j]*QR[i][k]; - } - } - } - return (new BounceMatrix(X,n,nx).getMatrix(0,n-1,0,nx-1)); - } - - public double hypot(double a, double b) { - double r; - if (Math.abs(a) > Math.abs(b)) { - r = b/a; - r = Math.abs(a)*Math.sqrt(1+r*r); - } - else if (b != 0) { - r = a/b; - r = Math.abs(b)*Math.sqrt(1+r*r); - } - else { - r = 0.0; - } - return r; - } - - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ + +package org.opensourcephysics.cabrillo.tracker; + +/** + * A subset of methods from the Jama Matrix class used for the BounceModel. + * This incorporates the LUDecomposition and QRDecomposition classes as static + * inner classes. + * Almost all javadoc and other comments have been removed for compactness. + * + * The entire JAMA matrix package including full documentation is available from + * http://math.nist.gov/javanumerics/jama + * + * @author The MathWorks, Inc. and the National Institute of Standards and Technology. + * @author Doug Brown (this file) + * @version 5 August 1998 (Jama), 12 Jan 2012 (this file) +*/ + @SuppressWarnings("javadoc") +public class BounceMatrix { + + private double[][] A; + private int m, n; + + public BounceMatrix (int m, int n) { + this.m = m; + this.n = n; + A = new double[m][n]; + } + + public BounceMatrix (double[][] A) { + m = A.length; + n = A[0].length; + for (int i = 0; i < m; i++) { + if (A[i].length != n) { + throw new IllegalArgumentException("All rows must have the same length."); //$NON-NLS-1$ + } + } + this.A = A; + } + + public BounceMatrix (double[][] A, int m, int n) { + this.A = A; + this.m = m; + this.n = n; + } + + public double[][] getArray () { + return A; + } + + public double[][] getArrayCopy () { + double[][] C = new double[m][n]; + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + C[i][j] = A[i][j]; + } + } + return C; + } + + public int getRowDimension () { + return m; + } + + public int getColumnDimension () { + return n; + } + + public double get (int i, int j) { + return A[i][j]; + } + + public BounceMatrix getMatrix (int i0, int i1, int j0, int j1) { + BounceMatrix X = new BounceMatrix(i1-i0+1,j1-j0+1); + double[][] B = X.getArray(); + try { + for (int i = i0; i <= i1; i++) { + for (int j = j0; j <= j1; j++) { + B[i-i0][j-j0] = A[i][j]; + } + } + } catch(ArrayIndexOutOfBoundsException e) { + throw new ArrayIndexOutOfBoundsException("Submatrix indices"); //$NON-NLS-1$ + } + return X; + } + + public BounceMatrix getMatrix (int[] r, int j0, int j1) { + BounceMatrix X = new BounceMatrix(r.length,j1-j0+1); + double[][] B = X.getArray(); + try { + for (int i = 0; i < r.length; i++) { + for (int j = j0; j <= j1; j++) { + B[i][j-j0] = A[r[i]][j]; + } + } + } catch(ArrayIndexOutOfBoundsException e) { + throw new ArrayIndexOutOfBoundsException("Submatrix indices"); //$NON-NLS-1$ + } + return X; + } + + public BounceMatrix minus (BounceMatrix B) { + if (B.m != m || B.n != n) { + throw new IllegalArgumentException("Matrix dimensions must agree."); //$NON-NLS-1$ + } + BounceMatrix X = new BounceMatrix(m,n); + double[][] C = X.getArray(); + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + C[i][j] = A[i][j] - B.A[i][j]; + } + } + return X; + } + + public BounceMatrix times (BounceMatrix B) { + if (B.m != n) { + throw new IllegalArgumentException("Matrix inner dimensions must agree."); //$NON-NLS-1$ + } + BounceMatrix X = new BounceMatrix(m,B.n); + double[][] C = X.getArray(); + double[] Bcolj = new double[n]; + for (int j = 0; j < B.n; j++) { + for (int k = 0; k < n; k++) { + Bcolj[k] = B.A[k][j]; + } + for (int i = 0; i < m; i++) { + double[] Arowi = A[i]; + double s = 0; + for (int k = 0; k < n; k++) { + s += Arowi[k]*Bcolj[k]; + } + C[i][j] = s; + } + } + return X; + } + + public BounceMatrix solve (BounceMatrix B) { + return (m == n ? (new LUDecomposition(this)).solve(B) : + (new QRDecomposition(this)).solve(B)); + } + + public BounceMatrix inverse () { + return solve(identity(m,m)); + } + + public static BounceMatrix identity (int m, int n) { + BounceMatrix A = new BounceMatrix(m,n); + double[][] X = A.getArray(); + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + X[i][j] = (i == j ? 1.0 : 0.0); + } + } + return A; + } + +//_______________________ LUDecomposition class __________________________ + + static class LUDecomposition { + + private double[][] LU; + private int m, n, pivsign; + private int[] piv; + + public LUDecomposition (BounceMatrix A) { + + LU = A.getArrayCopy(); + m = A.getRowDimension(); + n = A.getColumnDimension(); + piv = new int[m]; + for (int i = 0; i < m; i++) { + piv[i] = i; + } + pivsign = 1; + double[] LUrowi; + double[] LUcolj = new double[m]; + + for (int j = 0; j < n; j++) { + + for (int i = 0; i < m; i++) { + LUcolj[i] = LU[i][j]; + } + + for (int i = 0; i < m; i++) { + LUrowi = LU[i]; + int kmax = Math.min(i,j); + double s = 0.0; + for (int k = 0; k < kmax; k++) { + s += LUrowi[k]*LUcolj[k]; + } + LUrowi[j] = LUcolj[i] -= s; + } + + int p = j; + for (int i = j+1; i < m; i++) { + if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) { + p = i; + } + } + if (p != j) { + for (int k = 0; k < n; k++) { + double t = LU[p][k]; LU[p][k] = LU[j][k]; LU[j][k] = t; + } + int k = piv[p]; piv[p] = piv[j]; piv[j] = k; + pivsign = -pivsign; + } + + if (j < m & LU[j][j] != 0.0) { + for (int i = j+1; i < m; i++) { + LU[i][j] /= LU[j][j]; + } + } + } + } + + public boolean isNonsingular () { + for (int j = 0; j < n; j++) { + if (LU[j][j] == 0) + return false; + } + return true; + } + + public BounceMatrix solve (BounceMatrix B) { + if (B.getRowDimension() != m) { + throw new IllegalArgumentException("Matrix row dimensions must agree."); //$NON-NLS-1$ + } + if (!this.isNonsingular()) { + throw new RuntimeException("Matrix is singular."); //$NON-NLS-1$ + } + // Copy right hand side with pivoting + int nx = B.getColumnDimension(); + BounceMatrix Xmat = B.getMatrix(piv,0,nx-1); + double[][] X = Xmat.getArray(); + + // Solve L*Y = B(piv,:) + for (int k = 0; k < n; k++) { + for (int i = k+1; i < n; i++) { + for (int j = 0; j < nx; j++) { + X[i][j] -= X[k][j]*LU[i][k]; + } + } + } + // Solve U*X = Y; + for (int k = n-1; k >= 0; k--) { + for (int j = 0; j < nx; j++) { + X[k][j] /= LU[k][k]; + } + for (int i = 0; i < k; i++) { + for (int j = 0; j < nx; j++) { + X[i][j] -= X[k][j]*LU[i][k]; + } + } + } + return Xmat; + } + } + +//_________________________ QRDecomposition class __________________________ + + static class QRDecomposition { + + private double[][] QR; + private int m, n; + private double[] Rdiag; + + public QRDecomposition (BounceMatrix A) { + QR = A.getArrayCopy(); + m = A.getRowDimension(); + n = A.getColumnDimension(); + Rdiag = new double[n]; + + for (int k = 0; k < n; k++) { + // Compute 2-norm of k-th column without under/overflow. + double nrm = 0; + for (int i = k; i < m; i++) { + nrm = hypot(nrm,QR[i][k]); + } + + if (nrm != 0.0) { + // Form k-th Householder vector. + if (QR[k][k] < 0) { + nrm = -nrm; + } + for (int i = k; i < m; i++) { + QR[i][k] /= nrm; + } + QR[k][k] += 1.0; + + // Apply transformation to remaining columns. + for (int j = k+1; j < n; j++) { + double s = 0.0; + for (int i = k; i < m; i++) { + s += QR[i][k]*QR[i][j]; + } + s = -s/QR[k][k]; + for (int i = k; i < m; i++) { + QR[i][j] += s*QR[i][k]; + } + } + } + Rdiag[k] = -nrm; + } + } + + public boolean isFullRank () { + for (int j = 0; j < n; j++) { + if (Rdiag[j] == 0) + return false; + } + return true; + } + + public BounceMatrix solve (BounceMatrix B) { + if (B.getRowDimension() != m) { + throw new IllegalArgumentException("Matrix row dimensions must agree."); //$NON-NLS-1$ + } + if (!this.isFullRank()) { + throw new RuntimeException("Matrix is rank deficient."); //$NON-NLS-1$ + } + + // Copy right hand side + int nx = B.getColumnDimension(); + double[][] X = B.getArrayCopy(); + + // Compute Y = transpose(Q)*B + for (int k = 0; k < n; k++) { + for (int j = 0; j < nx; j++) { + double s = 0.0; + for (int i = k; i < m; i++) { + s += QR[i][k]*X[i][j]; + } + s = -s/QR[k][k]; + for (int i = k; i < m; i++) { + X[i][j] += s*QR[i][k]; + } + } + } + // Solve R*X = Y; + for (int k = n-1; k >= 0; k--) { + for (int j = 0; j < nx; j++) { + X[k][j] /= Rdiag[k]; + } + for (int i = 0; i < k; i++) { + for (int j = 0; j < nx; j++) { + X[i][j] -= X[k][j]*QR[i][k]; + } + } + } + return (new BounceMatrix(X,n,nx).getMatrix(0,n-1,0,nx-1)); + } + + public double hypot(double a, double b) { + double r; + if (Math.abs(a) > Math.abs(b)) { + r = b/a; + r = Math.abs(a)*Math.sqrt(1+r*r); + } + else if (b != 0) { + r = a/b; + r = Math.abs(b)*Math.sqrt(1+r*r); + } + else { + r = 0.0; + } + return r; + } + + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java b/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java index 76fc12bd..1f666b9b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java @@ -1,418 +1,418 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ - -package org.opensourcephysics.cabrillo.tracker; - - - -/** - * A LinearModelWithStep maps a parameter vector to a - * series of data points at equally spaced time intervals. - * - * For handling 2D data, the parameters are a num_params x 2 Matrix. - * - * This class requires the JAMA matrix package from - * http://math.nist.gov/javanumerics/jama - * - * Mon Oct 31 14:02:07 PDT 2011 Kevin Karplus - * - * @author Kevin Karplus - */ -public class BounceModel -{ - - private final BounceMatrix model; /* model*params should match data in least-squares sense */ - private final BounceMatrix inverse_model; /* inverse_model*data sets params */ - - private final double step_at; /* where is a step modeled */ - private final boolean use_step; /* one more parameter than polynomial, to fit step at step_at */ - private final boolean use_unknown_step; /* two more paramters than polynomial, - to try to fit step somewhere near middle of window - */ - - private final int degree; // degree of polynomial - private final int num_params; // degree+1 + (use_unknown_step? 2: (use_step? 1: 0)); - - /** constructor for n data points using polynomial of degree d - * plus a Dirac delta in the acceleration (step in velocity) at time s - * - * That is, data[t] will be fitted to - * sum_i<=d param[i]*t**i for t=num_data-1, then it is not - * possible to fit an extra parameter, so it is omitted from the model, - * and a pure polynomial is used - * sum_i<=d param[i]*t**i - * - * If the time of the step is Double.NaN, then the step time is - * unknown and two extra parameters are needed to estimate s, - * which is assumed to be in range (0.5*num_data-1, 0.5*num_data). - * - * - * Other than 0 to turn it off, the step should not be located at an integer. - * - * @param num_data - * @param deg - * @param when_step when step in velocity happens - */ - public BounceModel(int num_data, int deg, double when_step) - { - degree= deg; - - // There must be at least one data point on each side of a step - use_unknown_step = Double.isNaN(when_step); - if (use_unknown_step) - { use_step=false; - step_at= (num_data+1)/2; // looking for step in (step_at-1,step_at) - } - else - { use_step = when_step>0 && when_step=step_at? (t-step_at): 0; - } - if (use_unknown_step) - { mapping1D[t][degree+2] = t>=step_at? 1: 0; - } - } - - model = new BounceMatrix(mapping1D); -// model.print(8,2); // debugging output - inverse_model = model.inverse(); - } - - - /** where is there a step? - * - * @return time of step in velocity - */ - public double getStepAt() - { if (use_unknown_step) return Double.NaN; - return step_at; - } - - /** where is there a step? - * If there is a step in a model which estimates time as well as size of step, - * we need the model parameters to say where the step was fitted. - * - * @param model_param parameters from fit - * @return time of step in velocity - */ - public double getStepAt(BounceMatrix model_param) - { - if (!use_unknown_step) return step_at; - - double[][] param_array = model_param.getArray(); - int dimension = model_param.getColumnDimension(); - - double guess_step = 0; // where do fit_parameters estimate the step - // get weighted average of extra time past step_at - double weight=0; - for (int dim=0; dim0) guess_step /= weight; - return step_at - guess_step; - } - - - /** fit parameters for model to a window of (x,y) points - * - * Returned result: - * fitted paramters - * returns null if fitting is not possible, - * which can happen if - * start, start+index_step, ..., start+(num_data-1)*index_step - * goes out of range for either data array - * or xdata or ydata is Double.NaN for one of the specified points - * - * Time t=0 corresponds to subscript "start" - * Time t=1 to start+time_step - * - * @param xData array of x values - * @param yData array of y values - * @param start subscript of first (x,y) pair for window - * @param index_step increment between subscripts for subsequent data points - * @return LinearModelParams containing parameters and residual square error - */ - public BounceParameters fit_xy(double []xData, double[] yData, int start, int index_step) - { - int num_data = model.getRowDimension(); - int last_index = start+(num_data-1)*index_step; - if (start<0 || last_index>=xData.length || last_index>=yData.length) - { return null; - } - - // copy data points into a matrix - BounceMatrix data_matrix = new BounceMatrix(num_data,2); - double [][] data=data_matrix.getArray(); - for (int t=0; t=num_data-1) {try_step=num_data-1.001;} - - BounceModel step_model= new BounceModel(num_data, degree, try_step); - BounceParameters fit_step = step_model.fit_xy(xData, yData, start, index_step); - if (null==best_fit || best_fit.getError()>fit_step.getError()) - { best_fit = fit_step; - } - - combined_step += dv*dv*try_step; - weight += dv*dv; // dv^2 - } - if (weight>0) combined_step /= weight; - - BounceModel step_model= new BounceModel(num_data, degree, combined_step); - BounceParameters fit_step = step_model.fit_xy(xData, yData, start, index_step); - if (null==best_fit || best_fit.getError()>fit_step.getError()) - { best_fit = fit_step; - } - - return best_fit; - } - - /** fit parameters for model to a window of (x,y) points, with a specified step - * to be removed before fitting - * Returned result: - * fitted parameters, with record of extra step - * - * returns null if fitting is not possible, - * which can happen if - * start, start+index_step, ..., start+(num_data-1)*index_step - * goes out of range for either data array - * or xdata or ydata is Double.NaN for one of the specified points - * - * Time t=0 corresponds to subscript "start" - * Time t=1 to start+time_step - * - * @param xData array of x values - * @param yData array of y values - * @param start subscript of first (x,y) pair for window - * @param index_step increment between subscripts for subsequent data points - * @param initial_step_at what time the predefined step happens 0<=t=xData.length || last_index>=yData.length) - { return null; - } - - // copy data points into a matrix - BounceMatrix data_matrix = new BounceMatrix(num_data,2); - double [][] data=data_matrix.getArray(); - for (int t=0; tinitial_step_at? initial_step_size[0]*(t-initial_step_at): 0); - data[t][1] = yData[start+index_step*t] - (t>initial_step_at? initial_step_size[1]*(t-initial_step_at): 0); - if (Double.isNaN(data[t][0]) || Double.isNaN(data[t][1])) - { return null; - } - } - - BounceMatrix params = inverse_model.times(data_matrix); - - double[][] error_array =model.times(params).minus(data_matrix).getArray(); - double square_error=0; - for (int t=0; t=guess_step) - { for (int dim=0; dim + * + * For additional Tracker information and documentation, please see + * . + */ + +package org.opensourcephysics.cabrillo.tracker; + + + +/** + * A LinearModelWithStep maps a parameter vector to a + * series of data points at equally spaced time intervals. + * + * For handling 2D data, the parameters are a num_params x 2 Matrix. + * + * This class requires the JAMA matrix package from + * http://math.nist.gov/javanumerics/jama + * + * Mon Oct 31 14:02:07 PDT 2011 Kevin Karplus + * + * @author Kevin Karplus + */ +public class BounceModel +{ + + private final BounceMatrix model; /* model*params should match data in least-squares sense */ + private final BounceMatrix inverse_model; /* inverse_model*data sets params */ + + private final double step_at; /* where is a step modeled */ + private final boolean use_step; /* one more parameter than polynomial, to fit step at step_at */ + private final boolean use_unknown_step; /* two more paramters than polynomial, + to try to fit step somewhere near middle of window + */ + + private final int degree; // degree of polynomial + private final int num_params; // degree+1 + (use_unknown_step? 2: (use_step? 1: 0)); + + /** constructor for n data points using polynomial of degree d + * plus a Dirac delta in the acceleration (step in velocity) at time s + * + * That is, data[t] will be fitted to + * sum_i<=d param[i]*t**i for t=num_data-1, then it is not + * possible to fit an extra parameter, so it is omitted from the model, + * and a pure polynomial is used + * sum_i<=d param[i]*t**i + * + * If the time of the step is Double.NaN, then the step time is + * unknown and two extra parameters are needed to estimate s, + * which is assumed to be in range (0.5*num_data-1, 0.5*num_data). + * + * + * Other than 0 to turn it off, the step should not be located at an integer. + * + * @param num_data + * @param deg + * @param when_step when step in velocity happens + */ + public BounceModel(int num_data, int deg, double when_step) + { + degree= deg; + + // There must be at least one data point on each side of a step + use_unknown_step = Double.isNaN(when_step); + if (use_unknown_step) + { use_step=false; + step_at= (num_data+1)/2; // looking for step in (step_at-1,step_at) + } + else + { use_step = when_step>0 && when_step=step_at? (t-step_at): 0; + } + if (use_unknown_step) + { mapping1D[t][degree+2] = t>=step_at? 1: 0; + } + } + + model = new BounceMatrix(mapping1D); +// model.print(8,2); // debugging output + inverse_model = model.inverse(); + } + + + /** where is there a step? + * + * @return time of step in velocity + */ + public double getStepAt() + { if (use_unknown_step) return Double.NaN; + return step_at; + } + + /** where is there a step? + * If there is a step in a model which estimates time as well as size of step, + * we need the model parameters to say where the step was fitted. + * + * @param model_param parameters from fit + * @return time of step in velocity + */ + public double getStepAt(BounceMatrix model_param) + { + if (!use_unknown_step) return step_at; + + double[][] param_array = model_param.getArray(); + int dimension = model_param.getColumnDimension(); + + double guess_step = 0; // where do fit_parameters estimate the step + // get weighted average of extra time past step_at + double weight=0; + for (int dim=0; dim0) guess_step /= weight; + return step_at - guess_step; + } + + + /** fit parameters for model to a window of (x,y) points + * + * Returned result: + * fitted paramters + * returns null if fitting is not possible, + * which can happen if + * start, start+index_step, ..., start+(num_data-1)*index_step + * goes out of range for either data array + * or xdata or ydata is Double.NaN for one of the specified points + * + * Time t=0 corresponds to subscript "start" + * Time t=1 to start+time_step + * + * @param xData array of x values + * @param yData array of y values + * @param start subscript of first (x,y) pair for window + * @param index_step increment between subscripts for subsequent data points + * @return LinearModelParams containing parameters and residual square error + */ + public BounceParameters fit_xy(double []xData, double[] yData, int start, int index_step) + { + int num_data = model.getRowDimension(); + int last_index = start+(num_data-1)*index_step; + if (start<0 || last_index>=xData.length || last_index>=yData.length) + { return null; + } + + // copy data points into a matrix + BounceMatrix data_matrix = new BounceMatrix(num_data,2); + double [][] data=data_matrix.getArray(); + for (int t=0; t=num_data-1) {try_step=num_data-1.001;} + + BounceModel step_model= new BounceModel(num_data, degree, try_step); + BounceParameters fit_step = step_model.fit_xy(xData, yData, start, index_step); + if (null==best_fit || best_fit.getError()>fit_step.getError()) + { best_fit = fit_step; + } + + combined_step += dv*dv*try_step; + weight += dv*dv; // dv^2 + } + if (weight>0) combined_step /= weight; + + BounceModel step_model= new BounceModel(num_data, degree, combined_step); + BounceParameters fit_step = step_model.fit_xy(xData, yData, start, index_step); + if (null==best_fit || best_fit.getError()>fit_step.getError()) + { best_fit = fit_step; + } + + return best_fit; + } + + /** fit parameters for model to a window of (x,y) points, with a specified step + * to be removed before fitting + * Returned result: + * fitted parameters, with record of extra step + * + * returns null if fitting is not possible, + * which can happen if + * start, start+index_step, ..., start+(num_data-1)*index_step + * goes out of range for either data array + * or xdata or ydata is Double.NaN for one of the specified points + * + * Time t=0 corresponds to subscript "start" + * Time t=1 to start+time_step + * + * @param xData array of x values + * @param yData array of y values + * @param start subscript of first (x,y) pair for window + * @param index_step increment between subscripts for subsequent data points + * @param initial_step_at what time the predefined step happens 0<=t=xData.length || last_index>=yData.length) + { return null; + } + + // copy data points into a matrix + BounceMatrix data_matrix = new BounceMatrix(num_data,2); + double [][] data=data_matrix.getArray(); + for (int t=0; tinitial_step_at? initial_step_size[0]*(t-initial_step_at): 0); + data[t][1] = yData[start+index_step*t] - (t>initial_step_at? initial_step_size[1]*(t-initial_step_at): 0); + if (Double.isNaN(data[t][0]) || Double.isNaN(data[t][1])) + { return null; + } + } + + BounceMatrix params = inverse_model.times(data_matrix); + + double[][] error_array =model.times(params).minus(data_matrix).getArray(); + double square_error=0; + for (int t=0; t=guess_step) + { for (int dim=0; dim - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -/** - * A BounceParameters object is a set of parameters for - * a BounceModel model, which is included by reference. - * - * Wed Nov 2 15:30:20 PDT 2011 Kevin Karplus - * - * @author Kevin Karplus - */ -public class BounceParameters -{ - - // The model that was fitted to create these parameters. - private final BounceModel model; - - // The params matrix has as many rows as model has parameters. - // It has as many columns as the dimensionality of the data being fitted. - private final BounceMatrix params; - - // The sum of the squares of the residual error of the fitting. - private final double square_error; - - // If a step was removed before fitting the model, when was the step? - private final double initial_step_at; - - // If a step was removed before fitting the model, how big was it? - private final double[] initial_step_size; - - - /** constructor - * - * @param m model - * @param p params - * @param e square_error - */ - public BounceParameters(BounceModel m, BounceMatrix p, double e) - { - model=m; - params=p; - square_error=e; - initial_step_at=0; - initial_step_size=null; - } - - - /** constructor - * - * @param m model - * @param p params - * @param e square_error - * @param step_at when initial step is - * @param step_size - */ - public BounceParameters(BounceModel m, BounceMatrix p, double e, double step_at, double[] step_size) - { - model=m; - params=p; - square_error=e; - initial_step_at=step_at; - initial_step_size=step_size; - } - - - /** read-only access to model - * - * @return model - */ - public final BounceModel getModel() - { return model; - } - - /** read-only access to params - * - * @return params - */ - public final BounceMatrix getParams() - { return params; - } - - - /** read-only access to error - * - * @return square_error - */ - public final double getError() - { return square_error; - } - - - /** when is there a step? - * - * @return time of step in velocity - */ - public double getStepAt() - { - double model_stepat=model.getStepAt(params); - if (null == initial_step_size) return model_stepat; - if (!model.usesStep() || model_stepat==initial_step_at) return initial_step_at; - throw new RuntimeException("LinearModelParams with steps at different times"); //$NON-NLS-1$ - - } - - /** how big is the step? - * - * The dimensionality of the returned array of doubles is the same as - * the number of columns in the model_param Matrix - * (that would be 2 for model_param returned by fit_xy()). - * - * @return step size (0 if no step) - */ - public double[] getStepSize() - { - int dimension = params.getColumnDimension(); - double [] result = new double[dimension]; - - if (initial_step_size !=null) - { for (int i=0; i< result.length; i++) - { result[i] = initial_step_size[i]; - } - if (model.usesStep() && model.getStepAt()!=initial_step_at) - { throw new RuntimeException("LinearModelParams getStepSize with steps at different times"); //$NON-NLS-1$ - } - } - - if (! model.usesStep()) { return result; } - - int step_index = params.getRowDimension() - 1; - double[][] param_array = params.getArray(); - for (int dim=0; dim + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +/** + * A BounceParameters object is a set of parameters for + * a BounceModel model, which is included by reference. + * + * Wed Nov 2 15:30:20 PDT 2011 Kevin Karplus + * + * @author Kevin Karplus + */ +public class BounceParameters +{ + + // The model that was fitted to create these parameters. + private final BounceModel model; + + // The params matrix has as many rows as model has parameters. + // It has as many columns as the dimensionality of the data being fitted. + private final BounceMatrix params; + + // The sum of the squares of the residual error of the fitting. + private final double square_error; + + // If a step was removed before fitting the model, when was the step? + private final double initial_step_at; + + // If a step was removed before fitting the model, how big was it? + private final double[] initial_step_size; + + + /** constructor + * + * @param m model + * @param p params + * @param e square_error + */ + public BounceParameters(BounceModel m, BounceMatrix p, double e) + { + model=m; + params=p; + square_error=e; + initial_step_at=0; + initial_step_size=null; + } + + + /** constructor + * + * @param m model + * @param p params + * @param e square_error + * @param step_at when initial step is + * @param step_size + */ + public BounceParameters(BounceModel m, BounceMatrix p, double e, double step_at, double[] step_size) + { + model=m; + params=p; + square_error=e; + initial_step_at=step_at; + initial_step_size=step_size; + } + + + /** read-only access to model + * + * @return model + */ + public final BounceModel getModel() + { return model; + } + + /** read-only access to params + * + * @return params + */ + public final BounceMatrix getParams() + { return params; + } + + + /** read-only access to error + * + * @return square_error + */ + public final double getError() + { return square_error; + } + + + /** when is there a step? + * + * @return time of step in velocity + */ + public double getStepAt() + { + double model_stepat=model.getStepAt(params); + if (null == initial_step_size) return model_stepat; + if (!model.usesStep() || model_stepat==initial_step_at) return initial_step_at; + throw new RuntimeException("LinearModelParams with steps at different times"); //$NON-NLS-1$ + + } + + /** how big is the step? + * + * The dimensionality of the returned array of doubles is the same as + * the number of columns in the model_param Matrix + * (that would be 2 for model_param returned by fit_xy()). + * + * @return step size (0 if no step) + */ + public double[] getStepSize() + { + int dimension = params.getColumnDimension(); + double [] result = new double[dimension]; + + if (initial_step_size !=null) + { for (int i=0; i< result.length; i++) + { result[i] = initial_step_size[i]; + } + if (model.usesStep() && model.getStepAt()!=initial_step_at) + { throw new RuntimeException("LinearModelParams getStepSize with steps at different times"); //$NON-NLS-1$ + } + } + + if (! model.usesStep()) { return result; } + + int step_index = params.getRowDimension() - 1; + double[][] param_array = params.getArray(); + for (int dim=0; dim - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.font.TextLayout; -import java.awt.geom.Point2D; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.controls.*; - -/** - * A Calibration controls the ImageCoordSystem of a TrackerPanel. - * - * @author Douglas Brown - */ -public class Calibration extends TTrack { - - // static fields - protected static final int X_AXIS = 2; - protected static final int XY_AXES = 1; - protected static final int Y_AXIS = 0; - - // instance fields - protected NumberField x1Field, y1Field; - protected JLabel point1Label, point2Label, x1Label, y1Label; - private Component spinnerSeparator; - private Component[] fieldSeparators = new Component[3]; - protected boolean[] isWorldDataValid = new boolean[] {false, false}; - protected ArrayList axisList = new ArrayList(); - protected JSpinner axisSpinner; - protected ChangeListener axisListener; - protected JLabel axisLabel = new JLabel(); - protected int axes = XY_AXES; - protected int spinnerTextWidth; - protected boolean fixedCoordinates = true; - protected JCheckBoxMenuItem fixedCoordinatesItem; - - /** - * Constructs a Calibration. - */ - public Calibration() { - // set up footprint choices and color - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.Crosshair")}); //$NON-NLS-1$ - // assign a default name - setName(TrackerRes.getString("Calibration.New.Name")); //$NON-NLS-1$ - setColor(defaultColors[0]); - // hide from views - viewable = false; - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Calibration.Unmarked.Hint"); //$NON-NLS-1$ - keyFrames.add(0); - createGUI(); - } - - /** - * Sets the axis type. - * - * @param axis one of the type constants X_AXIS, Y_AXIS or XY_AXES - */ - public void setAxisType(int axis) { - if (axis == X_AXIS || axis == Y_AXIS || axis == XY_AXES) { - axes = axis; - } - } - - /** - * Creates, adds a point to, or repositions a calibration step. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the new step - */ - public Step createStep(int n, double x, double y) { - if (isLocked()) return null; - CalibrationStep step = (CalibrationStep)getStep(n); - if (step == null) { - step = new CalibrationStep(this, n, x, y); - step.setFootprint(getFootprint()); - steps = new StepArray(step); - } - else if (step.getPoints()[1] == null) { - if (trackerPanel!=null && trackerPanel.getSelectedPoint()==step.getPoints()[0]) { - trackerPanel.setSelectedPoint(null); - } - step.addSecondPoint(x, y); - steps = new StepArray(step); - } - else if (trackerPanel!=null) { - TPoint p = trackerPanel.getSelectedPoint(); - if (p==null) { - p = step.getPosition(1); - } - if (p instanceof CalibrationStep.Position) { - XMLControl state = new XMLControlElement(step); - p.setLocation(x, y); - Point2D pt = p.getWorldPosition(trackerPanel); - - if (step.points[0]==p) { // selected position is 0 - step.setWorldCoordinates(pt.getX(), pt.getY(), step.worldX1, step.worldY1); - } - else { // selected position is 1 - step.setWorldCoordinates(step.worldX0, step.worldY0, pt.getX(), pt.getY()); - } - Undo.postStepEdit(step, state); - } - } - support.firePropertyChange("step", null, n); //$NON-NLS-1$ - return step; - } - - /** - * Creates a new calibration step with two calibration points. - * - * @param n the frame number - * @param x1 the x coordinate of point 1 in image space - * @param y1 the y coordinate of point 1 in image space - * @param x2 the x coordinate of point 2 in image space - * @param y2 the y coordinate of point 2 in image space - * @return the step - */ - public Step createStep(int n, double x1, double y1, double x2, double y2) { - createStep(n, x1, y1); // first point - Step step = createStep(n, x2, y2); // adds second point - return step; - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - CalibrationStep step = (CalibrationStep)getStep(n); - int index = getTargetIndex(); - ImageCoordSystem coords = trackerPanel.getCoords(); - coords.setFixedOrigin(false); - coords.setFixedAngle(false); - coords.setFixedScale(false); - if (step == null) { - step = (CalibrationStep)createStep(n, x, y); - if (step!=null) - return step.getPoints()[index]; - } - else { - TPoint p = step.getPoints()[index]; - if (p==null) { - if (trackerPanel!=null && trackerPanel.getSelectedPoint()==step.getPoints()[0]) { - trackerPanel.setSelectedPoint(null); - } - step.addSecondPoint(x, y); - steps = new StepArray(step); - return step.getPoints()[index]; - } - - Mark mark = step.marks.get(trackerPanel); - if (mark==null) { - double worldX = index==0? step.worldX0: step.worldX1; - double worldY = index==0? step.worldY0: step.worldY1; - // set step location to image position of current world coordinates - double xx = coords.worldToImageX(n, worldX, worldY); - double yy = coords.worldToImageY(n, worldX, worldY); - p.setLocation(xx, yy); - } - p.setAdjusting(true); - p.setXY(x, y); - p.setAdjusting(false); - return p; - - } - return null; - } - - /** - * Overrides TTrack getStep method. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - CalibrationStep step = (CalibrationStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Overrides TTrack isLocked method. - * - * @return true if this is locked - */ - public boolean isLocked() { - boolean locked = super.isLocked(); - if (trackerPanel != null) { - locked = locked || trackerPanel.getCoords().isLocked(); - } - return locked; - } - - /** - * Overrides TTrack setTrailVisible method. - * Calibration trails are never visible. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Determines if at least one point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return CalibrationStep.getLength(); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 1; - } - - /** - * Determines if the world coordinates are fixed. - * - * @return true if fixed - */ - public boolean isFixedCoordinates() { - return fixedCoordinates; - } - - /** - * Sets the fixed coordinates property. When fixed, the world coordinates - * are the same at all times. - * - * @param fixed true to fix the coordinates - */ - public void setFixedCoordinates(boolean fixed) { - if (fixedCoordinates == fixed) return; - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - if (step!=null) { - steps = new StepArray(getStep(n)); - } - trackerPanel.repaint(); - } - if (fixed) { - keyFrames.clear(); - keyFrames.add(0); - } - fixedCoordinates = fixed; - Undo.postTrackEdit(this, control); - } - - /** - * Overrides TTrack setFootprint to handle PointAxesFootprints. - * - * @param name the name of the desired footprint - */ - public void setFootprint(String name) { - super.setFootprint(name); - setAxisType(axes); - } - - /** - * Implements findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first calibration point that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || - !isVisible() || - !isEnabled()) return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - Interactive ia = null; - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - if (step != null && - trackerPanel.getPlayer().getVideoClip().includesFrame(n)) - ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia != null) { - partName = TrackerRes.getString("Calibration.Point.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Calibration.Point.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Calibration.Halfmarked.Hint"); //$NON-NLS-1$ - } - return ia; - } - - /** - * Overrides TTrack method. - * - * @param locked true to lock this - */ - public void setLocked(boolean locked) { - super.setLocked(locked); - boolean enabled = !isLocked(); - xField.setEnabled(enabled); - yField.setEnabled(enabled); - x1Field.setEnabled(enabled); - y1Field.setEnabled(enabled); - if (axisSpinner!=null) - axisSpinner.setEnabled(enabled); - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); - // remove end items and last separator - menu.remove(deleteTrackItem); - menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); - - // add fixed and delete items - fixedCoordinatesItem.setText(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ - fixedCoordinatesItem.setSelected(isFixedCoordinates()); - menu.add(fixedCoordinatesItem); - menu.addSeparator(); - menu.add(deleteTrackItem); - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - - // rebuild the axis spinner - axisList.clear(); - String y = TrackerRes.getString("Calibration.Axes.YOnly"); //$NON-NLS-1$ - axisList.add(y); - String xy = TrackerRes.getString("Calibration.Axes.XY"); //$NON-NLS-1$ - axisList.add(xy); - String x = TrackerRes.getString("Calibration.Axes.XOnly"); //$NON-NLS-1$ - axisList.add(x); - SpinnerListModel axisModel = new SpinnerListModel(axisList); - axisSpinner = new JSpinner(axisModel) { - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width += spinnerTextWidth/2; - return dim; - } - }; - JTextField field = ((JSpinner.DefaultEditor)axisSpinner.getEditor()).getTextField(); - field.setDisabledTextColor(NumberField.DISABLED_COLOR); - String longest = xy; - longest = x.length()>longest.length()? x: longest; - longest = y.length()>longest.length()? y: longest; - Font font = axisSpinner.getFont().deriveFont(Font.PLAIN); - FontSizer.setFonts(axisSpinner, FontSizer.getLevel()); - TextLayout layout = new TextLayout(longest, font, frc); - spinnerTextWidth = (int)layout.getBounds().getWidth(); - // set correct value - axisModel.setValue(axes == XY_AXES? xy: axes == X_AXIS? x: y); - axisSpinner.addChangeListener(axisListener); - axisSpinner.setToolTipText(TrackerRes.getString("Calibration.Spinner.Axes.Tooltip")); //$NON-NLS-1$ - axisLabel.setText(TrackerRes.getString("Calibration.Label.Axes")); //$NON-NLS-1$ - Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); - axisLabel.setBorder(empty); - list.add(axisLabel); - list.add(axisSpinner); - list.add(spinnerSeparator); - - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - - // add world coordinate fields and labels - String s = TrackerRes.getString("Calibration.Label.Point"); //$NON-NLS-1$ - String unmarked = TrackerRes.getString("TTrack.Label.Unmarked"); //$NON-NLS-1$ - point1Label.setText(s+" 1: "); //$NON-NLS-1$ - point2Label.setText(s+" 2: "); //$NON-NLS-1$ - point1Label.setForeground(yLabel.getForeground()); - point2Label.setForeground(yLabel.getForeground()); - - boolean exists = step!=null; - boolean complete = exists && step.getPoints()[1]!=null; - if (!exists) { - point1Label.setText(s+" 1: "+unmarked); //$NON-NLS-1$ - point1Label.setForeground(Color.red.darker()); - } - else if (!complete){ - point2Label.setText(s+" 2: "+unmarked); //$NON-NLS-1$ - point2Label.setForeground(Color.red.darker()); - } - if (axes == Y_AXIS) { - list.add(point1Label); - if (exists) { - list.add(yLabel); - list.add(yField); - list.add(fieldSeparators[1]); - list.add(point2Label); - if (complete) { - list.add(y1Label); - list.add(y1Field); - } - } - } - else if (axes == X_AXIS) { - list.add(point1Label); - if (exists) { - list.add(xLabel); - list.add(xField); - list.add(fieldSeparators[1]); - list.add(point2Label); - if (complete) { - list.add(x1Label); - list.add(x1Field); - } - } - } - else { - list.add(point1Label); - if (exists) { - list.add(xLabel); - list.add(xField); - list.add(fieldSeparators[0]); - list.add(yLabel); - list.add(yField); - list.add(fieldSeparators[1]); - list.add(point2Label); - if (complete) { - list.add(x1Label); - list.add(x1Field); - list.add(fieldSeparators[2]); - list.add(y1Label); - list.add(y1Field); - } - } - } - - boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); - xField.setEnabled(!locked); - yField.setEnabled(!locked); - x1Field.setEnabled(!locked); - y1Field.setEnabled(!locked); - axisSpinner.setEnabled(!locked); - // display world coordinates in fields - displayWorldCoordinates(); - return list; - } - - /** - * Refreshes a step by setting it equal to the previous keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(CalibrationStep step) { - if (step==null) return; - int key = 0; - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - // compare step with keyStep - CalibrationStep keyStep = (CalibrationStep)steps.getStep(key); - boolean different = keyStep.worldX0!=step.worldX0 || keyStep.worldY0!=step.worldY0 - || keyStep.worldX1!=step.worldX1 || keyStep.worldY1!=step.worldY1; - // update step if needed - if (different) { - step.worldX0 = keyStep.worldX0; - step.worldY0 = keyStep.worldY0; - step.worldX1 = keyStep.worldX1; - step.worldY1 = keyStep.worldY1; - } - step.erase(); - } - - /** - * Sets the font level. - * - * @param level the desired font level - */ - public void setFontLevel(int level) { - super.setFontLevel(level); - Object[] objectsToSize = new Object[] - {point1Label, point2Label, x1Label, y1Label, x1Field, y1Field, axisLabel, - fixedCoordinatesItem}; - FontSizer.setFonts(objectsToSize, level); - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("Calibration.Name"); //$NON-NLS-1$ - } - - /** - * Responds to property change events. Overrides TTrack method. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("stepnumber")) { //$NON-NLS-1$ - if (trackerPanel.getSelectedTrack() == this) { - displayWorldCoordinates(); - } - } - else if (name.equals("locked")) { //$NON-NLS-1$ - boolean enabled = !isLocked(); - xField.setEnabled(enabled); - yField.setEnabled(enabled); - x1Field.setEnabled(enabled); - y1Field.setEnabled(enabled); - axisSpinner.setEnabled(enabled); - } - else super.propertyChange(e); - } - - /** - * Overrides TTrack method - * - * @return the point index - */ - protected int getTargetIndex() { -// int n = trackerPanel.getFrameNumber(); -// CalibrationStep step = (CalibrationStep)getStep(n); -// if (step!=null) { -// for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.font.TextLayout; +import java.awt.geom.Point2D; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.controls.*; + +/** + * A Calibration controls the ImageCoordSystem of a TrackerPanel. + * + * @author Douglas Brown + */ +public class Calibration extends TTrack { + + // static fields + protected static final int X_AXIS = 2; + protected static final int XY_AXES = 1; + protected static final int Y_AXIS = 0; + + // instance fields + protected NumberField x1Field, y1Field; + protected JLabel point1Label, point2Label, x1Label, y1Label; + private Component spinnerSeparator; + private Component[] fieldSeparators = new Component[3]; + protected boolean[] isWorldDataValid = new boolean[] {false, false}; + protected ArrayList axisList = new ArrayList(); + protected JSpinner axisSpinner; + protected ChangeListener axisListener; + protected JLabel axisLabel = new JLabel(); + protected int axes = XY_AXES; + protected int spinnerTextWidth; + protected boolean fixedCoordinates = true; + protected JCheckBoxMenuItem fixedCoordinatesItem; + + /** + * Constructs a Calibration. + */ + public Calibration() { + // set up footprint choices and color + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.Crosshair")}); //$NON-NLS-1$ + // assign a default name + setName(TrackerRes.getString("Calibration.New.Name")); //$NON-NLS-1$ + setColor(defaultColors[0]); + // hide from views + viewable = false; + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("Calibration.Unmarked.Hint"); //$NON-NLS-1$ + keyFrames.add(0); + createGUI(); + } + + /** + * Sets the axis type. + * + * @param axis one of the type constants X_AXIS, Y_AXIS or XY_AXES + */ + public void setAxisType(int axis) { + if (axis == X_AXIS || axis == Y_AXIS || axis == XY_AXES) { + axes = axis; + } + } + + /** + * Creates, adds a point to, or repositions a calibration step. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the new step + */ + public Step createStep(int n, double x, double y) { + if (isLocked()) return null; + CalibrationStep step = (CalibrationStep)getStep(n); + if (step == null) { + step = new CalibrationStep(this, n, x, y); + step.setFootprint(getFootprint()); + steps = new StepArray(step); + } + else if (step.getPoints()[1] == null) { + if (trackerPanel!=null && trackerPanel.getSelectedPoint()==step.getPoints()[0]) { + trackerPanel.setSelectedPoint(null); + } + step.addSecondPoint(x, y); + steps = new StepArray(step); + } + else if (trackerPanel!=null) { + TPoint p = trackerPanel.getSelectedPoint(); + if (p==null) { + p = step.getPosition(1); + } + if (p instanceof CalibrationStep.Position) { + XMLControl state = new XMLControlElement(step); + p.setLocation(x, y); + Point2D pt = p.getWorldPosition(trackerPanel); + + if (step.points[0]==p) { // selected position is 0 + step.setWorldCoordinates(pt.getX(), pt.getY(), step.worldX1, step.worldY1); + } + else { // selected position is 1 + step.setWorldCoordinates(step.worldX0, step.worldY0, pt.getX(), pt.getY()); + } + Undo.postStepEdit(step, state); + } + } + support.firePropertyChange("step", null, n); //$NON-NLS-1$ + return step; + } + + /** + * Creates a new calibration step with two calibration points. + * + * @param n the frame number + * @param x1 the x coordinate of point 1 in image space + * @param y1 the y coordinate of point 1 in image space + * @param x2 the x coordinate of point 2 in image space + * @param y2 the y coordinate of point 2 in image space + * @return the step + */ + public Step createStep(int n, double x1, double y1, double x2, double y2) { + createStep(n, x1, y1); // first point + Step step = createStep(n, x2, y2); // adds second point + return step; + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + CalibrationStep step = (CalibrationStep)getStep(n); + int index = getTargetIndex(); + ImageCoordSystem coords = trackerPanel.getCoords(); + coords.setFixedOrigin(false); + coords.setFixedAngle(false); + coords.setFixedScale(false); + if (step == null) { + step = (CalibrationStep)createStep(n, x, y); + if (step!=null) + return step.getPoints()[index]; + } + else { + TPoint p = step.getPoints()[index]; + if (p==null) { + if (trackerPanel!=null && trackerPanel.getSelectedPoint()==step.getPoints()[0]) { + trackerPanel.setSelectedPoint(null); + } + step.addSecondPoint(x, y); + steps = new StepArray(step); + return step.getPoints()[index]; + } + + Mark mark = step.marks.get(trackerPanel); + if (mark==null) { + double worldX = index==0? step.worldX0: step.worldX1; + double worldY = index==0? step.worldY0: step.worldY1; + // set step location to image position of current world coordinates + double xx = coords.worldToImageX(n, worldX, worldY); + double yy = coords.worldToImageY(n, worldX, worldY); + p.setLocation(xx, yy); + } + p.setAdjusting(true); + p.setXY(x, y); + p.setAdjusting(false); + return p; + + } + return null; + } + + /** + * Overrides TTrack getStep method. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + CalibrationStep step = (CalibrationStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Overrides TTrack isLocked method. + * + * @return true if this is locked + */ + public boolean isLocked() { + boolean locked = super.isLocked(); + if (trackerPanel != null) { + locked = locked || trackerPanel.getCoords().isLocked(); + } + return locked; + } + + /** + * Overrides TTrack setTrailVisible method. + * Calibration trails are never visible. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Determines if at least one point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return CalibrationStep.getLength(); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 1; + } + + /** + * Determines if the world coordinates are fixed. + * + * @return true if fixed + */ + public boolean isFixedCoordinates() { + return fixedCoordinates; + } + + /** + * Sets the fixed coordinates property. When fixed, the world coordinates + * are the same at all times. + * + * @param fixed true to fix the coordinates + */ + public void setFixedCoordinates(boolean fixed) { + if (fixedCoordinates == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + if (step!=null) { + steps = new StepArray(getStep(n)); + } + trackerPanel.repaint(); + } + if (fixed) { + keyFrames.clear(); + keyFrames.add(0); + } + fixedCoordinates = fixed; + Undo.postTrackEdit(this, control); + } + + /** + * Overrides TTrack setFootprint to handle PointAxesFootprints. + * + * @param name the name of the desired footprint + */ + public void setFootprint(String name) { + super.setFootprint(name); + setAxisType(axes); + } + + /** + * Implements findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first calibration point that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || + !isVisible() || + !isEnabled()) return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + Interactive ia = null; + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + if (step != null && + trackerPanel.getPlayer().getVideoClip().includesFrame(n)) + ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia != null) { + partName = TrackerRes.getString("Calibration.Point.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Calibration.Point.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("Calibration.Halfmarked.Hint"); //$NON-NLS-1$ + } + return ia; + } + + /** + * Overrides TTrack method. + * + * @param locked true to lock this + */ + public void setLocked(boolean locked) { + super.setLocked(locked); + boolean enabled = !isLocked(); + xField.setEnabled(enabled); + yField.setEnabled(enabled); + x1Field.setEnabled(enabled); + y1Field.setEnabled(enabled); + if (axisSpinner!=null) + axisSpinner.setEnabled(enabled); + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + + // add fixed and delete items + fixedCoordinatesItem.setText(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ + fixedCoordinatesItem.setSelected(isFixedCoordinates()); + menu.add(fixedCoordinatesItem); + menu.addSeparator(); + menu.add(deleteTrackItem); + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + + // rebuild the axis spinner + axisList.clear(); + String y = TrackerRes.getString("Calibration.Axes.YOnly"); //$NON-NLS-1$ + axisList.add(y); + String xy = TrackerRes.getString("Calibration.Axes.XY"); //$NON-NLS-1$ + axisList.add(xy); + String x = TrackerRes.getString("Calibration.Axes.XOnly"); //$NON-NLS-1$ + axisList.add(x); + SpinnerListModel axisModel = new SpinnerListModel(axisList); + axisSpinner = new JSpinner(axisModel) { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width += spinnerTextWidth/2; + return dim; + } + }; + JTextField field = ((JSpinner.DefaultEditor)axisSpinner.getEditor()).getTextField(); + field.setDisabledTextColor(NumberField.DISABLED_COLOR); + String longest = xy; + longest = x.length()>longest.length()? x: longest; + longest = y.length()>longest.length()? y: longest; + Font font = axisSpinner.getFont().deriveFont(Font.PLAIN); + FontSizer.setFonts(axisSpinner, FontSizer.getLevel()); + TextLayout layout = new TextLayout(longest, font, frc); + spinnerTextWidth = (int)layout.getBounds().getWidth(); + // set correct value + axisModel.setValue(axes == XY_AXES? xy: axes == X_AXIS? x: y); + axisSpinner.addChangeListener(axisListener); + axisSpinner.setToolTipText(TrackerRes.getString("Calibration.Spinner.Axes.Tooltip")); //$NON-NLS-1$ + axisLabel.setText(TrackerRes.getString("Calibration.Label.Axes")); //$NON-NLS-1$ + Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); + axisLabel.setBorder(empty); + list.add(axisLabel); + list.add(axisSpinner); + list.add(spinnerSeparator); + + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + + // add world coordinate fields and labels + String s = TrackerRes.getString("Calibration.Label.Point"); //$NON-NLS-1$ + String unmarked = TrackerRes.getString("TTrack.Label.Unmarked"); //$NON-NLS-1$ + point1Label.setText(s+" 1: "); //$NON-NLS-1$ + point2Label.setText(s+" 2: "); //$NON-NLS-1$ + point1Label.setForeground(yLabel.getForeground()); + point2Label.setForeground(yLabel.getForeground()); + + boolean exists = step!=null; + boolean complete = exists && step.getPoints()[1]!=null; + if (!exists) { + point1Label.setText(s+" 1: "+unmarked); //$NON-NLS-1$ + point1Label.setForeground(Color.red.darker()); + } + else if (!complete){ + point2Label.setText(s+" 2: "+unmarked); //$NON-NLS-1$ + point2Label.setForeground(Color.red.darker()); + } + if (axes == Y_AXIS) { + list.add(point1Label); + if (exists) { + list.add(yLabel); + list.add(yField); + list.add(fieldSeparators[1]); + list.add(point2Label); + if (complete) { + list.add(y1Label); + list.add(y1Field); + } + } + } + else if (axes == X_AXIS) { + list.add(point1Label); + if (exists) { + list.add(xLabel); + list.add(xField); + list.add(fieldSeparators[1]); + list.add(point2Label); + if (complete) { + list.add(x1Label); + list.add(x1Field); + } + } + } + else { + list.add(point1Label); + if (exists) { + list.add(xLabel); + list.add(xField); + list.add(fieldSeparators[0]); + list.add(yLabel); + list.add(yField); + list.add(fieldSeparators[1]); + list.add(point2Label); + if (complete) { + list.add(x1Label); + list.add(x1Field); + list.add(fieldSeparators[2]); + list.add(y1Label); + list.add(y1Field); + } + } + } + + boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); + xField.setEnabled(!locked); + yField.setEnabled(!locked); + x1Field.setEnabled(!locked); + y1Field.setEnabled(!locked); + axisSpinner.setEnabled(!locked); + // display world coordinates in fields + displayWorldCoordinates(); + return list; + } + + /** + * Refreshes a step by setting it equal to the previous keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(CalibrationStep step) { + if (step==null) return; + int key = 0; + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + // compare step with keyStep + CalibrationStep keyStep = (CalibrationStep)steps.getStep(key); + boolean different = keyStep.worldX0!=step.worldX0 || keyStep.worldY0!=step.worldY0 + || keyStep.worldX1!=step.worldX1 || keyStep.worldY1!=step.worldY1; + // update step if needed + if (different) { + step.worldX0 = keyStep.worldX0; + step.worldY0 = keyStep.worldY0; + step.worldX1 = keyStep.worldX1; + step.worldY1 = keyStep.worldY1; + } + step.erase(); + } + + /** + * Sets the font level. + * + * @param level the desired font level + */ + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {point1Label, point2Label, x1Label, y1Label, x1Field, y1Field, axisLabel, + fixedCoordinatesItem}; + FontSizer.setFonts(objectsToSize, level); + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("Calibration.Name"); //$NON-NLS-1$ + } + + /** + * Responds to property change events. Overrides TTrack method. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("stepnumber")) { //$NON-NLS-1$ + if (trackerPanel.getSelectedTrack() == this) { + displayWorldCoordinates(); + } + } + else if (name.equals("locked")) { //$NON-NLS-1$ + boolean enabled = !isLocked(); + xField.setEnabled(enabled); + yField.setEnabled(enabled); + x1Field.setEnabled(enabled); + y1Field.setEnabled(enabled); + axisSpinner.setEnabled(enabled); + } + else super.propertyChange(e); + } + + /** + * Overrides TTrack method + * + * @return the point index + */ + protected int getTargetIndex() { +// int n = trackerPanel.getFrameNumber(); +// CalibrationStep step = (CalibrationStep)getStep(n); +// if (step!=null) { +// for (int i=0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; - -import javax.swing.JOptionPane; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.media.core.*; - -/** - * This is a Step for a Calibration. It is used for - * setting the origin, angle and scale of an ImageCoordSystem. - * - * @author Douglas Brown - */ -public class CalibrationStep extends Step { - - // instance fields - private Calibration cal; - protected double worldX0, worldY0, worldX1=1, worldY1; - - /** - * Constructs a CalibrationStep with specified image coordinates. - * - * @param track the calibration - * @param n the frame number - * @param x the image x coordinate of point 0 - * @param y the image y coordinate of point 0 - */ - public CalibrationStep(Calibration track, int n, double x, double y) { - super(track, n); - cal = track; - screenPoints = new Point[getLength()]; - points = new TPoint[getLength()]; - Position p = new Position(x, y); - points[0] = p; - } - - /** - * Adds a second position point to this step at the specified image coordinates. - * - * @param x the image x coordinate of the position point - * @param y the image y coordinate of the position point - */ - public void addSecondPoint(double x, double y) { - Position p = new Position(x, y); - points[1] = p; - setWorldCoordinates(worldX0, worldY0, worldX1, worldY1); - } - - /** - * Gets the specified position point. - * - * @param n the point number (0 or 1) - * @return the position - */ - public Position getPosition(int n) { - return (Position)points[n]; - } - - /** - * Gets the default point. The default point is the point initially selected - * when the step is created. Overrides step getDefaultPoint method. - * - * @return the default TPoint - */ - public TPoint getDefaultPoint() { - if (points[1] == null) return points[0]; - if (cal.trackerPanel.getSelectedPoint()==points[0]) return points[0]; - return points[1]; - } - - /** - * Overrides Step getMark method. - * - * @param trackerPanel the tracker panel - * @return the mark - */ - protected Mark getMark(TrackerPanel trackerPanel) { - Mark mark = marks.get(trackerPanel); - TPoint selection = null; - if (mark == null) { - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - // set point locations to image positions of world coordinates - for (int i = 0; i < points.length; i++) { - Position pt = (Position)points[i]; - if (pt == null) continue; - double worldX = i==0? worldX0: worldX1; - double worldY = i==0? worldY0: worldY1; - double x = coords.worldToImageX(n, worldX, worldY); - double y = coords.worldToImageY(n, worldX, worldY); - pt.setLocation(x, y); - } - // get point shapes - selection = trackerPanel.getSelectedPoint(); - final Shape[] shapes = new Shape[points.length]; - for (int i = 0; i < points.length; i++) { - if (points[i] == null) continue; - Point p = points[i].getScreenPosition(trackerPanel); - if (selection == points[i]) { // point is selected - transform.setToTranslation(p.x, p.y); - shapes[i] = transform.createTransformedShape(selectionShape); - } - else { // point not selected - shapes[i] = footprint.getShape(new Point[] {p}); - } - } - // create mark - final Color color = footprint.getColor(); - mark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setPaint(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - for (int i = 0; i < points.length; i++) { - if (shapes[i] != null) g.fill(shapes[i]); - } - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - Rectangle bounds = null; - for (int i = 0; i < points.length; i++) { - if (shapes[i] != null) { - if (bounds == null) bounds = shapes[i].getBounds(); - else bounds.add(shapes[i].getBounds()); - } - } - return bounds; - } - }; - marks.put(trackerPanel, mark); - } - return mark; - } - - /** - * Clones this Step. - * - * @return a clone of this step - */ - public Object clone() { - CalibrationStep step = (CalibrationStep)super.clone(); - step.points[0] = step.new Position(points[0].x, points[0].y); - if (points[1] != null) { - step.points[1] = step.new Position(points[1].x, points[1].y); - } - return step; - } - - /** - * Sets the world coordinates. When a single point is visible, - * this sets the coords origin so its image position does not change. - * When both points are visible, this sets the origin, angle and scale - * so neither image position changes. - * - * @param x1 the world x coordinate of pt 1 - * @param y1 the world y coordinate of pt 1 - * @param x2 the world x coordinate of pt 2 - * @param y2 the world x coordinate of pt 2 - * @return true if successfully set - */ - public boolean setWorldCoordinates(double x1, double y1, double x2, double y2) { - if (track.isLocked()) return false; - // points can't share the same world position - boolean sameX = x2==x1; - boolean sameY = y2==y1; - if ((sameX && cal.axes == Calibration.X_AXIS) || - (sameY && cal.axes == Calibration.Y_AXIS) || - (sameX && sameY && cal.axes == Calibration.XY_AXES)) { - JOptionPane.showMessageDialog(track.trackerPanel, - TrackerRes.getString("Calibration.Dialog.InvalidCoordinates.Message"), //$NON-NLS-1$ - TrackerRes.getString("Calibration.Dialog.InvalidCoordinates.Title"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); - return false; - } - - if (cal.isFixedCoordinates()) { - CalibrationStep step = (CalibrationStep)cal.steps.getStep(0); - step.worldX0 = x1; - step.worldY0 = y1; - step.worldX1 = x2; - step.worldY1 = y2; - step.erase(); - cal.refreshStep(CalibrationStep.this); // sets properties of this step - } - else { - worldX0 = x1; - worldY0 = y1; - worldX1 = x2; - worldY1 = y2; - cal.keyFrames.add(n); - } - - if (points[1]!=null) { - updateCoords(); - } - else if (cal.trackerPanel!=null) { - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - int n = cal.trackerPanel.getFrameNumber(); - // get the current image position of the origin and points[0] - double x0 = coords.getOriginX(n); - double y0 = coords.getOriginY(n); - double x = coords.worldToImageX(n, worldX0, worldY0); - double y = coords.worldToImageY(n, worldX0, worldY0); - // translate the origin - coords.setOriginXY(n, x0+points[0].x-x, y0+points[0].y-y); - } - return true; - } - - /** - * Returns a String describing this step. - * - * @return a descriptive string - */ - public String toString() { - String s = "Calibration Points Step " + n //$NON-NLS-1$ - + " [" + format.format(worldX0) //$NON-NLS-1$ - + ", " + format.format(worldY0); //$NON-NLS-1$ - if (points[1] != null) { - s = s + ", " + format.format(worldX1) //$NON-NLS-1$ - + ", " + format.format(worldY1) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - s = s + "]"; //$NON-NLS-1$ - } - return s; - } - -//_________________________ private methods ___________________________ - - /** - * Sets the angle, scale and origin based on the current image and world - * coordinates of both calibration points. - */ - private void updateCoords() { - if (points[1] == null || cal.trackerPanel == null) return; - if (cal.axes == Calibration.X_AXIS) { - updateCoordsXOnly(); - return; - } - else if (cal.axes == Calibration.Y_AXIS) { - updateCoordsYOnly(); - return; - } - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - int n = cal.trackerPanel.getFrameNumber(); - // get the world coordinates of both points - double wx0 = worldX0; - double wy0 = worldY0; - double wx1 = worldX1; - double wy1 = worldY1; - // get the image coordinates of point 0 - double x0 = points[0].getX(); - double y0 = points[0].getY(); - // get the image distance and angle from point 0 to 1 - double id = points[0].distance(points[1]); - double itheta = points[0].angle(points[1]); - // get the world distance and angle from point 0 to 1 - double dwx = wx1 - wx0; - double dwy = wy1 - wy0; - double wd = Math.sqrt(dwx*dwx + dwy*dwy); - double wtheta = -Math.atan2(dwy, dwx); - // set the scale - double factor = id/wd; - coords.setScaleXY(n, factor, factor); - // set the angle - double dtheta = wtheta - itheta; - coords.setAngle(n, dtheta); - // set the origin - // get the current image position of the origin - double xOrigin = coords.getOriginX(n); - double yOrigin = coords.getOriginY(n); - // move the origin to restore point 0 to its original image position - double dx = coords.worldToImageX(n, wx0, wy0) - x0; - double dy = coords.worldToImageY(n, wx0, wy0) - y0; - coords.setOriginXY(n, xOrigin - dx, yOrigin - dy); - } - - /** - * Sets the scale and origin based on the current image and world - * x-coordinates of both calibration points. - */ - private void updateCoordsXOnly() { - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - int n = cal.trackerPanel.getFrameNumber(); - // get the world coordinates of the points - double wx0 = worldX0; - double wy0 = worldY0; - double wx1 = worldX1; - // get the image coordinates of the points - double x0 = points[0].getX(); - double y0 = points[0].getY(); - double x1 = points[1].getX(); - double y1 = points[1].getY(); - // get the image distance and angle from point 0 to 1 - double dI = points[0].distance(points[1]); - double thetaI = -points[0].angle(points[1]); - // get the coords angle - double thetaC = coords.getAngle(n); - // get the image dxI from point 0 to 1 - double dTheta = thetaI-thetaC; - double dxI = dI*Math.cos(dTheta); - // get the world dx from point 0 to 1 - double dxW = wx1 - wx0; - // set the scale - double factor = dxI/dxW; - if (factor > 0) coords.setScaleXY(n, factor, factor); - else { - coords.setScaleXY(n, -factor, -factor); - coords.setAngle(n, thetaC+Math.PI); - } - // get the current image position of the origin - double xOriginI = coords.getOriginX(n); - double yOriginI = coords.getOriginY(n); - // move the origin to restore point 0 to its original image x position - double dx = coords.worldToImageX(n, wx0, wy0) - x0; - double dy = coords.worldToImageY(n, wx0, wy0) - y0; - double theta = thetaC+Math.atan2(dy, dx); - double dOrigin = Math.sqrt(dx*dx+dy*dy)*Math.cos(theta); - double dxOrigin = dOrigin*Math.cos(thetaC); - double dyOrigin = -dOrigin*Math.sin(thetaC); - coords.setOriginXY(n, xOriginI-dxOrigin, yOriginI-dyOrigin); - // set the world units to restore the original y-positions - worldY0 = coords.imageToWorldY(n, x0, y0); - worldY1 = coords.imageToWorldY(n, x1, y1); - } - - /** - * Sets the scale and origin based on the current image and world - * y-coordinates of both calibration points. - */ - private void updateCoordsYOnly() { - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - int n = cal.trackerPanel.getFrameNumber(); - // get the world coordinates of the points - double wx0 = worldX0; - double wy0 = worldY0; - double wy1 = worldY1; - // get the image coordinates of the points - double x0 = points[0].getX(); - double y0 = points[0].getY(); - double x1 = points[1].getX(); - double y1 = points[1].getY(); - // get the image distance and angle from point 0 to 1 - double dI = points[0].distance(points[1]); - double thetaI = -points[0].angle(points[1]); - // get the coords angle - double thetaC = coords.getAngle(n); - // get the image dyI from point 0 to 1 - double dTheta = thetaI-thetaC; - double dyI = dI*Math.sin(dTheta); - // get the world dy from point 0 to 1 - double dyW = wy1 - wy0; - // set the scale - double factor = dyI/dyW; - if (factor > 0) coords.setScaleXY(n, factor, factor); - else { - coords.setScaleXY(n, -factor, -factor); - coords.setAngle(n, thetaC+Math.PI); - } - // get the current image position of the origin - double xOriginI = coords.getOriginX(n); - double yOriginI = coords.getOriginY(n); - // move the origin to restore point 0 to its original image y position - double dx = coords.worldToImageX(n, wx0, wy0) - x0; - double dy = coords.worldToImageY(n, wx0, wy0) - y0; - double theta = thetaC+Math.atan2(dy, dx); - double dOrigin = Math.sqrt(dx*dx+dy*dy)*Math.sin(theta); - double dxOrigin = dOrigin*Math.sin(thetaC); - double dyOrigin = dOrigin*Math.cos(thetaC); - coords.setOriginXY(n, xOriginI-dxOrigin, yOriginI-dyOrigin); - // set the world units to restore the original x-positions - worldX0 = coords.imageToWorldX(n, x0, y0); - worldX1 = coords.imageToWorldX(n, x1, y1); - } - - /** - * Gets the step length. - * - * @return the length of the points array - */ - public static int getLength() { - return 2; - } - -//______________________ inner Position class ________________________ - - /** - * A class that represents the position of a calibration point. - */ - public class Position extends TPoint { - - private double lastX, lastY; - - /** - * Constructs a position with specified image coordinates, - * and transforms those coordinates to set the world coordinates. - * Calibration points are used in pairs to set the origin, scale and angle. - * - * @param x the image x coordinate - * @param y the image y coordinate - */ - public Position(double x, double y) { - super.setXY(x, y); - setCoordsEditTrigger(true); - // set the world coordinates using x and y - if (cal.trackerPanel != null) { - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - int n = cal.trackerPanel.getFrameNumber(); - if (points[0]==null) { // this is first position created - worldX0 = coords.imageToWorldX(n, x, y); - worldY0 = coords.imageToWorldY(n, x, y); - } - else { // this is second position created - worldX1 = coords.imageToWorldX(n, x, y); - worldY1 = coords.imageToWorldY(n, x, y); - } - } - } - - /** - * Overrides TPoint setXY method. This moves the origin so the world - * coordinates do not change. - * - * @param x the x position - * @param y the y position - */ - public void setXY(double x, double y) { - if (track.isLocked()) return; - // calibration points can't share the same image position - int i = this == points[0]? 1: 0; - if (points[i] != null && - points[i].getX() == x && - points[i].getY() == y) { - Toolkit.getDefaultToolkit().beep(); - return; - } - if (isAdjusting()) { - lastX = x; - lastY = y; - } - double dx = x - getX(); - double dy = y - getY(); - super.setXY(x, y); - ImageCoordSystem coords = cal.trackerPanel.getCoords(); - coords.setAdjusting(isAdjusting()); - if (points[1] != null){ - updateCoords(); - } - else if (cal.trackerPanel != null) { - int n = cal.trackerPanel.getFrameNumber(); - // get the current image position of the origin - double x0 = coords.getOriginX(n); - double y0 = coords.getOriginY(n); - // translate the origin - coords.setOriginXY(n, x0 + dx, y0 + dy); - } - if (isAdjusting()) { - repaint(); - } - } - - /** - * Overrides TPoint showCoordinates method. This updates the values - * of the x and y fields. - * - * @param vidPanel the video panel - */ - public void showCoordinates(VideoPanel vidPanel) { - // put values into calibration x and y fields - if (this==points[0]) { - cal.xField.setValue(worldX0); - cal.yField.setValue(worldY0); - } - else { - cal.x1Field.setValue(worldX1); - cal.y1Field.setValue(worldY1); - } - super.showCoordinates(vidPanel); - } - - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - setXY(lastX, lastY); - track.firePropertyChange("step", null, n); //$NON-NLS-1$ - } - } - - } - - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - CalibrationStep step = (CalibrationStep) obj; - double[] data = new double[] {step.worldX0, step.worldY0, step.worldX1, step.worldY1}; - control.setValue("world_coordinates", data); //$NON-NLS-1$ - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - // this loader is not intended to be used to create new steps, - // but only for undo/redo step edits. - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - CalibrationStep step = (CalibrationStep)obj; - double[] data = (double[])control.getObject("world_coordinates"); //$NON-NLS-1$ - if (data!=null) { - step.worldX0 = data[0]; - step.worldY0 = data[1]; - step.worldX1 = data[2]; - step.worldY1 = data[3]; - } - if (step.cal!=null) - step.cal.displayWorldCoordinates(); - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; + +import javax.swing.JOptionPane; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.media.core.*; + +/** + * This is a Step for a Calibration. It is used for + * setting the origin, angle and scale of an ImageCoordSystem. + * + * @author Douglas Brown + */ +public class CalibrationStep extends Step { + + // instance fields + private Calibration cal; + protected double worldX0, worldY0, worldX1=1, worldY1; + + /** + * Constructs a CalibrationStep with specified image coordinates. + * + * @param track the calibration + * @param n the frame number + * @param x the image x coordinate of point 0 + * @param y the image y coordinate of point 0 + */ + public CalibrationStep(Calibration track, int n, double x, double y) { + super(track, n); + cal = track; + screenPoints = new Point[getLength()]; + points = new TPoint[getLength()]; + Position p = new Position(x, y); + points[0] = p; + } + + /** + * Adds a second position point to this step at the specified image coordinates. + * + * @param x the image x coordinate of the position point + * @param y the image y coordinate of the position point + */ + public void addSecondPoint(double x, double y) { + Position p = new Position(x, y); + points[1] = p; + setWorldCoordinates(worldX0, worldY0, worldX1, worldY1); + } + + /** + * Gets the specified position point. + * + * @param n the point number (0 or 1) + * @return the position + */ + public Position getPosition(int n) { + return (Position)points[n]; + } + + /** + * Gets the default point. The default point is the point initially selected + * when the step is created. Overrides step getDefaultPoint method. + * + * @return the default TPoint + */ + public TPoint getDefaultPoint() { + if (points[1] == null) return points[0]; + if (cal.trackerPanel.getSelectedPoint()==points[0]) return points[0]; + return points[1]; + } + + /** + * Overrides Step getMark method. + * + * @param trackerPanel the tracker panel + * @return the mark + */ + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + TPoint selection = null; + if (mark == null) { + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + // set point locations to image positions of world coordinates + for (int i = 0; i < points.length; i++) { + Position pt = (Position)points[i]; + if (pt == null) continue; + double worldX = i==0? worldX0: worldX1; + double worldY = i==0? worldY0: worldY1; + double x = coords.worldToImageX(n, worldX, worldY); + double y = coords.worldToImageY(n, worldX, worldY); + pt.setLocation(x, y); + } + // get point shapes + selection = trackerPanel.getSelectedPoint(); + final Shape[] shapes = new Shape[points.length]; + for (int i = 0; i < points.length; i++) { + if (points[i] == null) continue; + Point p = points[i].getScreenPosition(trackerPanel); + if (selection == points[i]) { // point is selected + transform.setToTranslation(p.x, p.y); + shapes[i] = transform.createTransformedShape(selectionShape); + } + else { // point not selected + shapes[i] = footprint.getShape(new Point[] {p}); + } + } + // create mark + final Color color = footprint.getColor(); + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setPaint(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + for (int i = 0; i < points.length; i++) { + if (shapes[i] != null) g.fill(shapes[i]); + } + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = null; + for (int i = 0; i < points.length; i++) { + if (shapes[i] != null) { + if (bounds == null) bounds = shapes[i].getBounds(); + else bounds.add(shapes[i].getBounds()); + } + } + return bounds; + } + }; + marks.put(trackerPanel, mark); + } + return mark; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + CalibrationStep step = (CalibrationStep)super.clone(); + step.points[0] = step.new Position(points[0].x, points[0].y); + if (points[1] != null) { + step.points[1] = step.new Position(points[1].x, points[1].y); + } + return step; + } + + /** + * Sets the world coordinates. When a single point is visible, + * this sets the coords origin so its image position does not change. + * When both points are visible, this sets the origin, angle and scale + * so neither image position changes. + * + * @param x1 the world x coordinate of pt 1 + * @param y1 the world y coordinate of pt 1 + * @param x2 the world x coordinate of pt 2 + * @param y2 the world x coordinate of pt 2 + * @return true if successfully set + */ + public boolean setWorldCoordinates(double x1, double y1, double x2, double y2) { + if (track.isLocked()) return false; + // points can't share the same world position + boolean sameX = x2==x1; + boolean sameY = y2==y1; + if ((sameX && cal.axes == Calibration.X_AXIS) || + (sameY && cal.axes == Calibration.Y_AXIS) || + (sameX && sameY && cal.axes == Calibration.XY_AXES)) { + JOptionPane.showMessageDialog(track.trackerPanel, + TrackerRes.getString("Calibration.Dialog.InvalidCoordinates.Message"), //$NON-NLS-1$ + TrackerRes.getString("Calibration.Dialog.InvalidCoordinates.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + return false; + } + + if (cal.isFixedCoordinates()) { + CalibrationStep step = (CalibrationStep)cal.steps.getStep(0); + step.worldX0 = x1; + step.worldY0 = y1; + step.worldX1 = x2; + step.worldY1 = y2; + step.erase(); + cal.refreshStep(CalibrationStep.this); // sets properties of this step + } + else { + worldX0 = x1; + worldY0 = y1; + worldX1 = x2; + worldY1 = y2; + cal.keyFrames.add(n); + } + + if (points[1]!=null) { + updateCoords(); + } + else if (cal.trackerPanel!=null) { + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + int n = cal.trackerPanel.getFrameNumber(); + // get the current image position of the origin and points[0] + double x0 = coords.getOriginX(n); + double y0 = coords.getOriginY(n); + double x = coords.worldToImageX(n, worldX0, worldY0); + double y = coords.worldToImageY(n, worldX0, worldY0); + // translate the origin + coords.setOriginXY(n, x0+points[0].x-x, y0+points[0].y-y); + } + return true; + } + + /** + * Returns a String describing this step. + * + * @return a descriptive string + */ + public String toString() { + String s = "Calibration Points Step " + n //$NON-NLS-1$ + + " [" + format.format(worldX0) //$NON-NLS-1$ + + ", " + format.format(worldY0); //$NON-NLS-1$ + if (points[1] != null) { + s = s + ", " + format.format(worldX1) //$NON-NLS-1$ + + ", " + format.format(worldY1) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + s = s + "]"; //$NON-NLS-1$ + } + return s; + } + +//_________________________ private methods ___________________________ + + /** + * Sets the angle, scale and origin based on the current image and world + * coordinates of both calibration points. + */ + private void updateCoords() { + if (points[1] == null || cal.trackerPanel == null) return; + if (cal.axes == Calibration.X_AXIS) { + updateCoordsXOnly(); + return; + } + else if (cal.axes == Calibration.Y_AXIS) { + updateCoordsYOnly(); + return; + } + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + int n = cal.trackerPanel.getFrameNumber(); + // get the world coordinates of both points + double wx0 = worldX0; + double wy0 = worldY0; + double wx1 = worldX1; + double wy1 = worldY1; + // get the image coordinates of point 0 + double x0 = points[0].getX(); + double y0 = points[0].getY(); + // get the image distance and angle from point 0 to 1 + double id = points[0].distance(points[1]); + double itheta = points[0].angle(points[1]); + // get the world distance and angle from point 0 to 1 + double dwx = wx1 - wx0; + double dwy = wy1 - wy0; + double wd = Math.sqrt(dwx*dwx + dwy*dwy); + double wtheta = -Math.atan2(dwy, dwx); + // set the scale + double factor = id/wd; + coords.setScaleXY(n, factor, factor); + // set the angle + double dtheta = wtheta - itheta; + coords.setAngle(n, dtheta); + // set the origin + // get the current image position of the origin + double xOrigin = coords.getOriginX(n); + double yOrigin = coords.getOriginY(n); + // move the origin to restore point 0 to its original image position + double dx = coords.worldToImageX(n, wx0, wy0) - x0; + double dy = coords.worldToImageY(n, wx0, wy0) - y0; + coords.setOriginXY(n, xOrigin - dx, yOrigin - dy); + } + + /** + * Sets the scale and origin based on the current image and world + * x-coordinates of both calibration points. + */ + private void updateCoordsXOnly() { + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + int n = cal.trackerPanel.getFrameNumber(); + // get the world coordinates of the points + double wx0 = worldX0; + double wy0 = worldY0; + double wx1 = worldX1; + // get the image coordinates of the points + double x0 = points[0].getX(); + double y0 = points[0].getY(); + double x1 = points[1].getX(); + double y1 = points[1].getY(); + // get the image distance and angle from point 0 to 1 + double dI = points[0].distance(points[1]); + double thetaI = -points[0].angle(points[1]); + // get the coords angle + double thetaC = coords.getAngle(n); + // get the image dxI from point 0 to 1 + double dTheta = thetaI-thetaC; + double dxI = dI*Math.cos(dTheta); + // get the world dx from point 0 to 1 + double dxW = wx1 - wx0; + // set the scale + double factor = dxI/dxW; + if (factor > 0) coords.setScaleXY(n, factor, factor); + else { + coords.setScaleXY(n, -factor, -factor); + coords.setAngle(n, thetaC+Math.PI); + } + // get the current image position of the origin + double xOriginI = coords.getOriginX(n); + double yOriginI = coords.getOriginY(n); + // move the origin to restore point 0 to its original image x position + double dx = coords.worldToImageX(n, wx0, wy0) - x0; + double dy = coords.worldToImageY(n, wx0, wy0) - y0; + double theta = thetaC+Math.atan2(dy, dx); + double dOrigin = Math.sqrt(dx*dx+dy*dy)*Math.cos(theta); + double dxOrigin = dOrigin*Math.cos(thetaC); + double dyOrigin = -dOrigin*Math.sin(thetaC); + coords.setOriginXY(n, xOriginI-dxOrigin, yOriginI-dyOrigin); + // set the world units to restore the original y-positions + worldY0 = coords.imageToWorldY(n, x0, y0); + worldY1 = coords.imageToWorldY(n, x1, y1); + } + + /** + * Sets the scale and origin based on the current image and world + * y-coordinates of both calibration points. + */ + private void updateCoordsYOnly() { + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + int n = cal.trackerPanel.getFrameNumber(); + // get the world coordinates of the points + double wx0 = worldX0; + double wy0 = worldY0; + double wy1 = worldY1; + // get the image coordinates of the points + double x0 = points[0].getX(); + double y0 = points[0].getY(); + double x1 = points[1].getX(); + double y1 = points[1].getY(); + // get the image distance and angle from point 0 to 1 + double dI = points[0].distance(points[1]); + double thetaI = -points[0].angle(points[1]); + // get the coords angle + double thetaC = coords.getAngle(n); + // get the image dyI from point 0 to 1 + double dTheta = thetaI-thetaC; + double dyI = dI*Math.sin(dTheta); + // get the world dy from point 0 to 1 + double dyW = wy1 - wy0; + // set the scale + double factor = dyI/dyW; + if (factor > 0) coords.setScaleXY(n, factor, factor); + else { + coords.setScaleXY(n, -factor, -factor); + coords.setAngle(n, thetaC+Math.PI); + } + // get the current image position of the origin + double xOriginI = coords.getOriginX(n); + double yOriginI = coords.getOriginY(n); + // move the origin to restore point 0 to its original image y position + double dx = coords.worldToImageX(n, wx0, wy0) - x0; + double dy = coords.worldToImageY(n, wx0, wy0) - y0; + double theta = thetaC+Math.atan2(dy, dx); + double dOrigin = Math.sqrt(dx*dx+dy*dy)*Math.sin(theta); + double dxOrigin = dOrigin*Math.sin(thetaC); + double dyOrigin = dOrigin*Math.cos(thetaC); + coords.setOriginXY(n, xOriginI-dxOrigin, yOriginI-dyOrigin); + // set the world units to restore the original x-positions + worldX0 = coords.imageToWorldX(n, x0, y0); + worldX1 = coords.imageToWorldX(n, x1, y1); + } + + /** + * Gets the step length. + * + * @return the length of the points array + */ + public static int getLength() { + return 2; + } + +//______________________ inner Position class ________________________ + + /** + * A class that represents the position of a calibration point. + */ + public class Position extends TPoint { + + private double lastX, lastY; + + /** + * Constructs a position with specified image coordinates, + * and transforms those coordinates to set the world coordinates. + * Calibration points are used in pairs to set the origin, scale and angle. + * + * @param x the image x coordinate + * @param y the image y coordinate + */ + public Position(double x, double y) { + super.setXY(x, y); + setCoordsEditTrigger(true); + // set the world coordinates using x and y + if (cal.trackerPanel != null) { + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + int n = cal.trackerPanel.getFrameNumber(); + if (points[0]==null) { // this is first position created + worldX0 = coords.imageToWorldX(n, x, y); + worldY0 = coords.imageToWorldY(n, x, y); + } + else { // this is second position created + worldX1 = coords.imageToWorldX(n, x, y); + worldY1 = coords.imageToWorldY(n, x, y); + } + } + } + + /** + * Overrides TPoint setXY method. This moves the origin so the world + * coordinates do not change. + * + * @param x the x position + * @param y the y position + */ + public void setXY(double x, double y) { + if (track.isLocked()) return; + // calibration points can't share the same image position + int i = this == points[0]? 1: 0; + if (points[i] != null && + points[i].getX() == x && + points[i].getY() == y) { + Toolkit.getDefaultToolkit().beep(); + return; + } + if (isAdjusting()) { + lastX = x; + lastY = y; + } + double dx = x - getX(); + double dy = y - getY(); + super.setXY(x, y); + ImageCoordSystem coords = cal.trackerPanel.getCoords(); + coords.setAdjusting(isAdjusting()); + if (points[1] != null){ + updateCoords(); + } + else if (cal.trackerPanel != null) { + int n = cal.trackerPanel.getFrameNumber(); + // get the current image position of the origin + double x0 = coords.getOriginX(n); + double y0 = coords.getOriginY(n); + // translate the origin + coords.setOriginXY(n, x0 + dx, y0 + dy); + } + if (isAdjusting()) { + repaint(); + } + } + + /** + * Overrides TPoint showCoordinates method. This updates the values + * of the x and y fields. + * + * @param vidPanel the video panel + */ + public void showCoordinates(VideoPanel vidPanel) { + // put values into calibration x and y fields + if (this==points[0]) { + cal.xField.setValue(worldX0); + cal.yField.setValue(worldY0); + } + else { + cal.x1Field.setValue(worldX1); + cal.y1Field.setValue(worldY1); + } + super.showCoordinates(vidPanel); + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + setXY(lastX, lastY); + track.firePropertyChange("step", null, n); //$NON-NLS-1$ + } + } + + } + + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + CalibrationStep step = (CalibrationStep) obj; + double[] data = new double[] {step.worldX0, step.worldY0, step.worldX1, step.worldY1}; + control.setValue("world_coordinates", data); //$NON-NLS-1$ + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + // this loader is not intended to be used to create new steps, + // but only for undo/redo step edits. + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + CalibrationStep step = (CalibrationStep)obj; + double[] data = (double[])control.getObject("world_coordinates"); //$NON-NLS-1$ + if (data!=null) { + step.worldX0 = data[0]; + step.worldY0 = data[1]; + step.worldX1 = data[2]; + step.worldY1 = data[3]; + } + if (step.cal!=null) + step.cal.displayWorldCoordinates(); + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java index 476145a6..bb4e20a4 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java @@ -1,540 +1,540 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * A CenterOfMass tracks the position, velocity and acceleration - * of the center of mass of a set of point mass objects. - * - * @author Douglas Brown - */ -public class CenterOfMass extends PointMass { - - // instance fields - protected PointMass[] masses; - protected ArrayList massNames = new ArrayList(); - protected JMenuItem inspectorItem; - protected DatasetManager newData; - protected CenterOfMassInspector inspector; - - /** - * Constructs an empty CenterOfMass. - */ - public CenterOfMass() { - this(new PointMass[0]); - } - - /** - * Constructs a CenterOfMass with specified masses. - * - * @param masses an array of point masses - */ - public CenterOfMass(PointMass[] masses) { - super(); - defaultColors = new Color[] {new Color(51, 204, 51)}; - massField.setMinValue(0); - setName(TrackerRes.getString("CenterOfMass.New.Name")); //$NON-NLS-1$ - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.Spot"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SolidDiamond"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SolidTriangle"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SolidCircle"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.BoldVerticalLine"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.BoldHorizontalLine"), //$NON-NLS-1$ - new PositionVectorFootprint(this, "Footprint.BoldPositionVector", 2)}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - this.masses = masses; - setColor(defaultColors[0]); - for (int i = 0; i < masses.length; i++) - masses[i].addPropertyChangeListener(this); - locked = true; - // set initial hint - if (masses.length == 0) - hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ - update(); - } - - /** - * Overrides PointMass draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - // add masses listed in massNames - if (!massNames.isEmpty() && panel instanceof TrackerPanel) { - TrackerPanel trackerPanel = (TrackerPanel) panel; - if (trackerPanel instanceof WorldTView) { - trackerPanel = ((WorldTView)trackerPanel).getTrackerPanel(); - } - ArrayList masses = trackerPanel.getDrawables(PointMass.class); - Iterator it = massNames.iterator(); - while (it.hasNext()) { - String name = it.next(); - for (PointMass mass: masses) { - if (mass.getName().equals(name)) - addMass(mass); - } - } - massNames.clear(); - } - super.draw(panel, _g); - } - - /** - * Adds a mass to the cm system. - * - * @param m the mass - */ - public void addMass(PointMass m) { - synchronized(masses) { - // don't add if already present - for (int i = 0; i < masses.length; i++) { - if (masses[i] == m) return; - } - PointMass[] newMasses = new PointMass[masses.length + 1]; - System.arraycopy(masses, 0, newMasses, 0, masses.length); - newMasses[masses.length] = m; - masses = newMasses; - m.addPropertyChangeListener(this); - } - update(); - } - - /** - * Removes a mass from the cm system. - * - * @param m the mass - */ - public void removeMass(PointMass m) { - synchronized(masses) { - for (int i = 0; i < masses.length; i++) - if (masses[i] == m) { - m.removePropertyChangeListener(this); - PointMass[] newMasses = new PointMass[masses.length - 1]; - System.arraycopy(masses, 0, newMasses, 0, i); - System.arraycopy(masses, i+1, newMasses, i, newMasses.length-i); - masses = newMasses; - break; - } - } - update(); - } - - /** - * Gets the array of masses in this cm. - * - * @return a shallow clone of the masses array - */ - public PointMass[] getMasses() { - synchronized(masses) { - return masses.clone(); - } - } - - /** - * Determines if the specified point mass is in this center of mass. - * - * @param m the point mass - * @return true if m is in this cm - */ - public boolean containsMass(PointMass m) { - synchronized(masses) { - for (int i = 0; i < masses.length; i++) { - if (masses[i] == m) return true; - } - return false; - } - } - - /** - * Overrides PointMass findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step or motion vector that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - Interactive ia = super.findInteractive(panel, xpix, ypix); - if (ia instanceof PositionStep.Position) { - hint = TrackerRes.getString("PointMass.Position.Locked.Hint"); //$NON-NLS-1$ - } - else if (masses.length == 0) { - hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ - } - else hint = null; - return ia; - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - if (inspector!=null && inspector.isVisible()) { - // call setVisible to force inspector to resize itself - inspector.setVisible(true); - } - } - - /** - * Overrides TTrack setLocked method. CenterOfMass is always locked. - * - * @param locked ignored - */ - public void setLocked(boolean locked) {/** empty block */} - - /** - * Overrides PointMass setMass method. Mass is determined by masses. - * - * @param mass ignored - */ - public void setMass(double mass) {/** empty block */} - - /** - * Overrides TTrack isStepComplete method. Always returns true. - * - * @param n the frame number - * @return true always since cm gets data from point masses - */ - public boolean isStepComplete(int n) { - return true; - } - - /** - * Overrides TTrack isDependent method to return true. - * - * @return true if this track is dependent - */ - public boolean isDependent() { - return true; - } - - /** - * Determines if any point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return false; - } - - /** - * Responds to property change events. CenterOfMass responds to the - * following events: "track" from tracker panel, "mass" and "step" - * from PointMass, "steps" from ParticleModel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("track") && e.getNewValue() == null) { // track deleted //$NON-NLS-1$ - TTrack track = (TTrack)e.getOldValue(); - if (track instanceof PointMass) - removeMass((PointMass)track); - } - if (e.getSource() instanceof PointMass) { - if (name.equals("mass")) //$NON-NLS-1$ - update(); - else if (name.equals("step")){ //$NON-NLS-1$ - int n = ((Integer)e.getNewValue()).intValue(); - update(n, true); - } - else if (name.equals("steps")){ //$NON-NLS-1$ - update(); - } - } - else super.propertyChange(e); - } - - /** - * Cleans up associated resources when this track is deleted or cleared. - */ - protected void cleanup() { - super.cleanup(); - if (inspector != null) inspector.dispose(); - } - - /** - * Updates all cm steps. - */ - private void update() { - // update mass and count steps - mass = 0; - int length = getSteps().length; - for (int i = 0; i < masses.length; i++) { - mass += masses[i].getMass(); - length = Math.max(length, masses[i].getSteps().length); - } - // update steps - for (int n = 0; n < length; n++) - update(n, false); - updateDerivatives(); - support.firePropertyChange("steps", null, null); //$NON-NLS-1$ - repaint(); - // update inspector, if visible - if (inspector != null && - inspector.isVisible()) { - inspector.updateDisplay(); - } - } - - /** - * Updates the specified cm step. - * - * @param n the frame number - */ - private void update(int n, boolean firePropertyChange) { - if (mass == 0) { // delete cm step, if any - if (firePropertyChange) { - locked = false; - deleteStep(n); - } - else { - steps.setStep(n, null); - } - locked = true; - return; - } - double x = 0, y = 0; // cm x and y coordinates in imagespace - // determine cm step position in imagespace - for (int i = 0; i < masses.length; i++) { - PositionStep step = (PositionStep)masses[i].getStep(n); - if (step == null) { // if any mass data missing, - if (getStep(n) != null) { // delete existing cm step if any - if (firePropertyChange) { - locked = false; - Step deletedStep = deleteStep(n); - repaint(deletedStep); - } - else { - steps.setStep(n, null); - } - locked = true; - } - return; - } - - double m = masses[i].getMass(); - x += m * step.getPosition().getX(); - y += m * step.getPosition().getY(); - } - - x /= mass; // cm x coordinate - y /= mass; // cm y coordinate - - // create cm step if none exists - PositionStep cmStep = (PositionStep)getStep(n); - if (cmStep == null) { - if (firePropertyChange) { - locked = false; - cmStep = (PositionStep)createStep(n, x, y); - repaint(cmStep); - } - else { - cmStep = new PositionStep(this, n, x, y); - steps.setStep(n, cmStep); - cmStep.setFootprint(getFootprint()); - } - } - // or set position of existing cm step - else { - if (firePropertyChange) { - locked = false; - cmStep.getPosition().setXY(x, y); - } - else { - point.setLocation(x, y); - cmStep.getPosition().setPosition(point); - } - } - locked = true; - } - - /** - * Returns a menu with items that control this track. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - // create a cm inspector item - inspectorItem = new JMenuItem(TrackerRes.getString("CenterOfMass.MenuItem.Inspector")); //$NON-NLS-1$ - inspectorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - CenterOfMassInspector inspector = getInspector(); - inspector.updateDisplay(); - inspector.setVisible(true); - } - }); - // assemble the menu - JMenu menu = super.getMenu(trackerPanel); - // remove unwanted menu items and separators - menu.remove(lockedItem); - menu.remove(autoAdvanceItem); - menu.remove(markByDefaultItem); - menu.insert(inspectorItem, 0); - if (menu.getItemCount() > 1) - menu.insertSeparator(1); - // eliminate any double separators - Object prevItem = inspectorItem; - int n = menu.getItemCount(); - for (int j = 1; j < n; j++) { - Object item = menu.getItem(j); - if (item == null && prevItem == null) { // found extra separator - menu.remove(j-1); - j = j-1; - n = n-1; - } - prevItem = item; - } - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return the DataSetManager - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - massField.setEnabled(false); - return list; - } - - /** - * Overrides TTrack getToolbarPointComponents method. - * - * @param trackerPanel the tracker panel - * @param point the TPoint - * @return a list of components - */ - public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, - TPoint point) { - ArrayList list = super.getToolbarPointComponents(trackerPanel, point); - xField.setEnabled(false); - yField.setEnabled(false); - return list; - } - - /** - * Overrides PointMass toString method. - * - * @return a description of this object - */ - public String toString() { - return TrackerRes.getString("CenterOfMass.Name"); //$NON-NLS-1$ - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - CenterOfMass cm = (CenterOfMass)obj; - // save mass names - ArrayList list = new ArrayList(); - PointMass[] masses = cm.getMasses(); - for (int i = 0; i < masses.length; i++) { - list.add(masses[i].getName()); - } - control.setValue("masses", list); //$NON-NLS-1$ - // save point mass data - XML.getLoader(PointMass.class).saveObject(control, obj); - } - - /** - * Creates a new object. - * - * @param control an XMLControl - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new CenterOfMass(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - CenterOfMass cm = (CenterOfMass)obj; - XML.getLoader(PointMass.class).loadObject(control, obj); - // load mass names - Collection names = Collection.class.cast(control.getObject("masses")); //$NON-NLS-1$ - Iterator it = names.iterator(); - while (it.hasNext()) { - cm.massNames.add((String)it.next()); - } - return obj; - } - } - - /** - * Gets the center of mass inspector. - * - * @return the center of mass inspector - */ - public CenterOfMassInspector getInspector() { - if (inspector == null) { - inspector = new CenterOfMassInspector(this); - inspector.setLocation(200, 200); - } - return inspector; - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * A CenterOfMass tracks the position, velocity and acceleration + * of the center of mass of a set of point mass objects. + * + * @author Douglas Brown + */ +public class CenterOfMass extends PointMass { + + // instance fields + protected PointMass[] masses; + protected ArrayList massNames = new ArrayList(); + protected JMenuItem inspectorItem; + protected DatasetManager newData; + protected CenterOfMassInspector inspector; + + /** + * Constructs an empty CenterOfMass. + */ + public CenterOfMass() { + this(new PointMass[0]); + } + + /** + * Constructs a CenterOfMass with specified masses. + * + * @param masses an array of point masses + */ + public CenterOfMass(PointMass[] masses) { + super(); + defaultColors = new Color[] {new Color(51, 204, 51)}; + massField.setMinValue(0); + setName(TrackerRes.getString("CenterOfMass.New.Name")); //$NON-NLS-1$ + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.Spot"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SolidDiamond"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SolidTriangle"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SolidCircle"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.BoldVerticalLine"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.BoldHorizontalLine"), //$NON-NLS-1$ + new PositionVectorFootprint(this, "Footprint.BoldPositionVector", 2)}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + this.masses = masses; + setColor(defaultColors[0]); + for (int i = 0; i < masses.length; i++) + masses[i].addPropertyChangeListener(this); + locked = true; + // set initial hint + if (masses.length == 0) + hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ + update(); + } + + /** + * Overrides PointMass draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + // add masses listed in massNames + if (!massNames.isEmpty() && panel instanceof TrackerPanel) { + TrackerPanel trackerPanel = (TrackerPanel) panel; + if (trackerPanel instanceof WorldTView) { + trackerPanel = ((WorldTView)trackerPanel).getTrackerPanel(); + } + ArrayList masses = trackerPanel.getDrawables(PointMass.class); + Iterator it = massNames.iterator(); + while (it.hasNext()) { + String name = it.next(); + for (PointMass mass: masses) { + if (mass.getName().equals(name)) + addMass(mass); + } + } + massNames.clear(); + } + super.draw(panel, _g); + } + + /** + * Adds a mass to the cm system. + * + * @param m the mass + */ + public void addMass(PointMass m) { + synchronized(masses) { + // don't add if already present + for (int i = 0; i < masses.length; i++) { + if (masses[i] == m) return; + } + PointMass[] newMasses = new PointMass[masses.length + 1]; + System.arraycopy(masses, 0, newMasses, 0, masses.length); + newMasses[masses.length] = m; + masses = newMasses; + m.addPropertyChangeListener(this); + } + update(); + } + + /** + * Removes a mass from the cm system. + * + * @param m the mass + */ + public void removeMass(PointMass m) { + synchronized(masses) { + for (int i = 0; i < masses.length; i++) + if (masses[i] == m) { + m.removePropertyChangeListener(this); + PointMass[] newMasses = new PointMass[masses.length - 1]; + System.arraycopy(masses, 0, newMasses, 0, i); + System.arraycopy(masses, i+1, newMasses, i, newMasses.length-i); + masses = newMasses; + break; + } + } + update(); + } + + /** + * Gets the array of masses in this cm. + * + * @return a shallow clone of the masses array + */ + public PointMass[] getMasses() { + synchronized(masses) { + return masses.clone(); + } + } + + /** + * Determines if the specified point mass is in this center of mass. + * + * @param m the point mass + * @return true if m is in this cm + */ + public boolean containsMass(PointMass m) { + synchronized(masses) { + for (int i = 0; i < masses.length; i++) { + if (masses[i] == m) return true; + } + return false; + } + } + + /** + * Overrides PointMass findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step or motion vector that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + Interactive ia = super.findInteractive(panel, xpix, ypix); + if (ia instanceof PositionStep.Position) { + hint = TrackerRes.getString("PointMass.Position.Locked.Hint"); //$NON-NLS-1$ + } + else if (masses.length == 0) { + hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ + } + else hint = null; + return ia; + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + if (inspector!=null && inspector.isVisible()) { + // call setVisible to force inspector to resize itself + inspector.setVisible(true); + } + } + + /** + * Overrides TTrack setLocked method. CenterOfMass is always locked. + * + * @param locked ignored + */ + public void setLocked(boolean locked) {/** empty block */} + + /** + * Overrides PointMass setMass method. Mass is determined by masses. + * + * @param mass ignored + */ + public void setMass(double mass) {/** empty block */} + + /** + * Overrides TTrack isStepComplete method. Always returns true. + * + * @param n the frame number + * @return true always since cm gets data from point masses + */ + public boolean isStepComplete(int n) { + return true; + } + + /** + * Overrides TTrack isDependent method to return true. + * + * @return true if this track is dependent + */ + public boolean isDependent() { + return true; + } + + /** + * Determines if any point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return false; + } + + /** + * Responds to property change events. CenterOfMass responds to the + * following events: "track" from tracker panel, "mass" and "step" + * from PointMass, "steps" from ParticleModel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("track") && e.getNewValue() == null) { // track deleted //$NON-NLS-1$ + TTrack track = (TTrack)e.getOldValue(); + if (track instanceof PointMass) + removeMass((PointMass)track); + } + if (e.getSource() instanceof PointMass) { + if (name.equals("mass")) //$NON-NLS-1$ + update(); + else if (name.equals("step")){ //$NON-NLS-1$ + int n = ((Integer)e.getNewValue()).intValue(); + update(n, true); + } + else if (name.equals("steps")){ //$NON-NLS-1$ + update(); + } + } + else super.propertyChange(e); + } + + /** + * Cleans up associated resources when this track is deleted or cleared. + */ + protected void cleanup() { + super.cleanup(); + if (inspector != null) inspector.dispose(); + } + + /** + * Updates all cm steps. + */ + private void update() { + // update mass and count steps + mass = 0; + int length = getSteps().length; + for (int i = 0; i < masses.length; i++) { + mass += masses[i].getMass(); + length = Math.max(length, masses[i].getSteps().length); + } + // update steps + for (int n = 0; n < length; n++) + update(n, false); + updateDerivatives(); + support.firePropertyChange("steps", null, null); //$NON-NLS-1$ + repaint(); + // update inspector, if visible + if (inspector != null && + inspector.isVisible()) { + inspector.updateDisplay(); + } + } + + /** + * Updates the specified cm step. + * + * @param n the frame number + */ + private void update(int n, boolean firePropertyChange) { + if (mass == 0) { // delete cm step, if any + if (firePropertyChange) { + locked = false; + deleteStep(n); + } + else { + steps.setStep(n, null); + } + locked = true; + return; + } + double x = 0, y = 0; // cm x and y coordinates in imagespace + // determine cm step position in imagespace + for (int i = 0; i < masses.length; i++) { + PositionStep step = (PositionStep)masses[i].getStep(n); + if (step == null) { // if any mass data missing, + if (getStep(n) != null) { // delete existing cm step if any + if (firePropertyChange) { + locked = false; + Step deletedStep = deleteStep(n); + repaint(deletedStep); + } + else { + steps.setStep(n, null); + } + locked = true; + } + return; + } + + double m = masses[i].getMass(); + x += m * step.getPosition().getX(); + y += m * step.getPosition().getY(); + } + + x /= mass; // cm x coordinate + y /= mass; // cm y coordinate + + // create cm step if none exists + PositionStep cmStep = (PositionStep)getStep(n); + if (cmStep == null) { + if (firePropertyChange) { + locked = false; + cmStep = (PositionStep)createStep(n, x, y); + repaint(cmStep); + } + else { + cmStep = new PositionStep(this, n, x, y); + steps.setStep(n, cmStep); + cmStep.setFootprint(getFootprint()); + } + } + // or set position of existing cm step + else { + if (firePropertyChange) { + locked = false; + cmStep.getPosition().setXY(x, y); + } + else { + point.setLocation(x, y); + cmStep.getPosition().setPosition(point); + } + } + locked = true; + } + + /** + * Returns a menu with items that control this track. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + // create a cm inspector item + inspectorItem = new JMenuItem(TrackerRes.getString("CenterOfMass.MenuItem.Inspector")); //$NON-NLS-1$ + inspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + CenterOfMassInspector inspector = getInspector(); + inspector.updateDisplay(); + inspector.setVisible(true); + } + }); + // assemble the menu + JMenu menu = super.getMenu(trackerPanel); + // remove unwanted menu items and separators + menu.remove(lockedItem); + menu.remove(autoAdvanceItem); + menu.remove(markByDefaultItem); + menu.insert(inspectorItem, 0); + if (menu.getItemCount() > 1) + menu.insertSeparator(1); + // eliminate any double separators + Object prevItem = inspectorItem; + int n = menu.getItemCount(); + for (int j = 1; j < n; j++) { + Object item = menu.getItem(j); + if (item == null && prevItem == null) { // found extra separator + menu.remove(j-1); + j = j-1; + n = n-1; + } + prevItem = item; + } + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return the DataSetManager + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + massField.setEnabled(false); + return list; + } + + /** + * Overrides TTrack getToolbarPointComponents method. + * + * @param trackerPanel the tracker panel + * @param point the TPoint + * @return a list of components + */ + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + xField.setEnabled(false); + yField.setEnabled(false); + return list; + } + + /** + * Overrides PointMass toString method. + * + * @return a description of this object + */ + public String toString() { + return TrackerRes.getString("CenterOfMass.Name"); //$NON-NLS-1$ + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + CenterOfMass cm = (CenterOfMass)obj; + // save mass names + ArrayList list = new ArrayList(); + PointMass[] masses = cm.getMasses(); + for (int i = 0; i < masses.length; i++) { + list.add(masses[i].getName()); + } + control.setValue("masses", list); //$NON-NLS-1$ + // save point mass data + XML.getLoader(PointMass.class).saveObject(control, obj); + } + + /** + * Creates a new object. + * + * @param control an XMLControl + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new CenterOfMass(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + CenterOfMass cm = (CenterOfMass)obj; + XML.getLoader(PointMass.class).loadObject(control, obj); + // load mass names + Collection names = Collection.class.cast(control.getObject("masses")); //$NON-NLS-1$ + Iterator it = names.iterator(); + while (it.hasNext()) { + cm.massNames.add((String)it.next()); + } + return obj; + } + } + + /** + * Gets the center of mass inspector. + * + * @return the center of mass inspector + */ + public CenterOfMassInspector getInspector() { + if (inspector == null) { + inspector = new CenterOfMassInspector(this); + inspector.setLocation(200, 200); + } + return inspector; + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java index e26f216e..f97e4418 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java @@ -1,240 +1,240 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.*; - -import org.opensourcephysics.tools.FontSizer; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; - -/** - * This displays and sets CenterOfMass properties. - * - * @author Douglas Brown - */ -public class CenterOfMassInspector extends JDialog - implements PropertyChangeListener { - - // instance fields - protected CenterOfMass cm; - protected TrackerPanel trackerPanel; - protected JButton okButton; - protected JPanel checkboxPanel; - protected ActionListener listener; - protected boolean isVisible; - - /** - * Constructs a CenterOfMassInspector. - * - * @param track the center of mass track - */ - public CenterOfMassInspector(CenterOfMass track) { - super(JOptionPane.getFrameForComponent(track.trackerPanel), false); - cm = track; - trackerPanel = cm.trackerPanel; - if (trackerPanel != null) { - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - // listener for the point mass checkboxes - listener = new ActionListener() { - public void actionPerformed(ActionEvent e) {updateCM();} - }; - setResizable(false); - createGUI(); - initialize(); - pack(); - } - - /** - * Initializes this inpector. - */ - public void initialize() { - updateDisplay(); - } - - /** - * Responds to property change events. This listens for the - * following events: "tab" from TFrame. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (trackerPanel != null && e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - else updateDisplay(); - } - - /** - * Overrides JDialog setVisible method. - * - * @param vis true to show this inspector - */ - public void setVisible(boolean vis) { - if (vis) { - FontSizer.setFonts(this, FontSizer.getLevel()); - pack(); - } - super.setVisible(vis); - isVisible = vis; - } - - /** - * Disposes of this inspector. - */ - public void dispose() { - checkboxPanel.removeAll(); - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - Iterator it = trackerPanel.getDrawables(PointMass.class).iterator(); - while (it.hasNext()) { - PointMass p = it.next(); - p.removePropertyChangeListener("name", this); //$NON-NLS-1$ - p.removePropertyChangeListener("color", this); //$NON-NLS-1$ - p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - super.dispose(); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - JPanel inspectorPanel = new JPanel(new BorderLayout()); - setContentPane(inspectorPanel); - // create checkboxPanel - checkboxPanel = new JPanel(new GridLayout(0, 1)); - Border etched = BorderFactory.createEtchedBorder(); - TitledBorder title = BorderFactory.createTitledBorder(etched, - TrackerRes.getString("CenterOfMassInspector.Border.Title")); //$NON-NLS-1$ - checkboxPanel.setBorder(title); - inspectorPanel.add(checkboxPanel, BorderLayout.CENTER); - // create ok button - okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - okButton.setForeground(new Color(0, 0, 102)); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - // create buttonbar at bottom - JPanel buttonbar = new JPanel(new GridLayout(1, 3)); - buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); - inspectorPanel.add(buttonbar, BorderLayout.SOUTH); - Box box = Box.createHorizontalBox(); - buttonbar.add(box); - buttonbar.add(okButton); - box = Box.createHorizontalBox(); - buttonbar.add(box); - } - - /** - * Updates the center of mass to reflect the current checkbox states. - */ - private void updateCM() { - // get the checkbox array - Component[] checkboxes = checkboxPanel.getComponents(); - for (int i = 0; i < checkboxes.length; i++) { - JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem)checkboxes[i]; - // get the pointmass - PointMass m = getPointMass(checkbox.getActionCommand()); - if (checkbox.isSelected() && !cm.containsMass(m)) - cm.addMass(m); - if (!checkbox.isSelected() && cm.containsMass(m)) - cm.removeMass(m); - } - cm.trackerPanel.repaint(); - } - - /** - * Gets the point mass with the specified name. - * - * @param name name of the point mass - * @return the point mass - */ - private PointMass getPointMass(String name) { - ArrayList masses = trackerPanel.getDrawables(PointMass.class); - for (PointMass m: masses) { - if (m.getName() == name) return m; - } - return null; - } - - /** - * Updates this inspector to show cm's current masses. - */ - protected void updateDisplay() { - setTitle(TrackerRes.getString("CenterOfMassInspector.Title") //$NON-NLS-1$ - + " \"" + cm.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ - // make checkboxes for all point masses in tracker panel - checkboxPanel.removeAll(); - Iterator it = trackerPanel.getDrawables(PointMass.class).iterator(); - while (it.hasNext()) { - PointMass m = it.next(); - m.removePropertyChangeListener("name", this); //$NON-NLS-1$ - m.removePropertyChangeListener("color", this); //$NON-NLS-1$ - m.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - m.addPropertyChangeListener("name", this); //$NON-NLS-1$ - m.addPropertyChangeListener("color", this); //$NON-NLS-1$ - m.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - if (m instanceof CenterOfMass) continue; // don't include other cms - JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem( - m.getName(), m.getFootprint().getIcon(21, 16)); - // check the checkbox if m is in the cm - if (cm.containsMass(m)) checkbox.setSelected(true); - checkbox.addActionListener(listener); - checkboxPanel.add(checkbox); - } - FontSizer.setFonts(checkboxPanel, FontSizer.getLevel()); - pack(); - repaint(); - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.*; + +import org.opensourcephysics.tools.FontSizer; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeEvent; + +/** + * This displays and sets CenterOfMass properties. + * + * @author Douglas Brown + */ +public class CenterOfMassInspector extends JDialog + implements PropertyChangeListener { + + // instance fields + protected CenterOfMass cm; + protected TrackerPanel trackerPanel; + protected JButton okButton; + protected JPanel checkboxPanel; + protected ActionListener listener; + protected boolean isVisible; + + /** + * Constructs a CenterOfMassInspector. + * + * @param track the center of mass track + */ + public CenterOfMassInspector(CenterOfMass track) { + super(JOptionPane.getFrameForComponent(track.trackerPanel), false); + cm = track; + trackerPanel = cm.trackerPanel; + if (trackerPanel != null) { + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + // listener for the point mass checkboxes + listener = new ActionListener() { + public void actionPerformed(ActionEvent e) {updateCM();} + }; + setResizable(false); + createGUI(); + initialize(); + pack(); + } + + /** + * Initializes this inpector. + */ + public void initialize() { + updateDisplay(); + } + + /** + * Responds to property change events. This listens for the + * following events: "tab" from TFrame. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (trackerPanel != null && e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + else updateDisplay(); + } + + /** + * Overrides JDialog setVisible method. + * + * @param vis true to show this inspector + */ + public void setVisible(boolean vis) { + if (vis) { + FontSizer.setFonts(this, FontSizer.getLevel()); + pack(); + } + super.setVisible(vis); + isVisible = vis; + } + + /** + * Disposes of this inspector. + */ + public void dispose() { + checkboxPanel.removeAll(); + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + Iterator it = trackerPanel.getDrawables(PointMass.class).iterator(); + while (it.hasNext()) { + PointMass p = it.next(); + p.removePropertyChangeListener("name", this); //$NON-NLS-1$ + p.removePropertyChangeListener("color", this); //$NON-NLS-1$ + p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.dispose(); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + JPanel inspectorPanel = new JPanel(new BorderLayout()); + setContentPane(inspectorPanel); + // create checkboxPanel + checkboxPanel = new JPanel(new GridLayout(0, 1)); + Border etched = BorderFactory.createEtchedBorder(); + TitledBorder title = BorderFactory.createTitledBorder(etched, + TrackerRes.getString("CenterOfMassInspector.Border.Title")); //$NON-NLS-1$ + checkboxPanel.setBorder(title); + inspectorPanel.add(checkboxPanel, BorderLayout.CENTER); + // create ok button + okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + okButton.setForeground(new Color(0, 0, 102)); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + // create buttonbar at bottom + JPanel buttonbar = new JPanel(new GridLayout(1, 3)); + buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); + inspectorPanel.add(buttonbar, BorderLayout.SOUTH); + Box box = Box.createHorizontalBox(); + buttonbar.add(box); + buttonbar.add(okButton); + box = Box.createHorizontalBox(); + buttonbar.add(box); + } + + /** + * Updates the center of mass to reflect the current checkbox states. + */ + private void updateCM() { + // get the checkbox array + Component[] checkboxes = checkboxPanel.getComponents(); + for (int i = 0; i < checkboxes.length; i++) { + JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem)checkboxes[i]; + // get the pointmass + PointMass m = getPointMass(checkbox.getActionCommand()); + if (checkbox.isSelected() && !cm.containsMass(m)) + cm.addMass(m); + if (!checkbox.isSelected() && cm.containsMass(m)) + cm.removeMass(m); + } + cm.trackerPanel.repaint(); + } + + /** + * Gets the point mass with the specified name. + * + * @param name name of the point mass + * @return the point mass + */ + private PointMass getPointMass(String name) { + ArrayList masses = trackerPanel.getDrawables(PointMass.class); + for (PointMass m: masses) { + if (m.getName() == name) return m; + } + return null; + } + + /** + * Updates this inspector to show cm's current masses. + */ + protected void updateDisplay() { + setTitle(TrackerRes.getString("CenterOfMassInspector.Title") //$NON-NLS-1$ + + " \"" + cm.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ + // make checkboxes for all point masses in tracker panel + checkboxPanel.removeAll(); + Iterator it = trackerPanel.getDrawables(PointMass.class).iterator(); + while (it.hasNext()) { + PointMass m = it.next(); + m.removePropertyChangeListener("name", this); //$NON-NLS-1$ + m.removePropertyChangeListener("color", this); //$NON-NLS-1$ + m.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + m.addPropertyChangeListener("name", this); //$NON-NLS-1$ + m.addPropertyChangeListener("color", this); //$NON-NLS-1$ + m.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + if (m instanceof CenterOfMass) continue; // don't include other cms + JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem( + m.getName(), m.getFootprint().getIcon(21, 16)); + // check the checkbox if m is in the cm + if (cm.containsMass(m)) checkbox.setSelected(true); + checkbox.addActionListener(listener); + checkboxPanel.add(checkbox); + } + FontSizer.setFonts(checkboxPanel, FontSizer.getLevel()); + pack(); + repaint(); + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java index 91b04d7b..ccc65d56 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java @@ -1,479 +1,479 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.*; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -/** - * A CircleFootprint returns a circle for a Point[] of length 1. - */ -public class CircleFootprint implements Footprint, Cloneable { - - // static fields - protected static float plainStrokeSize = 1.0f; - protected static float boldStrokeSize = 2.0f; - - // instance fields - protected String name; - protected Ellipse2D circle = new Ellipse2D.Double(); - protected Ellipse2D center = new Ellipse2D.Double(); - protected Shape highlight; - protected Shape outline; - protected Shape spot; - protected AffineTransform transform = new AffineTransform(); - protected Color color = new Color(255, 0, 0, 127); - protected Color highlightColor = Color.red; - protected Shape[] hitShapes = new Shape[1]; - protected BasicStroke highlightStroke, outlineStroke; - protected boolean outlined=true, spotted; - protected int alpha = 0; - protected CircleDialog dialog; - protected int r; - protected int prevRadius; - protected float prevStrokeSize; - protected boolean prevSpot; - - /** - * Constructs a CircleFootprint. - * - * @param name the name - * @param radius radius of the footprint - */ - public CircleFootprint(String name, int radius) { - this.name = name; - setRadius(radius); - setStroke(new BasicStroke(1.0f)); - center.setFrame(-1, -1, 2, 2); - } - - /** - * Clones a CircleFootprint. - * - * @return the clone - */ - protected Object clone() throws CloneNotSupportedException { - CircleFootprint clone = (CircleFootprint)super.clone(); - clone.circle = new Ellipse2D.Double(); - return clone; - } - - /** - * Gets a named footprint. - * - * @param name the name of the footprint - * @return the footprint - */ - public static Footprint getFootprint(String name) { - Iterator it = footprints.iterator(); - while(it.hasNext()) { - CircleFootprint footprint = (CircleFootprint)it.next(); - if (name == footprint.getName()) try { - Footprint fp = (CircleFootprint)footprint.clone(); - return fp; - } catch(CloneNotSupportedException ex) {ex.printStackTrace();} - } - return null; - } - - /** - * Gets the name of this footprint. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets the display name of the footprint. - * - * @return the localized display name - */ - public String getDisplayName() { - return TrackerRes.getString(name); - } - - /** - * Gets the minimum point array length required by this footprint. - * - * @return the length - */ - public int getLength() { - return 1; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - int realRadius = r; - setRadius(outlined? 5: 6); - Shape shape = getShape(new Point[] {new Point()}); - Area area = null; - if (spotted) { - area = new Area(spot); - } - if (outlined) { - if (area==null) - area = new Area(outline); - else - area.add(new Area(outline)); - } - ShapeIcon icon = new ShapeIcon(shape, area, w, h); - icon.setColor(color, highlightColor); - setRadius(realRadius); - return icon; - } - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points) { - final Shape shape = getShape(points); - final Shape outline = this.outline; - final Shape highlight = this.highlight; - final Shape spot = this.spot; - return new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setPaint(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(shape); - g.setPaint(highlightColor); - if (spotted) { - g.fill(spot); - } - if (outlined) { - g.fill(outline); - } - if (highlighted) { - g.fill(highlight); - } - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - Rectangle bounds = shape.getBounds(); - if (highlighted) bounds.add(highlight.getBounds()); - return bounds; - } - }; - } - - /** - * Gets the hit shapes. - * - * @return the hit shapes - */ - public Shape[] getHitShapes() { - return hitShapes; - } - - /** - * Sets the stroke. - * - * @param stroke the stroke - */ - public void setStroke(BasicStroke stroke) { - outlineStroke = stroke; - highlightStroke = new BasicStroke(stroke.getLineWidth()+1.0f); - } - - /** - * Gets the stroke. May return null; - * - * @return the stroke - */ - public BasicStroke getStroke() { - return null; - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); - highlightColor = new Color(color.getRed(), color.getGreen(), color.getBlue()); - } - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor() { - return highlightColor; - } - - /** - * Sets the radius. - * - * @param radius the radius - */ - public void setRadius(int radius) { - r = radius; - circle.setFrame(-r, -r, 2*r, 2*r); - } - - /** - * Sets the outlined flag. - * - * @param outline true to draw an outline around the circle - */ - public void setOutlined(boolean outline) { - outlined = outline; - } - - /** - * Sets the spotted flag. - * - * @param drawSpot true to draw a spot at the center of the circle - */ - public void setSpotShown(boolean drawSpot) { - spotted = drawSpot; - } - - /** - * Sets the alpha of the fill. - * - * @param alpha 0 for transparent, 255 for solid - */ - public void setAlpha(int alpha) { - this.alpha = alpha; - setColor(color); - } - - /** - * Gets the properties for saving. - * - * @return the properties "r outline spot bold" - */ - public String getProperties() { - String s = r+" "; //$NON-NLS-1$ - if (outlined) - s+="outline "; //$NON-NLS-1$ - if (spotted) - s+="spot "; //$NON-NLS-1$ - if (outlineStroke.getLineWidth()>plainStrokeSize) - s+="bold "; //$NON-NLS-1$ - return s; - } - - /** - * Sets the properties when loading. - * - * @param props the properties "r outline spot bold" - */ - public void setProperties(String props) { - if (props==null) return; - int n = props.indexOf(" "); //$NON-NLS-1$ - String radius = props.substring(0, n); - try { - setRadius(Integer.parseInt(radius)); - } catch (NumberFormatException e) { - } - setOutlined(props.indexOf("outline")>-1); //$NON-NLS-1$ - setSpotShown(props.indexOf("spot")>-1); //$NON-NLS-1$ - float f = props.indexOf("bold")>-1? boldStrokeSize: plainStrokeSize; //$NON-NLS-1$ - setStroke(new BasicStroke(f)); - } - - /** - * Shows the properties dialog. - * - * @param track the track using this footprint - */ - public void showProperties(TTrack track) { - if (dialog==null) { - dialog = new CircleDialog(track); - // center on screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - dialog.getBounds().width) / 2; - int y = (dim.height - dialog.getBounds().height) / 2; - dialog.setLocation(x, y); - } - dialog.boldCheckbox.setSelected(outlineStroke.getLineWidth()>plainStrokeSize); - dialog.spotCheckbox.setSelected(spotted); - dialog.spinner.setValue(r); - prevSpot = spotted; - prevStrokeSize = outlineStroke.getLineWidth(); - prevRadius = r; - dialog.setVisible(true); - } - - /** - * Gets the fill shape for a specified point. - * - * @param points an array of points - * @return the fill shape - */ - public Shape getShape(Point[] points) { - Point p = points[0]; - transform.setToTranslation(p.x, p.y); - Shape c = transform.createTransformedShape(circle); - highlight = highlightStroke.createStrokedShape(c); - outline = outlineStroke.createStrokedShape(c); - spot = transform.createTransformedShape(center); - hitShapes[0] = spot; // ignored by PointMass! - return c; - } - - private class CircleDialog extends JDialog { - - TTrack track; - JSpinner spinner; - JLabel spinnerLabel; - JButton okButton, cancelButton; - JCheckBox boldCheckbox, spotCheckbox; - - /** - * Constructs a CircleDialog for a specified track. - * @param track the track - */ - public CircleDialog(TTrack track) { - super(track.trackerPanel.getTFrame(), true); - this.track = track; - setTitle(TrackerRes.getString("CircleFootprint.Dialog.Title")); //$NON-NLS-1$ - setResizable(false); - setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); - createGUI(); - pack(); - okButton.requestFocusInWindow(); - } - - /** - * Creates the visible components. - */ - void createGUI() { - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - JPanel upper = new JPanel(); - upper.setBorder(BorderFactory.createEtchedBorder()); - contentPane.add(upper, BorderLayout.NORTH); - // add spinner label and spinner - spinnerLabel = new JLabel(TrackerRes.getString("CircleFootprint.Dialog.Label.Radius")); //$NON-NLS-1$ - spinnerLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - upper.add(spinnerLabel); - SpinnerModel model = new SpinnerNumberModel(3, 3, 100, 1); - spinner = new JSpinner(model); - JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); - tf.setEnabled(false); - tf.setDisabledTextColor(Color.BLACK); - ChangeListener listener = new ChangeListener() { - public void stateChanged(ChangeEvent e) { - int radius = (Integer)spinner.getValue(); - if (radius==r) return; - setRadius(radius); - track.trackerPanel.changed = true; - track.repaint(); - } - }; - spinner.addChangeListener(listener); - upper.add(spinner); - // add bold label and checkbox - boldCheckbox = new JCheckBox(TrackerRes.getString("CircleFootprint.Dialog.Checkbox.Bold")); //$NON-NLS-1$ - boldCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); - boldCheckbox.setOpaque(false); - boldCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - float f = boldCheckbox.isSelected()? boldStrokeSize: plainStrokeSize; - setStroke(new BasicStroke(f)); - track.trackerPanel.changed = true; - track.repaint(); - } - }); - upper.add(boldCheckbox); - spotCheckbox = new JCheckBox(TrackerRes.getString("CircleFootprint.Dialog.Checkbox.CenterSpot")); //$NON-NLS-1$ - spotCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); - spotCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setSpotShown(spotCheckbox.isSelected()); - track.trackerPanel.changed = true; - track.repaint(); - } - }); - upper.add(spotCheckbox); - // add close button - JPanel lower = new JPanel(); - contentPane.add(lower, BorderLayout.SOUTH); - okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - track.setFootprint(CircleFootprint.this.getName()); - } - }); - lower.add(okButton); - cancelButton = new JButton(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setSpotShown(prevSpot); - setStroke(new BasicStroke(prevStrokeSize)); - setRadius(prevRadius); - track.repaint(); - setVisible(false); - } - }); - lower.add(cancelButton); - } - } - - // static fields - private static Collection footprints = new HashSet(); - - // static constants - private static final CircleFootprint CIRCLE; - private static final CircleFootprint FILLED_CIRCLE; - - // static initializers - static { - CIRCLE = new CircleFootprint("CircleFootprint.Circle", 4); //$NON-NLS-1$ - footprints.add(CIRCLE); - FILLED_CIRCLE = new CircleFootprint("CircleFootprint.FilledCircle", 8); //$NON-NLS-1$ - FILLED_CIRCLE.setSpotShown(true); - FILLED_CIRCLE.setAlpha(102); - footprints.add(FILLED_CIRCLE); - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.geom.*; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +/** + * A CircleFootprint returns a circle for a Point[] of length 1. + */ +public class CircleFootprint implements Footprint, Cloneable { + + // static fields + protected static float plainStrokeSize = 1.0f; + protected static float boldStrokeSize = 2.0f; + + // instance fields + protected String name; + protected Ellipse2D circle = new Ellipse2D.Double(); + protected Ellipse2D center = new Ellipse2D.Double(); + protected Shape highlight; + protected Shape outline; + protected Shape spot; + protected AffineTransform transform = new AffineTransform(); + protected Color color = new Color(255, 0, 0, 127); + protected Color highlightColor = Color.red; + protected Shape[] hitShapes = new Shape[1]; + protected BasicStroke highlightStroke, outlineStroke; + protected boolean outlined=true, spotted; + protected int alpha = 0; + protected CircleDialog dialog; + protected int r; + protected int prevRadius; + protected float prevStrokeSize; + protected boolean prevSpot; + + /** + * Constructs a CircleFootprint. + * + * @param name the name + * @param radius radius of the footprint + */ + public CircleFootprint(String name, int radius) { + this.name = name; + setRadius(radius); + setStroke(new BasicStroke(1.0f)); + center.setFrame(-1, -1, 2, 2); + } + + /** + * Clones a CircleFootprint. + * + * @return the clone + */ + protected Object clone() throws CloneNotSupportedException { + CircleFootprint clone = (CircleFootprint)super.clone(); + clone.circle = new Ellipse2D.Double(); + return clone; + } + + /** + * Gets a named footprint. + * + * @param name the name of the footprint + * @return the footprint + */ + public static Footprint getFootprint(String name) { + Iterator it = footprints.iterator(); + while(it.hasNext()) { + CircleFootprint footprint = (CircleFootprint)it.next(); + if (name == footprint.getName()) try { + Footprint fp = (CircleFootprint)footprint.clone(); + return fp; + } catch(CloneNotSupportedException ex) {ex.printStackTrace();} + } + return null; + } + + /** + * Gets the name of this footprint. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the display name of the footprint. + * + * @return the localized display name + */ + public String getDisplayName() { + return TrackerRes.getString(name); + } + + /** + * Gets the minimum point array length required by this footprint. + * + * @return the length + */ + public int getLength() { + return 1; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + int realRadius = r; + setRadius(outlined? 5: 6); + Shape shape = getShape(new Point[] {new Point()}); + Area area = null; + if (spotted) { + area = new Area(spot); + } + if (outlined) { + if (area==null) + area = new Area(outline); + else + area.add(new Area(outline)); + } + ShapeIcon icon = new ShapeIcon(shape, area, w, h); + icon.setColor(color, highlightColor); + setRadius(realRadius); + return icon; + } + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points) { + final Shape shape = getShape(points); + final Shape outline = this.outline; + final Shape highlight = this.highlight; + final Shape spot = this.spot; + return new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setPaint(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(shape); + g.setPaint(highlightColor); + if (spotted) { + g.fill(spot); + } + if (outlined) { + g.fill(outline); + } + if (highlighted) { + g.fill(highlight); + } + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = shape.getBounds(); + if (highlighted) bounds.add(highlight.getBounds()); + return bounds; + } + }; + } + + /** + * Gets the hit shapes. + * + * @return the hit shapes + */ + public Shape[] getHitShapes() { + return hitShapes; + } + + /** + * Sets the stroke. + * + * @param stroke the stroke + */ + public void setStroke(BasicStroke stroke) { + outlineStroke = stroke; + highlightStroke = new BasicStroke(stroke.getLineWidth()+1.0f); + } + + /** + * Gets the stroke. May return null; + * + * @return the stroke + */ + public BasicStroke getStroke() { + return null; + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha); + highlightColor = new Color(color.getRed(), color.getGreen(), color.getBlue()); + } + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor() { + return highlightColor; + } + + /** + * Sets the radius. + * + * @param radius the radius + */ + public void setRadius(int radius) { + r = radius; + circle.setFrame(-r, -r, 2*r, 2*r); + } + + /** + * Sets the outlined flag. + * + * @param outline true to draw an outline around the circle + */ + public void setOutlined(boolean outline) { + outlined = outline; + } + + /** + * Sets the spotted flag. + * + * @param drawSpot true to draw a spot at the center of the circle + */ + public void setSpotShown(boolean drawSpot) { + spotted = drawSpot; + } + + /** + * Sets the alpha of the fill. + * + * @param alpha 0 for transparent, 255 for solid + */ + public void setAlpha(int alpha) { + this.alpha = alpha; + setColor(color); + } + + /** + * Gets the properties for saving. + * + * @return the properties "r outline spot bold" + */ + public String getProperties() { + String s = r+" "; //$NON-NLS-1$ + if (outlined) + s+="outline "; //$NON-NLS-1$ + if (spotted) + s+="spot "; //$NON-NLS-1$ + if (outlineStroke.getLineWidth()>plainStrokeSize) + s+="bold "; //$NON-NLS-1$ + return s; + } + + /** + * Sets the properties when loading. + * + * @param props the properties "r outline spot bold" + */ + public void setProperties(String props) { + if (props==null) return; + int n = props.indexOf(" "); //$NON-NLS-1$ + String radius = props.substring(0, n); + try { + setRadius(Integer.parseInt(radius)); + } catch (NumberFormatException e) { + } + setOutlined(props.indexOf("outline")>-1); //$NON-NLS-1$ + setSpotShown(props.indexOf("spot")>-1); //$NON-NLS-1$ + float f = props.indexOf("bold")>-1? boldStrokeSize: plainStrokeSize; //$NON-NLS-1$ + setStroke(new BasicStroke(f)); + } + + /** + * Shows the properties dialog. + * + * @param track the track using this footprint + */ + public void showProperties(TTrack track) { + if (dialog==null) { + dialog = new CircleDialog(track); + // center on screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - dialog.getBounds().width) / 2; + int y = (dim.height - dialog.getBounds().height) / 2; + dialog.setLocation(x, y); + } + dialog.boldCheckbox.setSelected(outlineStroke.getLineWidth()>plainStrokeSize); + dialog.spotCheckbox.setSelected(spotted); + dialog.spinner.setValue(r); + prevSpot = spotted; + prevStrokeSize = outlineStroke.getLineWidth(); + prevRadius = r; + dialog.setVisible(true); + } + + /** + * Gets the fill shape for a specified point. + * + * @param points an array of points + * @return the fill shape + */ + public Shape getShape(Point[] points) { + Point p = points[0]; + transform.setToTranslation(p.x, p.y); + Shape c = transform.createTransformedShape(circle); + highlight = highlightStroke.createStrokedShape(c); + outline = outlineStroke.createStrokedShape(c); + spot = transform.createTransformedShape(center); + hitShapes[0] = spot; // ignored by PointMass! + return c; + } + + private class CircleDialog extends JDialog { + + TTrack track; + JSpinner spinner; + JLabel spinnerLabel; + JButton okButton, cancelButton; + JCheckBox boldCheckbox, spotCheckbox; + + /** + * Constructs a CircleDialog for a specified track. + * @param track the track + */ + public CircleDialog(TTrack track) { + super(track.trackerPanel.getTFrame(), true); + this.track = track; + setTitle(TrackerRes.getString("CircleFootprint.Dialog.Title")); //$NON-NLS-1$ + setResizable(false); + setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); + createGUI(); + pack(); + okButton.requestFocusInWindow(); + } + + /** + * Creates the visible components. + */ + void createGUI() { + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + JPanel upper = new JPanel(); + upper.setBorder(BorderFactory.createEtchedBorder()); + contentPane.add(upper, BorderLayout.NORTH); + // add spinner label and spinner + spinnerLabel = new JLabel(TrackerRes.getString("CircleFootprint.Dialog.Label.Radius")); //$NON-NLS-1$ + spinnerLabel.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + upper.add(spinnerLabel); + SpinnerModel model = new SpinnerNumberModel(3, 3, 100, 1); + spinner = new JSpinner(model); + JFormattedTextField tf = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField(); + tf.setEnabled(false); + tf.setDisabledTextColor(Color.BLACK); + ChangeListener listener = new ChangeListener() { + public void stateChanged(ChangeEvent e) { + int radius = (Integer)spinner.getValue(); + if (radius==r) return; + setRadius(radius); + track.trackerPanel.changed = true; + track.repaint(); + } + }; + spinner.addChangeListener(listener); + upper.add(spinner); + // add bold label and checkbox + boldCheckbox = new JCheckBox(TrackerRes.getString("CircleFootprint.Dialog.Checkbox.Bold")); //$NON-NLS-1$ + boldCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); + boldCheckbox.setOpaque(false); + boldCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + float f = boldCheckbox.isSelected()? boldStrokeSize: plainStrokeSize; + setStroke(new BasicStroke(f)); + track.trackerPanel.changed = true; + track.repaint(); + } + }); + upper.add(boldCheckbox); + spotCheckbox = new JCheckBox(TrackerRes.getString("CircleFootprint.Dialog.Checkbox.CenterSpot")); //$NON-NLS-1$ + spotCheckbox.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10)); + spotCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setSpotShown(spotCheckbox.isSelected()); + track.trackerPanel.changed = true; + track.repaint(); + } + }); + upper.add(spotCheckbox); + // add close button + JPanel lower = new JPanel(); + contentPane.add(lower, BorderLayout.SOUTH); + okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + track.setFootprint(CircleFootprint.this.getName()); + } + }); + lower.add(okButton); + cancelButton = new JButton(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setSpotShown(prevSpot); + setStroke(new BasicStroke(prevStrokeSize)); + setRadius(prevRadius); + track.repaint(); + setVisible(false); + } + }); + lower.add(cancelButton); + } + } + + // static fields + private static Collection footprints = new HashSet(); + + // static constants + private static final CircleFootprint CIRCLE; + private static final CircleFootprint FILLED_CIRCLE; + + // static initializers + static { + CIRCLE = new CircleFootprint("CircleFootprint.Circle", 4); //$NON-NLS-1$ + footprints.add(CIRCLE); + FILLED_CIRCLE = new CircleFootprint("CircleFootprint.FilledCircle", 8); //$NON-NLS-1$ + FILLED_CIRCLE.setSpotShown(true); + FILLED_CIRCLE.setAlpha(102); + footprints.add(FILLED_CIRCLE); + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/Configuration.java b/src/org/opensourcephysics/cabrillo/tracker/Configuration.java index 31bc0e2b..6693fd5c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Configuration.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Configuration.java @@ -1,123 +1,123 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import org.opensourcephysics.controls.*; - -/** - * This manages a set of enabled configuration properties. - * - * @author Douglas Brown - * @version 1.3 Aug 2004 - */ -public class Configuration { - - Set enabled = new TreeSet(); - - /** - * Creates an empty Configuration. - */ - public Configuration() { - enabled = new TreeSet(); - } - - /** - * Creates a Configuration and initializes it with a configuration. - * @param enabled a Set of enabled properties - */ - public Configuration(Set enabled) { - this.enabled = enabled; - } - - /** - * Creates a Configuration and initializes it with the specified tracker panel - * configuration. - * - * @param trackerPanel the tracker panel - */ - public Configuration(TrackerPanel trackerPanel) { - enabled = trackerPanel.getEnabled(); - } - - /** - * Returns an XML.ObjectLoader to save and load object data. - * - * @return the XML.ObjectLoader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load object data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the TrackerPanel object to save - */ - public void saveObject(XMLControl control, Object obj) { - Configuration config = (Configuration) obj; - // save the configuration - control.setValue("enabled", config.enabled); //$NON-NLS-1$ - } - - /** - * Creates an object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - return new Configuration(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - Configuration config = (Configuration) obj; - // load the configuration - Object set = control.getObject("enabled"); //$NON-NLS-1$ - if (set != null) { - TreeSet enabled = new TreeSet(); - for (Object next: Collection.class.cast(set)) { - enabled.add((String)next); - } - config.enabled = enabled; - } - return obj; - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import org.opensourcephysics.controls.*; + +/** + * This manages a set of enabled configuration properties. + * + * @author Douglas Brown + * @version 1.3 Aug 2004 + */ +public class Configuration { + + Set enabled = new TreeSet(); + + /** + * Creates an empty Configuration. + */ + public Configuration() { + enabled = new TreeSet(); + } + + /** + * Creates a Configuration and initializes it with a configuration. + * @param enabled a Set of enabled properties + */ + public Configuration(Set enabled) { + this.enabled = enabled; + } + + /** + * Creates a Configuration and initializes it with the specified tracker panel + * configuration. + * + * @param trackerPanel the tracker panel + */ + public Configuration(TrackerPanel trackerPanel) { + enabled = trackerPanel.getEnabled(); + } + + /** + * Returns an XML.ObjectLoader to save and load object data. + * + * @return the XML.ObjectLoader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load object data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the TrackerPanel object to save + */ + public void saveObject(XMLControl control, Object obj) { + Configuration config = (Configuration) obj; + // save the configuration + control.setValue("enabled", config.enabled); //$NON-NLS-1$ + } + + /** + * Creates an object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + return new Configuration(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + Configuration config = (Configuration) obj; + // load the configuration + Object set = control.getObject("enabled"); //$NON-NLS-1$ + if (set != null) { + TreeSet enabled = new TreeSet(); + for (Object next: Collection.class.cast(set)) { + enabled.add((String)next); + } + config.enabled = enabled; + } + return obj; + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java b/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java index 886392ac..c74efeca 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java @@ -1,683 +1,683 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; - -import javax.swing.*; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import java.awt.event.*; -import java.beans.PropertyChangeEvent; -import java.util.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.controls.*; - -/** - * A CoordAxes displays and controls the image coordinate system of - * a specified tracker panel. - * - * @author Douglas Brown - */ -public class CoordAxes extends TTrack { - - protected static Icon gridOptionsIcon; - - protected boolean notyetShown = true; - protected JLabel originLabel; - protected WorldGrid grid; - protected JCheckBox gridCheckbox; - protected TButton gridButton; - protected Component gridSeparator; - protected boolean gridVisible; - - static { - gridOptionsIcon = new ImageIcon( - Tracker.class.getResource("resources/images/restore.gif")); //$NON-NLS-1$ - } - - /** - * Constructs a CoordAxes. - */ - public CoordAxes() { - defaultColors = new Color[] {new Color(200, 0, 200)}; - setName(TrackerRes.getString("CoordAxes.New.Name")); //$NON-NLS-1$ - // set up footprint choices and color - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.BoldSimpleAxes"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SimpleAxes")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - setViewable(false); // views ignore this track - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("CoordAxes.Hint"); //$NON-NLS-1$ - // initialize the step array - // step 0 is the only step needed - Step step = new CoordAxesStep(this, 0); - step.setFootprint(getFootprint()); - steps.setStep(0, step); - // configure angle field components - angleField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (trackerPanel == null) return; - double theta = angleField.getValue(); - // get the origin and handle of the current step - int n = trackerPanel.getFrameNumber(); - CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); - TPoint origin = step.getOrigin(); - TPoint handle = step.getHandle(); - // move the handle to the new angle at same distance from origin - double d = origin.distance(handle); - double x = origin.getX() + d * Math.cos(theta); - double y = origin.getY() - d * Math.sin(theta); - handle.setXY(x, y); - angleField.setValue(trackerPanel.getCoords().getAngle(n)); - angleField.requestFocusInWindow(); - } - }); - angleField.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (trackerPanel == null) return; - double theta = angleField.getValue(); - // get the origin and handle of the current step - int n = trackerPanel.getFrameNumber(); - CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); - TPoint origin = step.getOrigin(); - TPoint handle = step.getHandle(); - // move the handle to the new angle at same distance from origin - double d = origin.distance(handle); - double x = origin.getX() + d * Math.cos(theta); - double y = origin.getY() - d * Math.sin(theta); - handle.setXY(x, y); - angleField.setValue(trackerPanel.getCoords().getAngle(n)); - } - }); - originLabel = new JLabel(); - final Action setOriginAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (trackerPanel == null) return; - double x = xField.getValue(); - double y = yField.getValue(); - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - coords.setOriginXY(n, x, y); - xField.setValue(coords.getOriginX(n)); - yField.setValue(coords.getOriginY(n)); - CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); - TPoint handle = step.getHandle(); - if (handle==trackerPanel.getSelectedPoint()) { - trackerPanel.setSelectedPoint(null); - } - } - }; - // configure x and y origin field components - xField = new DecimalField(5, 2); - yField = new DecimalField(5, 2); - - xField.addActionListener(setOriginAction); - yField.addActionListener(setOriginAction); - xField.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - setOriginAction.actionPerformed(null); - } - }); - yField.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - setOriginAction.actionPerformed(null); - } - }); - - // grid items - grid = new WorldGrid(); - grid.setVisible(gridVisible); - - gridSeparator = Box.createRigidArea(new Dimension(4, 4)); - gridCheckbox = new JCheckBox(); - gridCheckbox.setBorder(BorderFactory.createEmptyBorder()); - gridCheckbox.setOpaque(false); - gridCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setGridVisible(gridCheckbox.isSelected()); - } - }); - - gridButton = new TButton(gridOptionsIcon) { - - public Dimension getMaximumSize() { - Dimension dim = super.getMaximumSize(); - dim.height = TTrackBar.getTrackbar(trackerPanel).toolbarComponentHeight; - return dim; - } - - @Override - protected JPopupMenu getPopup() { - JPopupMenu popup = new JPopupMenu(); - JMenuItem colorItem = new JMenuItem(TrackerRes.getString("CoordAxes.MenuItem.GridColor")); //$NON-NLS-1$ - colorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // show the grid if not visible - if (!grid.isVisible()) { - gridCheckbox.doClick(0); - } - - Color color = grid.getColor(); - Color newColor = chooseColor(color, TrackerRes.getString("CoordAxes.Dialog.GridColor.Title")); //$NON-NLS-1$ - if (newColor!=color) { - grid.setColor(newColor); - for (TrackerPanel next: panels) { - next.repaint(); - } - } - } - }); - popup.add(colorItem); - JMenuItem transparencyItem = new JMenuItem(TrackerRes.getString("CoordAxes.MenuItem.GridOpacity")); //$NON-NLS-1$ - transparencyItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // show the grid if not visible - if (!grid.isVisible()) { - gridCheckbox.doClick(0); - } - - // show a dialog with a transparency slider - int alpha = grid.getAlpha(); - final JSlider slider = new JSlider(0, 255, alpha); - slider.setMaximum(255); - slider.setMinimum(0); - slider.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2)); - slider.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - grid.setAlpha(slider.getValue()); - for (TrackerPanel next: panels) { - next.repaint(); - } - } - }); - - int response = JOptionPane.showConfirmDialog(trackerPanel, slider, - TrackerRes.getString("CoordAxes.Dialog.GridOpacity.Title"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); - if (response==JOptionPane.CANCEL_OPTION) { - grid.setAlpha(alpha); - for (TrackerPanel next: panels) { - next.repaint(); - } - } - } - }); - popup.add(transparencyItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - - }; - } - - /** - * Gets the origin. - * - * @return the current origin - */ - public TPoint getOrigin() { - return ((CoordAxesStep)getStep(0)).getOrigin(); - } - - /** - * Overrides TTrack isLocked method. - * - * @return true if this is locked - */ - public boolean isLocked() { - boolean locked = super.isLocked(); - if (trackerPanel != null) { - locked = locked || trackerPanel.getCoords().isLocked(); - } - return locked; - } - - /** - * Overrides TTrack setVisible method to change notyetShown flag. - * - * @param visible true to show this track - */ - public void setVisible(boolean visible) { - super.setVisible(visible); - if (visible) { - notyetShown = false; - if (grid!=null) grid.setVisible(gridVisible); - } - else if (grid!=null) { - grid.setVisible(false); - } - } - - /** - * Sets the grid visibility. - * - * @param visible true to show the grid - */ - public void setGridVisible(boolean visible) { - if (gridVisible==visible) return; - gridVisible = visible; - grid.setVisible(gridVisible); - gridCheckbox.setSelected(gridVisible); - for (TrackerPanel next: panels) { - next.repaint(); - } - } - - /** - * Overrides TTrack setTrailVisible method to keep trails hidden. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Mimics step creation by setting the origin position. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - public Step createStep(int n, double x, double y) { -// Step step = steps.getStep(n); - Step step = getStep(0); - if (trackerPanel.getSelectedPoint() instanceof CoordAxesStep.Handle) { - ((CoordAxesStep)step).getHandle().setXY(x, y);; - } - else ((CoordAxesStep)step).getOrigin().setXY(x, y); - return step; - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - return null; - } - - /** - * Overrides TTrack getStep method. Always return step 0. - * - * @param n the frame number (ignored) - * @return step 0 - */ - public Step getStep(int n) { - Step step = steps.getStep(0); - // always erase since step position/shape may change - // without calls to TPoint setXY method - step.erase(); - return step; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return CoordAxesStep.getLength(); - } - - /** - * Determines if at least one point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Determines if the given point index is autotrackable. - * - * @param pointIndex the points[] index - * @return true if autotrackable - */ - protected boolean isAutoTrackable(int pointIndex) { - return true; -// return pointIndex==0; // origin only - } - - /** - * Returns a description of the point at a given index. Used by AutoTracker. - * - * @param pointIndex the points[] index - * @return the description - */ - protected String getTargetDescription(int pointIndex) { - if (pointIndex==0) { - return TrackerRes.getString("CoordAxes.Origin.Name"); //$NON-NLS-1$ - } - return TrackerRes.getString("CoordAxes.Handle.Name"); //$NON-NLS-1$ -// return null; - } - - @Override - protected void setTrackerPanel(TrackerPanel panel) { - super.setTrackerPanel(panel); - trackerPanel.addDrawable(grid); - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - ImageCoordSystem coords = trackerPanel.getCoords(); - if (getTargetIndex()==0) { // origin - if (coords.isFixedOrigin()) { - coords.setFixedOrigin(false); - } - TPoint origin = getOrigin(); - origin.setXY(x, y); - } - else { // handle - if (coords.isFixedAngle()) { - coords.setFixedAngle(false); - } - TPoint handle = ((CoordAxesStep)getStep(0)).getHandle(); - handle.setXY(x, y); - } - firePropertyChange("step", null, n); //$NON-NLS-1$ - return getMarkedPoint(n, getTargetIndex()); - } - - /** - * Used by autoTracker to get the marked point for a given frame and index. - * Overrides TTrack method. - * - * @param n the frame number - * @param index the index - * @return a TPoint - */ - public TPoint getMarkedPoint(final int n, int index) { - if (index==0) { - return new OriginPoint(n); - } - TPoint handle = ((CoordAxesStep)getStep(0)).getHandle(); - return new AnglePoint(handle.getX(), handle.getY(), n); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 1; - } - - /** - * Implements findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || - !isVisible() || - !isEnabled()) return null; - ImageCoordSystem coords = ((TrackerPanel)panel).getCoords(); - if (coords instanceof ReferenceFrame) return null; - // only look at step 0 since getStep(n) returns 0 for every n - Interactive ia = getStep(0).findInteractive(trackerPanel, xpix, ypix); - if (ia == null) { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("CoordAxes.Hint"); //$NON-NLS-1$ - return null; - } - if (ia instanceof CoordAxesStep.Handle) { - partName = TrackerRes.getString("CoordAxes.Handle.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("CoordAxes.Handle.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("CoordAxes.Origin.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("CoordAxes.Origin.Hint"); //$NON-NLS-1$ - } - return ia; - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - menu.remove(deleteTrackItem); - if (menu.getItemCount()>0) - menu.remove(menu.getItemCount()-1); // remove separator - lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - int n = trackerPanel.getFrameNumber(); - ImageCoordSystem coords = trackerPanel.getCoords(); - originLabel.setText(TrackerRes.getString("CoordAxes.Origin.Label")); //$NON-NLS-1$ - xField.setToolTipText(TrackerRes.getString("CoordAxes.Origin.Field.Tooltip")); //$NON-NLS-1$ - yField.setToolTipText(TrackerRes.getString("CoordAxes.Origin.Field.Tooltip")); //$NON-NLS-1$ - gridCheckbox.setText(TrackerRes.getString("CoordAxes.Checkbox.Grid")); //$NON-NLS-1$ - gridCheckbox.setToolTipText(TrackerRes.getString("CoordAxes.Checkbox.Grid.Tooltip")); //$NON-NLS-1$ - gridButton.setToolTipText(TrackerRes.getString("CoordAxes.Button.Grid.Tooltip")); //$NON-NLS-1$ - list.add(gridSeparator); - list.add(gridCheckbox); - list.add(gridButton); - list.add(magSeparator); - list.add(originLabel); - list.add(xSeparator); - list.add(xLabel); - list.add(xField); - list.add(ySeparator); - list.add(yLabel); - list.add(yField); - xField.setValue(coords.getOriginX(n)); - yField.setValue(coords.getOriginY(n)); - - angleLabel.setText(TrackerRes.getString("CoordAxes.Label.Angle")); //$NON-NLS-1$ - list.add(stepSeparator); - list.add(angleLabel); - list.add(angleField); - // put coords angle into angle field - angleField.setValue(coords.getAngle(n)); - - xField.setEnabled(!isLocked()); - yField.setEnabled(!isLocked()); - angleField.setEnabled(!isLocked()); - return list; - } - - /** - * Responds to property change events. This listens for the following - * events: "stepnumber" & "image" from TrackerPanel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("stepnumber")) { //$NON-NLS-1$ - int n = trackerPanel.getFrameNumber(); - ImageCoordSystem coords = trackerPanel.getCoords(); - angleField.setValue(coords.getAngle(n)); - xField.setValue(coords.getOriginX(n)); - yField.setValue(coords.getOriginY(n)); - } - else super.propertyChange(e); - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - Object[] objectsToSize = new Object[] - {originLabel, gridCheckbox}; - FontSizer.setFonts(objectsToSize, level); - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return "Coordinate Axes"; //$NON-NLS-1$ - } - - /** - * A TPoint used by autotracker to check for manually marked angles. - */ - protected class AnglePoint extends TPoint { - int frameNum; - - public AnglePoint(double x, double y, int n) { - super(x, y); - frameNum = n; - } - - public double getAngle() { - TPoint origin = getOrigin(); - return -origin.angle(this); - } - } - - /** - * A TPoint used by autotracker to check for manually marked origins. - */ - protected class OriginPoint extends TPoint { - - int frameNum; - - OriginPoint(int n) { - frameNum = n; - } - - public double getX() { - ImageCoordSystem coords = trackerPanel.getCoords(); - return coords.getOriginX(frameNum); - } - - public double getY() { - ImageCoordSystem coords = trackerPanel.getCoords(); - return coords.getOriginY(frameNum); - } - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - CoordAxes axes = (CoordAxes)obj; - if (axes.gridVisible) { - control.setValue("grid_visible", true); //$NON-NLS-1$ - } - if (axes.grid.isCustom()) { - control.setValue("grid_alpha", axes.grid.getAlpha()); //$NON-NLS-1$ - control.setValue("grid_RGB", axes.grid.getColor().getRGB()); //$NON-NLS-1$ - } - } - - /** - * Creates a new object. - * - * @param control the XMLControl with the object data - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new CoordAxes(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - CoordAxes axes = (CoordAxes)obj; - axes.notyetShown = false; - - if (control.getPropertyNames().contains("grid_visible")) { //$NON-NLS-1$ - axes.setGridVisible(control.getBoolean("grid_visible")); //$NON-NLS-1$ - } - if (control.getPropertyNames().contains("grid_alpha")) { //$NON-NLS-1$ - axes.grid.setAlpha(control.getInt("grid_alpha")); //$NON-NLS-1$ - } - if (control.getPropertyNames().contains("grid_RGB")) { //$NON-NLS-1$ - Color color = new Color(control.getInt("grid_RGB")); //$NON-NLS-1$ - axes.grid.setColor(color); - } - return obj; - } - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; + +import javax.swing.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import java.awt.event.*; +import java.beans.PropertyChangeEvent; +import java.util.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.controls.*; + +/** + * A CoordAxes displays and controls the image coordinate system of + * a specified tracker panel. + * + * @author Douglas Brown + */ +public class CoordAxes extends TTrack { + + protected static Icon gridOptionsIcon; + + protected boolean notyetShown = true; + protected JLabel originLabel; + protected WorldGrid grid; + protected JCheckBox gridCheckbox; + protected TButton gridButton; + protected Component gridSeparator; + protected boolean gridVisible; + + static { + gridOptionsIcon = new ImageIcon( + Tracker.class.getResource("resources/images/restore.gif")); //$NON-NLS-1$ + } + + /** + * Constructs a CoordAxes. + */ + public CoordAxes() { + defaultColors = new Color[] {new Color(200, 0, 200)}; + setName(TrackerRes.getString("CoordAxes.New.Name")); //$NON-NLS-1$ + // set up footprint choices and color + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.BoldSimpleAxes"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SimpleAxes")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + setViewable(false); // views ignore this track + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("CoordAxes.Hint"); //$NON-NLS-1$ + // initialize the step array + // step 0 is the only step needed + Step step = new CoordAxesStep(this, 0); + step.setFootprint(getFootprint()); + steps.setStep(0, step); + // configure angle field components + angleField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (trackerPanel == null) return; + double theta = angleField.getValue(); + // get the origin and handle of the current step + int n = trackerPanel.getFrameNumber(); + CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); + TPoint origin = step.getOrigin(); + TPoint handle = step.getHandle(); + // move the handle to the new angle at same distance from origin + double d = origin.distance(handle); + double x = origin.getX() + d * Math.cos(theta); + double y = origin.getY() - d * Math.sin(theta); + handle.setXY(x, y); + angleField.setValue(trackerPanel.getCoords().getAngle(n)); + angleField.requestFocusInWindow(); + } + }); + angleField.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (trackerPanel == null) return; + double theta = angleField.getValue(); + // get the origin and handle of the current step + int n = trackerPanel.getFrameNumber(); + CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); + TPoint origin = step.getOrigin(); + TPoint handle = step.getHandle(); + // move the handle to the new angle at same distance from origin + double d = origin.distance(handle); + double x = origin.getX() + d * Math.cos(theta); + double y = origin.getY() - d * Math.sin(theta); + handle.setXY(x, y); + angleField.setValue(trackerPanel.getCoords().getAngle(n)); + } + }); + originLabel = new JLabel(); + final Action setOriginAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (trackerPanel == null) return; + double x = xField.getValue(); + double y = yField.getValue(); + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + coords.setOriginXY(n, x, y); + xField.setValue(coords.getOriginX(n)); + yField.setValue(coords.getOriginY(n)); + CoordAxesStep step = (CoordAxesStep)CoordAxes.this.getStep(n); + TPoint handle = step.getHandle(); + if (handle==trackerPanel.getSelectedPoint()) { + trackerPanel.setSelectedPoint(null); + } + } + }; + // configure x and y origin field components + xField = new DecimalField(5, 2); + yField = new DecimalField(5, 2); + + xField.addActionListener(setOriginAction); + yField.addActionListener(setOriginAction); + xField.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + setOriginAction.actionPerformed(null); + } + }); + yField.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + setOriginAction.actionPerformed(null); + } + }); + + // grid items + grid = new WorldGrid(); + grid.setVisible(gridVisible); + + gridSeparator = Box.createRigidArea(new Dimension(4, 4)); + gridCheckbox = new JCheckBox(); + gridCheckbox.setBorder(BorderFactory.createEmptyBorder()); + gridCheckbox.setOpaque(false); + gridCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setGridVisible(gridCheckbox.isSelected()); + } + }); + + gridButton = new TButton(gridOptionsIcon) { + + public Dimension getMaximumSize() { + Dimension dim = super.getMaximumSize(); + dim.height = TTrackBar.getTrackbar(trackerPanel).toolbarComponentHeight; + return dim; + } + + @Override + protected JPopupMenu getPopup() { + JPopupMenu popup = new JPopupMenu(); + JMenuItem colorItem = new JMenuItem(TrackerRes.getString("CoordAxes.MenuItem.GridColor")); //$NON-NLS-1$ + colorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // show the grid if not visible + if (!grid.isVisible()) { + gridCheckbox.doClick(0); + } + + Color color = grid.getColor(); + Color newColor = chooseColor(color, TrackerRes.getString("CoordAxes.Dialog.GridColor.Title")); //$NON-NLS-1$ + if (newColor!=color) { + grid.setColor(newColor); + for (TrackerPanel next: panels) { + next.repaint(); + } + } + } + }); + popup.add(colorItem); + JMenuItem transparencyItem = new JMenuItem(TrackerRes.getString("CoordAxes.MenuItem.GridOpacity")); //$NON-NLS-1$ + transparencyItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // show the grid if not visible + if (!grid.isVisible()) { + gridCheckbox.doClick(0); + } + + // show a dialog with a transparency slider + int alpha = grid.getAlpha(); + final JSlider slider = new JSlider(0, 255, alpha); + slider.setMaximum(255); + slider.setMinimum(0); + slider.setBorder(BorderFactory.createEmptyBorder(0, 2, 0, 2)); + slider.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + grid.setAlpha(slider.getValue()); + for (TrackerPanel next: panels) { + next.repaint(); + } + } + }); + + int response = JOptionPane.showConfirmDialog(trackerPanel, slider, + TrackerRes.getString("CoordAxes.Dialog.GridOpacity.Title"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE); + if (response==JOptionPane.CANCEL_OPTION) { + grid.setAlpha(alpha); + for (TrackerPanel next: panels) { + next.repaint(); + } + } + } + }); + popup.add(transparencyItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + + }; + } + + /** + * Gets the origin. + * + * @return the current origin + */ + public TPoint getOrigin() { + return ((CoordAxesStep)getStep(0)).getOrigin(); + } + + /** + * Overrides TTrack isLocked method. + * + * @return true if this is locked + */ + public boolean isLocked() { + boolean locked = super.isLocked(); + if (trackerPanel != null) { + locked = locked || trackerPanel.getCoords().isLocked(); + } + return locked; + } + + /** + * Overrides TTrack setVisible method to change notyetShown flag. + * + * @param visible true to show this track + */ + public void setVisible(boolean visible) { + super.setVisible(visible); + if (visible) { + notyetShown = false; + if (grid!=null) grid.setVisible(gridVisible); + } + else if (grid!=null) { + grid.setVisible(false); + } + } + + /** + * Sets the grid visibility. + * + * @param visible true to show the grid + */ + public void setGridVisible(boolean visible) { + if (gridVisible==visible) return; + gridVisible = visible; + grid.setVisible(gridVisible); + gridCheckbox.setSelected(gridVisible); + for (TrackerPanel next: panels) { + next.repaint(); + } + } + + /** + * Overrides TTrack setTrailVisible method to keep trails hidden. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Mimics step creation by setting the origin position. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the step + */ + public Step createStep(int n, double x, double y) { +// Step step = steps.getStep(n); + Step step = getStep(0); + if (trackerPanel.getSelectedPoint() instanceof CoordAxesStep.Handle) { + ((CoordAxesStep)step).getHandle().setXY(x, y);; + } + else ((CoordAxesStep)step).getOrigin().setXY(x, y); + return step; + } + + /** + * Overrides TTrack deleteStep method to prevent deletion. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + return null; + } + + /** + * Overrides TTrack getStep method. Always return step 0. + * + * @param n the frame number (ignored) + * @return step 0 + */ + public Step getStep(int n) { + Step step = steps.getStep(0); + // always erase since step position/shape may change + // without calls to TPoint setXY method + step.erase(); + return step; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return CoordAxesStep.getLength(); + } + + /** + * Determines if at least one point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Determines if the given point index is autotrackable. + * + * @param pointIndex the points[] index + * @return true if autotrackable + */ + protected boolean isAutoTrackable(int pointIndex) { + return true; +// return pointIndex==0; // origin only + } + + /** + * Returns a description of the point at a given index. Used by AutoTracker. + * + * @param pointIndex the points[] index + * @return the description + */ + protected String getTargetDescription(int pointIndex) { + if (pointIndex==0) { + return TrackerRes.getString("CoordAxes.Origin.Name"); //$NON-NLS-1$ + } + return TrackerRes.getString("CoordAxes.Handle.Name"); //$NON-NLS-1$ +// return null; + } + + @Override + protected void setTrackerPanel(TrackerPanel panel) { + super.setTrackerPanel(panel); + trackerPanel.addDrawable(grid); + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + ImageCoordSystem coords = trackerPanel.getCoords(); + if (getTargetIndex()==0) { // origin + if (coords.isFixedOrigin()) { + coords.setFixedOrigin(false); + } + TPoint origin = getOrigin(); + origin.setXY(x, y); + } + else { // handle + if (coords.isFixedAngle()) { + coords.setFixedAngle(false); + } + TPoint handle = ((CoordAxesStep)getStep(0)).getHandle(); + handle.setXY(x, y); + } + firePropertyChange("step", null, n); //$NON-NLS-1$ + return getMarkedPoint(n, getTargetIndex()); + } + + /** + * Used by autoTracker to get the marked point for a given frame and index. + * Overrides TTrack method. + * + * @param n the frame number + * @param index the index + * @return a TPoint + */ + public TPoint getMarkedPoint(final int n, int index) { + if (index==0) { + return new OriginPoint(n); + } + TPoint handle = ((CoordAxesStep)getStep(0)).getHandle(); + return new AnglePoint(handle.getX(), handle.getY(), n); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 1; + } + + /** + * Implements findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || + !isVisible() || + !isEnabled()) return null; + ImageCoordSystem coords = ((TrackerPanel)panel).getCoords(); + if (coords instanceof ReferenceFrame) return null; + // only look at step 0 since getStep(n) returns 0 for every n + Interactive ia = getStep(0).findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("CoordAxes.Hint"); //$NON-NLS-1$ + return null; + } + if (ia instanceof CoordAxesStep.Handle) { + partName = TrackerRes.getString("CoordAxes.Handle.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CoordAxes.Handle.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("CoordAxes.Origin.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CoordAxes.Origin.Hint"); //$NON-NLS-1$ + } + return ia; + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + menu.remove(deleteTrackItem); + if (menu.getItemCount()>0) + menu.remove(menu.getItemCount()-1); // remove separator + lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + int n = trackerPanel.getFrameNumber(); + ImageCoordSystem coords = trackerPanel.getCoords(); + originLabel.setText(TrackerRes.getString("CoordAxes.Origin.Label")); //$NON-NLS-1$ + xField.setToolTipText(TrackerRes.getString("CoordAxes.Origin.Field.Tooltip")); //$NON-NLS-1$ + yField.setToolTipText(TrackerRes.getString("CoordAxes.Origin.Field.Tooltip")); //$NON-NLS-1$ + gridCheckbox.setText(TrackerRes.getString("CoordAxes.Checkbox.Grid")); //$NON-NLS-1$ + gridCheckbox.setToolTipText(TrackerRes.getString("CoordAxes.Checkbox.Grid.Tooltip")); //$NON-NLS-1$ + gridButton.setToolTipText(TrackerRes.getString("CoordAxes.Button.Grid.Tooltip")); //$NON-NLS-1$ + list.add(gridSeparator); + list.add(gridCheckbox); + list.add(gridButton); + list.add(magSeparator); + list.add(originLabel); + list.add(xSeparator); + list.add(xLabel); + list.add(xField); + list.add(ySeparator); + list.add(yLabel); + list.add(yField); + xField.setValue(coords.getOriginX(n)); + yField.setValue(coords.getOriginY(n)); + + angleLabel.setText(TrackerRes.getString("CoordAxes.Label.Angle")); //$NON-NLS-1$ + list.add(stepSeparator); + list.add(angleLabel); + list.add(angleField); + // put coords angle into angle field + angleField.setValue(coords.getAngle(n)); + + xField.setEnabled(!isLocked()); + yField.setEnabled(!isLocked()); + angleField.setEnabled(!isLocked()); + return list; + } + + /** + * Responds to property change events. This listens for the following + * events: "stepnumber" & "image" from TrackerPanel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("stepnumber")) { //$NON-NLS-1$ + int n = trackerPanel.getFrameNumber(); + ImageCoordSystem coords = trackerPanel.getCoords(); + angleField.setValue(coords.getAngle(n)); + xField.setValue(coords.getOriginX(n)); + yField.setValue(coords.getOriginY(n)); + } + else super.propertyChange(e); + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {originLabel, gridCheckbox}; + FontSizer.setFonts(objectsToSize, level); + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return "Coordinate Axes"; //$NON-NLS-1$ + } + + /** + * A TPoint used by autotracker to check for manually marked angles. + */ + protected class AnglePoint extends TPoint { + int frameNum; + + public AnglePoint(double x, double y, int n) { + super(x, y); + frameNum = n; + } + + public double getAngle() { + TPoint origin = getOrigin(); + return -origin.angle(this); + } + } + + /** + * A TPoint used by autotracker to check for manually marked origins. + */ + protected class OriginPoint extends TPoint { + + int frameNum; + + OriginPoint(int n) { + frameNum = n; + } + + public double getX() { + ImageCoordSystem coords = trackerPanel.getCoords(); + return coords.getOriginX(frameNum); + } + + public double getY() { + ImageCoordSystem coords = trackerPanel.getCoords(); + return coords.getOriginY(frameNum); + } + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + CoordAxes axes = (CoordAxes)obj; + if (axes.gridVisible) { + control.setValue("grid_visible", true); //$NON-NLS-1$ + } + if (axes.grid.isCustom()) { + control.setValue("grid_alpha", axes.grid.getAlpha()); //$NON-NLS-1$ + control.setValue("grid_RGB", axes.grid.getColor().getRGB()); //$NON-NLS-1$ + } + } + + /** + * Creates a new object. + * + * @param control the XMLControl with the object data + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new CoordAxes(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + CoordAxes axes = (CoordAxes)obj; + axes.notyetShown = false; + + if (control.getPropertyNames().contains("grid_visible")) { //$NON-NLS-1$ + axes.setGridVisible(control.getBoolean("grid_visible")); //$NON-NLS-1$ + } + if (control.getPropertyNames().contains("grid_alpha")) { //$NON-NLS-1$ + axes.grid.setAlpha(control.getInt("grid_alpha")); //$NON-NLS-1$ + } + if (control.getPropertyNames().contains("grid_RGB")) { //$NON-NLS-1$ + Color color = new Color(control.getInt("grid_RGB")); //$NON-NLS-1$ + axes.grid.setColor(color); + } + return obj; + } + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java b/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java index 6ed6c406..e4bb955e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java @@ -1,476 +1,476 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; - -/** - * This is a Step for a CoordAxes. It is used for displaying the axes and for - * setting the origin, angle and/or scale of an ImageCoordSystem. - * - * @author Douglas Brown - */ -public class CoordAxesStep extends Step { - - // instance fields - private Origin origin; - private Handle handle; - private boolean originEnabled = true; - private boolean handleEnabled = true; - private Map handleShapes = new HashMap(); - private Shape[] fillShapes = new Shape[2]; - private GeneralPath path = new GeneralPath(); - - /** - * Constructs an AxesStep. - * - * @param track the track - * @param n the frame number - */ - public CoordAxesStep(CoordAxes track, int n) { - super(track, n); - origin = new Origin(); - origin.setCoordsEditTrigger(true); - handle = new Handle(); - handle.setCoordsEditTrigger(true); - points = new TPoint[] {origin, handle}; // origin is "default" point - screenPoints = new Point[1]; - } - - /** - * Gets the origin. - * - * @return the origin - */ - public TPoint getOrigin() { - return origin; - } - - /** - * Gets the handle. - * - * @return the origin - */ - public TPoint getHandle() { - return handle; - } - - /** - /** - * Enables and disables the interactivity of the origin. - * - * @param enabled true to enable the origin - */ - public void setOriginEnabled(boolean enabled) { - originEnabled = enabled; - } - - /** - * Gets whether the origin is enabled. - * - * @return true if the origin is enabled - */ - public boolean isOriginEnabled() { - return originEnabled; - } - - /** - * Enables and disables the interactivity of the handle. - * - * @param enabled true to enable the handle - */ - public void setHandleEnabled(boolean enabled) { - handleEnabled = enabled; - } - - /** - * Gets whether the handle is enabled. - * - * @return true if the handle is enabled - */ - public boolean isHandleEnabled() { - return handleEnabled; - } - - /** - * Overrides Step findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position - * @param ypix the y pixel position - * @return the TPoint that is hit, or null - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - TrackerPanel trackerPanel = (TrackerPanel)panel; - setHitRectCenter(xpix, ypix); - AutoTracker autoTracker = track.trackerPanel==null? null: track.trackerPanel.getAutoTracker(); - if (handleEnabled) { - Shape hitShape = handleShapes.get(trackerPanel); - if (hitShape != null && hitShape.intersects(hitRect)) { - if (autoTracker!=null && autoTracker.getTrack()==track && track.getTargetIndex()==1) { - int n = track.trackerPanel.getFrameNumber(); - AutoTracker.FrameData frame = autoTracker.getFrame(n); - if (frame==frame.getKeyFrame()) { - return null; - } - } - return handle; - } - } - if (originEnabled && !track.isLocked()) { - Interactive ia = super.findInteractive(panel, xpix, ypix); - if (ia==origin) { - if (autoTracker!=null && autoTracker.getTrack()==track && track.getTargetIndex()==0) { - int n = track.trackerPanel.getFrameNumber(); - AutoTracker.FrameData frame = autoTracker.getFrame(n); - if (frame==frame.getKeyFrame()) { - return null; - } - } - return origin; - } - } - return null; - } - - /** - * Overrides Step draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - if (track.trackerPanel==panel) { - AutoTracker autoTracker = track.trackerPanel.getAutoTracker(); - if (autoTracker.isInteracting(track)) return; - } - // draw the axes - TrackerPanel trackerPanel = (TrackerPanel)panel; - Graphics2D g = (Graphics2D)_g; - getMark(trackerPanel).draw(g, false); // no highlight - } - - /** - * Overrides Step getMark method. - * - * @param trackerPanel the tracker panel - * @return the mark - */ - protected Mark getMark(TrackerPanel trackerPanel) { - Mark mark = marks.get(trackerPanel); - TPoint selection = null; - if (mark == null) { - selection = trackerPanel.getSelectedPoint(); - // set origin location to coords origin - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - if (track.trackerPanel != null) n = track.trackerPanel.getFrameNumber(); - double x = coords.getOriginX(n); - double y = coords.getOriginY(n); - origin.setLocation(x, y); - // get default axes shape and handle hit shape (positive x-axis) - Point p0 = screenPoints[0] = origin.getScreenPosition(trackerPanel); - fillShapes[0] = footprint.getShape(screenPoints); - path.reset(); - path.moveTo(p0.x + 15, p0.y); - path.lineTo(p0.x + 3000, p0.y); - Shape hitShape = path; - // rotate axes and x-axis hit shape about origin if drawing in image space - if (trackerPanel.isDrawingInImageSpace()) { - double angle = coords.getAngle(n); - transform.setToRotation(-angle, p0.x, p0.y); - fillShapes[0] = transform.createTransformedShape(fillShapes[0]); - hitShape = transform.createTransformedShape(hitShape); - } - handleShapes.put(trackerPanel, hitShape); - // get selected point shape, if any - if (selection == origin) { - transform.setToTranslation(p0.x, p0.y); - fillShapes[1] = transform.createTransformedShape(selectionShape); - } - else if (selection == handle) { - Point p1 = handle.getScreenPosition(trackerPanel); - transform.setToTranslation(p1.x, p1.y); - fillShapes[1] = transform.createTransformedShape(selectionShape); - } - else fillShapes[1] = null; - // create mark to draw fillShapes - final Color color = footprint.getColor(); - final TrackerPanel panel = trackerPanel; - mark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setPaint(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - for (int i = 0; i < 2; i++) { - if (fillShapes[i] != null) - g.fill(fillShapes[i]); - } - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - Rectangle bounds = panel.getBounds(); - if (fillShapes[1] != null) { - bounds.add(fillShapes[1].getBounds()); - } - return bounds; - } - }; - marks.put(trackerPanel, mark); - } - return mark; - } - - /** - * Overrides Step getPointIndex method. - * - * @return the index, or -1 if not found - */ - public int getPointIndex(TPoint p) { - int i = super.getPointIndex(p); - if (i==-1) { - if (p instanceof CoordAxes.OriginPoint) return 0; - if (p instanceof CoordAxes.AnglePoint) return 1; - } - return i; - } - - /** - * Overrides Step getBounds method. - * - * @param trackerPanel the tracker panel drawing the step - * @return the bounding rectangle - */ - public Rectangle getBounds(TrackerPanel trackerPanel) { - Rectangle bounds = getMark(trackerPanel).getBounds(false); - return bounds; - } - - /** - * Clones this Step. - * - * @return a clone of this step - */ - public Object clone() { - CoordAxesStep step = (CoordAxesStep)super.clone(); - if (step != null) { - step.handleShapes = new HashMap(); - } - return step; - } - - /** - * Returns a String describing this. - * - * @return a descriptive string - */ - public String toString() { - return "CoordAxesStep " + n; //$NON-NLS-1$ - } - - /** - * Gets the step length. - * - * @return the length of the points array - */ - public static int getLength() { - return 2; - } - - // ______________________ inner Origin class ________________________ - - /** - * Inner class used to set the origin. - */ - class Origin extends TPoint { - - private double lastX, lastY; - - /** - * Overrides TPoint setXY method. - * - * @param x the x position - * @param y the y position - */ - public void setXY(double x, double y) { - if (track.isLocked()) return; - if (isAdjusting()) { - lastX = x; - lastY = y; - } - super.setXY(x, y); - TrackerPanel panel = track.trackerPanel; - if (panel != null) { - ImageCoordSystem coords = track.trackerPanel.getCoords(); - coords.setAdjusting(isAdjusting()); - int n = panel.getFrameNumber(); - coords.setOriginXY(n, x, y); - CoordAxes coordAxes = (CoordAxes)track; - coordAxes.xField.setValue(coords.getOriginX(n)); - coordAxes.yField.setValue(coords.getOriginY(n)); - } - if (isAdjusting()) { - repaint(); - } - } - - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - setXY(lastX, lastY); - track.firePropertyChange("step", null, track.trackerPanel.getFrameNumber()); //$NON-NLS-1$ - } - } - -} - - //______________________ inner Handle class ________________________ - - class Handle extends TPoint { - - // instance fields - private double angleIncrement = 0; - protected Point2D.Double p = new Point2D.Double(); - private double lastX, lastY; - - /** - * Overrides TPoint setXY method to set the angle of the x axis. - * - * @param x the x position - * @param y the y position - */ - public void setXY(double x, double y) { - if (track.isLocked()) return; - CoordAxes coordAxes = (CoordAxes)track; - if (coordAxes.trackerPanel == null) { - super.setXY(x, y); - return; - } - if (angleIncrement >= Math.PI/180) { // 1 degree of arc - // place handle at same distance from origin at closest permitted angle - p.setLocation(x, y); - double d = origin.distance(p); - double theta = origin.angle(p); - int i = Math.round((float)(theta/angleIncrement)); - theta = i * angleIncrement; - x = origin.getX() + d * Math.cos(theta); - y = origin.getY() + d * Math.sin(theta); - } - if (isAdjusting()) { - lastX = x; - lastY = y; - } - super.setXY(x, y); - double cos = origin.cos(this); - double sin = origin.sin(this); - ImageCoordSystem coords = coordAxes.trackerPanel.getCoords(); - coords.setAdjusting(isAdjusting()); - int n = coordAxes.trackerPanel.getFrameNumber(); - coords.setCosineSine(n, cos, sin); - coordAxes.angleField.setValue(coords.getAngle(n)); - angleIncrement = 0; - if (isAdjusting()) { - repaint(); - } - } - - /** - * Overrides TPoint setScreenPosition method. - * - * @param x the screen x coordinate - * @param y the screen y coordinate - * @param vidPanel the video panel - * @param e the input event making the request - */ - public void setScreenPosition(int x, int y, - VideoPanel vidPanel, - InputEvent e) { - if (e == null) { - angleIncrement = 0; - } - else if (e.isShiftDown()) { - angleIncrement = Math.PI/36; // 5 degrees - } - else { - angleIncrement = 0; - } - setScreenPosition(x, y, vidPanel); - } - - /** - * Overrides TPoint showCoordinates method so handle position can be set - * to mouse position when first selecting this handle - * - * @param vidPanel the video panel - */ - public void showCoordinates(VideoPanel vidPanel) { - if (vidPanel instanceof TrackerPanel) { - TrackerPanel trackerPanel = (TrackerPanel)vidPanel; - if (!(this == trackerPanel.getSelectedPoint())) { - // start by setting location to mouse point - setLocation(vidPanel.getMouseX(), vidPanel.getMouseY()); - // then move to nearest point on x-axis - Point2D p = getWorldPosition(vidPanel); - p.setLocation(p.getX(), 0); // move to y = 0 - int n = vidPanel.getFrameNumber(); - AffineTransform toImage = vidPanel.getCoords().getToImageTransform(n); - toImage.transform(p, p); - setLocation(p); - } - } - super.showCoordinates(vidPanel); - } - - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - setXY(lastX, lastY); - } - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; + +/** + * This is a Step for a CoordAxes. It is used for displaying the axes and for + * setting the origin, angle and/or scale of an ImageCoordSystem. + * + * @author Douglas Brown + */ +public class CoordAxesStep extends Step { + + // instance fields + private Origin origin; + private Handle handle; + private boolean originEnabled = true; + private boolean handleEnabled = true; + private Map handleShapes = new HashMap(); + private Shape[] fillShapes = new Shape[2]; + private GeneralPath path = new GeneralPath(); + + /** + * Constructs an AxesStep. + * + * @param track the track + * @param n the frame number + */ + public CoordAxesStep(CoordAxes track, int n) { + super(track, n); + origin = new Origin(); + origin.setCoordsEditTrigger(true); + handle = new Handle(); + handle.setCoordsEditTrigger(true); + points = new TPoint[] {origin, handle}; // origin is "default" point + screenPoints = new Point[1]; + } + + /** + * Gets the origin. + * + * @return the origin + */ + public TPoint getOrigin() { + return origin; + } + + /** + * Gets the handle. + * + * @return the origin + */ + public TPoint getHandle() { + return handle; + } + + /** + /** + * Enables and disables the interactivity of the origin. + * + * @param enabled true to enable the origin + */ + public void setOriginEnabled(boolean enabled) { + originEnabled = enabled; + } + + /** + * Gets whether the origin is enabled. + * + * @return true if the origin is enabled + */ + public boolean isOriginEnabled() { + return originEnabled; + } + + /** + * Enables and disables the interactivity of the handle. + * + * @param enabled true to enable the handle + */ + public void setHandleEnabled(boolean enabled) { + handleEnabled = enabled; + } + + /** + * Gets whether the handle is enabled. + * + * @return true if the handle is enabled + */ + public boolean isHandleEnabled() { + return handleEnabled; + } + + /** + * Overrides Step findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position + * @param ypix the y pixel position + * @return the TPoint that is hit, or null + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + TrackerPanel trackerPanel = (TrackerPanel)panel; + setHitRectCenter(xpix, ypix); + AutoTracker autoTracker = track.trackerPanel==null? null: track.trackerPanel.getAutoTracker(); + if (handleEnabled) { + Shape hitShape = handleShapes.get(trackerPanel); + if (hitShape != null && hitShape.intersects(hitRect)) { + if (autoTracker!=null && autoTracker.getTrack()==track && track.getTargetIndex()==1) { + int n = track.trackerPanel.getFrameNumber(); + AutoTracker.FrameData frame = autoTracker.getFrame(n); + if (frame==frame.getKeyFrame()) { + return null; + } + } + return handle; + } + } + if (originEnabled && !track.isLocked()) { + Interactive ia = super.findInteractive(panel, xpix, ypix); + if (ia==origin) { + if (autoTracker!=null && autoTracker.getTrack()==track && track.getTargetIndex()==0) { + int n = track.trackerPanel.getFrameNumber(); + AutoTracker.FrameData frame = autoTracker.getFrame(n); + if (frame==frame.getKeyFrame()) { + return null; + } + } + return origin; + } + } + return null; + } + + /** + * Overrides Step draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + if (track.trackerPanel==panel) { + AutoTracker autoTracker = track.trackerPanel.getAutoTracker(); + if (autoTracker.isInteracting(track)) return; + } + // draw the axes + TrackerPanel trackerPanel = (TrackerPanel)panel; + Graphics2D g = (Graphics2D)_g; + getMark(trackerPanel).draw(g, false); // no highlight + } + + /** + * Overrides Step getMark method. + * + * @param trackerPanel the tracker panel + * @return the mark + */ + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + TPoint selection = null; + if (mark == null) { + selection = trackerPanel.getSelectedPoint(); + // set origin location to coords origin + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + if (track.trackerPanel != null) n = track.trackerPanel.getFrameNumber(); + double x = coords.getOriginX(n); + double y = coords.getOriginY(n); + origin.setLocation(x, y); + // get default axes shape and handle hit shape (positive x-axis) + Point p0 = screenPoints[0] = origin.getScreenPosition(trackerPanel); + fillShapes[0] = footprint.getShape(screenPoints); + path.reset(); + path.moveTo(p0.x + 15, p0.y); + path.lineTo(p0.x + 3000, p0.y); + Shape hitShape = path; + // rotate axes and x-axis hit shape about origin if drawing in image space + if (trackerPanel.isDrawingInImageSpace()) { + double angle = coords.getAngle(n); + transform.setToRotation(-angle, p0.x, p0.y); + fillShapes[0] = transform.createTransformedShape(fillShapes[0]); + hitShape = transform.createTransformedShape(hitShape); + } + handleShapes.put(trackerPanel, hitShape); + // get selected point shape, if any + if (selection == origin) { + transform.setToTranslation(p0.x, p0.y); + fillShapes[1] = transform.createTransformedShape(selectionShape); + } + else if (selection == handle) { + Point p1 = handle.getScreenPosition(trackerPanel); + transform.setToTranslation(p1.x, p1.y); + fillShapes[1] = transform.createTransformedShape(selectionShape); + } + else fillShapes[1] = null; + // create mark to draw fillShapes + final Color color = footprint.getColor(); + final TrackerPanel panel = trackerPanel; + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setPaint(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + for (int i = 0; i < 2; i++) { + if (fillShapes[i] != null) + g.fill(fillShapes[i]); + } + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = panel.getBounds(); + if (fillShapes[1] != null) { + bounds.add(fillShapes[1].getBounds()); + } + return bounds; + } + }; + marks.put(trackerPanel, mark); + } + return mark; + } + + /** + * Overrides Step getPointIndex method. + * + * @return the index, or -1 if not found + */ + public int getPointIndex(TPoint p) { + int i = super.getPointIndex(p); + if (i==-1) { + if (p instanceof CoordAxes.OriginPoint) return 0; + if (p instanceof CoordAxes.AnglePoint) return 1; + } + return i; + } + + /** + * Overrides Step getBounds method. + * + * @param trackerPanel the tracker panel drawing the step + * @return the bounding rectangle + */ + public Rectangle getBounds(TrackerPanel trackerPanel) { + Rectangle bounds = getMark(trackerPanel).getBounds(false); + return bounds; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + CoordAxesStep step = (CoordAxesStep)super.clone(); + if (step != null) { + step.handleShapes = new HashMap(); + } + return step; + } + + /** + * Returns a String describing this. + * + * @return a descriptive string + */ + public String toString() { + return "CoordAxesStep " + n; //$NON-NLS-1$ + } + + /** + * Gets the step length. + * + * @return the length of the points array + */ + public static int getLength() { + return 2; + } + + // ______________________ inner Origin class ________________________ + + /** + * Inner class used to set the origin. + */ + class Origin extends TPoint { + + private double lastX, lastY; + + /** + * Overrides TPoint setXY method. + * + * @param x the x position + * @param y the y position + */ + public void setXY(double x, double y) { + if (track.isLocked()) return; + if (isAdjusting()) { + lastX = x; + lastY = y; + } + super.setXY(x, y); + TrackerPanel panel = track.trackerPanel; + if (panel != null) { + ImageCoordSystem coords = track.trackerPanel.getCoords(); + coords.setAdjusting(isAdjusting()); + int n = panel.getFrameNumber(); + coords.setOriginXY(n, x, y); + CoordAxes coordAxes = (CoordAxes)track; + coordAxes.xField.setValue(coords.getOriginX(n)); + coordAxes.yField.setValue(coords.getOriginY(n)); + } + if (isAdjusting()) { + repaint(); + } + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + setXY(lastX, lastY); + track.firePropertyChange("step", null, track.trackerPanel.getFrameNumber()); //$NON-NLS-1$ + } + } + +} + + //______________________ inner Handle class ________________________ + + class Handle extends TPoint { + + // instance fields + private double angleIncrement = 0; + protected Point2D.Double p = new Point2D.Double(); + private double lastX, lastY; + + /** + * Overrides TPoint setXY method to set the angle of the x axis. + * + * @param x the x position + * @param y the y position + */ + public void setXY(double x, double y) { + if (track.isLocked()) return; + CoordAxes coordAxes = (CoordAxes)track; + if (coordAxes.trackerPanel == null) { + super.setXY(x, y); + return; + } + if (angleIncrement >= Math.PI/180) { // 1 degree of arc + // place handle at same distance from origin at closest permitted angle + p.setLocation(x, y); + double d = origin.distance(p); + double theta = origin.angle(p); + int i = Math.round((float)(theta/angleIncrement)); + theta = i * angleIncrement; + x = origin.getX() + d * Math.cos(theta); + y = origin.getY() + d * Math.sin(theta); + } + if (isAdjusting()) { + lastX = x; + lastY = y; + } + super.setXY(x, y); + double cos = origin.cos(this); + double sin = origin.sin(this); + ImageCoordSystem coords = coordAxes.trackerPanel.getCoords(); + coords.setAdjusting(isAdjusting()); + int n = coordAxes.trackerPanel.getFrameNumber(); + coords.setCosineSine(n, cos, sin); + coordAxes.angleField.setValue(coords.getAngle(n)); + angleIncrement = 0; + if (isAdjusting()) { + repaint(); + } + } + + /** + * Overrides TPoint setScreenPosition method. + * + * @param x the screen x coordinate + * @param y the screen y coordinate + * @param vidPanel the video panel + * @param e the input event making the request + */ + public void setScreenPosition(int x, int y, + VideoPanel vidPanel, + InputEvent e) { + if (e == null) { + angleIncrement = 0; + } + else if (e.isShiftDown()) { + angleIncrement = Math.PI/36; // 5 degrees + } + else { + angleIncrement = 0; + } + setScreenPosition(x, y, vidPanel); + } + + /** + * Overrides TPoint showCoordinates method so handle position can be set + * to mouse position when first selecting this handle + * + * @param vidPanel the video panel + */ + public void showCoordinates(VideoPanel vidPanel) { + if (vidPanel instanceof TrackerPanel) { + TrackerPanel trackerPanel = (TrackerPanel)vidPanel; + if (!(this == trackerPanel.getSelectedPoint())) { + // start by setting location to mouse point + setLocation(vidPanel.getMouseX(), vidPanel.getMouseY()); + // then move to nearest point on x-axis + Point2D p = getWorldPosition(vidPanel); + p.setLocation(p.getX(), 0); // move to y = 0 + int n = vidPanel.getFrameNumber(); + AffineTransform toImage = vidPanel.getCoords().getToImageTransform(n); + toImage.transform(p, p); + setLocation(p); + } + } + super.showCoordinates(vidPanel); + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + setXY(lastX, lastY); + } + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/Derivative.java b/src/org/opensourcephysics/cabrillo/tracker/Derivative.java index 97effdc0..d5f44275 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Derivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Derivative.java @@ -1,56 +1,56 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -/** - * A Derivative implements an algorithm for finding a first, second or both derivatives. - * - * @author Douglas Brown - */ -public interface Derivative { - - /** - * Evaluates the derivative(s). - * - * Input data: - * data[0] = parameters (int[] {spill, start, stepsize, count}) - * data[1] = xData (double[]) - * data[2] = yData (double[]) - * data[3] = validData (boolean[]) - * - * Returned result: - * result[0] = firstDerivX (double[]) may be null - * result[1] = firstDerivY (double[]) may be null - * result[2] = secondDerivX (double[]) may be null - * result[3] = secondDerivY (double[]) may be null - * - * Note: result values may be NaN if no derivative could be determined - * - * @param data the input data - * @return Object[] result - */ - public Object[] evaluate(Object[] data); - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +/** + * A Derivative implements an algorithm for finding a first, second or both derivatives. + * + * @author Douglas Brown + */ +public interface Derivative { + + /** + * Evaluates the derivative(s). + * + * Input data: + * data[0] = parameters (int[] {spill, start, stepsize, count}) + * data[1] = xData (double[]) + * data[2] = yData (double[]) + * data[3] = validData (boolean[]) + * + * Returned result: + * result[0] = firstDerivX (double[]) may be null + * result[1] = firstDerivY (double[]) may be null + * result[2] = secondDerivX (double[]) may be null + * result[3] = secondDerivY (double[]) may be null + * + * Note: result values may be NaN if no derivative could be determined + * + * @param data the input data + * @return Object[] result + */ + public Object[] evaluate(Object[] data); + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java b/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java index d834f5da..d43c5433 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java @@ -1,216 +1,216 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.TitledBorder; - -import org.opensourcephysics.tools.FontSizer; - -import java.util.ArrayList; - -/** - * A dialog for setting velocity and acceleration algorithms used by one - * or more point mass tracks. - * - * @author Douglas Brown - */ -public class DerivativeAlgorithmDialog extends JDialog { - - protected TrackerPanel trackerPanel; - protected ArrayList allMasses = new ArrayList(); - protected ArrayList targetMasses = new ArrayList(); - protected JButton okButton, cancelButton; - JTextPane textPane; - int[] types = new int[] {PointMass.FINITE_DIFF, PointMass.BOUNCE_DETECT}; - JRadioButton[] buttons = new JRadioButton[types.length]; - TitledBorder choiceBorder; - int prevAlgorithm; - - /** - * Constructor. - * - * @param panel a tracker panel - */ - public DerivativeAlgorithmDialog(TrackerPanel panel) { - super(panel.getTFrame(), false); - trackerPanel = panel; - allMasses = panel.getDrawables(PointMass.class); - targetMasses.addAll(allMasses); - createGUI(); - pack(); - okButton.requestFocusInWindow(); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - - textPane = new JTextPane(); - JScrollPane scroller = new JScrollPane(textPane); - contentPane.add(scroller, BorderLayout.CENTER); - - Box choicebar = Box.createHorizontalBox(); - choiceBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ - Border empty = BorderFactory.createEmptyBorder(3, 2, 3, 2); - choicebar.setBorder(BorderFactory.createCompoundBorder(empty, choiceBorder)); - ButtonGroup group = new ButtonGroup(); - Action chooser = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - int i = Integer.parseInt(e.getActionCommand()); - for (PointMass next: targetMasses) { - next.setAlgorithm(i); - } - refreshInfo(i); - } - }; - for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import org.opensourcephysics.tools.FontSizer; + +import java.util.ArrayList; + +/** + * A dialog for setting velocity and acceleration algorithms used by one + * or more point mass tracks. + * + * @author Douglas Brown + */ +public class DerivativeAlgorithmDialog extends JDialog { + + protected TrackerPanel trackerPanel; + protected ArrayList allMasses = new ArrayList(); + protected ArrayList targetMasses = new ArrayList(); + protected JButton okButton, cancelButton; + JTextPane textPane; + int[] types = new int[] {PointMass.FINITE_DIFF, PointMass.BOUNCE_DETECT}; + JRadioButton[] buttons = new JRadioButton[types.length]; + TitledBorder choiceBorder; + int prevAlgorithm; + + /** + * Constructor. + * + * @param panel a tracker panel + */ + public DerivativeAlgorithmDialog(TrackerPanel panel) { + super(panel.getTFrame(), false); + trackerPanel = panel; + allMasses = panel.getDrawables(PointMass.class); + targetMasses.addAll(allMasses); + createGUI(); + pack(); + okButton.requestFocusInWindow(); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + textPane = new JTextPane(); + JScrollPane scroller = new JScrollPane(textPane); + contentPane.add(scroller, BorderLayout.CENTER); + + Box choicebar = Box.createHorizontalBox(); + choiceBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ + Border empty = BorderFactory.createEmptyBorder(3, 2, 3, 2); + choicebar.setBorder(BorderFactory.createCompoundBorder(empty, choiceBorder)); + ButtonGroup group = new ButtonGroup(); + Action chooser = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + int i = Integer.parseInt(e.getActionCommand()); + for (PointMass next: targetMasses) { + next.setAlgorithm(i); + } + refreshInfo(i); + } + }; + for (int i=0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.Area; - -import javax.swing.Icon; - -/** - * An DoubleArrowFootprint returns a double arrow shape - * for a Point array of length 2. - * - * @author Douglas Brown - */ -public class DoubleArrowFootprint extends LineFootprint { - - // instance fields - protected int tipLength = 16; - protected int tipWidth = 4; - boolean openHead = true; - protected BasicStroke headStroke = new BasicStroke(); - - /** - * Constructs a DoubleArrowFootprint. - * - * @param name the name - */ - public DoubleArrowFootprint(String name) { - super(name); - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; - Shape shape = getShape(points, false); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - return icon; - } - - /** - * Sets the length of the arrow tip. - * - * @param tipLength the desired tip length in pixels - */ - public void setTipLength(int tipLength) { - tipLength = Math.max(8, tipLength); - tipWidth = tipLength / 4; - this.tipLength = 4 * tipWidth; - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - @Override - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - super.setStroke(stroke); - headStroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - null, - stroke.getDashPhase()); - } - - /** - * Sets the solid arrowhead property. - * - * @param solid true for a filled arrowhead - */ - public void setSolidHead(boolean solid) { - openHead = !solid; - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - return getShape(points, true); - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @param bothEnds true to draw both ends - * @return the shape - */ - private Shape getShape(Point[] points, boolean bothEnds) { - Point p1 = points[0]; - Point p2 = points[1]; - double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); - transform.setToRotation(theta, p2.x, p2.y); - transform.translate(p2.x, p2.y); - float d = (float) p1.distance(p2); // length of the line - // set arrowhead dimensions and stroke - int tipL = tipLength; - if (bothEnds) - tipL = Math.min(tipLength, Math.round(d/2-3)); - tipL = Math.max(8, tipL); - int tipW = Math.max(tipL/4, 3); - float f = stroke.getLineWidth(); - BasicStroke s = f < tipL/4? stroke: - new BasicStroke(Math.max(tipL/4, 0.8f), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - // set up tip hitShape using full length - path.reset(); - path.moveTo(d - 4, 0); - path.lineTo(d - 6, -2); - path.lineTo(d, 0); - path.lineTo(d - 6, 2); - path.closePath(); - hitShapes[0] = transform.createTransformedShape(path); // for tip - // set up tail hitShape - path.reset(); - path.moveTo(4, 0); - path.lineTo(6, -2); - path.lineTo(0, 0); - path.lineTo(6, 2); - path.closePath(); - hitShapes[1] = transform.createTransformedShape(path); // for tail - // set up shaft hitShape - float center = d/2; // center point - float l = d - 2 * tipL; // center section length - path.reset(); - path.moveTo(center - 0.45f*l, 0); - path.lineTo(center + 0.45f*l, 0); - hitShapes[2] = transform.createTransformedShape(path); // for shaft - // shorten d to account for the width of the stroke - // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 - float w = (float) (s.getLineWidth() * 1.58) - 1; - d = d - w; - - // set up draw shape - path.reset(); - path.moveTo(tipL-tipW, 0); - path.lineTo(bothEnds? d-tipL+tipW: d, 0); - Shape shaft = transform.createTransformedShape(path); - shaft = s.createStrokedShape(shaft); - Area area = new Area(shaft); - path.reset(); - path.moveTo(w+tipL-tipW, 0); - path.lineTo(w+tipL, tipW); - path.lineTo(w, 0); - path.lineTo(w+tipL, -tipW); - path.closePath(); - Shape end1 = transform.createTransformedShape(path); - if (openHead) { - end1 = headStroke.createStrokedShape(end1); - } - area.add(new Area(end1)); - if (!openHead) { - area.add(new Area(headStroke.createStrokedShape(end1))); - } - if (bothEnds) { - path.reset(); - path.moveTo(d-tipL+tipW, 0); - path.lineTo(d-tipL, -tipW); - path.lineTo(d, 0); - path.lineTo(d-tipL, tipW); - path.closePath(); - Shape end2 = transform.createTransformedShape(path); - if (openHead) { - end2 = headStroke.createStrokedShape(end2); - } - area.add(new Area(end2)); - if (!openHead) { - area.add(new Area(headStroke.createStrokedShape(end2))); - } - } - return area; - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.Area; + +import javax.swing.Icon; + +/** + * An DoubleArrowFootprint returns a double arrow shape + * for a Point array of length 2. + * + * @author Douglas Brown + */ +public class DoubleArrowFootprint extends LineFootprint { + + // instance fields + protected int tipLength = 16; + protected int tipWidth = 4; + boolean openHead = true; + protected BasicStroke headStroke = new BasicStroke(); + + /** + * Constructs a DoubleArrowFootprint. + * + * @param name the name + */ + public DoubleArrowFootprint(String name) { + super(name); + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; + Shape shape = getShape(points, false); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + return icon; + } + + /** + * Sets the length of the arrow tip. + * + * @param tipLength the desired tip length in pixels + */ + public void setTipLength(int tipLength) { + tipLength = Math.max(8, tipLength); + tipWidth = tipLength / 4; + this.tipLength = 4 * tipWidth; + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + @Override + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + super.setStroke(stroke); + headStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + null, + stroke.getDashPhase()); + } + + /** + * Sets the solid arrowhead property. + * + * @param solid true for a filled arrowhead + */ + public void setSolidHead(boolean solid) { + openHead = !solid; + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + return getShape(points, true); + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @param bothEnds true to draw both ends + * @return the shape + */ + private Shape getShape(Point[] points, boolean bothEnds) { + Point p1 = points[0]; + Point p2 = points[1]; + double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); + transform.setToRotation(theta, p2.x, p2.y); + transform.translate(p2.x, p2.y); + float d = (float) p1.distance(p2); // length of the line + // set arrowhead dimensions and stroke + int tipL = tipLength; + if (bothEnds) + tipL = Math.min(tipLength, Math.round(d/2-3)); + tipL = Math.max(8, tipL); + int tipW = Math.max(tipL/4, 3); + float f = stroke.getLineWidth(); + BasicStroke s = f < tipL/4? stroke: + new BasicStroke(Math.max(tipL/4, 0.8f), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + // set up tip hitShape using full length + path.reset(); + path.moveTo(d - 4, 0); + path.lineTo(d - 6, -2); + path.lineTo(d, 0); + path.lineTo(d - 6, 2); + path.closePath(); + hitShapes[0] = transform.createTransformedShape(path); // for tip + // set up tail hitShape + path.reset(); + path.moveTo(4, 0); + path.lineTo(6, -2); + path.lineTo(0, 0); + path.lineTo(6, 2); + path.closePath(); + hitShapes[1] = transform.createTransformedShape(path); // for tail + // set up shaft hitShape + float center = d/2; // center point + float l = d - 2 * tipL; // center section length + path.reset(); + path.moveTo(center - 0.45f*l, 0); + path.lineTo(center + 0.45f*l, 0); + hitShapes[2] = transform.createTransformedShape(path); // for shaft + // shorten d to account for the width of the stroke + // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 + float w = (float) (s.getLineWidth() * 1.58) - 1; + d = d - w; + + // set up draw shape + path.reset(); + path.moveTo(tipL-tipW, 0); + path.lineTo(bothEnds? d-tipL+tipW: d, 0); + Shape shaft = transform.createTransformedShape(path); + shaft = s.createStrokedShape(shaft); + Area area = new Area(shaft); + path.reset(); + path.moveTo(w+tipL-tipW, 0); + path.lineTo(w+tipL, tipW); + path.lineTo(w, 0); + path.lineTo(w+tipL, -tipW); + path.closePath(); + Shape end1 = transform.createTransformedShape(path); + if (openHead) { + end1 = headStroke.createStrokedShape(end1); + } + area.add(new Area(end1)); + if (!openHead) { + area.add(new Area(headStroke.createStrokedShape(end1))); + } + if (bothEnds) { + path.reset(); + path.moveTo(d-tipL+tipW, 0); + path.lineTo(d-tipL, -tipW); + path.lineTo(d, 0); + path.lineTo(d-tipL, tipW); + path.closePath(); + Shape end2 = transform.createTransformedShape(path); + if (openHead) { + end2 = headStroke.createStrokedShape(end2); + } + area.add(new Area(end2)); + if (!openHead) { + area.add(new Area(headStroke.createStrokedShape(end2))); + } + } + return area; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java index b239e505..5e4b93e8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java @@ -1,152 +1,152 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.Area; -import java.awt.geom.Line2D; - -import javax.swing.Icon; - -/** - * A double crosshair footprint for a Point array of length 2. - * - * @author Douglas Brown - */ -public class DoubleCrosshairFootprint extends LineFootprint { - - // instance fields - protected Shape targetShape; - protected int size; - protected Shape hitShape; - - /** - * Constructs a DoubleCrosshairFootprint. - * - * @param name the name - */ - public DoubleCrosshairFootprint(String name) { - super(name); - setCrosshairSize(4, 0); - } - - /** - /** - * Sets the size of the crosshair. - * - * @param out the outside end of the crosshair - * @param in the inside end of the crosshair - */ - public void setCrosshairSize(int out, int in) { - size = out; - // make target shape - path.reset(); - path.moveTo(-out, 0); - path.lineTo(-in, 0); - path.moveTo(out, 0); - path.lineTo(in, 0); - path.moveTo(0, out); - path.lineTo(0, in); - path.moveTo(0, -out); - path.lineTo(0, -in); - transform.setToIdentity(); - targetShape = transform.createTransformedShape(path); - hitShape = new Rectangle(-size/2, -size/2, size, size); - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Shape target = stroke.createStrokedShape(targetShape); - Area area = new Area(target); - double x0 = size/2-w+2; - double y0 = h-size/2-2; - double d = Math.sqrt(x0*x0+y0*y0); - double x1 = x0*size/d; - double y1 = y0*size/d; - Line2D line = new Line2D.Double(x0, y0, x1, y1); - area.add(new Area(stroke.createStrokedShape(line))); - ShapeIcon icon = new ShapeIcon(area, w, h); - icon.setColor(color); - return icon; - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - this.stroke = stroke; - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - Point p1 = points[0]; - Point p2 = points[1]; - - // set up end shapes - transform.setToTranslation(p1.x, p1.y); - Shape target1 = transform.createTransformedShape(targetShape); - hitShapes[0] = transform.createTransformedShape(hitShape); // end1 - transform.setToTranslation(p2.x, p2.y); - Shape target2 = transform.createTransformedShape(targetShape); - hitShapes[1] = transform.createTransformedShape(hitShape); // end2 - - // set up line shapes - float d = (float)p1.distance(p2); // distance between ends - float center = d/2; // center point - float l = d - 2*size-6; // line length - float f = 0.45f; // hit shape is 90% of line length - path.reset(); - path.moveTo(center - f*l, 0); - path.lineTo(center + f*l, 0); - double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); - transform.setToRotation(theta, p2.x, p2.y); - transform.translate(p2.x, p2.y); - hitShapes[2] = transform.createTransformedShape(path); // line - path.reset(); - path.moveTo(center - l/2, 0); - path.lineTo(center + l/2, 0); - Shape line = transform.createTransformedShape(path); - - // set up drawing area - Area area = new Area(stroke.createStrokedShape(target1)); - area.add(new Area(stroke.createStrokedShape(target2))); - area.add(new Area(stroke.createStrokedShape(line))); - return area; - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.Area; +import java.awt.geom.Line2D; + +import javax.swing.Icon; + +/** + * A double crosshair footprint for a Point array of length 2. + * + * @author Douglas Brown + */ +public class DoubleCrosshairFootprint extends LineFootprint { + + // instance fields + protected Shape targetShape; + protected int size; + protected Shape hitShape; + + /** + * Constructs a DoubleCrosshairFootprint. + * + * @param name the name + */ + public DoubleCrosshairFootprint(String name) { + super(name); + setCrosshairSize(4, 0); + } + + /** + /** + * Sets the size of the crosshair. + * + * @param out the outside end of the crosshair + * @param in the inside end of the crosshair + */ + public void setCrosshairSize(int out, int in) { + size = out; + // make target shape + path.reset(); + path.moveTo(-out, 0); + path.lineTo(-in, 0); + path.moveTo(out, 0); + path.lineTo(in, 0); + path.moveTo(0, out); + path.lineTo(0, in); + path.moveTo(0, -out); + path.lineTo(0, -in); + transform.setToIdentity(); + targetShape = transform.createTransformedShape(path); + hitShape = new Rectangle(-size/2, -size/2, size, size); + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Shape target = stroke.createStrokedShape(targetShape); + Area area = new Area(target); + double x0 = size/2-w+2; + double y0 = h-size/2-2; + double d = Math.sqrt(x0*x0+y0*y0); + double x1 = x0*size/d; + double y1 = y0*size/d; + Line2D line = new Line2D.Double(x0, y0, x1, y1); + area.add(new Area(stroke.createStrokedShape(line))); + ShapeIcon icon = new ShapeIcon(area, w, h); + icon.setColor(color); + return icon; + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + this.stroke = stroke; + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + Point p1 = points[0]; + Point p2 = points[1]; + + // set up end shapes + transform.setToTranslation(p1.x, p1.y); + Shape target1 = transform.createTransformedShape(targetShape); + hitShapes[0] = transform.createTransformedShape(hitShape); // end1 + transform.setToTranslation(p2.x, p2.y); + Shape target2 = transform.createTransformedShape(targetShape); + hitShapes[1] = transform.createTransformedShape(hitShape); // end2 + + // set up line shapes + float d = (float)p1.distance(p2); // distance between ends + float center = d/2; // center point + float l = d - 2*size-6; // line length + float f = 0.45f; // hit shape is 90% of line length + path.reset(); + path.moveTo(center - f*l, 0); + path.lineTo(center + f*l, 0); + double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); + transform.setToRotation(theta, p2.x, p2.y); + transform.translate(p2.x, p2.y); + hitShapes[2] = transform.createTransformedShape(path); // line + path.reset(); + path.moveTo(center - l/2, 0); + path.lineTo(center + l/2, 0); + Shape line = transform.createTransformedShape(path); + + // set up drawing area + Area area = new Area(stroke.createStrokedShape(target1)); + area.add(new Area(stroke.createStrokedShape(target2))); + area.add(new Area(stroke.createStrokedShape(line))); + return area; + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicFunctionPanel.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicFunctionPanel.java index b52acaa9..8f58bbd0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicFunctionPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicFunctionPanel.java @@ -1,70 +1,70 @@ -/* - * Open Source Physics software is free software as described near the bottom of this code file. - * - * For additional information and documentation on Open Source Physics please see: - * - */ - -package org.opensourcephysics.cabrillo.tracker; - -import org.opensourcephysics.tools.*; - -/** - * This is a FunctionPanel for dynamic particles. - * - * @author Douglas Brown - */ -public class DynamicFunctionPanel extends ModelFunctionPanel { - - /** - * Constructor with user function editor and track. - * - * @param editor the user function editor - * @param track a DynamicParticle - */ - public DynamicFunctionPanel(UserFunctionEditor editor, DynamicParticle track) { - super(editor, track); - } - - /** - * Returns the forcce functions. - * - * @return the x and y UserFunctions - */ - public UserFunction[] getForceFunctions() { - return ((UserFunctionEditor)functionEditor).getMainFunctions(); - } - - /** - * Refreshes the GUI. - */ - protected void refreshGUI() { - super.refreshGUI(); - functionEditor.setBorderTitle(TrackerRes.getString("DynamicFunctionPanel.FunctionEditor.Border.Title")); //$NON-NLS-1$ - } - -} - -/* - * Open Source Physics software is free software; you can redistribute - * it and/or modify it under the terms of the GNU General Public License (GPL) as - * published by the Free Software Foundation; either version 3 of the License, - * or(at your option) any later version. - - * Code that uses any portion of the code in the org.opensourcephysics package - * or any subpackage (subdirectory) of this package must must also be be released - * under the GNU GPL license. - * - * This software 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; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at http://www.gnu.org/copyleft/gpl.html - * - * Copyright (c) 2007 The Open Source Physics project - * http://www.opensourcephysics.org - */ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker; + +import org.opensourcephysics.tools.*; + +/** + * This is a FunctionPanel for dynamic particles. + * + * @author Douglas Brown + */ +public class DynamicFunctionPanel extends ModelFunctionPanel { + + /** + * Constructor with user function editor and track. + * + * @param editor the user function editor + * @param track a DynamicParticle + */ + public DynamicFunctionPanel(UserFunctionEditor editor, DynamicParticle track) { + super(editor, track); + } + + /** + * Returns the forcce functions. + * + * @return the x and y UserFunctions + */ + public UserFunction[] getForceFunctions() { + return ((UserFunctionEditor)functionEditor).getMainFunctions(); + } + + /** + * Refreshes the GUI. + */ + protected void refreshGUI() { + super.refreshGUI(); + functionEditor.setBorderTitle(TrackerRes.getString("DynamicFunctionPanel.FunctionEditor.Border.Title")); //$NON-NLS-1$ + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 3 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java index 5835d648..834ebbac 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java @@ -1,719 +1,719 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Graphics; -import java.awt.geom.*; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.util.HashMap; - -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.numerics.*; -import org.opensourcephysics.tools.Parameter; -import org.opensourcephysics.tools.UserFunction; -import org.opensourcephysics.tools.UserFunctionEditor; -import org.opensourcephysics.controls.*; -import org.opensourcephysics.display.Dataset; -import org.opensourcephysics.display.DatasetManager; -import org.opensourcephysics.display.DrawingPanel; - -/** - * DynamicParticle models a particle using Newton's 2nd law. - * - * @author W. Christian, D. Brown - * @version 1.0 - */ -public class DynamicParticle - extends ParticleModel implements ODE { - - // instance fields - protected boolean inSystem; // used only when loading - protected String boosterName; // used only when loading - protected double[] state = new double[5]; // {x, vx, y, vy, t} - protected double[] initialState = new double[5]; // {x, vx, y, vy, t} - protected ODESolver solver = new RK4(this); - protected int iterationsPerStep = 100; - protected DynamicSystem system; - protected Point2D[] points; - protected HashMap frameStates = new HashMap(); - protected ModelBooster modelBooster = new ModelBooster(); - - /** - * Constructor - */ - public DynamicParticle() { - // create initial condition parameters - initializeInitEditor(); - points = new Point2D[] {point}; - } - - /** - * Overrides ParticleModel draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - // if a booster is named, set the booster to the named point mass - if (boosterName!=null && panel instanceof TrackerPanel) { - for (PointMass track: ((TrackerPanel)panel).getDrawables(PointMass.class)) { - if (track.getName().equals(boosterName)) { - setBooster(track); - boosterName = null; - break; - } - } - } - // if this is part of a system, then the system draws it - if (system==null && !inSystem) - super.draw(panel, _g); - } - - /** - * Gets a display name for this model. - * - * @return the display name - */ - public String getDisplayName() { - String s = getName(); - if (system == null) return s; - String in = TrackerRes.getString("DynamicParticle.System.In"); //$NON-NLS-1$ - return s+" ("+in+" "+system.getName()+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - /** - * Deletes this particle. Overrides ParticleModel method to warn user if this - * is part of a DynamicSystem. - * - */ - public void delete() { - // if this is part of a system, warn user - if (system !=null) { - String message = TrackerRes.getString("DynamicParticle.Dialog.Delete.Message"); //$NON-NLS-1$ - int response = javax.swing.JOptionPane.showConfirmDialog( - trackerPanel.getTFrame(), - message, - TrackerRes.getString("DynamicParticle.Dialog.Delete.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.OK_CANCEL_OPTION, - javax.swing.JOptionPane.WARNING_MESSAGE); - if (response == javax.swing.JOptionPane.YES_OPTION) { - system.removeParticle(this); - } - else return; - } - super.delete(); - } - - /** - * Refreshes step positions. - */ - protected void refreshSteps() { - if (system==null) - super.refreshSteps(); - } - - /** - * Resets parameters, initializes solver and sets position(s) for start frame - * or first clip frame following. - */ - public void reset() { - if (system!=null) return; - super.reset(); - resetState(); // resets state to initial state (ie at startFrame) - double[] state = getState(); - // state is {x, vx, y, vy, t} but may be different in subclasses - t0 = state[state.length-1]; // time at start frame - setTracePositions(state); - if (trackerPanel != null) { - erase(); - dt = trackerPanel.getPlayer().getMeanStepDuration() / (1000*tracePtsPerStep); - dt /= iterationsPerStep; - solver.initialize(dt); - ParticleModel[] models = getModels(); - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - // find last frame included in both model and clip - int end = Math.min(getEndFrame(), clip.getFrameCount()-1); - while (end>getStartFrame() && !clip.includesFrame(end)) { - end--; - } - // determine if this is an empty dynamic system - boolean emptySystem = false; - if (this instanceof DynamicSystem) { - DynamicSystem system = (DynamicSystem)this; - emptySystem = system.particles.length==0; - } - // clear all steps if empty system or no frames included in clip - if (emptySystem || - (end==getStartFrame() && !clip.includesFrame(getStartFrame()))) { - for (int i = 0; i < models.length; i++) { - models[i].steps.setLength(1); - models[i].steps.setStep(0, null); - for (TrackerPanel panel: panels) { - models[i].getVArray(panel).setLength(0); - models[i].getAArray(panel).setLength(0); - } - models[i].traceX = new double[0]; - models[i].traceY = new double[0]; - models[i].support.firePropertyChange("steps", null, null); //$NON-NLS-1$ - } - return; - } - // find first frame included in both model and clip - int firstFrameInClip = getStartFrame(); - while (firstFrameInClip solverClass) { - Class[] c = {ODE.class}; - Object[] o = {this}; - try { // create the solver by reflection - java.lang.reflect.Constructor constructor = solverClass.getDeclaredConstructor(c); - solver = (ODESolver) constructor.newInstance(o); - reset(); - } catch(Exception ex) { - ex.printStackTrace(); - } - } - - /** - * Gets the initial state {x, vx, y, vy, t}. - * - * @return the initial state - */ - public double[] getInitialState() { - double[] init = getInitialValues(); - // init is {t, x, y, vx, vy} - initialState[0] = init[1]; - initialState[1] = init[3]; - initialState[2] = init[2]; - initialState[3] = init[4]; - initialState[4] = init[0]; - return initialState; - } - - /** - * Gets the start frame for this model. Overrides ParticleModel method. - * - * @return the start frame - */ - public int getStartFrame() { - if (system!=null) - return system.getStartFrame(); - return startFrame; - } - - /** - * Sets the start frame for this model. Overrides ParticleModel method. - * - * @param n the desired start frame - */ - public void setStartFrame(int n) { - if (system!=null) { - system.setStartFrame(n); - system.refreshSystemParameters(); - } - else { - super.setStartFrame(n); - if (modelBooster!=null) { - modelBooster.setBooster(modelBooster.booster); - } - } - } - - /** - * Gets the end frame for this model. Overrides ParticleModel method. - * - * @return the end frame - */ - public int getEndFrame() { - if (system!=null) - return system.getEndFrame(); - return endFrame; - } - - /** - * Sets the end frame for this model. Overrides ParticleModel method. - * - * @param n the desired end frame - */ - public void setEndFrame(int n) { - if (system!=null) - system.setEndFrame(n); - else super.setEndFrame(n); - } - - /** - * Gets the x- and y-forces based on a specified cartesian state {x, vx, y, vy, t}. - * - * @param cartesianState the state - * @return the forces - */ - protected double[] getXYForces(double[] cartesianState) { - UserFunction[] f = getFunctionEditor().getMainFunctions(); - // state is {x, vx, y, vy, t} - double fx = f[0].evaluate(cartesianState); - double fy = f[1].evaluate(cartesianState); - return new double[] {fx, fy}; - } - - /** - * Resets the state variables {x, vx, y, vy, t}. - */ - protected void resetState() { - if (system!=null) - system.resetState(); - else - System.arraycopy(getInitialState(), 0, state, 0, state.length); - } - - /** - * Creates the initial position and velocity parameters. - */ - protected void initializeInitEditor() { - Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ - Parameter x = new Parameter("x", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - x.setNameEditable(false); - x.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialX.Description")); //$NON-NLS-1$ - Parameter y = new Parameter("y", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - y.setNameEditable(false); - y.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialY.Description")); //$NON-NLS-1$ - Parameter vx = new Parameter("vx", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - vx.setNameEditable(false); - vx.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityX.Description")); //$NON-NLS-1$ - Parameter vy = new Parameter("vy", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - vy.setNameEditable(false); - vy.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityY.Description")); //$NON-NLS-1$ - getInitEditor().setParameters(new Parameter[] {t, x, y, vx, vy}); - } - - /** - * Creates and initializes the ModelFunctionPanel. - */ - protected void initializeFunctionPanel() { - // create panel - functionEditor = new UserFunctionEditor(); - functionPanel = new DynamicFunctionPanel(functionEditor, this); - // create main force functions - String[] funcVars = new String[] {"x", "vx", //$NON-NLS-1$ //$NON-NLS-2$ - "y", "vy", "t"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - UserFunction[] uf = new UserFunction[2]; - uf[0] = new UserFunction("fx"); //$NON-NLS-1$ - uf[0].setNameEditable(false); - uf[0].setExpression("0", funcVars); //$NON-NLS-1$ - uf[0].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.X.Description")); //$NON-NLS-1$ - uf[1] = new UserFunction("fy"); //$NON-NLS-1$ - uf[1].setNameEditable(false); - uf[1].setExpression("0", funcVars); //$NON-NLS-1$ - uf[1].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.Y.Description")); //$NON-NLS-1$ - functionEditor.setMainFunctions(uf); - // create mass and initial time parameters - createMassAndTimeParameters(); - } - - /** - * Gets the next trace positions. - * - * @return an array of points at the trace positions - */ - protected Point2D[] getNextTracePositions() { - for (int i = 0; i < iterationsPerStep; i++) { - solver.step(); - } - setTracePositions(getState()); - return points; - } - - /** - * Sets the positions of the trace points based on a specified state. - * - * @param state the state - */ - protected void setTracePositions(double[] state) { - // state is {x, vx, y, vy, t} - points[0].setLocation(state[0], state[2]); - } - - /** - * Gets the cartesian state {x, vx, y, vy, t} of a PointMass at a specified frame number. - * - * @param target the PointMass - * @param frameNumber the frame number - * @return the state, or null if the point mass is not marked at the frame number - */ - protected double[] getCartesianState(PointMass target, int frameNumber) { - DatasetManager data = target.getData(trackerPanel); - - // determine the dataset index for the specified frame number - Dataset ds = data.getDataset(data.getDatasetIndex("frame")); //$NON-NLS-1$ - int index = -1; - double[] frames = ds.getYPoints(); - for (int i=0; i solverClass = Class.forName(solver); - p.setSolver(solverClass); - } catch(Exception ex2) {/** empty block */} - } - String t = control.getString("t0"); //$NON-NLS-1$ - p.getInitEditor().setExpression("t", t, false); //$NON-NLS-1$ - String x = control.getString("x"); //$NON-NLS-1$ - p.getInitEditor().setExpression("x", x, false); //$NON-NLS-1$ - String y = control.getString("y"); //$NON-NLS-1$ - p.getInitEditor().setExpression("y", y, false); //$NON-NLS-1$ - String vx = control.getString("vx"); //$NON-NLS-1$ - p.getInitEditor().setExpression("vx", vx, false); //$NON-NLS-1$ - String vy = control.getString("vy"); //$NON-NLS-1$ - p.getInitEditor().setExpression("vy", vy, false); //$NON-NLS-1$ - String fx = control.getString("force x"); //$NON-NLS-1$ - p.getFunctionEditor().setExpression("fx", fx, false); //$NON-NLS-1$ - String fy = control.getString("force y"); //$NON-NLS-1$ - p.getFunctionEditor().setExpression("fy", fy, false); //$NON-NLS-1$ - p.reset(); - } - return obj; - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Graphics; +import java.awt.geom.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; + +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.numerics.*; +import org.opensourcephysics.tools.Parameter; +import org.opensourcephysics.tools.UserFunction; +import org.opensourcephysics.tools.UserFunctionEditor; +import org.opensourcephysics.controls.*; +import org.opensourcephysics.display.Dataset; +import org.opensourcephysics.display.DatasetManager; +import org.opensourcephysics.display.DrawingPanel; + +/** + * DynamicParticle models a particle using Newton's 2nd law. + * + * @author W. Christian, D. Brown + * @version 1.0 + */ +public class DynamicParticle + extends ParticleModel implements ODE { + + // instance fields + protected boolean inSystem; // used only when loading + protected String boosterName; // used only when loading + protected double[] state = new double[5]; // {x, vx, y, vy, t} + protected double[] initialState = new double[5]; // {x, vx, y, vy, t} + protected ODESolver solver = new RK4(this); + protected int iterationsPerStep = 100; + protected DynamicSystem system; + protected Point2D[] points; + protected HashMap frameStates = new HashMap(); + protected ModelBooster modelBooster = new ModelBooster(); + + /** + * Constructor + */ + public DynamicParticle() { + // create initial condition parameters + initializeInitEditor(); + points = new Point2D[] {point}; + } + + /** + * Overrides ParticleModel draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + // if a booster is named, set the booster to the named point mass + if (boosterName!=null && panel instanceof TrackerPanel) { + for (PointMass track: ((TrackerPanel)panel).getDrawables(PointMass.class)) { + if (track.getName().equals(boosterName)) { + setBooster(track); + boosterName = null; + break; + } + } + } + // if this is part of a system, then the system draws it + if (system==null && !inSystem) + super.draw(panel, _g); + } + + /** + * Gets a display name for this model. + * + * @return the display name + */ + public String getDisplayName() { + String s = getName(); + if (system == null) return s; + String in = TrackerRes.getString("DynamicParticle.System.In"); //$NON-NLS-1$ + return s+" ("+in+" "+system.getName()+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * Deletes this particle. Overrides ParticleModel method to warn user if this + * is part of a DynamicSystem. + * + */ + public void delete() { + // if this is part of a system, warn user + if (system !=null) { + String message = TrackerRes.getString("DynamicParticle.Dialog.Delete.Message"); //$NON-NLS-1$ + int response = javax.swing.JOptionPane.showConfirmDialog( + trackerPanel.getTFrame(), + message, + TrackerRes.getString("DynamicParticle.Dialog.Delete.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.OK_CANCEL_OPTION, + javax.swing.JOptionPane.WARNING_MESSAGE); + if (response == javax.swing.JOptionPane.YES_OPTION) { + system.removeParticle(this); + } + else return; + } + super.delete(); + } + + /** + * Refreshes step positions. + */ + protected void refreshSteps() { + if (system==null) + super.refreshSteps(); + } + + /** + * Resets parameters, initializes solver and sets position(s) for start frame + * or first clip frame following. + */ + public void reset() { + if (system!=null) return; + super.reset(); + resetState(); // resets state to initial state (ie at startFrame) + double[] state = getState(); + // state is {x, vx, y, vy, t} but may be different in subclasses + t0 = state[state.length-1]; // time at start frame + setTracePositions(state); + if (trackerPanel != null) { + erase(); + dt = trackerPanel.getPlayer().getMeanStepDuration() / (1000*tracePtsPerStep); + dt /= iterationsPerStep; + solver.initialize(dt); + ParticleModel[] models = getModels(); + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + // find last frame included in both model and clip + int end = Math.min(getEndFrame(), clip.getFrameCount()-1); + while (end>getStartFrame() && !clip.includesFrame(end)) { + end--; + } + // determine if this is an empty dynamic system + boolean emptySystem = false; + if (this instanceof DynamicSystem) { + DynamicSystem system = (DynamicSystem)this; + emptySystem = system.particles.length==0; + } + // clear all steps if empty system or no frames included in clip + if (emptySystem || + (end==getStartFrame() && !clip.includesFrame(getStartFrame()))) { + for (int i = 0; i < models.length; i++) { + models[i].steps.setLength(1); + models[i].steps.setStep(0, null); + for (TrackerPanel panel: panels) { + models[i].getVArray(panel).setLength(0); + models[i].getAArray(panel).setLength(0); + } + models[i].traceX = new double[0]; + models[i].traceY = new double[0]; + models[i].support.firePropertyChange("steps", null, null); //$NON-NLS-1$ + } + return; + } + // find first frame included in both model and clip + int firstFrameInClip = getStartFrame(); + while (firstFrameInClip solverClass) { + Class[] c = {ODE.class}; + Object[] o = {this}; + try { // create the solver by reflection + java.lang.reflect.Constructor constructor = solverClass.getDeclaredConstructor(c); + solver = (ODESolver) constructor.newInstance(o); + reset(); + } catch(Exception ex) { + ex.printStackTrace(); + } + } + + /** + * Gets the initial state {x, vx, y, vy, t}. + * + * @return the initial state + */ + public double[] getInitialState() { + double[] init = getInitialValues(); + // init is {t, x, y, vx, vy} + initialState[0] = init[1]; + initialState[1] = init[3]; + initialState[2] = init[2]; + initialState[3] = init[4]; + initialState[4] = init[0]; + return initialState; + } + + /** + * Gets the start frame for this model. Overrides ParticleModel method. + * + * @return the start frame + */ + public int getStartFrame() { + if (system!=null) + return system.getStartFrame(); + return startFrame; + } + + /** + * Sets the start frame for this model. Overrides ParticleModel method. + * + * @param n the desired start frame + */ + public void setStartFrame(int n) { + if (system!=null) { + system.setStartFrame(n); + system.refreshSystemParameters(); + } + else { + super.setStartFrame(n); + if (modelBooster!=null) { + modelBooster.setBooster(modelBooster.booster); + } + } + } + + /** + * Gets the end frame for this model. Overrides ParticleModel method. + * + * @return the end frame + */ + public int getEndFrame() { + if (system!=null) + return system.getEndFrame(); + return endFrame; + } + + /** + * Sets the end frame for this model. Overrides ParticleModel method. + * + * @param n the desired end frame + */ + public void setEndFrame(int n) { + if (system!=null) + system.setEndFrame(n); + else super.setEndFrame(n); + } + + /** + * Gets the x- and y-forces based on a specified cartesian state {x, vx, y, vy, t}. + * + * @param cartesianState the state + * @return the forces + */ + protected double[] getXYForces(double[] cartesianState) { + UserFunction[] f = getFunctionEditor().getMainFunctions(); + // state is {x, vx, y, vy, t} + double fx = f[0].evaluate(cartesianState); + double fy = f[1].evaluate(cartesianState); + return new double[] {fx, fy}; + } + + /** + * Resets the state variables {x, vx, y, vy, t}. + */ + protected void resetState() { + if (system!=null) + system.resetState(); + else + System.arraycopy(getInitialState(), 0, state, 0, state.length); + } + + /** + * Creates the initial position and velocity parameters. + */ + protected void initializeInitEditor() { + Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ + Parameter x = new Parameter("x", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + x.setNameEditable(false); + x.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialX.Description")); //$NON-NLS-1$ + Parameter y = new Parameter("y", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + y.setNameEditable(false); + y.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialY.Description")); //$NON-NLS-1$ + Parameter vx = new Parameter("vx", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + vx.setNameEditable(false); + vx.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityX.Description")); //$NON-NLS-1$ + Parameter vy = new Parameter("vy", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + vy.setNameEditable(false); + vy.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityY.Description")); //$NON-NLS-1$ + getInitEditor().setParameters(new Parameter[] {t, x, y, vx, vy}); + } + + /** + * Creates and initializes the ModelFunctionPanel. + */ + protected void initializeFunctionPanel() { + // create panel + functionEditor = new UserFunctionEditor(); + functionPanel = new DynamicFunctionPanel(functionEditor, this); + // create main force functions + String[] funcVars = new String[] {"x", "vx", //$NON-NLS-1$ //$NON-NLS-2$ + "y", "vy", "t"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + UserFunction[] uf = new UserFunction[2]; + uf[0] = new UserFunction("fx"); //$NON-NLS-1$ + uf[0].setNameEditable(false); + uf[0].setExpression("0", funcVars); //$NON-NLS-1$ + uf[0].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.X.Description")); //$NON-NLS-1$ + uf[1] = new UserFunction("fy"); //$NON-NLS-1$ + uf[1].setNameEditable(false); + uf[1].setExpression("0", funcVars); //$NON-NLS-1$ + uf[1].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.Y.Description")); //$NON-NLS-1$ + functionEditor.setMainFunctions(uf); + // create mass and initial time parameters + createMassAndTimeParameters(); + } + + /** + * Gets the next trace positions. + * + * @return an array of points at the trace positions + */ + protected Point2D[] getNextTracePositions() { + for (int i = 0; i < iterationsPerStep; i++) { + solver.step(); + } + setTracePositions(getState()); + return points; + } + + /** + * Sets the positions of the trace points based on a specified state. + * + * @param state the state + */ + protected void setTracePositions(double[] state) { + // state is {x, vx, y, vy, t} + points[0].setLocation(state[0], state[2]); + } + + /** + * Gets the cartesian state {x, vx, y, vy, t} of a PointMass at a specified frame number. + * + * @param target the PointMass + * @param frameNumber the frame number + * @return the state, or null if the point mass is not marked at the frame number + */ + protected double[] getCartesianState(PointMass target, int frameNumber) { + DatasetManager data = target.getData(trackerPanel); + + // determine the dataset index for the specified frame number + Dataset ds = data.getDataset(data.getDatasetIndex("frame")); //$NON-NLS-1$ + int index = -1; + double[] frames = ds.getYPoints(); + for (int i=0; i solverClass = Class.forName(solver); + p.setSolver(solverClass); + } catch(Exception ex2) {/** empty block */} + } + String t = control.getString("t0"); //$NON-NLS-1$ + p.getInitEditor().setExpression("t", t, false); //$NON-NLS-1$ + String x = control.getString("x"); //$NON-NLS-1$ + p.getInitEditor().setExpression("x", x, false); //$NON-NLS-1$ + String y = control.getString("y"); //$NON-NLS-1$ + p.getInitEditor().setExpression("y", y, false); //$NON-NLS-1$ + String vx = control.getString("vx"); //$NON-NLS-1$ + p.getInitEditor().setExpression("vx", vx, false); //$NON-NLS-1$ + String vy = control.getString("vy"); //$NON-NLS-1$ + p.getInitEditor().setExpression("vy", vy, false); //$NON-NLS-1$ + String fx = control.getString("force x"); //$NON-NLS-1$ + p.getFunctionEditor().setExpression("fx", fx, false); //$NON-NLS-1$ + String fy = control.getString("force y"); //$NON-NLS-1$ + p.getFunctionEditor().setExpression("fy", fy, false); //$NON-NLS-1$ + p.reset(); + } + return obj; + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticlePolar.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticlePolar.java index fc2804e6..7e9e70d0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticlePolar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticlePolar.java @@ -1,257 +1,257 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import org.opensourcephysics.tools.FunctionEditor; -import org.opensourcephysics.tools.Parameter; -import org.opensourcephysics.tools.UserFunction; -import org.opensourcephysics.tools.UserFunctionEditor; -import org.opensourcephysics.controls.*; - -/** - * DynamicParticlePolar models a particle using Newton's 2nd law in polar coordinates. - * - * @author D. Brown - * @version 1.0 - */ -public class DynamicParticlePolar extends DynamicParticle { - - /** - * Gets the initial state {x, vx, y, vy, t}. - * - * @return the initial state - */ - public double[] getInitialState() { - double[] polar = getInitialValues(); - // polar is {t, r, theta, vr, omega} - double cos = Math.cos(polar[2]); - double sin = Math.sin(polar[2]); - if (Math.abs(cos) < 0.0000001) cos = 0; - if (Math.abs(sin) < 0.0000001) sin = 0; - double romega = polar[1]*polar[4]; - // initial state is {x, vx, y, vy, t} - initialState[0] = polar[1]*cos; // x = r*cos(theta) - initialState[1] = polar[3]*cos - romega*sin; // vx = vr*cos(theta)-r*omega*sin(theta) - initialState[2] = polar[1]*sin; // y = r*sin(theta) - initialState[3] = polar[3]*sin + romega*cos; // vy = vr*sin(theta)+r*omega*cos(theta) - initialState[4] = polar[0]; // t - return initialState; - } - - /** - * Gets the x- and y-forces based on a specified cartesian state {x, vx, y, vy, t}. - * - * @param cartesianState the state - * @return the forces - */ - protected double[] getXYForces(double[] cartesianState) { - // cartesianState is {x, vx, y, vy, t} - UserFunction[] f = getFunctionEditor().getMainFunctions(); - // get polar state {r, vr, theta, omega, t} to evaluate polar functions - double[] polarState = getPolarState(cartesianState); - double fr = f[0].evaluate(polarState); - double ftheta = f[1].evaluate(polarState); - double cos = Math.cos(polarState[2]); - double sin = Math.sin(polarState[2]); - double fx = (fr*cos - ftheta*sin); - double fy = (fr*sin + ftheta*cos); - return new double[] {fx, fy}; - } - - /** - * Creates and initializes the ModelFunctionPanel. - */ - protected void initializeFunctionPanel() { - // create panel - functionEditor = new UserFunctionEditor(); - functionPanel = new DynamicFunctionPanel(functionEditor, this); - // create main force functions - UserFunction[] uf = new UserFunction[2]; - String[] funcVars = new String[] {"r", "vr", //$NON-NLS-1$ //$NON-NLS-2$ - FunctionEditor.THETA, FunctionEditor.OMEGA, "t"}; //$NON-NLS-1$ - uf[0] = new UserFunction("fr"); //$NON-NLS-1$ - uf[0].setNameEditable(false); - uf[0].setExpression("0", funcVars); //$NON-NLS-1$ - uf[0].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.R.Description")); //$NON-NLS-1$ - String s = "f"+FunctionEditor.THETA; //$NON-NLS-1$ - uf[1] = new UserFunction(s); - uf[1].setNameEditable(false); - uf[1].setExpression("0", funcVars); //$NON-NLS-1$ - uf[1].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.Theta.Description")); //$NON-NLS-1$ - functionEditor.setMainFunctions(uf); - // create mass and initial time parameters - createMassAndTimeParameters(); - } - - /** - * Creates the initial position and velocity parameters. - */ - protected void initializeInitEditor() { - Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ - Parameter r = new Parameter("r", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - r.setNameEditable(false); - r.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialR.Description")); //$NON-NLS-1$ - Parameter th = new Parameter(FunctionEditor.THETA, "0.0"); //$NON-NLS-1$ - th.setNameEditable(false); - th.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialTheta.Description")); //$NON-NLS-1$ - Parameter v = new Parameter("vr", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ - v.setNameEditable(false); - v.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityR.Description")); //$NON-NLS-1$ - Parameter w = new Parameter(FunctionEditor.OMEGA, "0.0"); //$NON-NLS-1$ - w.setNameEditable(false); - w.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialOmega.Description")); //$NON-NLS-1$ - getInitEditor().setParameters(new Parameter[] {t, r, th, v, w}); - } - - /** - * Converts a cartesian state {x, vx, y, vy, t} to polar {r, vr, theta, omega, t}, - * both relative to the origin. - * - * @param state the cartesian state - * @return the polar state - */ - protected double[] getPolarState(double[] state) { - // state is {x, vx, y, vy, t} - double[] polarState = new double[5]; - double dx = state[0]; - double dy = state[2]; - double vx = state[1]; - double vy = state[3]; - double r = Math.sqrt(dx*dx + dy*dy); - double v = Math.sqrt(vx*vx + vy*vy); - double rang = Math.atan2(dy, dx); - double vang = Math.atan2(vy, vx); - double dang = vang-rang; - // polar state is {r, vr, theta, omega, t} - polarState[0] = r; // r - polarState[1] = r == 0? v: v*Math.cos(dang); // vr - polarState[2] = r == 0? vang: rang; // theta - polarState[3] = r == 0? 0: v*Math.sin(dang)/r; // omega - polarState[4] = state[4]; // t - return polarState; - } - - /** - * Sets the initial conditions to those of the booster. - */ - @Override - protected void boost() { - if (this instanceof DynamicSystem) { - return; - } - if (modelBooster==null || modelBooster.booster==null) - return; - - int frameNumber = getStartFrame(); - double[] state = getCartesianState(modelBooster.booster, frameNumber); // {x, vx, y, vy, t} - - if (state==null) return; - double[] polarState = getPolarState(state); - // polar is {r, vr, theta, omega, t} - - Parameter[] params = getInitEditor().getParameters(); - for (int i = 0; i < params.length; i++) { - Parameter param = params[i]; - String name = param.getName(); - double value = Double.NaN; // default - - if (name.equals("r")) value = polarState[0]; //$NON-NLS-1$ - else if (name.equals("vr")) value = polarState[1]; //$NON-NLS-1$ - else if (name.equals(FunctionEditor.THETA)) value = polarState[2]; - else if (name.equals(FunctionEditor.OMEGA)) value = polarState[3]; - - // replace parameter with new one if not null - if (!Double.isNaN(value)) { - Parameter newParam = new Parameter(name, String.valueOf(value)); - newParam.setDescription(param.getDescription()); - newParam.setNameEditable(false); - params[i] = newParam; - } - } - getInitEditor().setParameters(params); - if (system!=null) { - system.refreshSystemParameters(); - system.lastValidFrame = -1; - system.refreshSteps(); - } - else { - reset(); - } - repaint(); - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - DynamicParticle p = (DynamicParticle)obj; - // save particle model data - XML.getLoader(ParticleModel.class).saveObject(control, obj); - if (p.system!=null) control.setValue("in_system", true); //$NON-NLS-1$ - } - - /** - * Creates a new object. - * - * @param control the control with the object data - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new DynamicParticlePolar(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - DynamicParticle p = (DynamicParticle)obj; - XML.getLoader(ParticleModel.class).loadObject(control, obj); - p.inSystem = control.getBoolean("in_system"); //$NON-NLS-1$ - return obj; - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import org.opensourcephysics.tools.FunctionEditor; +import org.opensourcephysics.tools.Parameter; +import org.opensourcephysics.tools.UserFunction; +import org.opensourcephysics.tools.UserFunctionEditor; +import org.opensourcephysics.controls.*; + +/** + * DynamicParticlePolar models a particle using Newton's 2nd law in polar coordinates. + * + * @author D. Brown + * @version 1.0 + */ +public class DynamicParticlePolar extends DynamicParticle { + + /** + * Gets the initial state {x, vx, y, vy, t}. + * + * @return the initial state + */ + public double[] getInitialState() { + double[] polar = getInitialValues(); + // polar is {t, r, theta, vr, omega} + double cos = Math.cos(polar[2]); + double sin = Math.sin(polar[2]); + if (Math.abs(cos) < 0.0000001) cos = 0; + if (Math.abs(sin) < 0.0000001) sin = 0; + double romega = polar[1]*polar[4]; + // initial state is {x, vx, y, vy, t} + initialState[0] = polar[1]*cos; // x = r*cos(theta) + initialState[1] = polar[3]*cos - romega*sin; // vx = vr*cos(theta)-r*omega*sin(theta) + initialState[2] = polar[1]*sin; // y = r*sin(theta) + initialState[3] = polar[3]*sin + romega*cos; // vy = vr*sin(theta)+r*omega*cos(theta) + initialState[4] = polar[0]; // t + return initialState; + } + + /** + * Gets the x- and y-forces based on a specified cartesian state {x, vx, y, vy, t}. + * + * @param cartesianState the state + * @return the forces + */ + protected double[] getXYForces(double[] cartesianState) { + // cartesianState is {x, vx, y, vy, t} + UserFunction[] f = getFunctionEditor().getMainFunctions(); + // get polar state {r, vr, theta, omega, t} to evaluate polar functions + double[] polarState = getPolarState(cartesianState); + double fr = f[0].evaluate(polarState); + double ftheta = f[1].evaluate(polarState); + double cos = Math.cos(polarState[2]); + double sin = Math.sin(polarState[2]); + double fx = (fr*cos - ftheta*sin); + double fy = (fr*sin + ftheta*cos); + return new double[] {fx, fy}; + } + + /** + * Creates and initializes the ModelFunctionPanel. + */ + protected void initializeFunctionPanel() { + // create panel + functionEditor = new UserFunctionEditor(); + functionPanel = new DynamicFunctionPanel(functionEditor, this); + // create main force functions + UserFunction[] uf = new UserFunction[2]; + String[] funcVars = new String[] {"r", "vr", //$NON-NLS-1$ //$NON-NLS-2$ + FunctionEditor.THETA, FunctionEditor.OMEGA, "t"}; //$NON-NLS-1$ + uf[0] = new UserFunction("fr"); //$NON-NLS-1$ + uf[0].setNameEditable(false); + uf[0].setExpression("0", funcVars); //$NON-NLS-1$ + uf[0].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.R.Description")); //$NON-NLS-1$ + String s = "f"+FunctionEditor.THETA; //$NON-NLS-1$ + uf[1] = new UserFunction(s); + uf[1].setNameEditable(false); + uf[1].setExpression("0", funcVars); //$NON-NLS-1$ + uf[1].setDescription(TrackerRes.getString("DynamicParticle.ForceFunction.Theta.Description")); //$NON-NLS-1$ + functionEditor.setMainFunctions(uf); + // create mass and initial time parameters + createMassAndTimeParameters(); + } + + /** + * Creates the initial position and velocity parameters. + */ + protected void initializeInitEditor() { + Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ + Parameter r = new Parameter("r", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + r.setNameEditable(false); + r.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialR.Description")); //$NON-NLS-1$ + Parameter th = new Parameter(FunctionEditor.THETA, "0.0"); //$NON-NLS-1$ + th.setNameEditable(false); + th.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialTheta.Description")); //$NON-NLS-1$ + Parameter v = new Parameter("vr", "0.0"); //$NON-NLS-1$ //$NON-NLS-2$ + v.setNameEditable(false); + v.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityR.Description")); //$NON-NLS-1$ + Parameter w = new Parameter(FunctionEditor.OMEGA, "0.0"); //$NON-NLS-1$ + w.setNameEditable(false); + w.setDescription(TrackerRes.getString("DynamicParticle.Parameter.InitialOmega.Description")); //$NON-NLS-1$ + getInitEditor().setParameters(new Parameter[] {t, r, th, v, w}); + } + + /** + * Converts a cartesian state {x, vx, y, vy, t} to polar {r, vr, theta, omega, t}, + * both relative to the origin. + * + * @param state the cartesian state + * @return the polar state + */ + protected double[] getPolarState(double[] state) { + // state is {x, vx, y, vy, t} + double[] polarState = new double[5]; + double dx = state[0]; + double dy = state[2]; + double vx = state[1]; + double vy = state[3]; + double r = Math.sqrt(dx*dx + dy*dy); + double v = Math.sqrt(vx*vx + vy*vy); + double rang = Math.atan2(dy, dx); + double vang = Math.atan2(vy, vx); + double dang = vang-rang; + // polar state is {r, vr, theta, omega, t} + polarState[0] = r; // r + polarState[1] = r == 0? v: v*Math.cos(dang); // vr + polarState[2] = r == 0? vang: rang; // theta + polarState[3] = r == 0? 0: v*Math.sin(dang)/r; // omega + polarState[4] = state[4]; // t + return polarState; + } + + /** + * Sets the initial conditions to those of the booster. + */ + @Override + protected void boost() { + if (this instanceof DynamicSystem) { + return; + } + if (modelBooster==null || modelBooster.booster==null) + return; + + int frameNumber = getStartFrame(); + double[] state = getCartesianState(modelBooster.booster, frameNumber); // {x, vx, y, vy, t} + + if (state==null) return; + double[] polarState = getPolarState(state); + // polar is {r, vr, theta, omega, t} + + Parameter[] params = getInitEditor().getParameters(); + for (int i = 0; i < params.length; i++) { + Parameter param = params[i]; + String name = param.getName(); + double value = Double.NaN; // default + + if (name.equals("r")) value = polarState[0]; //$NON-NLS-1$ + else if (name.equals("vr")) value = polarState[1]; //$NON-NLS-1$ + else if (name.equals(FunctionEditor.THETA)) value = polarState[2]; + else if (name.equals(FunctionEditor.OMEGA)) value = polarState[3]; + + // replace parameter with new one if not null + if (!Double.isNaN(value)) { + Parameter newParam = new Parameter(name, String.valueOf(value)); + newParam.setDescription(param.getDescription()); + newParam.setNameEditable(false); + params[i] = newParam; + } + } + getInitEditor().setParameters(params); + if (system!=null) { + system.refreshSystemParameters(); + system.lastValidFrame = -1; + system.refreshSteps(); + } + else { + reset(); + } + repaint(); + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + DynamicParticle p = (DynamicParticle)obj; + // save particle model data + XML.getLoader(ParticleModel.class).saveObject(control, obj); + if (p.system!=null) control.setValue("in_system", true); //$NON-NLS-1$ + } + + /** + * Creates a new object. + * + * @param control the control with the object data + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new DynamicParticlePolar(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + DynamicParticle p = (DynamicParticle)obj; + XML.getLoader(ParticleModel.class).loadObject(control, obj); + p.inSystem = control.getBoolean("in_system"); //$NON-NLS-1$ + return obj; + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java index 5a7cc42e..8c27121a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java @@ -1,1036 +1,1036 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Point; -import java.awt.Toolkit; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.geom.*; -import java.beans.PropertyChangeEvent; -import java.util.ArrayList; -import java.util.TreeMap; - -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.SwingUtilities; - -import org.opensourcephysics.media.core.ImageCoordSystem; -import org.opensourcephysics.media.core.TPoint; -import org.opensourcephysics.media.core.VideoClip; -import org.opensourcephysics.media.core.VideoPlayer; -import org.opensourcephysics.tools.FunctionEditor; -import org.opensourcephysics.tools.Parameter; -import org.opensourcephysics.tools.UserFunction; -import org.opensourcephysics.tools.UserFunctionEditor; -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.display.DatasetManager; -import org.opensourcephysics.display.DrawingPanel; - -/** - * This models a system of 2 particles that interact via internal forces. - * - * @author D. Brown - * @version 1.0 - */ -public class DynamicSystem extends DynamicParticlePolar { - - protected DynamicParticle[] particles = new DynamicParticle[0]; - protected ParticleModel[] models = new ParticleModel[0]; - protected double[] particleState = new double[5]; - protected DynamicSystemInspector systemInspector; - protected JMenuItem systemInspectorItem; - protected String[] particleNames = new String[0]; - protected StepArray realSteps; - protected StepArray noSteps; - protected int systemInspectorX = Integer.MIN_VALUE, systemInspectorY; - protected TreeMap relativeStates = new TreeMap(); - protected boolean refreshing = false; - - /** - * No-arg constructor. - */ - public DynamicSystem() { - this(new DynamicParticle[0]); - } - - /** - * Constructor with particles. - * - * @param parts an array of up to two dynamic particles - */ - public DynamicSystem(DynamicParticle[] parts) { - super(); - defaultColors = new Color[] {new Color(51, 204, 51)}; - massField.setMinValue(0); - realSteps = steps; - noSteps = new StepArray(); - Parameter massParam = (Parameter)getParamEditor().getObject("m"); //$NON-NLS-1$ - massParam.setExpressionEditable(false); - setName(TrackerRes.getString("DynamicSystem.New.Name")); //$NON-NLS-1$ - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.SolidDiamond"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.Spot"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SolidTriangle"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.SolidCircle"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.BoldVerticalLine"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.BoldHorizontalLine"), //$NON-NLS-1$ - new PositionVectorFootprint(this, "Footprint.BoldPositionVector", 2)}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - locked = true; - setParticles(parts); - } - - /** - * Overrides DynamicParticle draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - if (!(panel instanceof TrackerPanel) || trackerPanel==null) return; - panels.add((TrackerPanel)panel); // keep a list of drawing panels - // add particles in particleNames - if (particleNames.length > 0) { - ArrayList toAdd = new ArrayList(); - ArrayList parts = trackerPanel.getDrawables(DynamicParticle.class); - for (int i = 0; i < particleNames.length; i++) { - for (DynamicParticle p: parts) { - if (p.getName().equals(particleNames[i])) { - toAdd.add(p); - particleNames[i] = null; - } - } - } - setParticles(toAdd.toArray(new DynamicParticle[0])); - boolean empty = true; - for (String name: particleNames) { - empty = name==null && empty; - } - if (empty) particleNames = new String[0]; - } - getInspector(); - if (systemInspectorX != Integer.MIN_VALUE - && trackerPanel.getTFrame() != null) { - // set system inspector position - getSystemInspector(); - TFrame frame = trackerPanel.getTFrame(); - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = Math.max(frame.getLocation().x + systemInspectorX, 0); - x = Math.min(x, dim.width-systemInspector.getWidth()); - int y = Math.max(frame.getLocation().y + systemInspectorY, 0); - y = Math.min(y, dim.height-systemInspector.getHeight()); - systemInspector.setLocation(x, y); - systemInspectorX = Integer.MIN_VALUE; - Runnable runner = new Runnable() { - public void run() { - systemInspector.setVisible(true); - } - }; - SwingUtilities.invokeLater(runner); - } - if (particles.length==0) { - return; - } - if (trackerPanel.getFrameNumber() > lastValidFrame) { - refreshSteps(); - } - for (ParticleModel next: getModels()) { - next.drawMe(panel, _g); - } - } - - /** - * Gets a display name for this model. - * - * @return the display name - */ - public String getDisplayName() { - StringBuffer buf = new StringBuffer(getName()); - buf.append(" ("); //$NON-NLS-1$ - if (particles == null || particles.length==0) { - buf.append(TrackerRes.getString("DynamicSystem.Empty")); //$NON-NLS-1$ - } - else { - for (int i = 0; i < particles.length; i++) { - if (i > 0) buf.append(" + "); //$NON-NLS-1$ - buf.append(particles[i].getName()); - } - } - buf.append(")"); //$NON-NLS-1$ - return buf.toString(); - } - - /** - * Returns a menu with items that control this track. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - // create a system inspector item - systemInspectorItem = new JMenuItem(TrackerRes.getString("DynamicSystem.MenuItem.Inspector")); //$NON-NLS-1$ - systemInspectorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - DynamicSystemInspector inspector = getSystemInspector(); - inspector.updateDisplay(); - inspector.setVisible(true); - } - }); - // assemble the menu - JMenu menu = super.getMenu(trackerPanel); - menu.add(systemInspectorItem, 1); - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - massField.setEnabled(false); - return list; - } - - /** - * Gets the mass. Overrides PointMass method. - * - * @return the mass - */ - public double getMass() { - // set mass to sum of particle masses - mass = 0; - if (particles==null) - return mass; - for (int i = 0; i < particles.length; i++) { - mass += particles[i].getMass(); - } - return mass; - } - - /** - * Overrides TTrack isDependent method to return true. - * - * @return true if this track is dependent - */ - public boolean isDependent() { - return true; - } - - /** - * Adds a particle to this system. - * - * @param particle the particle to add - * @return true if particle added - */ - public boolean addParticle(DynamicParticle particle) { - if (particles.length == 2) return false; // can't exceed two particles - for (DynamicParticle next: particles) { - if (next == particle) return false; // already contains particle - } - // make a new particles array - DynamicParticle[] newParticles = new DynamicParticle[particles.length+1]; - System.arraycopy(particles, 0, newParticles, 0, particles.length); - newParticles[particles.length] = particle; - return setParticles(newParticles); - } - - /** - * Removes a particle from this system. - * - * @param particle the particle to remove - * @return true if particle removed - */ - public boolean removeParticle(DynamicParticle particle) { - if (particles.length==1 && particles[0]==particle) { - return setParticles(new DynamicParticle[0]); - } - if (particles.length==2) { - if (particles[0]==particle) - return setParticles(new DynamicParticle[] {particles[1]}); - if (particles[1]==particle) - return setParticles(new DynamicParticle[] {particles[0]}); - } - return false; - } - - /** - * Sets the particles in this system. - * - * @param newParticles an array of zero to two dynamic particles - * @return true if particles accepted - */ - public boolean setParticles(DynamicParticle[] newParticles) { - if (newParticles==null || newParticles.length>2) { - return false; - } - for (DynamicParticle next: newParticles) { - if (next==null) { - return false; - } - } - if (newParticles.length==2) { - DynamicParticle problem = null; - if (newParticles[0].isBoostedBy(newParticles[1])) { - problem = newParticles[0]; - } - else if (newParticles[1].isBoostedBy(newParticles[0])) { - problem = newParticles[1]; - } - if (problem!=null) { - String message = TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message1")+"\n" //$NON-NLS-1$ //$NON-NLS-2$ - +TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message2")+" " //$NON-NLS-1$ //$NON-NLS-2$ - +problem.getName()+"\n" //$NON-NLS-1$ - +TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message3"); //$NON-NLS-1$ - int response = javax.swing.JOptionPane.showConfirmDialog( - trackerPanel.getTFrame(), - message, - TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.OK_CANCEL_OPTION, - javax.swing.JOptionPane.WARNING_MESSAGE); - if (response == javax.swing.JOptionPane.YES_OPTION) { - problem.setBooster(null); - } - else return false; - } - } - - // clean up particles that will be removed - for (DynamicParticle particle: particles) { - boolean cleanMe = true; - for (DynamicParticle next: newParticles) { - if (next == particle) { - cleanMe = false; - } - } - if (cleanMe) { - particle.system = null; - particle.inSystem = false; - particle.refreshInitialTime(); - particle.removePropertyChangeListener(this); - particle.lastValidFrame = -1; - particle.repaint(); - if (systemInspector!=null) { - particle.removePropertyChangeListener("name", systemInspector); //$NON-NLS-1$ - particle.removePropertyChangeListener("color", systemInspector); //$NON-NLS-1$ - particle.removePropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ - } - } - } - particles = new DynamicParticle[newParticles.length]; - System.arraycopy(newParticles, 0, particles, 0, newParticles.length); - state = new double[particles.length*4+1]; - initialState = new double[particles.length*4+1]; - models = new ParticleModel[0]; - // update inspector, if visible - if (systemInspector != null && - systemInspector.isVisible()) { - systemInspector.updateDisplay(); - } - // make new points arrary - points = new Point2D[particles.length+1]; - for (int i = 0; i < particles.length; i++) { - points[i] = new Point2D.Double(); - } - points[points.length-1] = point; - - for (int i = 0; i < particles.length; i++) { - particles[i].removePropertyChangeListener(this); - particles[i].addPropertyChangeListener(this); - particles[i].system = this; - particles[i].refreshInitialTime(); - if (systemInspector!=null) { - particles[i].removePropertyChangeListener("name", systemInspector); //$NON-NLS-1$ - particles[i].removePropertyChangeListener("color", systemInspector); //$NON-NLS-1$ - particles[i].removePropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ - particles[i].addPropertyChangeListener("name", systemInspector); //$NON-NLS-1$ - particles[i].addPropertyChangeListener("color", systemInspector); //$NON-NLS-1$ - particles[i].addPropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ - } - } - refreshSystemParameters(); - if (inspector != null) - inspector.refreshDropdown(null); - if (particles.length==0 && steps != noSteps) { - steps = noSteps; - support.firePropertyChange("steps", null, null); //$NON-NLS-1$ - } - else if (particles.length>0 && steps != realSteps) { - steps = realSteps; - support.firePropertyChange("steps", null, null); //$NON-NLS-1$ - } - lastValidFrame = -1; - repaint(); - return true; - } - - /** - * Deletes this system. Overrides DynamicParticle method to clean up - * particles after deleting. - * - */ - public void delete() { - setParticles(new DynamicParticle[0]); - super.delete(); - } - - /** - * Gets the rate based on a specified state. - * - * @param state the state - * @param rate the rate of change of the state - */ - public void getRate(double[] state, double[] rate) { - rate[rate.length-1] = 1; // dt/dt=1 - if (particles.length == 0) { - return; - } - // one particle, no interactions: state is {x1, vx1, y1, vy1, t}, - // rate is {vx1, ax1, vy1, ay1, 1} - if (particles.length == 1) { - double[] particleState = getState(particles[0]); - double[] forces = particles[0].getXYForces(particleState); - double m = particles[0].getMass(); - rate[0] = state[1]; // dx/dt = vx - rate[1] = forces[0] / m; // dvx/dt = ax = fx/m - rate[2] = state[3]; // dy/dt = vy - rate[3] = forces[1] / m; // dvy/dt = ay = fy/m - return; - } - // two particles, one interaction: state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t}, - // rate is {vx1, ax1, vy1, ay1, vx2, ax2, vy2, ay2, 1} - UserFunction[] f = getFunctionEditor().getMainFunctions(); - // use relative polar state {r, vr, theta, omega, t} to get interaction forces - double[] polarState = getRelativePolarState(state); - double cos = Math.cos(polarState[2]); - double sin = Math.sin(polarState[2]); - double fr = f[0].evaluate(polarState); - double ftheta = f[1].evaluate(polarState); - // use particle states {x, vx, y, vy, t} to get external forces on particles - for (int i = 0; i < particles.length; i++) { - double[] particleState = getState(particles[i]); - double[] forces = particles[i].getXYForces(particleState); - double m = particles[i].getMass(); - int sign = i==0? 1: -1; // polar forces are opposite on particles[1] - rate[4*i] = state[4*i+1]; // dx/dt = vx - rate[4*i+1] = (forces[0] + sign*fr*cos - sign*ftheta*sin) / m; // dvx/dt = ax = fx/m - rate[4*i+2] = state[4*i+3]; // dy/dt = vy - rate[4*i+3] = (forces[1] + sign*fr*sin + sign*ftheta*cos) / m; // dvy/dt = ay = fy/m - } - } - - /** - * Gets the initial values. - * - * @return initial values {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - */ - public double[] getInitialValues() { - double[] state = null; - // check initial state in case paint manager calls this unexpectedly - if (initialState.length!=particles.length*4+1) - initialState = new double[particles.length*4+1]; - for (int i = 0; i < particles.length; i++) { - state = particles[i].getInitialState(); - // state is {x, vx, y, vy, t} - System.arraycopy(state, 0, initialState, 4*i, 4); - } - if (state != null) - initialState[initialState.length-1] = state[state.length-1]; - else if (trackerPanel!=null) { - double t0 = trackerPanel.getPlayer().getVideoClip().getStartTime(); - initialState[initialState.length-1] = t0/1000; - } - return initialState; - } - - /** - * Responds to property change events. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("transform")) { //$NON-NLS-1$ - // workaround to prevent infinite loop - ImageCoordSystem coords = trackerPanel.getCoords(); - if (coords instanceof ReferenceFrame) { - TTrack track = ((ReferenceFrame)coords).getOriginTrack(); - if (track==this - || (particles.length>0 && track==particles[0]) - || (particles.length>1 && track==particles[1])) { - return; - } - } - lastValidFrame = -1; - refreshSteps(); - } - else super.propertyChange(e); - if (name.equals("mass") || name.equals("function")) { //$NON-NLS-1$ //$NON-NLS-2$ - refreshSystemParameters(); - if (trackerPanel!=null) - trackerPanel.repaint(); - } - else if (name.equals("name")) { //$NON-NLS-1$ - refreshSystemParameters(); - } - } - - /** - * Gets the system inspector. - * - * @return the system inspector - */ - public DynamicSystemInspector getSystemInspector() { - if (systemInspector == null) { - systemInspector = new DynamicSystemInspector(this); - systemInspector.setLocation(200, 200); - addPropertyChangeListener("name", systemInspector); //$NON-NLS-1$ - addPropertyChangeListener("color", systemInspector); //$NON-NLS-1$ - addPropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ - } - return systemInspector; - } - - /** - * Gets the initial state. Overrides DynamicParticle method. - * - * @return the initial state - */ - public double[] getInitialState() { - return getInitialValues(); - } - - /** - * Refreshes the data. Overrides PointMass method. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - int count = 25; // number of datasets - if (data.getDataset(0).getColumnName(0).equals("x")) { //$NON-NLS-1$ - // assign column names to the datasets - String timeVar = "t"; //$NON-NLS-1$ - data.getDataset(0).setXYColumnNames(timeVar, "x"); //$NON-NLS-1$ - data.getDataset(1).setXYColumnNames(timeVar, "y"); //$NON-NLS-1$ - data.getDataset(2).setXYColumnNames(timeVar, "r"); //$NON-NLS-1$ - data.getDataset(3).setXYColumnNames(timeVar, "$\\theta$_{r}"); //$NON-NLS-1$ - data.getDataset(4).setXYColumnNames(timeVar, "v_{x}"); //$NON-NLS-1$ - data.getDataset(5).setXYColumnNames(timeVar, "v_{y}"); //$NON-NLS-1$ - data.getDataset(6).setXYColumnNames(timeVar, "v"); //$NON-NLS-1$ - data.getDataset(7).setXYColumnNames(timeVar, "$\\theta$_{v}"); //$NON-NLS-1$ - data.getDataset(8).setXYColumnNames(timeVar, "a_{x}"); //$NON-NLS-1$ - data.getDataset(9).setXYColumnNames(timeVar, "a_{y}"); //$NON-NLS-1$ - data.getDataset(10).setXYColumnNames(timeVar, "a"); //$NON-NLS-1$ - data.getDataset(11).setXYColumnNames(timeVar, "$\\theta$_{a}"); //$NON-NLS-1$ - data.getDataset(12).setXYColumnNames(timeVar, "$\\theta$"); //$NON-NLS-1$ - data.getDataset(13).setXYColumnNames(timeVar, "$\\omega$"); //$NON-NLS-1$ - data.getDataset(14).setXYColumnNames(timeVar, "$\\alpha$"); //$NON-NLS-1$ - data.getDataset(15).setXYColumnNames(timeVar, "step"); //$NON-NLS-1$ - data.getDataset(16).setXYColumnNames(timeVar, "frame"); //$NON-NLS-1$ - data.getDataset(17).setXYColumnNames(timeVar, "p_{x}"); //$NON-NLS-1$ - data.getDataset(18).setXYColumnNames(timeVar, "p_{y}"); //$NON-NLS-1$ - data.getDataset(19).setXYColumnNames(timeVar, "p"); //$NON-NLS-1$ - data.getDataset(20).setXYColumnNames(timeVar, "$\\theta$_{p}"); //$NON-NLS-1$ - data.getDataset(21).setXYColumnNames(timeVar, "r_{rel}"); //$NON-NLS-1$ - data.getDataset(22).setXYColumnNames(timeVar, "$\\theta$_{rel}"); //$NON-NLS-1$ - data.getDataset(23).setXYColumnNames(timeVar, "vr_{rel}"); //$NON-NLS-1$ - data.getDataset(24).setXYColumnNames(timeVar, "$\\omega$_{rel}"); //$NON-NLS-1$ - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < count-3; i++) { - dataDescriptions[i] = TrackerRes.getString("PointMass.Data.Description."+i); //$NON-NLS-1$ - } - for (int i = 0; i < 4; i++) { - dataDescriptions[count-3+i] = TrackerRes.getString("DynamicSystem.Data.Description."+i); //$NON-NLS-1$ - } - // get the rotational data - Object[] rotationData = getRotationData(); - double[] theta_data = (double[])rotationData[0]; - double[] omega_data = (double[])rotationData[1]; - double[] alpha_data = (double[])rotationData[2]; - // clear datasets - dataFrames.clear(); - for (int i = 0; i < count;i++) { - data.getDataset(i).clear(); - } - // get data at each non-null position step in the videoclip - VideoPlayer player = trackerPanel.getPlayer(); - VideoClip clip = player.getVideoClip(); - double dt = player.getMeanStepDuration() / 1000.0; - ImageCoordSystem coords = trackerPanel.getCoords(); - Step[] stepArray = getSteps(); - for (int n = 0; n < stepArray.length; n++) { - if (stepArray[n] == null || !clip.includesFrame(n)) continue; - int stepNumber = clip.frameToStep(n); - double t = player.getStepTime(stepNumber)/1000.0; - // assemble the data values for this step - double[] vals = new double[count]; - TPoint p = ((PositionStep)stepArray[n]).getPosition(); - Point2D pt = p.getWorldPosition(trackerPanel); - vals[0] = pt.getX(); // x - vals[1] = pt.getY(); // y - vals[2] = pt.distance(0, 0); //mag - vals[3] = Math.atan2(pt.getY(), pt.getX()); // ang between +/-pi - vals[4] = Double.NaN; // vx - vals[5] = Double.NaN; //vy - vals[6] = Double.NaN; // vmag - vals[7] = Double.NaN; // vang - vals[8] = Double.NaN; // ax - vals[9] = Double.NaN; // ay - vals[10] = Double.NaN; // amag - vals[11] = Double.NaN; // aang - vals[12] = theta_data[n]; // theta - vals[13] = omega_data[n]/dt; // omega - vals[14] = alpha_data[n]/(dt*dt); // alpha - vals[15] = stepNumber; // step - vals[16] = n; // frame - vals[17] = Double.NaN; // px - vals[18] = Double.NaN; // py - vals[19] = Double.NaN; // pmag - vals[20] = Double.NaN; // pang - vals[21] = Double.NaN; // r_rel - vals[22] = Double.NaN; // theta_rel - vals[23] = Double.NaN; // vr_rel - vals[24] = Double.NaN; // omega_rel - if (particles.length==2) { - double[] relState = relativeStates.get(n); // {r, vr, theta, omega, t} - if (relState!=null) { - vals[21] = relState[0]; // r_rel - vals[22] = relState[2]; // theta_rel - vals[23] = relState[1]; // vr_rel - vals[24] = relState[3]; // omega_rel - } - } - VectorStep veloc = getVelocity(n, trackerPanel); - if (veloc != null) { - double imageX = veloc.getXComponent(); - double imageY = veloc.getYComponent(); - vals[4] = coords.imageToWorldXComponent(n, imageX, imageY)/dt; - vals[5] = coords.imageToWorldYComponent(n, imageX, imageY)/dt; - double vsquared = vals[4]*vals[4] + vals[5]*vals[5]; - vals[6] = Math.sqrt(vsquared); - vals[7] = Math.atan2(vals[5], vals[4]); - double mass = getMass(); - vals[17] = mass*vals[4]; - vals[18] = mass*vals[5]; - vals[19] = mass*vals[6]; - vals[20] = mass*vals[7]; - } - VectorStep accel = getAcceleration(n, trackerPanel); - if (accel != null) { - double imageX = accel.getXComponent(); - double imageY = accel.getYComponent(); - vals[8] = coords.imageToWorldXComponent(n, imageX, imageY)/(dt*dt); - vals[9] = coords.imageToWorldYComponent(n, imageX, imageY)/(dt*dt); - vals[10] = Math.sqrt(vals[8]*vals[8] + vals[9]*vals[9]); - vals[11] = Math.atan2(vals[9], vals[8]); - } - // append points to datasets - for (int i = 0; i < count; i++) { - data.getDataset(i).append(t, vals[i]); - } - dataFrames.add(new Integer(n)); - } - // store the mass in the data properties - Double m = getMass(); - String desc = TrackerRes.getString("ParticleModel.Parameter.Mass.Description"); //$NON-NLS-1$ - data.setConstant("m", m, m.toString(), desc); //$NON-NLS-1$ - } - -//______________________________ protected methods __________________________ - - /** - * Cleans up associated resources when this track is deleted or cleared. - */ - protected void cleanup() { - super.cleanup(); - if (systemInspector != null) systemInspector.dispose(); - } - - /** - * Refreshes initial time parameter for this model. Overrides ParticleModel. - */ - protected void refreshInitialTime() { - super.refreshInitialTime(); - for (ParticleModel next: particles) { - next.refreshInitialTime(); - } - } - - /** - * Refreshes the initial positions, velocities and particle masses - * based on the values for the particles in this system. - */ - protected void refreshSystemParameters() { - if (refreshing) return; - refreshing = true; - double[] polarState; // polar state is {r, vr, theta, omega, t} - if (particles.length==2) { - polarState = getRelativePolarState(getInitialState()); - } - else { - polarState = new double[] {0, 0, 0, 0, 0}; - } - double zeroPosition = 1E-12; - if (trackerPanel != null) { - zeroPosition = .001/trackerPanel.getCoords().getScaleX(0); - } - double zeroVelocity = 1E-11; - if (trackerPanel != null) { - zeroVelocity = 1000*zeroPosition/trackerPanel.getPlayer().getMeanStepDuration(); - } - double zeroAngle = 1E-5; - double zeroOmega = 1E-4; - if (trackerPanel != null) { - zeroOmega = 1000*zeroAngle/trackerPanel.getPlayer().getMeanStepDuration(); - } - String relative = "_"+TrackerRes.getString("DynamicSystem.Parameter.Name.Relative"); //$NON-NLS-1$ //$NON-NLS-2$ - String particleNames = " "; //$NON-NLS-1$ - if (particles.length>0) { - particleNames += TrackerRes.getString("DynamicSystem.Parameter.Of")+" "; //$NON-NLS-1$ //$NON-NLS-2$ - particleNames += particles[0].getName()+" "; //$NON-NLS-1$ - particleNames += TrackerRes.getString("DynamicSystem.Parameter.RelativeTo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ - particleNames += particles.length>1? particles[1].getName(): particles[0].getName(); - } - // particle masses - String desc = TrackerRes.getString("DynamicSystem.Parameter.Mass.Description"); //$NON-NLS-1$ - getParamEditor().setExpression("m", String.valueOf(getMass()), false); //$NON-NLS-1$ - getParamEditor().setDescription("m", desc); //$NON-NLS-1$ - Parameter m1 = (Parameter)getParamEditor().getObject("m1"); //$NON-NLS-1$ - Parameter m2 = (Parameter)getParamEditor().getObject("m2"); //$NON-NLS-1$ - desc = TrackerRes.getString("DynamicSystem.Parameter.ParticleMass.Description"); //$NON-NLS-1$ - if (particles.length==0) { - if (m1!=null) { - // must set name and expression editable before removing parameter - m1.setNameEditable(true); - m1.setExpressionEditable(true); - getParamEditor().removeObject(m1, false); - } - if (m2!=null) { - // must set name and expression editable before removing parameter - m2.setNameEditable(true); - m2.setExpressionEditable(true); - getParamEditor().removeObject(m2, false); - } - } - else { - String value = FunctionEditor.format(particles[0].getMass(), 0); - if (m1==null) { - m1 = createParameter("m1", value, desc+" "+particles[0].getName()); //$NON-NLS-1$ //$NON-NLS-2$ - getParamEditor().addObject(m1, 1, false, false); - } - else - getParamEditor().setExpression("m1", value, false); //$NON-NLS-1$ - if (particles.length>1) { - value = FunctionEditor.format(particles[1].getMass(), 0); - if (m2==null) { - m2 = createParameter("m2", value, desc+" "+particles[1].getName()); //$NON-NLS-1$ //$NON-NLS-2$ - getParamEditor().addObject(m2, 2, false, false); - } - else - getParamEditor().setExpression("m2", value, false); //$NON-NLS-1$ - } - else { - if (m2!=null) { - // must set name and expression editable before removing parameter - m2.setNameEditable(true); - m2.setExpressionEditable(true); - getParamEditor().removeObject(m2, false); - } - } - } - for (DynamicParticle particle: particles) { - if (particle.modelBooster!=null) { - particle.modelBooster.setBooster(particle.modelBooster.booster); - } - } - // initial values - Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ - String value = FunctionEditor.format(polarState[0], zeroPosition); - desc = TrackerRes.getString("DynamicParticle.Parameter.InitialR.Description"); //$NON-NLS-1$ - Parameter r = createParameter("r"+relative, value, desc+particleNames); //$NON-NLS-1$ - value = FunctionEditor.format(polarState[2], zeroAngle); - desc = TrackerRes.getString("DynamicParticle.Parameter.InitialTheta.Description"); //$NON-NLS-1$ - Parameter theta = createParameter(FunctionEditor.THETA+relative, value, desc+particleNames); - value = FunctionEditor.format(polarState[1], zeroVelocity); - desc = TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityR.Description"); //$NON-NLS-1$ - Parameter vr = createParameter("vr"+relative, value, desc+particleNames); //$NON-NLS-1$ - value = FunctionEditor.format(polarState[3], zeroOmega); - desc = TrackerRes.getString("DynamicParticle.Parameter.InitialOmega.Description"); //$NON-NLS-1$ - Parameter omega = createParameter(FunctionEditor.OMEGA+relative, value, desc+particleNames); - getInitEditor().setParameters(new Parameter[] {t, r, theta, vr, omega}); - refreshing = false; - } - - /** - * Sets the positions of the trace points based on a specified state. - * - * @param state the state - */ - protected void setTracePositions(double[] state) { - // state is {t} if no particles - // or {x1, vx1, y1, vy1, t} if one particle - // or {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} if two particles - if (particles.length==0) { - return; - } - for (int i = 0; i < points.length-1; i++) { - points[i].setLocation(state[4*i], state[4*i+2]); // current ODE state - } - double mass = 0, xcm = 0, ycm = 0; - for (int i = 0; i < particles.length; i++) { - double m = particles[i].getMass(); - mass += m; - xcm += m * state[4*i]; - ycm += m * state[4*i+2]; - } - points[points.length-1].setLocation(xcm/mass, ycm/mass); - } - - /** - * Creates and initializes the ModelFunctionPanel. - */ - protected void initializeFunctionPanel() { - // create panel - functionEditor = new UserFunctionEditor(); - functionPanel = new DynamicFunctionPanel(functionEditor, this); - // create main force functions - UserFunction[] uf = new UserFunction[2]; - String[] funcVars = new String[] {"r", "vr", //$NON-NLS-1$ //$NON-NLS-2$ - FunctionEditor.THETA, FunctionEditor.OMEGA, "t"}; //$NON-NLS-1$ - String internal = TrackerRes.getString("DynamicSystem.Force.Name.Internal"); //$NON-NLS-1$ - uf[0] = new UserFunction("fr_"+internal); //$NON-NLS-1$ - uf[0].setNameEditable(false); - uf[0].setExpression("0", funcVars); //$NON-NLS-1$ - uf[0].setDescription(TrackerRes.getString("DynamicSystem.ForceFunction.R.Description")); //$NON-NLS-1$ - String s = "f"+FunctionEditor.THETA+"_"+internal; //$NON-NLS-1$ //$NON-NLS-2$ - uf[1] = new UserFunction(s); - uf[1].setNameEditable(false); - uf[1].setExpression("0", funcVars); //$NON-NLS-1$ - uf[1].setDescription(TrackerRes.getString("DynamicSystem.ForceFunction.Theta.Description")); //$NON-NLS-1$ - functionEditor.setMainFunctions(uf); - // create mass and initial time parameters - createMassAndTimeParameters(); - } - - /** - * Gets the state of this system based on the states of its particles. - * - * @param state the particle state {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - * @return the system state {x_cm, vx_cm, y_cm, vy_cm, t} - */ - protected double[] getSystemState(double[] state) { - double mass = 0; - for (int i = 0; i < particleState.length; i++) { - particleState[i] = 0; - } - particleState[4] = state[state.length-1]; // time - if (particles.length>0) { - // state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - // systemState is {x_cm, vx_cm, y_cm, vy_cm, t} - for (int i = 0; i < particles.length; i++) { - double m = particles[i].getMass(); - mass += m; - particleState[0] += m * state[4*i]; - particleState[1] += m * state[4*i+1]; - particleState[2] += m * state[4*i+2]; - particleState[3] += m * state[4*i+3]; - } - particleState[0] /= mass; // cm x coordinate - particleState[1] /= mass; // cm y coordinate - particleState[2] /= mass; // cm x velocity - particleState[3] /= mass; // cm y velocity - } - return particleState; - } - - /** - * Gets the current state of the specified particle. - * - * @param particle the particle - * @return the state of the particle {x, vx, y, vy, t} - */ - protected double[] getState(DynamicParticle particle) { - for (int i = 0; i < particles.length; i++) { - if (particles[i] == particle) { - // state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - // particleState is {x, vx, y, vy, t} - particleState[0] = state[4*i]; - particleState[1] = state[4*i+1]; - particleState[2] = state[4*i+2]; - particleState[3] = state[4*i+3]; - particleState[4] = state[state.length-1]; - return particleState; - } - } - return null; - } - - /** - * Gets the particle models associated with this model. - * - * @return an array of particle models - */ - protected ParticleModel[] getModels() { - if (models.length != particles.length+1) { - models = new ParticleModel[particles.length+1]; - for (int i = 0; i < models.length-1; i++) { - models[i] = particles[i]; - } - models[models.length-1] = this; - } - return models; - } - - /** - * Converts a two-body cartesian state {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - * to a relative polar state {r, vr, theta, omega, t}. - * - * @param state the cartesian state of both particles - * @return the polar state of particle 1 relative to particle 2 - */ - protected double[] getRelativePolarState(double[] state) { - // cartesian state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} - double[] polarState = new double[5]; - double dx = state[0]-state[4]; - double dy = state[2]-state[6]; - double vx = state[1]-state[5]; - double vy = state[3]-state[7]; - double r = Math.sqrt(dx*dx + dy*dy); - double v = Math.sqrt(vx*vx + vy*vy); - double rang = Math.atan2(dy, dx); - double vang = Math.atan2(vy, vx); - double dang = vang-rang; - // polar state is {r, vr, theta, omega, t} - polarState[0] = r; // r - polarState[1] = r == 0? v: v*Math.cos(dang); // vr - polarState[2] = r == 0? vang: rang; // theta - polarState[3] = r == 0? 0: v*Math.sin(dang)/r; // omega - polarState[4] = state[8]; // t - double[] toSave = new double[polarState.length]; - System.arraycopy(polarState, 0, toSave, 0, polarState.length); - int frameNum = trackerPanel.getFrameNumber(); - relativeStates.put(frameNum, toSave); - return polarState; - } - -//______________________________ private methods __________________________ - - private Parameter createParameter(String name, String expression, String description) { - Parameter p = new Parameter(name, expression); - p.setExpressionEditable(false); - p.setNameEditable(false); - p.setDescription(description); - return p; - } - -//________________________ static methods and classes ______________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - DynamicSystem system = (DynamicSystem)obj; - // save particle names, if any - if (system.particles.length>0) { - String[] names = new String[system.particles.length]; - for (int i = 0; i < names.length; i++) { - names[i] = system.particles[i].getName(); - } - control.setValue("particles", names); //$NON-NLS-1$ - } - // save system inspector location if visible - if (system.systemInspector!=null && system.systemInspector.isVisible()) { - Point p = system.systemInspector.getLocation(); - // save location relative to frame - TFrame frame = system.trackerPanel.getTFrame(); - control.setValue("system_inspector_x", p.x - frame.getLocation().x); //$NON-NLS-1$ - control.setValue("system_inspector_y", p.y - frame.getLocation().y); //$NON-NLS-1$ - } - // save particle model data - XML.getLoader(ParticleModel.class).saveObject(control, obj); - } - - /** - * Creates a new object. - * - * @param control the control with the object data - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new DynamicSystem(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - XML.getLoader(ParticleModel.class).loadObject(control, obj); - DynamicSystem system = (DynamicSystem)obj; - // load mass names - String[] names = (String[])control.getObject("particles"); //$NON-NLS-1$ - if (names != null) { - system.particleNames = names; - } - system.systemInspectorX = control.getInt("system_inspector_x"); //$NON-NLS-1$ - system.systemInspectorY = control.getInt("system_inspector_y"); //$NON-NLS-1$ - return obj; - } - } - - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.geom.*; +import java.beans.PropertyChangeEvent; +import java.util.ArrayList; +import java.util.TreeMap; + +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import javax.swing.SwingUtilities; + +import org.opensourcephysics.media.core.ImageCoordSystem; +import org.opensourcephysics.media.core.TPoint; +import org.opensourcephysics.media.core.VideoClip; +import org.opensourcephysics.media.core.VideoPlayer; +import org.opensourcephysics.tools.FunctionEditor; +import org.opensourcephysics.tools.Parameter; +import org.opensourcephysics.tools.UserFunction; +import org.opensourcephysics.tools.UserFunctionEditor; +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.display.DatasetManager; +import org.opensourcephysics.display.DrawingPanel; + +/** + * This models a system of 2 particles that interact via internal forces. + * + * @author D. Brown + * @version 1.0 + */ +public class DynamicSystem extends DynamicParticlePolar { + + protected DynamicParticle[] particles = new DynamicParticle[0]; + protected ParticleModel[] models = new ParticleModel[0]; + protected double[] particleState = new double[5]; + protected DynamicSystemInspector systemInspector; + protected JMenuItem systemInspectorItem; + protected String[] particleNames = new String[0]; + protected StepArray realSteps; + protected StepArray noSteps; + protected int systemInspectorX = Integer.MIN_VALUE, systemInspectorY; + protected TreeMap relativeStates = new TreeMap(); + protected boolean refreshing = false; + + /** + * No-arg constructor. + */ + public DynamicSystem() { + this(new DynamicParticle[0]); + } + + /** + * Constructor with particles. + * + * @param parts an array of up to two dynamic particles + */ + public DynamicSystem(DynamicParticle[] parts) { + super(); + defaultColors = new Color[] {new Color(51, 204, 51)}; + massField.setMinValue(0); + realSteps = steps; + noSteps = new StepArray(); + Parameter massParam = (Parameter)getParamEditor().getObject("m"); //$NON-NLS-1$ + massParam.setExpressionEditable(false); + setName(TrackerRes.getString("DynamicSystem.New.Name")); //$NON-NLS-1$ + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.SolidDiamond"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.Spot"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SolidTriangle"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.SolidCircle"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.BoldVerticalLine"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.BoldHorizontalLine"), //$NON-NLS-1$ + new PositionVectorFootprint(this, "Footprint.BoldPositionVector", 2)}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + locked = true; + setParticles(parts); + } + + /** + * Overrides DynamicParticle draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + if (!(panel instanceof TrackerPanel) || trackerPanel==null) return; + panels.add((TrackerPanel)panel); // keep a list of drawing panels + // add particles in particleNames + if (particleNames.length > 0) { + ArrayList toAdd = new ArrayList(); + ArrayList parts = trackerPanel.getDrawables(DynamicParticle.class); + for (int i = 0; i < particleNames.length; i++) { + for (DynamicParticle p: parts) { + if (p.getName().equals(particleNames[i])) { + toAdd.add(p); + particleNames[i] = null; + } + } + } + setParticles(toAdd.toArray(new DynamicParticle[0])); + boolean empty = true; + for (String name: particleNames) { + empty = name==null && empty; + } + if (empty) particleNames = new String[0]; + } + getInspector(); + if (systemInspectorX != Integer.MIN_VALUE + && trackerPanel.getTFrame() != null) { + // set system inspector position + getSystemInspector(); + TFrame frame = trackerPanel.getTFrame(); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = Math.max(frame.getLocation().x + systemInspectorX, 0); + x = Math.min(x, dim.width-systemInspector.getWidth()); + int y = Math.max(frame.getLocation().y + systemInspectorY, 0); + y = Math.min(y, dim.height-systemInspector.getHeight()); + systemInspector.setLocation(x, y); + systemInspectorX = Integer.MIN_VALUE; + Runnable runner = new Runnable() { + public void run() { + systemInspector.setVisible(true); + } + }; + SwingUtilities.invokeLater(runner); + } + if (particles.length==0) { + return; + } + if (trackerPanel.getFrameNumber() > lastValidFrame) { + refreshSteps(); + } + for (ParticleModel next: getModels()) { + next.drawMe(panel, _g); + } + } + + /** + * Gets a display name for this model. + * + * @return the display name + */ + public String getDisplayName() { + StringBuffer buf = new StringBuffer(getName()); + buf.append(" ("); //$NON-NLS-1$ + if (particles == null || particles.length==0) { + buf.append(TrackerRes.getString("DynamicSystem.Empty")); //$NON-NLS-1$ + } + else { + for (int i = 0; i < particles.length; i++) { + if (i > 0) buf.append(" + "); //$NON-NLS-1$ + buf.append(particles[i].getName()); + } + } + buf.append(")"); //$NON-NLS-1$ + return buf.toString(); + } + + /** + * Returns a menu with items that control this track. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + // create a system inspector item + systemInspectorItem = new JMenuItem(TrackerRes.getString("DynamicSystem.MenuItem.Inspector")); //$NON-NLS-1$ + systemInspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + DynamicSystemInspector inspector = getSystemInspector(); + inspector.updateDisplay(); + inspector.setVisible(true); + } + }); + // assemble the menu + JMenu menu = super.getMenu(trackerPanel); + menu.add(systemInspectorItem, 1); + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + massField.setEnabled(false); + return list; + } + + /** + * Gets the mass. Overrides PointMass method. + * + * @return the mass + */ + public double getMass() { + // set mass to sum of particle masses + mass = 0; + if (particles==null) + return mass; + for (int i = 0; i < particles.length; i++) { + mass += particles[i].getMass(); + } + return mass; + } + + /** + * Overrides TTrack isDependent method to return true. + * + * @return true if this track is dependent + */ + public boolean isDependent() { + return true; + } + + /** + * Adds a particle to this system. + * + * @param particle the particle to add + * @return true if particle added + */ + public boolean addParticle(DynamicParticle particle) { + if (particles.length == 2) return false; // can't exceed two particles + for (DynamicParticle next: particles) { + if (next == particle) return false; // already contains particle + } + // make a new particles array + DynamicParticle[] newParticles = new DynamicParticle[particles.length+1]; + System.arraycopy(particles, 0, newParticles, 0, particles.length); + newParticles[particles.length] = particle; + return setParticles(newParticles); + } + + /** + * Removes a particle from this system. + * + * @param particle the particle to remove + * @return true if particle removed + */ + public boolean removeParticle(DynamicParticle particle) { + if (particles.length==1 && particles[0]==particle) { + return setParticles(new DynamicParticle[0]); + } + if (particles.length==2) { + if (particles[0]==particle) + return setParticles(new DynamicParticle[] {particles[1]}); + if (particles[1]==particle) + return setParticles(new DynamicParticle[] {particles[0]}); + } + return false; + } + + /** + * Sets the particles in this system. + * + * @param newParticles an array of zero to two dynamic particles + * @return true if particles accepted + */ + public boolean setParticles(DynamicParticle[] newParticles) { + if (newParticles==null || newParticles.length>2) { + return false; + } + for (DynamicParticle next: newParticles) { + if (next==null) { + return false; + } + } + if (newParticles.length==2) { + DynamicParticle problem = null; + if (newParticles[0].isBoostedBy(newParticles[1])) { + problem = newParticles[0]; + } + else if (newParticles[1].isBoostedBy(newParticles[0])) { + problem = newParticles[1]; + } + if (problem!=null) { + String message = TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message1")+"\n" //$NON-NLS-1$ //$NON-NLS-2$ + +TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message2")+" " //$NON-NLS-1$ //$NON-NLS-2$ + +problem.getName()+"\n" //$NON-NLS-1$ + +TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Message3"); //$NON-NLS-1$ + int response = javax.swing.JOptionPane.showConfirmDialog( + trackerPanel.getTFrame(), + message, + TrackerRes.getString("DynamicSystem.Dialog.RemoveBooster.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.OK_CANCEL_OPTION, + javax.swing.JOptionPane.WARNING_MESSAGE); + if (response == javax.swing.JOptionPane.YES_OPTION) { + problem.setBooster(null); + } + else return false; + } + } + + // clean up particles that will be removed + for (DynamicParticle particle: particles) { + boolean cleanMe = true; + for (DynamicParticle next: newParticles) { + if (next == particle) { + cleanMe = false; + } + } + if (cleanMe) { + particle.system = null; + particle.inSystem = false; + particle.refreshInitialTime(); + particle.removePropertyChangeListener(this); + particle.lastValidFrame = -1; + particle.repaint(); + if (systemInspector!=null) { + particle.removePropertyChangeListener("name", systemInspector); //$NON-NLS-1$ + particle.removePropertyChangeListener("color", systemInspector); //$NON-NLS-1$ + particle.removePropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ + } + } + } + particles = new DynamicParticle[newParticles.length]; + System.arraycopy(newParticles, 0, particles, 0, newParticles.length); + state = new double[particles.length*4+1]; + initialState = new double[particles.length*4+1]; + models = new ParticleModel[0]; + // update inspector, if visible + if (systemInspector != null && + systemInspector.isVisible()) { + systemInspector.updateDisplay(); + } + // make new points arrary + points = new Point2D[particles.length+1]; + for (int i = 0; i < particles.length; i++) { + points[i] = new Point2D.Double(); + } + points[points.length-1] = point; + + for (int i = 0; i < particles.length; i++) { + particles[i].removePropertyChangeListener(this); + particles[i].addPropertyChangeListener(this); + particles[i].system = this; + particles[i].refreshInitialTime(); + if (systemInspector!=null) { + particles[i].removePropertyChangeListener("name", systemInspector); //$NON-NLS-1$ + particles[i].removePropertyChangeListener("color", systemInspector); //$NON-NLS-1$ + particles[i].removePropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ + particles[i].addPropertyChangeListener("name", systemInspector); //$NON-NLS-1$ + particles[i].addPropertyChangeListener("color", systemInspector); //$NON-NLS-1$ + particles[i].addPropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ + } + } + refreshSystemParameters(); + if (inspector != null) + inspector.refreshDropdown(null); + if (particles.length==0 && steps != noSteps) { + steps = noSteps; + support.firePropertyChange("steps", null, null); //$NON-NLS-1$ + } + else if (particles.length>0 && steps != realSteps) { + steps = realSteps; + support.firePropertyChange("steps", null, null); //$NON-NLS-1$ + } + lastValidFrame = -1; + repaint(); + return true; + } + + /** + * Deletes this system. Overrides DynamicParticle method to clean up + * particles after deleting. + * + */ + public void delete() { + setParticles(new DynamicParticle[0]); + super.delete(); + } + + /** + * Gets the rate based on a specified state. + * + * @param state the state + * @param rate the rate of change of the state + */ + public void getRate(double[] state, double[] rate) { + rate[rate.length-1] = 1; // dt/dt=1 + if (particles.length == 0) { + return; + } + // one particle, no interactions: state is {x1, vx1, y1, vy1, t}, + // rate is {vx1, ax1, vy1, ay1, 1} + if (particles.length == 1) { + double[] particleState = getState(particles[0]); + double[] forces = particles[0].getXYForces(particleState); + double m = particles[0].getMass(); + rate[0] = state[1]; // dx/dt = vx + rate[1] = forces[0] / m; // dvx/dt = ax = fx/m + rate[2] = state[3]; // dy/dt = vy + rate[3] = forces[1] / m; // dvy/dt = ay = fy/m + return; + } + // two particles, one interaction: state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t}, + // rate is {vx1, ax1, vy1, ay1, vx2, ax2, vy2, ay2, 1} + UserFunction[] f = getFunctionEditor().getMainFunctions(); + // use relative polar state {r, vr, theta, omega, t} to get interaction forces + double[] polarState = getRelativePolarState(state); + double cos = Math.cos(polarState[2]); + double sin = Math.sin(polarState[2]); + double fr = f[0].evaluate(polarState); + double ftheta = f[1].evaluate(polarState); + // use particle states {x, vx, y, vy, t} to get external forces on particles + for (int i = 0; i < particles.length; i++) { + double[] particleState = getState(particles[i]); + double[] forces = particles[i].getXYForces(particleState); + double m = particles[i].getMass(); + int sign = i==0? 1: -1; // polar forces are opposite on particles[1] + rate[4*i] = state[4*i+1]; // dx/dt = vx + rate[4*i+1] = (forces[0] + sign*fr*cos - sign*ftheta*sin) / m; // dvx/dt = ax = fx/m + rate[4*i+2] = state[4*i+3]; // dy/dt = vy + rate[4*i+3] = (forces[1] + sign*fr*sin + sign*ftheta*cos) / m; // dvy/dt = ay = fy/m + } + } + + /** + * Gets the initial values. + * + * @return initial values {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + */ + public double[] getInitialValues() { + double[] state = null; + // check initial state in case paint manager calls this unexpectedly + if (initialState.length!=particles.length*4+1) + initialState = new double[particles.length*4+1]; + for (int i = 0; i < particles.length; i++) { + state = particles[i].getInitialState(); + // state is {x, vx, y, vy, t} + System.arraycopy(state, 0, initialState, 4*i, 4); + } + if (state != null) + initialState[initialState.length-1] = state[state.length-1]; + else if (trackerPanel!=null) { + double t0 = trackerPanel.getPlayer().getVideoClip().getStartTime(); + initialState[initialState.length-1] = t0/1000; + } + return initialState; + } + + /** + * Responds to property change events. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("transform")) { //$NON-NLS-1$ + // workaround to prevent infinite loop + ImageCoordSystem coords = trackerPanel.getCoords(); + if (coords instanceof ReferenceFrame) { + TTrack track = ((ReferenceFrame)coords).getOriginTrack(); + if (track==this + || (particles.length>0 && track==particles[0]) + || (particles.length>1 && track==particles[1])) { + return; + } + } + lastValidFrame = -1; + refreshSteps(); + } + else super.propertyChange(e); + if (name.equals("mass") || name.equals("function")) { //$NON-NLS-1$ //$NON-NLS-2$ + refreshSystemParameters(); + if (trackerPanel!=null) + trackerPanel.repaint(); + } + else if (name.equals("name")) { //$NON-NLS-1$ + refreshSystemParameters(); + } + } + + /** + * Gets the system inspector. + * + * @return the system inspector + */ + public DynamicSystemInspector getSystemInspector() { + if (systemInspector == null) { + systemInspector = new DynamicSystemInspector(this); + systemInspector.setLocation(200, 200); + addPropertyChangeListener("name", systemInspector); //$NON-NLS-1$ + addPropertyChangeListener("color", systemInspector); //$NON-NLS-1$ + addPropertyChangeListener("footprint", systemInspector); //$NON-NLS-1$ + } + return systemInspector; + } + + /** + * Gets the initial state. Overrides DynamicParticle method. + * + * @return the initial state + */ + public double[] getInitialState() { + return getInitialValues(); + } + + /** + * Refreshes the data. Overrides PointMass method. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + int count = 25; // number of datasets + if (data.getDataset(0).getColumnName(0).equals("x")) { //$NON-NLS-1$ + // assign column names to the datasets + String timeVar = "t"; //$NON-NLS-1$ + data.getDataset(0).setXYColumnNames(timeVar, "x"); //$NON-NLS-1$ + data.getDataset(1).setXYColumnNames(timeVar, "y"); //$NON-NLS-1$ + data.getDataset(2).setXYColumnNames(timeVar, "r"); //$NON-NLS-1$ + data.getDataset(3).setXYColumnNames(timeVar, "$\\theta$_{r}"); //$NON-NLS-1$ + data.getDataset(4).setXYColumnNames(timeVar, "v_{x}"); //$NON-NLS-1$ + data.getDataset(5).setXYColumnNames(timeVar, "v_{y}"); //$NON-NLS-1$ + data.getDataset(6).setXYColumnNames(timeVar, "v"); //$NON-NLS-1$ + data.getDataset(7).setXYColumnNames(timeVar, "$\\theta$_{v}"); //$NON-NLS-1$ + data.getDataset(8).setXYColumnNames(timeVar, "a_{x}"); //$NON-NLS-1$ + data.getDataset(9).setXYColumnNames(timeVar, "a_{y}"); //$NON-NLS-1$ + data.getDataset(10).setXYColumnNames(timeVar, "a"); //$NON-NLS-1$ + data.getDataset(11).setXYColumnNames(timeVar, "$\\theta$_{a}"); //$NON-NLS-1$ + data.getDataset(12).setXYColumnNames(timeVar, "$\\theta$"); //$NON-NLS-1$ + data.getDataset(13).setXYColumnNames(timeVar, "$\\omega$"); //$NON-NLS-1$ + data.getDataset(14).setXYColumnNames(timeVar, "$\\alpha$"); //$NON-NLS-1$ + data.getDataset(15).setXYColumnNames(timeVar, "step"); //$NON-NLS-1$ + data.getDataset(16).setXYColumnNames(timeVar, "frame"); //$NON-NLS-1$ + data.getDataset(17).setXYColumnNames(timeVar, "p_{x}"); //$NON-NLS-1$ + data.getDataset(18).setXYColumnNames(timeVar, "p_{y}"); //$NON-NLS-1$ + data.getDataset(19).setXYColumnNames(timeVar, "p"); //$NON-NLS-1$ + data.getDataset(20).setXYColumnNames(timeVar, "$\\theta$_{p}"); //$NON-NLS-1$ + data.getDataset(21).setXYColumnNames(timeVar, "r_{rel}"); //$NON-NLS-1$ + data.getDataset(22).setXYColumnNames(timeVar, "$\\theta$_{rel}"); //$NON-NLS-1$ + data.getDataset(23).setXYColumnNames(timeVar, "vr_{rel}"); //$NON-NLS-1$ + data.getDataset(24).setXYColumnNames(timeVar, "$\\omega$_{rel}"); //$NON-NLS-1$ + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < count-3; i++) { + dataDescriptions[i] = TrackerRes.getString("PointMass.Data.Description."+i); //$NON-NLS-1$ + } + for (int i = 0; i < 4; i++) { + dataDescriptions[count-3+i] = TrackerRes.getString("DynamicSystem.Data.Description."+i); //$NON-NLS-1$ + } + // get the rotational data + Object[] rotationData = getRotationData(); + double[] theta_data = (double[])rotationData[0]; + double[] omega_data = (double[])rotationData[1]; + double[] alpha_data = (double[])rotationData[2]; + // clear datasets + dataFrames.clear(); + for (int i = 0; i < count;i++) { + data.getDataset(i).clear(); + } + // get data at each non-null position step in the videoclip + VideoPlayer player = trackerPanel.getPlayer(); + VideoClip clip = player.getVideoClip(); + double dt = player.getMeanStepDuration() / 1000.0; + ImageCoordSystem coords = trackerPanel.getCoords(); + Step[] stepArray = getSteps(); + for (int n = 0; n < stepArray.length; n++) { + if (stepArray[n] == null || !clip.includesFrame(n)) continue; + int stepNumber = clip.frameToStep(n); + double t = player.getStepTime(stepNumber)/1000.0; + // assemble the data values for this step + double[] vals = new double[count]; + TPoint p = ((PositionStep)stepArray[n]).getPosition(); + Point2D pt = p.getWorldPosition(trackerPanel); + vals[0] = pt.getX(); // x + vals[1] = pt.getY(); // y + vals[2] = pt.distance(0, 0); //mag + vals[3] = Math.atan2(pt.getY(), pt.getX()); // ang between +/-pi + vals[4] = Double.NaN; // vx + vals[5] = Double.NaN; //vy + vals[6] = Double.NaN; // vmag + vals[7] = Double.NaN; // vang + vals[8] = Double.NaN; // ax + vals[9] = Double.NaN; // ay + vals[10] = Double.NaN; // amag + vals[11] = Double.NaN; // aang + vals[12] = theta_data[n]; // theta + vals[13] = omega_data[n]/dt; // omega + vals[14] = alpha_data[n]/(dt*dt); // alpha + vals[15] = stepNumber; // step + vals[16] = n; // frame + vals[17] = Double.NaN; // px + vals[18] = Double.NaN; // py + vals[19] = Double.NaN; // pmag + vals[20] = Double.NaN; // pang + vals[21] = Double.NaN; // r_rel + vals[22] = Double.NaN; // theta_rel + vals[23] = Double.NaN; // vr_rel + vals[24] = Double.NaN; // omega_rel + if (particles.length==2) { + double[] relState = relativeStates.get(n); // {r, vr, theta, omega, t} + if (relState!=null) { + vals[21] = relState[0]; // r_rel + vals[22] = relState[2]; // theta_rel + vals[23] = relState[1]; // vr_rel + vals[24] = relState[3]; // omega_rel + } + } + VectorStep veloc = getVelocity(n, trackerPanel); + if (veloc != null) { + double imageX = veloc.getXComponent(); + double imageY = veloc.getYComponent(); + vals[4] = coords.imageToWorldXComponent(n, imageX, imageY)/dt; + vals[5] = coords.imageToWorldYComponent(n, imageX, imageY)/dt; + double vsquared = vals[4]*vals[4] + vals[5]*vals[5]; + vals[6] = Math.sqrt(vsquared); + vals[7] = Math.atan2(vals[5], vals[4]); + double mass = getMass(); + vals[17] = mass*vals[4]; + vals[18] = mass*vals[5]; + vals[19] = mass*vals[6]; + vals[20] = mass*vals[7]; + } + VectorStep accel = getAcceleration(n, trackerPanel); + if (accel != null) { + double imageX = accel.getXComponent(); + double imageY = accel.getYComponent(); + vals[8] = coords.imageToWorldXComponent(n, imageX, imageY)/(dt*dt); + vals[9] = coords.imageToWorldYComponent(n, imageX, imageY)/(dt*dt); + vals[10] = Math.sqrt(vals[8]*vals[8] + vals[9]*vals[9]); + vals[11] = Math.atan2(vals[9], vals[8]); + } + // append points to datasets + for (int i = 0; i < count; i++) { + data.getDataset(i).append(t, vals[i]); + } + dataFrames.add(new Integer(n)); + } + // store the mass in the data properties + Double m = getMass(); + String desc = TrackerRes.getString("ParticleModel.Parameter.Mass.Description"); //$NON-NLS-1$ + data.setConstant("m", m, m.toString(), desc); //$NON-NLS-1$ + } + +//______________________________ protected methods __________________________ + + /** + * Cleans up associated resources when this track is deleted or cleared. + */ + protected void cleanup() { + super.cleanup(); + if (systemInspector != null) systemInspector.dispose(); + } + + /** + * Refreshes initial time parameter for this model. Overrides ParticleModel. + */ + protected void refreshInitialTime() { + super.refreshInitialTime(); + for (ParticleModel next: particles) { + next.refreshInitialTime(); + } + } + + /** + * Refreshes the initial positions, velocities and particle masses + * based on the values for the particles in this system. + */ + protected void refreshSystemParameters() { + if (refreshing) return; + refreshing = true; + double[] polarState; // polar state is {r, vr, theta, omega, t} + if (particles.length==2) { + polarState = getRelativePolarState(getInitialState()); + } + else { + polarState = new double[] {0, 0, 0, 0, 0}; + } + double zeroPosition = 1E-12; + if (trackerPanel != null) { + zeroPosition = .001/trackerPanel.getCoords().getScaleX(0); + } + double zeroVelocity = 1E-11; + if (trackerPanel != null) { + zeroVelocity = 1000*zeroPosition/trackerPanel.getPlayer().getMeanStepDuration(); + } + double zeroAngle = 1E-5; + double zeroOmega = 1E-4; + if (trackerPanel != null) { + zeroOmega = 1000*zeroAngle/trackerPanel.getPlayer().getMeanStepDuration(); + } + String relative = "_"+TrackerRes.getString("DynamicSystem.Parameter.Name.Relative"); //$NON-NLS-1$ //$NON-NLS-2$ + String particleNames = " "; //$NON-NLS-1$ + if (particles.length>0) { + particleNames += TrackerRes.getString("DynamicSystem.Parameter.Of")+" "; //$NON-NLS-1$ //$NON-NLS-2$ + particleNames += particles[0].getName()+" "; //$NON-NLS-1$ + particleNames += TrackerRes.getString("DynamicSystem.Parameter.RelativeTo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ + particleNames += particles.length>1? particles[1].getName(): particles[0].getName(); + } + // particle masses + String desc = TrackerRes.getString("DynamicSystem.Parameter.Mass.Description"); //$NON-NLS-1$ + getParamEditor().setExpression("m", String.valueOf(getMass()), false); //$NON-NLS-1$ + getParamEditor().setDescription("m", desc); //$NON-NLS-1$ + Parameter m1 = (Parameter)getParamEditor().getObject("m1"); //$NON-NLS-1$ + Parameter m2 = (Parameter)getParamEditor().getObject("m2"); //$NON-NLS-1$ + desc = TrackerRes.getString("DynamicSystem.Parameter.ParticleMass.Description"); //$NON-NLS-1$ + if (particles.length==0) { + if (m1!=null) { + // must set name and expression editable before removing parameter + m1.setNameEditable(true); + m1.setExpressionEditable(true); + getParamEditor().removeObject(m1, false); + } + if (m2!=null) { + // must set name and expression editable before removing parameter + m2.setNameEditable(true); + m2.setExpressionEditable(true); + getParamEditor().removeObject(m2, false); + } + } + else { + String value = FunctionEditor.format(particles[0].getMass(), 0); + if (m1==null) { + m1 = createParameter("m1", value, desc+" "+particles[0].getName()); //$NON-NLS-1$ //$NON-NLS-2$ + getParamEditor().addObject(m1, 1, false, false); + } + else + getParamEditor().setExpression("m1", value, false); //$NON-NLS-1$ + if (particles.length>1) { + value = FunctionEditor.format(particles[1].getMass(), 0); + if (m2==null) { + m2 = createParameter("m2", value, desc+" "+particles[1].getName()); //$NON-NLS-1$ //$NON-NLS-2$ + getParamEditor().addObject(m2, 2, false, false); + } + else + getParamEditor().setExpression("m2", value, false); //$NON-NLS-1$ + } + else { + if (m2!=null) { + // must set name and expression editable before removing parameter + m2.setNameEditable(true); + m2.setExpressionEditable(true); + getParamEditor().removeObject(m2, false); + } + } + } + for (DynamicParticle particle: particles) { + if (particle.modelBooster!=null) { + particle.modelBooster.setBooster(particle.modelBooster.booster); + } + } + // initial values + Parameter t = (Parameter)getInitEditor().getObject("t"); //$NON-NLS-1$ + String value = FunctionEditor.format(polarState[0], zeroPosition); + desc = TrackerRes.getString("DynamicParticle.Parameter.InitialR.Description"); //$NON-NLS-1$ + Parameter r = createParameter("r"+relative, value, desc+particleNames); //$NON-NLS-1$ + value = FunctionEditor.format(polarState[2], zeroAngle); + desc = TrackerRes.getString("DynamicParticle.Parameter.InitialTheta.Description"); //$NON-NLS-1$ + Parameter theta = createParameter(FunctionEditor.THETA+relative, value, desc+particleNames); + value = FunctionEditor.format(polarState[1], zeroVelocity); + desc = TrackerRes.getString("DynamicParticle.Parameter.InitialVelocityR.Description"); //$NON-NLS-1$ + Parameter vr = createParameter("vr"+relative, value, desc+particleNames); //$NON-NLS-1$ + value = FunctionEditor.format(polarState[3], zeroOmega); + desc = TrackerRes.getString("DynamicParticle.Parameter.InitialOmega.Description"); //$NON-NLS-1$ + Parameter omega = createParameter(FunctionEditor.OMEGA+relative, value, desc+particleNames); + getInitEditor().setParameters(new Parameter[] {t, r, theta, vr, omega}); + refreshing = false; + } + + /** + * Sets the positions of the trace points based on a specified state. + * + * @param state the state + */ + protected void setTracePositions(double[] state) { + // state is {t} if no particles + // or {x1, vx1, y1, vy1, t} if one particle + // or {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} if two particles + if (particles.length==0) { + return; + } + for (int i = 0; i < points.length-1; i++) { + points[i].setLocation(state[4*i], state[4*i+2]); // current ODE state + } + double mass = 0, xcm = 0, ycm = 0; + for (int i = 0; i < particles.length; i++) { + double m = particles[i].getMass(); + mass += m; + xcm += m * state[4*i]; + ycm += m * state[4*i+2]; + } + points[points.length-1].setLocation(xcm/mass, ycm/mass); + } + + /** + * Creates and initializes the ModelFunctionPanel. + */ + protected void initializeFunctionPanel() { + // create panel + functionEditor = new UserFunctionEditor(); + functionPanel = new DynamicFunctionPanel(functionEditor, this); + // create main force functions + UserFunction[] uf = new UserFunction[2]; + String[] funcVars = new String[] {"r", "vr", //$NON-NLS-1$ //$NON-NLS-2$ + FunctionEditor.THETA, FunctionEditor.OMEGA, "t"}; //$NON-NLS-1$ + String internal = TrackerRes.getString("DynamicSystem.Force.Name.Internal"); //$NON-NLS-1$ + uf[0] = new UserFunction("fr_"+internal); //$NON-NLS-1$ + uf[0].setNameEditable(false); + uf[0].setExpression("0", funcVars); //$NON-NLS-1$ + uf[0].setDescription(TrackerRes.getString("DynamicSystem.ForceFunction.R.Description")); //$NON-NLS-1$ + String s = "f"+FunctionEditor.THETA+"_"+internal; //$NON-NLS-1$ //$NON-NLS-2$ + uf[1] = new UserFunction(s); + uf[1].setNameEditable(false); + uf[1].setExpression("0", funcVars); //$NON-NLS-1$ + uf[1].setDescription(TrackerRes.getString("DynamicSystem.ForceFunction.Theta.Description")); //$NON-NLS-1$ + functionEditor.setMainFunctions(uf); + // create mass and initial time parameters + createMassAndTimeParameters(); + } + + /** + * Gets the state of this system based on the states of its particles. + * + * @param state the particle state {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + * @return the system state {x_cm, vx_cm, y_cm, vy_cm, t} + */ + protected double[] getSystemState(double[] state) { + double mass = 0; + for (int i = 0; i < particleState.length; i++) { + particleState[i] = 0; + } + particleState[4] = state[state.length-1]; // time + if (particles.length>0) { + // state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + // systemState is {x_cm, vx_cm, y_cm, vy_cm, t} + for (int i = 0; i < particles.length; i++) { + double m = particles[i].getMass(); + mass += m; + particleState[0] += m * state[4*i]; + particleState[1] += m * state[4*i+1]; + particleState[2] += m * state[4*i+2]; + particleState[3] += m * state[4*i+3]; + } + particleState[0] /= mass; // cm x coordinate + particleState[1] /= mass; // cm y coordinate + particleState[2] /= mass; // cm x velocity + particleState[3] /= mass; // cm y velocity + } + return particleState; + } + + /** + * Gets the current state of the specified particle. + * + * @param particle the particle + * @return the state of the particle {x, vx, y, vy, t} + */ + protected double[] getState(DynamicParticle particle) { + for (int i = 0; i < particles.length; i++) { + if (particles[i] == particle) { + // state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + // particleState is {x, vx, y, vy, t} + particleState[0] = state[4*i]; + particleState[1] = state[4*i+1]; + particleState[2] = state[4*i+2]; + particleState[3] = state[4*i+3]; + particleState[4] = state[state.length-1]; + return particleState; + } + } + return null; + } + + /** + * Gets the particle models associated with this model. + * + * @return an array of particle models + */ + protected ParticleModel[] getModels() { + if (models.length != particles.length+1) { + models = new ParticleModel[particles.length+1]; + for (int i = 0; i < models.length-1; i++) { + models[i] = particles[i]; + } + models[models.length-1] = this; + } + return models; + } + + /** + * Converts a two-body cartesian state {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + * to a relative polar state {r, vr, theta, omega, t}. + * + * @param state the cartesian state of both particles + * @return the polar state of particle 1 relative to particle 2 + */ + protected double[] getRelativePolarState(double[] state) { + // cartesian state is {x1, vx1, y1, vy1, x2, vx2, y2, vy2, t} + double[] polarState = new double[5]; + double dx = state[0]-state[4]; + double dy = state[2]-state[6]; + double vx = state[1]-state[5]; + double vy = state[3]-state[7]; + double r = Math.sqrt(dx*dx + dy*dy); + double v = Math.sqrt(vx*vx + vy*vy); + double rang = Math.atan2(dy, dx); + double vang = Math.atan2(vy, vx); + double dang = vang-rang; + // polar state is {r, vr, theta, omega, t} + polarState[0] = r; // r + polarState[1] = r == 0? v: v*Math.cos(dang); // vr + polarState[2] = r == 0? vang: rang; // theta + polarState[3] = r == 0? 0: v*Math.sin(dang)/r; // omega + polarState[4] = state[8]; // t + double[] toSave = new double[polarState.length]; + System.arraycopy(polarState, 0, toSave, 0, polarState.length); + int frameNum = trackerPanel.getFrameNumber(); + relativeStates.put(frameNum, toSave); + return polarState; + } + +//______________________________ private methods __________________________ + + private Parameter createParameter(String name, String expression, String description) { + Parameter p = new Parameter(name, expression); + p.setExpressionEditable(false); + p.setNameEditable(false); + p.setDescription(description); + return p; + } + +//________________________ static methods and classes ______________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + DynamicSystem system = (DynamicSystem)obj; + // save particle names, if any + if (system.particles.length>0) { + String[] names = new String[system.particles.length]; + for (int i = 0; i < names.length; i++) { + names[i] = system.particles[i].getName(); + } + control.setValue("particles", names); //$NON-NLS-1$ + } + // save system inspector location if visible + if (system.systemInspector!=null && system.systemInspector.isVisible()) { + Point p = system.systemInspector.getLocation(); + // save location relative to frame + TFrame frame = system.trackerPanel.getTFrame(); + control.setValue("system_inspector_x", p.x - frame.getLocation().x); //$NON-NLS-1$ + control.setValue("system_inspector_y", p.y - frame.getLocation().y); //$NON-NLS-1$ + } + // save particle model data + XML.getLoader(ParticleModel.class).saveObject(control, obj); + } + + /** + * Creates a new object. + * + * @param control the control with the object data + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new DynamicSystem(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + XML.getLoader(ParticleModel.class).loadObject(control, obj); + DynamicSystem system = (DynamicSystem)obj; + // load mass names + String[] names = (String[])control.getObject("particles"); //$NON-NLS-1$ + if (names != null) { + system.particleNames = names; + } + system.systemInspectorX = control.getInt("system_inspector_x"); //$NON-NLS-1$ + system.systemInspectorY = control.getInt("system_inspector_y"); //$NON-NLS-1$ + return obj; + } + } + + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java index 8def7dbe..40ee8bd5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java @@ -1,426 +1,426 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.*; - -import org.opensourcephysics.tools.FontSizer; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; - -/** - * This displays and sets DynamicSystem properties. - * - * @author Douglas Brown - */ -public class DynamicSystemInspector extends JDialog - implements PropertyChangeListener { - - // instance fields - protected DynamicSystem system; - protected TrackerPanel trackerPanel; - protected boolean isVisible; - protected int particleCount; - protected JButton closeButton, helpButton; - protected ActionListener changeParticleListener; - protected JPanel[] particlePanels; - protected JButton[] changeButtons; - protected DynamicParticle[] selectedParticles; - protected JLabel[] particleLabels; - protected TButton[] particleButtons; - protected JPanel[] labelPanels; - protected DynamicParticle newParticle; - protected TButton systemButton; - protected MouseListener selectListener; - - /** - * Constructs a DynamicSystemInspector. - * - * @param track the DynamicSystem - */ - public DynamicSystemInspector(DynamicSystem track) { - super(JOptionPane.getFrameForComponent(track.trackerPanel), false); - system = track; - particleCount = 2; - trackerPanel = system.trackerPanel; - if (trackerPanel != null) { - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - setResizable(false); - createGUI(); - initialize(); - updateDisplay(); - } - - /** - * Initializes this inspector. - */ - public void initialize() { - updateDisplay(); - } - - /** - * Responds to property change events. This listens for the - * following events: "tab" from TFrame. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (trackerPanel != null && e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - else if (e.getPropertyName().equals("track") //$NON-NLS-1$ - && e.getNewValue() instanceof DynamicParticle) { - newParticle = (DynamicParticle)e.getNewValue(); - updateDisplay(); - } - else updateDisplay(); - } - - /** - * Overrides JDialog setVisible method. - * - * @param vis true to show this inspector - */ - public void setVisible(boolean vis) { - super.setVisible(vis); - isVisible = vis; - } - - /** - * Disposes of this inspector. - */ - public void dispose() { - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - Iterator it = trackerPanel.getDrawables(DynamicParticle.class).iterator(); - while (it.hasNext()) { - PointMass p = it.next(); - p.removePropertyChangeListener("name", this); //$NON-NLS-1$ - p.removePropertyChangeListener("color", this); //$NON-NLS-1$ - p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - super.dispose(); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - changeParticleListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - final JButton button = (JButton)e.getSource(); - final int n = button==changeButtons[0]? 0: 1; - final Action cloneAction = TActions.getAction("cloneTrack", trackerPanel); //$NON-NLS-1$ - final Action cartesianAction = TActions.getAction("dynamicParticle", trackerPanel); //$NON-NLS-1$ - final Action polarAction = TActions.getAction("dynamicParticlePolar", trackerPanel); //$NON-NLS-1$ - JPopupMenu popup = new JPopupMenu(); - boolean hasPopupItems = false; - JMenu cloneMenu = new JMenu( - TrackerRes.getString("TMenuBar.MenuItem.Clone")); //$NON-NLS-1$ - Iterator it = trackerPanel.getDrawables(DynamicParticle.class).iterator(); - while (it.hasNext()) { - DynamicParticle p = it.next(); - if (p instanceof DynamicSystem) continue; // no other systems - // add items to clone menu - final JMenuItem cloneItem = new JMenuItem(p.getName(), p.getFootprint().getIcon(21, 16)); - cloneItem.setActionCommand(p.getName()); - cloneItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - newParticle = null; - cloneAction.actionPerformed(e); - if (newParticle!=null) { - newParticle.getInspector(); - selectedParticles[n] = newParticle; - updateSystem(); - } - } - }); - cloneMenu.add(cloneItem); - if (p==selectedParticles[0] - || p==selectedParticles[1] - || p.system!=null) continue; - // add items to popup menu - hasPopupItems = true; - final JMenuItem item = new JMenuItem(p.getName(), p.getFootprint().getIcon(21, 16)) { - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - int w = button.getPreferredSize().width-2; - dim.width = Math.max(w, dim.width); - return dim; - } - }; - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - selectedParticles[n] = getParticle(item.getText()); - updateSystem(); - } - }); - popup.add(item); - } - if (hasPopupItems) - popup.addSeparator(); - JMenu newMenu = new JMenu( - TrackerRes.getString("TrackControl.Button.NewTrack")) { //$NON-NLS-1$ - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - int w = button.getPreferredSize().width-2; - dim.width = Math.max(w, dim.width); - return dim; - } - }; - popup.add(newMenu); - - JMenuItem cartesianItem = new JMenuItem( - TrackerRes.getString("TMenuBar.MenuItem.Cartesian")); //$NON-NLS-1$ - cartesianItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - newParticle = null; - cartesianAction.actionPerformed(e); - if (newParticle!=null) { - newParticle.getInspector(); - selectedParticles[n] = newParticle; - updateSystem(); - } - } - }); - newMenu.add(cartesianItem); - JMenuItem polarItem = new JMenuItem( - TrackerRes.getString("TMenuBar.MenuItem.Polar")); //$NON-NLS-1$ - polarItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - newParticle = null; - polarAction.actionPerformed(e); - if (newParticle!=null) { - newParticle.getInspector(); - selectedParticles[n] = newParticle; - updateSystem(); - } - } - }); - newMenu.add(polarItem); - if (cloneMenu.getItemCount() > 0) - popup.add(cloneMenu); - JMenuItem noneItem = new JMenuItem( - TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ - noneItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - newParticle = null; - selectedParticles[n] = null; - updateSystem(); - } - }); - popup.addSeparator(); - popup.add(noneItem); - - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(button, 0, button.getHeight()); - } - }; - selectListener = new MouseAdapter() { - public void mousePressed(MouseEvent e) { - TButton button = (TButton)e.getSource(); - TTrack track = getParticle(button.getText()); - trackerPanel.setSelectedTrack(track); - } - public void mouseExited(MouseEvent e) { - closeButton.requestFocusInWindow(); - } - }; - // create GUI components - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - JPanel inspectorPanel = new JPanel(new GridLayout(1, 2)); - contentPane.add(inspectorPanel, BorderLayout.CENTER); - particlePanels = new JPanel[particleCount]; - changeButtons = new JButton[particleCount]; - particleLabels = new JLabel[particleCount]; - particleButtons = new TButton[particleCount]; - labelPanels = new JPanel[particleCount]; - for (int i = 0; i < particleCount; i++) { - particlePanels[i] = new JPanel(new BorderLayout()); - inspectorPanel.add(particlePanels[i]); - changeButtons[i] = new JButton(); - changeButtons[i].addActionListener(changeParticleListener); - particleLabels[i] = new JLabel( - TrackerRes.getString("DynamicSystemInspector.ParticleName.None")) { //$NON-NLS-1$ - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.height = systemButton.getPreferredSize().height; - return dim; - } - }; - particleLabels[i].setHorizontalAlignment(SwingConstants.CENTER); - particleLabels[i].setAlignmentX(Component.CENTER_ALIGNMENT); - particleButtons[i] = new TButton(); - particleButtons[i].setContentAreaFilled(false); - particleButtons[i].addMouseListener(selectListener); - particleButtons[i].setAlignmentX(Component.CENTER_ALIGNMENT); - labelPanels[i] = new JPanel(); - labelPanels[i].setLayout(new BoxLayout(labelPanels[i], BoxLayout.Y_AXIS)); - labelPanels[i].add(particleLabels[i]); - particlePanels[i].add(labelPanels[i], BorderLayout.NORTH); - JPanel center = new JPanel(); - center.add(changeButtons[i]); - particlePanels[i].add(center, BorderLayout.CENTER); - } - // create buttons and buttonbar - systemButton = new TButton(); - systemButton.setText(system.getName()); - systemButton.setIcon(system.getFootprint().getIcon(21, 16)); - systemButton.setContentAreaFilled(false); - systemButton.addMouseListener(selectListener); - systemButton.setAlignmentX(Component.CENTER_ALIGNMENT); - helpButton = new JButton(); - helpButton.setForeground(new Color(0, 0, 102)); - helpButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trackerPanel.getTFrame().showHelp("system", 0); //$NON-NLS-1$ - } - }); - closeButton = new JButton(); - closeButton.setForeground(new Color(0, 0, 102)); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - JPanel buttonbar = new JPanel(); - contentPane.add(buttonbar, BorderLayout.SOUTH); - buttonbar.add(helpButton); - buttonbar.add(closeButton); - JPanel panel = new JPanel(); - panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); - panel.add(systemButton); - panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 2, 0)); - contentPane.add(panel, BorderLayout.NORTH); - } - - /** - * Updates the system to reflect the current particle selection. - */ - private void updateSystem() { - if (selectedParticles[0]==null && selectedParticles[1]==null) { - system.setParticles(new DynamicParticle[0]); - } - else if (selectedParticles[0]==null) - system.setParticles(new DynamicParticle[] {selectedParticles[1]}); - else if (selectedParticles[1]==null) - system.setParticles(new DynamicParticle[] {selectedParticles[0]}); - else system.setParticles(selectedParticles); - if (newParticle==null) - newParticle = system; - system.getInspector().setSelectedPanel(newParticle.getName()); - updateDisplay(); - this.setVisible(true); - } - - /** - * Gets the particle with the specified name. - * - * @param name name of the particle - * @return the particle - */ - private DynamicParticle getParticle(String name) { - ArrayList particles = trackerPanel.getDrawables(DynamicParticle.class); - for (DynamicParticle p: particles) { - if (p.getName().equals(name)) return p; - } - return null; - } - - /** - * Updates this inspector to show the system's current particles. - */ - protected void updateDisplay() { - setTitle(TrackerRes.getString("DynamicSystemInspector.Title")); //$NON-NLS-1$ - helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ - closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - selectedParticles = new DynamicParticle[particleCount]; - systemButton.setText(system.getName()); - systemButton.setIcon(system.getFootprint().getIcon(21, 16)); - systemButton.setToolTipText( - TrackerRes.getString("TrackControl.Button.Properties.ToolTip") //$NON-NLS-1$ - +" "+system.getName()); //$NON-NLS-1$ - boolean empty = true; - for (int i = 0; i < particleCount; i++) { - Border etched = BorderFactory.createEtchedBorder(); - TitledBorder title = BorderFactory.createTitledBorder(etched, - TrackerRes.getString("DynamicSystemInspector.Border.Title")+" "+(i+1)); //$NON-NLS-1$ //$NON-NLS-2$ - particlePanels[i].setBorder(title); - changeButtons[i].setText( - TrackerRes.getString("DynamicSystemInspector.Button.Change")); //$NON-NLS-1$ - labelPanels[i].removeAll(); - if (system.particles.length>i && system.particles[i]!=null) { - empty = false; - selectedParticles[i] = system.particles[i]; - particleButtons[i].setText(selectedParticles[i].getName()); - particleButtons[i].setIcon(selectedParticles[i].getFootprint().getIcon(21, 16)); - particleButtons[i].setToolTipText( - TrackerRes.getString("TrackControl.Button.Properties.ToolTip") //$NON-NLS-1$ - +" "+selectedParticles[i].getName()); //$NON-NLS-1$ - - labelPanels[i].setLayout(new BoxLayout(labelPanels[i], BoxLayout.Y_AXIS)); - labelPanels[i].add(particleButtons[i]); - } - else { - selectedParticles[i] = null; - particleLabels[i].setText( - TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ - labelPanels[i].setLayout(new BorderLayout()); - labelPanels[i].add(particleLabels[i]); - } - } - changeButtons[particleCount-1].setEnabled(!empty); - changeButtons[0].requestFocusInWindow(); - pack(); - repaint(); - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.*; + +import org.opensourcephysics.tools.FontSizer; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeEvent; + +/** + * This displays and sets DynamicSystem properties. + * + * @author Douglas Brown + */ +public class DynamicSystemInspector extends JDialog + implements PropertyChangeListener { + + // instance fields + protected DynamicSystem system; + protected TrackerPanel trackerPanel; + protected boolean isVisible; + protected int particleCount; + protected JButton closeButton, helpButton; + protected ActionListener changeParticleListener; + protected JPanel[] particlePanels; + protected JButton[] changeButtons; + protected DynamicParticle[] selectedParticles; + protected JLabel[] particleLabels; + protected TButton[] particleButtons; + protected JPanel[] labelPanels; + protected DynamicParticle newParticle; + protected TButton systemButton; + protected MouseListener selectListener; + + /** + * Constructs a DynamicSystemInspector. + * + * @param track the DynamicSystem + */ + public DynamicSystemInspector(DynamicSystem track) { + super(JOptionPane.getFrameForComponent(track.trackerPanel), false); + system = track; + particleCount = 2; + trackerPanel = system.trackerPanel; + if (trackerPanel != null) { + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + setResizable(false); + createGUI(); + initialize(); + updateDisplay(); + } + + /** + * Initializes this inspector. + */ + public void initialize() { + updateDisplay(); + } + + /** + * Responds to property change events. This listens for the + * following events: "tab" from TFrame. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (trackerPanel != null && e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + else if (e.getPropertyName().equals("track") //$NON-NLS-1$ + && e.getNewValue() instanceof DynamicParticle) { + newParticle = (DynamicParticle)e.getNewValue(); + updateDisplay(); + } + else updateDisplay(); + } + + /** + * Overrides JDialog setVisible method. + * + * @param vis true to show this inspector + */ + public void setVisible(boolean vis) { + super.setVisible(vis); + isVisible = vis; + } + + /** + * Disposes of this inspector. + */ + public void dispose() { + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + Iterator it = trackerPanel.getDrawables(DynamicParticle.class).iterator(); + while (it.hasNext()) { + PointMass p = it.next(); + p.removePropertyChangeListener("name", this); //$NON-NLS-1$ + p.removePropertyChangeListener("color", this); //$NON-NLS-1$ + p.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.dispose(); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + changeParticleListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + final JButton button = (JButton)e.getSource(); + final int n = button==changeButtons[0]? 0: 1; + final Action cloneAction = TActions.getAction("cloneTrack", trackerPanel); //$NON-NLS-1$ + final Action cartesianAction = TActions.getAction("dynamicParticle", trackerPanel); //$NON-NLS-1$ + final Action polarAction = TActions.getAction("dynamicParticlePolar", trackerPanel); //$NON-NLS-1$ + JPopupMenu popup = new JPopupMenu(); + boolean hasPopupItems = false; + JMenu cloneMenu = new JMenu( + TrackerRes.getString("TMenuBar.MenuItem.Clone")); //$NON-NLS-1$ + Iterator it = trackerPanel.getDrawables(DynamicParticle.class).iterator(); + while (it.hasNext()) { + DynamicParticle p = it.next(); + if (p instanceof DynamicSystem) continue; // no other systems + // add items to clone menu + final JMenuItem cloneItem = new JMenuItem(p.getName(), p.getFootprint().getIcon(21, 16)); + cloneItem.setActionCommand(p.getName()); + cloneItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + newParticle = null; + cloneAction.actionPerformed(e); + if (newParticle!=null) { + newParticle.getInspector(); + selectedParticles[n] = newParticle; + updateSystem(); + } + } + }); + cloneMenu.add(cloneItem); + if (p==selectedParticles[0] + || p==selectedParticles[1] + || p.system!=null) continue; + // add items to popup menu + hasPopupItems = true; + final JMenuItem item = new JMenuItem(p.getName(), p.getFootprint().getIcon(21, 16)) { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + int w = button.getPreferredSize().width-2; + dim.width = Math.max(w, dim.width); + return dim; + } + }; + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + selectedParticles[n] = getParticle(item.getText()); + updateSystem(); + } + }); + popup.add(item); + } + if (hasPopupItems) + popup.addSeparator(); + JMenu newMenu = new JMenu( + TrackerRes.getString("TrackControl.Button.NewTrack")) { //$NON-NLS-1$ + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + int w = button.getPreferredSize().width-2; + dim.width = Math.max(w, dim.width); + return dim; + } + }; + popup.add(newMenu); + + JMenuItem cartesianItem = new JMenuItem( + TrackerRes.getString("TMenuBar.MenuItem.Cartesian")); //$NON-NLS-1$ + cartesianItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + newParticle = null; + cartesianAction.actionPerformed(e); + if (newParticle!=null) { + newParticle.getInspector(); + selectedParticles[n] = newParticle; + updateSystem(); + } + } + }); + newMenu.add(cartesianItem); + JMenuItem polarItem = new JMenuItem( + TrackerRes.getString("TMenuBar.MenuItem.Polar")); //$NON-NLS-1$ + polarItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + newParticle = null; + polarAction.actionPerformed(e); + if (newParticle!=null) { + newParticle.getInspector(); + selectedParticles[n] = newParticle; + updateSystem(); + } + } + }); + newMenu.add(polarItem); + if (cloneMenu.getItemCount() > 0) + popup.add(cloneMenu); + JMenuItem noneItem = new JMenuItem( + TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ + noneItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + newParticle = null; + selectedParticles[n] = null; + updateSystem(); + } + }); + popup.addSeparator(); + popup.add(noneItem); + + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(button, 0, button.getHeight()); + } + }; + selectListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + TButton button = (TButton)e.getSource(); + TTrack track = getParticle(button.getText()); + trackerPanel.setSelectedTrack(track); + } + public void mouseExited(MouseEvent e) { + closeButton.requestFocusInWindow(); + } + }; + // create GUI components + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + JPanel inspectorPanel = new JPanel(new GridLayout(1, 2)); + contentPane.add(inspectorPanel, BorderLayout.CENTER); + particlePanels = new JPanel[particleCount]; + changeButtons = new JButton[particleCount]; + particleLabels = new JLabel[particleCount]; + particleButtons = new TButton[particleCount]; + labelPanels = new JPanel[particleCount]; + for (int i = 0; i < particleCount; i++) { + particlePanels[i] = new JPanel(new BorderLayout()); + inspectorPanel.add(particlePanels[i]); + changeButtons[i] = new JButton(); + changeButtons[i].addActionListener(changeParticleListener); + particleLabels[i] = new JLabel( + TrackerRes.getString("DynamicSystemInspector.ParticleName.None")) { //$NON-NLS-1$ + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height = systemButton.getPreferredSize().height; + return dim; + } + }; + particleLabels[i].setHorizontalAlignment(SwingConstants.CENTER); + particleLabels[i].setAlignmentX(Component.CENTER_ALIGNMENT); + particleButtons[i] = new TButton(); + particleButtons[i].setContentAreaFilled(false); + particleButtons[i].addMouseListener(selectListener); + particleButtons[i].setAlignmentX(Component.CENTER_ALIGNMENT); + labelPanels[i] = new JPanel(); + labelPanels[i].setLayout(new BoxLayout(labelPanels[i], BoxLayout.Y_AXIS)); + labelPanels[i].add(particleLabels[i]); + particlePanels[i].add(labelPanels[i], BorderLayout.NORTH); + JPanel center = new JPanel(); + center.add(changeButtons[i]); + particlePanels[i].add(center, BorderLayout.CENTER); + } + // create buttons and buttonbar + systemButton = new TButton(); + systemButton.setText(system.getName()); + systemButton.setIcon(system.getFootprint().getIcon(21, 16)); + systemButton.setContentAreaFilled(false); + systemButton.addMouseListener(selectListener); + systemButton.setAlignmentX(Component.CENTER_ALIGNMENT); + helpButton = new JButton(); + helpButton.setForeground(new Color(0, 0, 102)); + helpButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trackerPanel.getTFrame().showHelp("system", 0); //$NON-NLS-1$ + } + }); + closeButton = new JButton(); + closeButton.setForeground(new Color(0, 0, 102)); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + JPanel buttonbar = new JPanel(); + contentPane.add(buttonbar, BorderLayout.SOUTH); + buttonbar.add(helpButton); + buttonbar.add(closeButton); + JPanel panel = new JPanel(); + panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); + panel.add(systemButton); + panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 2, 0)); + contentPane.add(panel, BorderLayout.NORTH); + } + + /** + * Updates the system to reflect the current particle selection. + */ + private void updateSystem() { + if (selectedParticles[0]==null && selectedParticles[1]==null) { + system.setParticles(new DynamicParticle[0]); + } + else if (selectedParticles[0]==null) + system.setParticles(new DynamicParticle[] {selectedParticles[1]}); + else if (selectedParticles[1]==null) + system.setParticles(new DynamicParticle[] {selectedParticles[0]}); + else system.setParticles(selectedParticles); + if (newParticle==null) + newParticle = system; + system.getInspector().setSelectedPanel(newParticle.getName()); + updateDisplay(); + this.setVisible(true); + } + + /** + * Gets the particle with the specified name. + * + * @param name name of the particle + * @return the particle + */ + private DynamicParticle getParticle(String name) { + ArrayList particles = trackerPanel.getDrawables(DynamicParticle.class); + for (DynamicParticle p: particles) { + if (p.getName().equals(name)) return p; + } + return null; + } + + /** + * Updates this inspector to show the system's current particles. + */ + protected void updateDisplay() { + setTitle(TrackerRes.getString("DynamicSystemInspector.Title")); //$NON-NLS-1$ + helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + selectedParticles = new DynamicParticle[particleCount]; + systemButton.setText(system.getName()); + systemButton.setIcon(system.getFootprint().getIcon(21, 16)); + systemButton.setToolTipText( + TrackerRes.getString("TrackControl.Button.Properties.ToolTip") //$NON-NLS-1$ + +" "+system.getName()); //$NON-NLS-1$ + boolean empty = true; + for (int i = 0; i < particleCount; i++) { + Border etched = BorderFactory.createEtchedBorder(); + TitledBorder title = BorderFactory.createTitledBorder(etched, + TrackerRes.getString("DynamicSystemInspector.Border.Title")+" "+(i+1)); //$NON-NLS-1$ //$NON-NLS-2$ + particlePanels[i].setBorder(title); + changeButtons[i].setText( + TrackerRes.getString("DynamicSystemInspector.Button.Change")); //$NON-NLS-1$ + labelPanels[i].removeAll(); + if (system.particles.length>i && system.particles[i]!=null) { + empty = false; + selectedParticles[i] = system.particles[i]; + particleButtons[i].setText(selectedParticles[i].getName()); + particleButtons[i].setIcon(selectedParticles[i].getFootprint().getIcon(21, 16)); + particleButtons[i].setToolTipText( + TrackerRes.getString("TrackControl.Button.Properties.ToolTip") //$NON-NLS-1$ + +" "+selectedParticles[i].getName()); //$NON-NLS-1$ + + labelPanels[i].setLayout(new BoxLayout(labelPanels[i], BoxLayout.Y_AXIS)); + labelPanels[i].add(particleButtons[i]); + } + else { + selectedParticles[i] = null; + particleLabels[i].setText( + TrackerRes.getString("DynamicSystemInspector.ParticleName.None")); //$NON-NLS-1$ + labelPanels[i].setLayout(new BorderLayout()); + labelPanels[i].add(particleLabels[i]); + } + } + changeButtons[particleCount-1].setEnabled(!empty); + changeButtons[0].requestFocusInWindow(); + pack(); + repaint(); + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java index a896b9af..1439d761 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java @@ -1,398 +1,398 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.event.*; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; - -import javax.swing.*; -import javax.swing.border.*; - -import org.opensourcephysics.controls.ControlsRes; -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.display.DataTable; - -/** - * A dialog for exporting videos from a TrackerPanel. - * - * @author Douglas Brown - */ -public class ExportDataDialog extends JDialog { - - protected static ExportDataDialog dataExporter; // singleton - - // instance fields - protected TrackerPanel trackerPanel; - protected JButton saveAsButton, closeButton; - protected JComponent tablePanel, delimiterPanel, contentPanel, formatPanel; - protected JComboBox formatDropdown, delimiterDropdown, tableDropdown, contentDropdown; - protected HashMap tables; - protected HashMap trackNames; - protected boolean refreshing; - - /** - * Returns the singleton ExportDataDialog for a specified TrackerPanel. - * - * @param panel the TrackerPanel - * @return the ExportDataDialog - */ - public static ExportDataDialog getDialog(TrackerPanel panel) { - if (dataExporter==null) { - dataExporter = new ExportDataDialog(panel); - } - dataExporter.trackerPanel = panel; - dataExporter.refreshGUI(); - return dataExporter; - } - - /** - * Constructs a ExportDataDialog. - * - * @param panel a TrackerPanel to supply the images - */ - private ExportDataDialog(TrackerPanel panel) { - super(JOptionPane.getFrameForComponent(panel), true); - trackerPanel = panel; - setResizable(false); - createGUI(); - refreshGUI(); - // center dialog on the screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - getBounds().width) / 2; - int y = (dim.height - getBounds().height) / 2; - setLocation(x, y); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this dialog. - */ - private void createGUI() { - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - Box settingsPanel = Box.createVerticalBox(); - contentPane.add(settingsPanel, BorderLayout.CENTER); - JPanel upper = new JPanel(new GridLayout(1, 2)); - JPanel lower = new JPanel(new GridLayout(1, 2)); - - // table panel - tables = new HashMap(); - trackNames = new HashMap(); - tablePanel = Box.createVerticalBox(); - tableDropdown = new JComboBox(); - tablePanel.add(tableDropdown); - - // delimiter panel - delimiterPanel = new JPanel(new GridLayout(0, 1)); - delimiterDropdown = new JComboBox(); - delimiterPanel.add(delimiterDropdown); - delimiterDropdown.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if (refreshing) return; - if (e.getStateChange()==ItemEvent.SELECTED) { - Object selected = delimiterDropdown.getSelectedItem(); - boolean isAdd = selected.equals( - TrackerRes.getString("ExportDataDialog.Delimiter.Add")); //$NON-NLS-1$ - boolean isRemove = selected.equals( - TrackerRes.getString("ExportDataDialog.Delimiter.Remove")); //$NON-NLS-1$ - String delimiter = TrackerIO.getDelimiter(); - if (isAdd) { - Object response = JOptionPane.showInputDialog(ExportDataDialog.this, - TrackerRes.getString("TableTrackView.Dialog.CustomDelimiter.Message"), //$NON-NLS-1$ - TrackerRes.getString("TableTrackView.Dialog.CustomDelimiter.Title"), //$NON-NLS-1$ - JOptionPane.PLAIN_MESSAGE, null, null, delimiter); - if (response!=null && !"".equals(response.toString())) { //$NON-NLS-1$ - String s = response.toString(); - TrackerIO.setDelimiter(s); - TrackerIO.addCustomDelimiter(s); - } - refreshGUI(); - } - else if (isRemove) { - String[] choices = TrackerIO.customDelimiters.values().toArray(new String[1]); - Object response = JOptionPane.showInputDialog(ExportDataDialog.this, - TrackerRes.getString("TableTrackView.Dialog.RemoveDelimiter.Message"), //$NON-NLS-1$ - TrackerRes.getString("TableTrackView.Dialog.RemoveDelimiter.Title"), //$NON-NLS-1$ - JOptionPane.PLAIN_MESSAGE, null, choices, null); - if (response!=null) { - String s = response.toString(); - TrackerIO.removeCustomDelimiter(s); - } - refreshGUI(); - } - else { - if (TrackerIO.delimiters.keySet().contains(selected)) - TrackerIO.setDelimiter(TrackerIO.delimiters.get(selected)); - else if (TrackerIO.customDelimiters.keySet().contains(selected)) - TrackerIO.setDelimiter(TrackerIO.customDelimiters.get(selected)); - } - } - } - }); - ListCellRenderer renderer = delimiterDropdown.getRenderer(); - delimiterDropdown.setRenderer(new SeparatorRenderer(renderer)); - - // content panel - contentPanel = new JPanel(new GridLayout(0, 1)); - contentDropdown = new JComboBox(); - contentPanel.add(contentDropdown); - - // format panel - formatPanel = new JPanel(new GridLayout(0, 1)); - formatDropdown = new JComboBox(); - formatPanel.add(formatDropdown); - - // assemble - settingsPanel.add(upper); - settingsPanel.add(lower); - upper.add(tablePanel); - upper.add(contentPanel); - lower.add(formatPanel); - lower.add(delimiterPanel); - - // buttons - saveAsButton = new JButton(); - saveAsButton.setForeground(new Color(0, 0, 102)); - saveAsButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = TrackerIO.getChooser(); - chooser.setAcceptAllFileFilterUsed(true); - chooser.setDialogTitle(TrackerRes.getString("ExportDataDialog.Chooser.SaveData.Title")); //$NON-NLS-1$ - chooser.setSelectedFile(new File("")); //$NON-NLS-1$ - File[] files = TrackerIO.getChooserFiles("save"); //$NON-NLS-1$ - if (files==null || files.length==0) - return; - DataTable table = tables.get(tableDropdown.getSelectedItem()); - boolean asFormatted = formatDropdown.getSelectedItem().equals( - TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ - boolean allCells = contentDropdown.getSelectedItem().equals( - TrackerRes.getString("ExportDataDialog.Content.AllCells")); //$NON-NLS-1$ - String trackName = trackNames.get(table)+XML.NEW_LINE; - trackName = trackName.replace(' ', '_'); - if (allCells) { - // get current selection state - int[] selectedRows = table.getSelectedRows(); - int[] selectedCols = table.getSelectedColumns(); - // select all - table.selectAll(); - // get data and write to output file - StringBuffer buf = TrackerIO.getData(table, asFormatted); - write(files[0], trackName+buf.toString()); - // restore previous selection state - table.clearSelection(); - for (int row: selectedRows) - table.addRowSelectionInterval(row, row); - for (int col: selectedCols) - table.addColumnSelectionInterval(col, col); - } - else { - // get data and write to output file - StringBuffer buf = TrackerIO.getData(table, asFormatted); - write(files[0], trackName+buf.toString()); - } - } - }); - closeButton = new JButton(); - closeButton.setForeground(new Color(0, 0, 102)); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - // buttonbar - JPanel buttonbar = new JPanel(); - contentPane.add(buttonbar, BorderLayout.SOUTH); - buttonbar.add(saveAsButton); - buttonbar.add(closeButton); - } - - /** - * Refreshes the visible components of this dialog. - */ - private void refreshGUI() { - refreshing = true; - // refresh strings - String title = TrackerRes.getString("ExportDataDialog.Title"); //$NON-NLS-1$ - setTitle(title); - title = TrackerRes.getString("ExportDataDialog.Subtitle.Table"); //$NON-NLS-1$ - Border space = BorderFactory.createEmptyBorder(0, 4, 6, 4); - Border titled = BorderFactory.createTitledBorder(title); - tablePanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - title = TrackerRes.getString("ExportDataDialog.Subtitle.Delimiter"); //$NON-NLS-1$ - titled = BorderFactory.createTitledBorder(title); - delimiterPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - title = TrackerRes.getString("ExportDataDialog.Subtitle.Content"); //$NON-NLS-1$ - titled = BorderFactory.createTitledBorder(title); - contentPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - title = TrackerRes.getString("ExportDataDialog.Subtitle.Format"); //$NON-NLS-1$ - titled = BorderFactory.createTitledBorder(title); - formatPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - saveAsButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ - closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - - // refresh dropdowns - // delimiters - Object selectedItem = null; - String delim = TrackerIO.getDelimiter(); - delimiterDropdown.removeAllItems(); - // standard delimiters - for (String key: TrackerIO.delimiters.keySet()) { - delimiterDropdown.addItem(key); - if (delim.equals(TrackerIO.delimiters.get(key))) - selectedItem = key; - } - // custom delimiters - boolean hasCustom = !TrackerIO.customDelimiters.isEmpty(); - if (hasCustom) { - delimiterDropdown.addItem(new JSeparator(JSeparator.HORIZONTAL)); - for (String key: TrackerIO.customDelimiters.keySet()) { - delimiterDropdown.addItem(key); - if (delim.equals(TrackerIO.customDelimiters.get(key))) - selectedItem = key; - } - } - // add and remove delimiter items - delimiterDropdown.addItem(new JSeparator(JSeparator.HORIZONTAL)); - String s = TrackerRes.getString("ExportDataDialog.Delimiter.Add"); //$NON-NLS-1$ - delimiterDropdown.addItem(s); - if (hasCustom) { - s = TrackerRes.getString("ExportDataDialog.Delimiter.Remove"); //$NON-NLS-1$ - delimiterDropdown.addItem(s); - } - delimiterDropdown.setSelectedItem(selectedItem); - - // tables - selectedItem = tableDropdown.getSelectedItem(); - tableDropdown.removeAllItems(); - Container[] c = trackerPanel.getTFrame().getViews(trackerPanel); - boolean hasSelection = false; - for (int i = 0; i < c.length; i++) { - if (trackerPanel.getTFrame().isViewOpen(i, trackerPanel)) { - String number = " ("+(i+1)+")"; //$NON-NLS-1$ //$NON-NLS-2$ - if (c[i] instanceof TViewChooser) { - TViewChooser chooser = (TViewChooser)c[i]; - TView tview = chooser.getSelectedView(); - if (tview instanceof TableTView) { - TableTView tableView = (TableTView)tview; - TTrack track = tableView.getSelectedTrack(); - if (track!=null) { - s = track.getName() + number; - TableTrackView trackView = (TableTrackView)tableView.getTrackView(track); - trackNames.put(trackView.dataTable, track.getName()); - tables.put(s, trackView.dataTable); - tableDropdown.addItem(s); - int[] selectedRows = trackView.dataTable.getSelectedRows(); - if (selectedRows.length > 0) { - hasSelection = true; - } - } - } - } - } - } - if (selectedItem!=null) - tableDropdown.setSelectedItem(selectedItem); - - // formats - selectedItem = formatDropdown.getSelectedItem(); - formatDropdown.removeAllItems(); - formatDropdown.addItem(TrackerRes.getString("TableTrackView.MenuItem.Unformatted")); //$NON-NLS-1$ - formatDropdown.addItem(TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ - if (selectedItem!=null) - formatDropdown.setSelectedItem(selectedItem); - - // content - contentDropdown.removeAllItems(); - contentDropdown.addItem(TrackerRes.getString("ExportDataDialog.Content.AllCells")); //$NON-NLS-1$ - if (hasSelection) { - s = TrackerRes.getString("ExportDataDialog.Content.SelectedCells"); //$NON-NLS-1$ - contentDropdown.insertItemAt(s, 0); - contentDropdown.setSelectedItem(s); - } - - pack(); - refreshing = false; - } - - /** - * Writes a string to a file. - * - * @param file the file - * @param content the string to write - * @return the path of the saved file or null if failed - */ - public String write(File file, String content) { - if(file.exists()&&!file.canWrite()) { - JOptionPane.showMessageDialog(trackerPanel, - ControlsRes.getString("Dialog.ReadOnly.Message"), //$NON-NLS-1$ - ControlsRes.getString("Dialog.ReadOnly.Title"), //$NON-NLS-1$ - JOptionPane.PLAIN_MESSAGE); - return null; - } - try { - FileOutputStream stream = new FileOutputStream(file); - java.nio.charset.Charset charset = java.nio.charset.Charset.forName("UTF-8"); //$NON-NLS-1$ - Writer out = new BufferedWriter(new OutputStreamWriter(stream, charset)); - out.write(content); - out.flush(); - out.close(); - if(file.exists()) { - return XML.getAbsolutePath(file); - } - } catch(IOException ex) { - ex.printStackTrace(); - } - return null; - } - - /** - * Custom renderer to separator in dropdown list - */ - class SeparatorRenderer extends JLabel implements ListCellRenderer { - - ListCellRenderer renderer; - - SeparatorRenderer(ListCellRenderer renderer) { - this.renderer = renderer; - } - - public Component getListCellRendererComponent(JList list, Object value, int index, - boolean isSelected, boolean cellHasFocus) { - if (value instanceof JSeparator) - return (JSeparator)value; - return renderer.getListCellRendererComponent( - list, value, index, isSelected, cellHasFocus); - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.event.*; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.io.Writer; + +import javax.swing.*; +import javax.swing.border.*; + +import org.opensourcephysics.controls.ControlsRes; +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.display.DataTable; + +/** + * A dialog for exporting videos from a TrackerPanel. + * + * @author Douglas Brown + */ +public class ExportDataDialog extends JDialog { + + protected static ExportDataDialog dataExporter; // singleton + + // instance fields + protected TrackerPanel trackerPanel; + protected JButton saveAsButton, closeButton; + protected JComponent tablePanel, delimiterPanel, contentPanel, formatPanel; + protected JComboBox formatDropdown, delimiterDropdown, tableDropdown, contentDropdown; + protected HashMap tables; + protected HashMap trackNames; + protected boolean refreshing; + + /** + * Returns the singleton ExportDataDialog for a specified TrackerPanel. + * + * @param panel the TrackerPanel + * @return the ExportDataDialog + */ + public static ExportDataDialog getDialog(TrackerPanel panel) { + if (dataExporter==null) { + dataExporter = new ExportDataDialog(panel); + } + dataExporter.trackerPanel = panel; + dataExporter.refreshGUI(); + return dataExporter; + } + + /** + * Constructs a ExportDataDialog. + * + * @param panel a TrackerPanel to supply the images + */ + private ExportDataDialog(TrackerPanel panel) { + super(JOptionPane.getFrameForComponent(panel), true); + trackerPanel = panel; + setResizable(false); + createGUI(); + refreshGUI(); + // center dialog on the screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - getBounds().width) / 2; + int y = (dim.height - getBounds().height) / 2; + setLocation(x, y); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this dialog. + */ + private void createGUI() { + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + Box settingsPanel = Box.createVerticalBox(); + contentPane.add(settingsPanel, BorderLayout.CENTER); + JPanel upper = new JPanel(new GridLayout(1, 2)); + JPanel lower = new JPanel(new GridLayout(1, 2)); + + // table panel + tables = new HashMap(); + trackNames = new HashMap(); + tablePanel = Box.createVerticalBox(); + tableDropdown = new JComboBox(); + tablePanel.add(tableDropdown); + + // delimiter panel + delimiterPanel = new JPanel(new GridLayout(0, 1)); + delimiterDropdown = new JComboBox(); + delimiterPanel.add(delimiterDropdown); + delimiterDropdown.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (refreshing) return; + if (e.getStateChange()==ItemEvent.SELECTED) { + Object selected = delimiterDropdown.getSelectedItem(); + boolean isAdd = selected.equals( + TrackerRes.getString("ExportDataDialog.Delimiter.Add")); //$NON-NLS-1$ + boolean isRemove = selected.equals( + TrackerRes.getString("ExportDataDialog.Delimiter.Remove")); //$NON-NLS-1$ + String delimiter = TrackerIO.getDelimiter(); + if (isAdd) { + Object response = JOptionPane.showInputDialog(ExportDataDialog.this, + TrackerRes.getString("TableTrackView.Dialog.CustomDelimiter.Message"), //$NON-NLS-1$ + TrackerRes.getString("TableTrackView.Dialog.CustomDelimiter.Title"), //$NON-NLS-1$ + JOptionPane.PLAIN_MESSAGE, null, null, delimiter); + if (response!=null && !"".equals(response.toString())) { //$NON-NLS-1$ + String s = response.toString(); + TrackerIO.setDelimiter(s); + TrackerIO.addCustomDelimiter(s); + } + refreshGUI(); + } + else if (isRemove) { + String[] choices = TrackerIO.customDelimiters.values().toArray(new String[1]); + Object response = JOptionPane.showInputDialog(ExportDataDialog.this, + TrackerRes.getString("TableTrackView.Dialog.RemoveDelimiter.Message"), //$NON-NLS-1$ + TrackerRes.getString("TableTrackView.Dialog.RemoveDelimiter.Title"), //$NON-NLS-1$ + JOptionPane.PLAIN_MESSAGE, null, choices, null); + if (response!=null) { + String s = response.toString(); + TrackerIO.removeCustomDelimiter(s); + } + refreshGUI(); + } + else { + if (TrackerIO.delimiters.keySet().contains(selected)) + TrackerIO.setDelimiter(TrackerIO.delimiters.get(selected)); + else if (TrackerIO.customDelimiters.keySet().contains(selected)) + TrackerIO.setDelimiter(TrackerIO.customDelimiters.get(selected)); + } + } + } + }); + ListCellRenderer renderer = delimiterDropdown.getRenderer(); + delimiterDropdown.setRenderer(new SeparatorRenderer(renderer)); + + // content panel + contentPanel = new JPanel(new GridLayout(0, 1)); + contentDropdown = new JComboBox(); + contentPanel.add(contentDropdown); + + // format panel + formatPanel = new JPanel(new GridLayout(0, 1)); + formatDropdown = new JComboBox(); + formatPanel.add(formatDropdown); + + // assemble + settingsPanel.add(upper); + settingsPanel.add(lower); + upper.add(tablePanel); + upper.add(contentPanel); + lower.add(formatPanel); + lower.add(delimiterPanel); + + // buttons + saveAsButton = new JButton(); + saveAsButton.setForeground(new Color(0, 0, 102)); + saveAsButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = TrackerIO.getChooser(); + chooser.setAcceptAllFileFilterUsed(true); + chooser.setDialogTitle(TrackerRes.getString("ExportDataDialog.Chooser.SaveData.Title")); //$NON-NLS-1$ + chooser.setSelectedFile(new File("")); //$NON-NLS-1$ + File[] files = TrackerIO.getChooserFiles("save"); //$NON-NLS-1$ + if (files==null || files.length==0) + return; + DataTable table = tables.get(tableDropdown.getSelectedItem()); + boolean asFormatted = formatDropdown.getSelectedItem().equals( + TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ + boolean allCells = contentDropdown.getSelectedItem().equals( + TrackerRes.getString("ExportDataDialog.Content.AllCells")); //$NON-NLS-1$ + String trackName = trackNames.get(table)+XML.NEW_LINE; + trackName = trackName.replace(' ', '_'); + if (allCells) { + // get current selection state + int[] selectedRows = table.getSelectedRows(); + int[] selectedCols = table.getSelectedColumns(); + // select all + table.selectAll(); + // get data and write to output file + StringBuffer buf = TrackerIO.getData(table, asFormatted); + write(files[0], trackName+buf.toString()); + // restore previous selection state + table.clearSelection(); + for (int row: selectedRows) + table.addRowSelectionInterval(row, row); + for (int col: selectedCols) + table.addColumnSelectionInterval(col, col); + } + else { + // get data and write to output file + StringBuffer buf = TrackerIO.getData(table, asFormatted); + write(files[0], trackName+buf.toString()); + } + } + }); + closeButton = new JButton(); + closeButton.setForeground(new Color(0, 0, 102)); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + // buttonbar + JPanel buttonbar = new JPanel(); + contentPane.add(buttonbar, BorderLayout.SOUTH); + buttonbar.add(saveAsButton); + buttonbar.add(closeButton); + } + + /** + * Refreshes the visible components of this dialog. + */ + private void refreshGUI() { + refreshing = true; + // refresh strings + String title = TrackerRes.getString("ExportDataDialog.Title"); //$NON-NLS-1$ + setTitle(title); + title = TrackerRes.getString("ExportDataDialog.Subtitle.Table"); //$NON-NLS-1$ + Border space = BorderFactory.createEmptyBorder(0, 4, 6, 4); + Border titled = BorderFactory.createTitledBorder(title); + tablePanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + title = TrackerRes.getString("ExportDataDialog.Subtitle.Delimiter"); //$NON-NLS-1$ + titled = BorderFactory.createTitledBorder(title); + delimiterPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + title = TrackerRes.getString("ExportDataDialog.Subtitle.Content"); //$NON-NLS-1$ + titled = BorderFactory.createTitledBorder(title); + contentPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + title = TrackerRes.getString("ExportDataDialog.Subtitle.Format"); //$NON-NLS-1$ + titled = BorderFactory.createTitledBorder(title); + formatPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + saveAsButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + + // refresh dropdowns + // delimiters + Object selectedItem = null; + String delim = TrackerIO.getDelimiter(); + delimiterDropdown.removeAllItems(); + // standard delimiters + for (String key: TrackerIO.delimiters.keySet()) { + delimiterDropdown.addItem(key); + if (delim.equals(TrackerIO.delimiters.get(key))) + selectedItem = key; + } + // custom delimiters + boolean hasCustom = !TrackerIO.customDelimiters.isEmpty(); + if (hasCustom) { + delimiterDropdown.addItem(new JSeparator(JSeparator.HORIZONTAL)); + for (String key: TrackerIO.customDelimiters.keySet()) { + delimiterDropdown.addItem(key); + if (delim.equals(TrackerIO.customDelimiters.get(key))) + selectedItem = key; + } + } + // add and remove delimiter items + delimiterDropdown.addItem(new JSeparator(JSeparator.HORIZONTAL)); + String s = TrackerRes.getString("ExportDataDialog.Delimiter.Add"); //$NON-NLS-1$ + delimiterDropdown.addItem(s); + if (hasCustom) { + s = TrackerRes.getString("ExportDataDialog.Delimiter.Remove"); //$NON-NLS-1$ + delimiterDropdown.addItem(s); + } + delimiterDropdown.setSelectedItem(selectedItem); + + // tables + selectedItem = tableDropdown.getSelectedItem(); + tableDropdown.removeAllItems(); + Container[] c = trackerPanel.getTFrame().getViews(trackerPanel); + boolean hasSelection = false; + for (int i = 0; i < c.length; i++) { + if (trackerPanel.getTFrame().isViewOpen(i, trackerPanel)) { + String number = " ("+(i+1)+")"; //$NON-NLS-1$ //$NON-NLS-2$ + if (c[i] instanceof TViewChooser) { + TViewChooser chooser = (TViewChooser)c[i]; + TView tview = chooser.getSelectedView(); + if (tview instanceof TableTView) { + TableTView tableView = (TableTView)tview; + TTrack track = tableView.getSelectedTrack(); + if (track!=null) { + s = track.getName() + number; + TableTrackView trackView = (TableTrackView)tableView.getTrackView(track); + trackNames.put(trackView.dataTable, track.getName()); + tables.put(s, trackView.dataTable); + tableDropdown.addItem(s); + int[] selectedRows = trackView.dataTable.getSelectedRows(); + if (selectedRows.length > 0) { + hasSelection = true; + } + } + } + } + } + } + if (selectedItem!=null) + tableDropdown.setSelectedItem(selectedItem); + + // formats + selectedItem = formatDropdown.getSelectedItem(); + formatDropdown.removeAllItems(); + formatDropdown.addItem(TrackerRes.getString("TableTrackView.MenuItem.Unformatted")); //$NON-NLS-1$ + formatDropdown.addItem(TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ + if (selectedItem!=null) + formatDropdown.setSelectedItem(selectedItem); + + // content + contentDropdown.removeAllItems(); + contentDropdown.addItem(TrackerRes.getString("ExportDataDialog.Content.AllCells")); //$NON-NLS-1$ + if (hasSelection) { + s = TrackerRes.getString("ExportDataDialog.Content.SelectedCells"); //$NON-NLS-1$ + contentDropdown.insertItemAt(s, 0); + contentDropdown.setSelectedItem(s); + } + + pack(); + refreshing = false; + } + + /** + * Writes a string to a file. + * + * @param file the file + * @param content the string to write + * @return the path of the saved file or null if failed + */ + public String write(File file, String content) { + if(file.exists()&&!file.canWrite()) { + JOptionPane.showMessageDialog(trackerPanel, + ControlsRes.getString("Dialog.ReadOnly.Message"), //$NON-NLS-1$ + ControlsRes.getString("Dialog.ReadOnly.Title"), //$NON-NLS-1$ + JOptionPane.PLAIN_MESSAGE); + return null; + } + try { + FileOutputStream stream = new FileOutputStream(file); + java.nio.charset.Charset charset = java.nio.charset.Charset.forName("UTF-8"); //$NON-NLS-1$ + Writer out = new BufferedWriter(new OutputStreamWriter(stream, charset)); + out.write(content); + out.flush(); + out.close(); + if(file.exists()) { + return XML.getAbsolutePath(file); + } + } catch(IOException ex) { + ex.printStackTrace(); + } + return null; + } + + /** + * Custom renderer to separator in dropdown list + */ + class SeparatorRenderer extends JLabel implements ListCellRenderer { + + ListCellRenderer renderer; + + SeparatorRenderer(ListCellRenderer renderer) { + this.renderer = renderer; + } + + public Component getListCellRendererComponent(JList list, Object value, int index, + boolean isSelected, boolean cellHasFocus) { + if (value instanceof JSeparator) + return (JSeparator)value; + return renderer.getListCellRendererComponent( + list, value, index, isSelected, cellHasFocus); + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java index 95f64111..01bfafed 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java @@ -1,1746 +1,1746 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.font.FontRenderContext; -import java.awt.geom.Rectangle2D; -import java.awt.image.BufferedImage; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeEvent; -import java.io.File; -import java.io.FileWriter; -import java.net.MalformedURLException; -import java.net.URL; - -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.text.JTextComponent; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.controls.XMLControlElement; -import org.opensourcephysics.controls.XMLProperty; -import org.opensourcephysics.media.core.ImageCoordSystem; -import org.opensourcephysics.media.core.ImageVideo; -import org.opensourcephysics.media.core.ImageVideoType; -import org.opensourcephysics.media.core.Video; -import org.opensourcephysics.media.core.VideoClip; -import org.opensourcephysics.media.core.VideoIO; -import org.opensourcephysics.media.core.VideoPlayer; -import org.opensourcephysics.media.core.VideoType; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.tools.JarTool; -import org.opensourcephysics.tools.LaunchBuilder; -import org.opensourcephysics.tools.LibraryResource; -import org.opensourcephysics.tools.Resource; -import org.opensourcephysics.tools.ResourceLoader; - -/** - * A dialog for exporting Tracker ZIP files. Steps are: - * 1. create temp folder in target directory which will contain all files to be zipped - * 2. write or copy the video clip to a video subfolder - * 3. write or copy HTML pages, stylesheets and image files into html and image subfolders - * 4. write the converted Tracker data file in the temp folder - * 5. zip the temp folder - * 6. delete temp folder - * - * @author Douglas Brown - */ -public class ExportZipDialog extends JDialog { - - protected static final String DEFAULT_VIDEO_EXTENSION = "jpg"; //$NON-NLS-1$ - - protected static ExportZipDialog zipExporter; // singleton - protected static String videoSubdirectory = "videos"; //$NON-NLS-1$ - protected static String htmlSubdirectory = "html"; //$NON-NLS-1$ - protected static String imageSubdirectory = "images"; //$NON-NLS-1$ - protected static Color labelColor = new Color(0, 0, 102); - protected static String preferredExtension = DEFAULT_VIDEO_EXTENSION; - - // instance fields - protected ExportVideoDialog videoExporter; - protected TrackerPanel trackerPanel; - protected AddedFilesDialog addedFilesDialog; - protected Icon openIcon; - protected JPanel videoPanel, thumbnailPanel, centerPanel, imagePanel; - protected Box metadataBox; - protected TitledBorder videoBorder, thumbnailBorder, metadataBorder; - protected JButton saveButton, closeButton, addFilesButton, thumbnailButton, loadHTMLButton, helpButton; - protected JComboBox formatDropdown; - protected JLabel formatLabel, authorLabel, contactLabel, descriptionLabel, keywordsLabel; - protected JLabel thumbnailDisplay, urlLabel, titleLabel, htmlLabel; - protected JCheckBox clipCheckbox, showThumbnailCheckbox; - protected ArrayList labels = new ArrayList(); - protected EntryField authorField, contactField, keywordsField, urlField, titleField, htmlField; - protected String targetName, targetDirectory, targetVideo, targetExtension; - protected JTextArea filelistPane, descriptionPane; - protected VideoListener videoExportListener; - protected XMLControl control; - protected boolean addThumbnail=true; - protected ArrayList badModels; // particle models with start frames not included in clip - protected String videoIOPreferredExtension; - - /** - * Returns the singleton ZipResourceDialog ready to create a zip resource for a TrackerPanel. - * - * @param panel the TrackerPanel - * @return the ZipResourceDialog - */ - public static ExportZipDialog getDialog(TrackerPanel panel) { - boolean reset = false; - if (zipExporter==null) { - zipExporter = new ExportZipDialog(panel); - reset = true; - } - reset = reset || zipExporter.trackerPanel!=panel; - if (reset) { - zipExporter.trackerPanel = panel; - zipExporter.control = new XMLControlElement(panel); - zipExporter.videoExporter = ExportVideoDialog.getDialog(panel); - zipExporter.addThumbnail = true; - zipExporter.addedFilesDialog.addedFiles.clear(); - zipExporter.htmlField.setText(zipExporter.htmlField.getDefaultText()); - zipExporter.htmlField.setForeground(zipExporter.htmlField.getEmptyForeground()); - zipExporter.htmlField.setFont(zipExporter.htmlField.getEmptyFont()); - zipExporter.htmlField.setBackground(Color.white); - zipExporter.clipCheckbox.setSelected(panel.getVideo()!=null); - zipExporter.titleField.requestFocusInWindow(); - } - zipExporter.refreshFormatDropdown(); - zipExporter.refreshThumbnail(); - zipExporter.refreshGUI(); - - return zipExporter; - } - - /** - * Private constructor. - * - * @param panel a TrackerPanel - */ - private ExportZipDialog(TrackerPanel panel) { - super(panel.getTFrame(), false); - trackerPanel = panel; - videoExporter = ExportVideoDialog.getDialog(panel); -// setResizable(false); - createGUI(); - refreshGUI(); - // center dialog on the screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - getBounds().width) / 2; - int y = (dim.height - getBounds().height) / 2; - setLocation(x, y); - } - - /** - * Sets the font level. - * - * @param level the desired font level - */ - public void setFontLevel(int level) { - FontSizer.setFonts(this, level); - // refresh the dropdowns - int n = formatDropdown.getSelectedIndex(); - Object[] items = new Object[formatDropdown.getItemCount()]; - for (int i=0; i it = labels.iterator(); it.hasNext(); ) { - JLabel next = it.next(); - Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+1); - } - int h = titleField.getMinimumSize().height; - Dimension labelSize = new Dimension(w, h); - for(Iterator it = labels.iterator(); it.hasNext(); ) { - JLabel next = it.next(); - next.setPreferredSize(labelSize); - } - pack(); - - // set font level of addedFilesDialog - FontSizer.setFonts(addedFilesDialog, level); - addedFilesDialog.pack(); - } - - //_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this dialog. - */ - private void createGUI() { - String path = "/org/opensourcephysics/cabrillo/tracker/resources/images/open.gif"; //$NON-NLS-1$ - openIcon = new ImageIcon(this.getClass().getResource(path)); - Color color = UIManager.getColor("Label.disabledForeground"); //$NON-NLS-1$ - if (color!=null) UIManager.put("ComboBox.disabledForeground", color); //$NON-NLS-1$ - videoExportListener = new VideoListener(); - - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - - // video panel - videoPanel = new JPanel(); - clipCheckbox = new JCheckBox(); - clipCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - refreshGUI(); - } - }); - formatLabel = new JLabel(); - formatLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); - formatDropdown = new JComboBox(videoExporter.getFormats()); - - - videoPanel.add(clipCheckbox); - videoPanel.add(formatLabel); - videoPanel.add(formatDropdown); - - // button bar - JPanel buttonbar = new JPanel(); - helpButton = new JButton(); - helpButton.setForeground(new Color(0, 0, 102)); - helpButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trackerPanel.getTFrame().showHelp("zip", 0); //$NON-NLS-1$ - } - }); - addFilesButton = new JButton(); - addFilesButton.setForeground(labelColor); - addFilesButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // show added files dialog - addedFilesDialog.refreshGUI(); - addedFilesDialog.refreshFileList(); - addedFilesDialog.setVisible(true); - } - }); - saveButton = new JButton(); - saveButton.setForeground(labelColor); - saveButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // if saving clip, warn if there are particle models with start frames not included in clip - if (clipCheckbox.isSelected()) { - badModels = getModelsNotInClip(); - if (!badModels.isEmpty()) { - final TFrame frame = trackerPanel.getTFrame(); - // show names of bad models and offer to exclude them from export - String names = ""; //$NON-NLS-1$ - for (ParticleModel next: badModels) { - if (!"".equals(names)) { //$NON-NLS-1$ - names += ", "; //$NON-NLS-1$ - } - names += "'"+next.getName()+"'"; //$NON-NLS-1$ //$NON-NLS-2$ - } - int response = javax.swing.JOptionPane.showConfirmDialog( - frame, - TrackerRes.getString("ZipResourceDialog.BadModels.Message1") //$NON-NLS-1$ - +"\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Message2") //$NON-NLS-1$ //$NON-NLS-2$ - +"\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Message3") //$NON-NLS-1$ //$NON-NLS-2$ - +"\n\n"+names //$NON-NLS-1$ - +"\n\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Question"), //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("ZipResourceDialog.BadModels.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.YES_NO_CANCEL_OPTION, - javax.swing.JOptionPane.WARNING_MESSAGE); - if (response!=javax.swing.JOptionPane.YES_OPTION) { - return; - } - } - } - - ArrayList zipList = defineTarget(); - if (zipList==null) return; - setVisible(false); - // add thumbnail image - String thumbPath = addThumbnail(zipList); - // add HTML info file - addHTMLInfo(thumbPath, zipList); - // export video clip - if (clipCheckbox.isSelected()) { - VideoType format = ExportVideoDialog.formats.get(formatDropdown.getSelectedItem()); - videoExporter.setFormat(formatDropdown.getSelectedItem()); - // add videoExportListener to save zip file when video is finished - videoExportListener.setTargetList(zipList); - videoExportListener.setDialog(videoExporter); - videoExporter.addPropertyChangeListener("video_saved", videoExportListener); //$NON-NLS-1$ - videoExporter.addPropertyChangeListener("video_cancelled", videoExportListener); //$NON-NLS-1$ - String extension = format.getDefaultExtension(); - targetVideo = getVideoTarget(extension); - // save VideoIO preferred export format - videoIOPreferredExtension = VideoIO.getPreferredExportExtension(); - // render the video (also sets VideoIO preferred extension to this one) - videoExporter.exportFullSizeVideo(targetVideo); - } - else { // original or no video - Video vid = trackerPanel.getVideo(); - if (vid!=null && vid.getProperty("absolutePath")!=null) { //$NON-NLS-1$ - String originalPath = (String)vid.getProperty("absolutePath"); //$NON-NLS-1$ - // copy or extract original video to target directory - String vidDir = getTempDirectory()+videoSubdirectory; - targetVideo = vidDir+"/"+XML.getName(originalPath); //$NON-NLS-1$ - new File(vidDir).mkdirs(); - if (!copyOrExtractFile(originalPath, new File(targetVideo))) { - javax.swing.JOptionPane.showMessageDialog( - ExportZipDialog.this, - TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Message"), //$NON-NLS-1$ - TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.ERROR_MESSAGE); - return; - } - // if image video, then copy/extract additional image files - if (vid instanceof ImageVideo) { - ImageVideo imageVid = (ImageVideo)vid; - String[] paths = imageVid.getValidPaths(); - // first path is originalPath relative to base - int n = originalPath.indexOf(XML.getName(paths[0])); - if (n>0) { - String base = originalPath.substring(0, n); - for (String path: paths) { - String name = XML.getName(path); - path = base+name; - if (path.equals(originalPath)) continue; - File target = new File(vidDir+"/"+name); //$NON-NLS-1$ - if (!copyOrExtractFile(path, target)) { - javax.swing.JOptionPane.showMessageDialog( - ExportZipDialog.this, - TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Message"), //$NON-NLS-1$ - TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.ERROR_MESSAGE); - return; - } - } - } - } - } - // explicitly save zip here, since no videoExportListener to do it - saveZip(zipList); - } - } - }); - closeButton = new JButton(); - closeButton.setForeground(labelColor); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - buttonbar.add(helpButton); - buttonbar.add(addFilesButton); - buttonbar.add(saveButton); - buttonbar.add(closeButton); - - Border toolbarBorder = BorderFactory.createEmptyBorder(6, 4, 2, 4); - - // metadata - metadataBox = Box.createVerticalBox(); - - // HTML file - htmlLabel = new JLabel(); - htmlField = new EntryField(30) { - protected String getDefaultText() { - return TrackerRes.getString("ZipResourceDialog.HTMLField.DefaultText"); //$NON-NLS-1$ - } - protected Font getEmptyFont() { - return getFont().deriveFont(Font.ITALIC); - } - protected Font getDefaultFont() { - return getFont().deriveFont(Font.PLAIN); - } - - }; - htmlField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - htmlField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - refreshGUI(); - } - }); - loadHTMLButton = new JButton(openIcon); - loadHTMLButton.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 2)); - loadHTMLButton.setAlignmentY(JToolBar.TOP_ALIGNMENT); - loadHTMLButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = TrackerIO.getChooser(); - chooser.setAcceptAllFileFilterUsed(false); - chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.OpenHTML.Title")); //$NON-NLS-1$ - chooser.setFileFilter(LaunchBuilder.getHTMLFilter()); - File[] files = TrackerIO.getChooserFiles("open any"); //$NON-NLS-1$ - chooser.removeChoosableFileFilter(LaunchBuilder.getHTMLFilter()); - if (files==null) return; // cancelled by user - htmlField.setText(XML.getRelativePath(files[0].getPath())); - refreshFieldsFromHTML(files[0]); - refreshGUI(); - } - - }); - JToolBar htmlbar = new JToolBar(); - htmlbar.setBorder(toolbarBorder); - htmlbar.setFloatable(false); - htmlbar.setOpaque(false); - htmlbar.add(htmlLabel); - htmlbar.add(htmlField); - htmlbar.add(loadHTMLButton); - - // title - titleLabel = new JLabel(); - titleField = new EntryField(30); - titleField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - JToolBar titlebar = new JToolBar(); - titlebar.setBorder(toolbarBorder); - titlebar.setFloatable(false); - titlebar.setOpaque(false); - titlebar.add(titleLabel); - titlebar.add(titleField); - // description - descriptionLabel = new JLabel(); - descriptionPane = new JTextArea(); - descriptionPane.setLineWrap(true); - descriptionPane.setWrapStyleWord(true); - descriptionPane.getDocument().putProperty("parent", descriptionPane); //$NON-NLS-1$ - descriptionPane.getDocument().addDocumentListener(EntryField.documentListener); - descriptionPane.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - descriptionPane.setBackground(Color.white); - } - }); - JToolBar descriptionbar = new JToolBar(); - descriptionbar.setBorder(toolbarBorder); - descriptionbar.setFloatable(false); - descriptionbar.setOpaque(false); - descriptionbar.add(descriptionLabel); - JScrollPane scroller = new JScrollPane(descriptionPane) { - public Dimension getPreferredSize() { - int w = titleField.getPreferredSize().width; - return new Dimension(w, 60); - } - }; - scroller.setAlignmentY(JToolBar.TOP_ALIGNMENT); - descriptionbar.add(scroller); - // author - authorLabel = new JLabel(); - authorField = new EntryField(30); - authorField.setText(trackerPanel.author); - authorField.setBackground(Color.white); - authorField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - JToolBar authorbar = new JToolBar(); - authorbar.setBorder(toolbarBorder); - authorbar.setFloatable(false); - authorbar.setOpaque(false); - authorbar.add(authorLabel); - authorbar.add(authorField); - // contact - contactLabel = new JLabel(); - contactField = new EntryField(30); - contactField.setText(trackerPanel.contact); - contactField.setBackground(Color.white); - contactField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - JToolBar contactbar = new JToolBar(); - contactbar.setBorder(toolbarBorder); - contactbar.setFloatable(false); - contactbar.setOpaque(false); - contactbar.add(contactLabel); - contactbar.add(contactField); - // keywords - keywordsLabel = new JLabel(); - keywordsField = new EntryField(30); - keywordsField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - JToolBar keywordsbar = new JToolBar(); - keywordsbar.setBorder(toolbarBorder); - keywordsbar.setFloatable(false); - keywordsbar.setOpaque(false); - keywordsbar.add(keywordsLabel); - keywordsbar.add(keywordsField); - // URL - urlLabel = new JLabel(); - urlField = new EntryField(30); - urlField.setAlignmentY(JToolBar.TOP_ALIGNMENT); - urlField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - refreshGUI(); - } - }); - JToolBar urlbar = new JToolBar(); - urlbar.setBorder(toolbarBorder); - urlbar.setFloatable(false); - urlbar.setOpaque(false); - urlbar.add(urlLabel); - urlbar.add(urlField); - - metadataBox.add(htmlbar); - metadataBox.add(titlebar); - metadataBox.add(descriptionbar); - metadataBox.add(authorbar); - metadataBox.add(contactbar); - metadataBox.add(keywordsbar); - metadataBox.add(urlbar); - - // thumbnail panel - thumbnailDisplay = new JLabel(); - Border line = BorderFactory.createLineBorder(Color.black); - Border empty = BorderFactory.createEmptyBorder(0, 2, 0, 2); - thumbnailDisplay.setBorder(BorderFactory.createCompoundBorder(empty, line)); - thumbnailButton = new JButton(); - thumbnailButton.setForeground(labelColor); - thumbnailButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ThumbnailDialog.getDialog(trackerPanel, false).setVisible(true); - } - }); - showThumbnailCheckbox = new JCheckBox(); - showThumbnailCheckbox.setSelected(true); - showThumbnailCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (showThumbnailCheckbox.isSelected()) { - thumbnailPanel.add(imagePanel, BorderLayout.CENTER); - } - else { - thumbnailPanel.remove(imagePanel); - } - pack(); - repaint(); - } - }); - thumbnailPanel = new JPanel(new BorderLayout()); - imagePanel = new JPanel(); - imagePanel.add(thumbnailDisplay); - thumbnailPanel.add(imagePanel, BorderLayout.CENTER); - JPanel panel = new JPanel(); - panel.add(thumbnailButton); - panel.add(showThumbnailCheckbox); - thumbnailPanel.add(panel, BorderLayout.NORTH); - ThumbnailDialog dialog = ThumbnailDialog.getDialog(trackerPanel, false); - dialog.addPropertyChangeListener("accepted", new PropertyChangeListener() { //$NON-NLS-1$ - public void propertyChange(PropertyChangeEvent e) { - refreshThumbnail(); - } - }); - refreshThumbnail(); - - // assemble - centerPanel = new JPanel(new BorderLayout()); - centerPanel.add(videoPanel, BorderLayout.NORTH); - centerPanel.add(thumbnailPanel, BorderLayout.SOUTH); - contentPane.add(metadataBox, BorderLayout.NORTH); - contentPane.add(centerPanel, BorderLayout.CENTER); - contentPane.add(buttonbar, BorderLayout.SOUTH); - - labels.add(authorLabel); - labels.add(contactLabel); - labels.add(descriptionLabel); - labels.add(keywordsLabel); - labels.add(urlLabel); - labels.add(titleLabel); - labels.add(htmlLabel); - - videoBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ - videoPanel.setBorder(videoBorder); - videoBorder.setTitleColor(labelColor); - thumbnailBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ - thumbnailBorder.setTitleColor(labelColor); - thumbnailPanel.setBorder(thumbnailBorder); - metadataBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ - metadataBorder.setTitleColor(labelColor); - metadataBox.setBorder(metadataBorder); - - addedFilesDialog = new AddedFilesDialog(); - addedFilesDialog.setLocationRelativeTo(ExportZipDialog.this); - - } - - /** - * Refreshes the thumbnail image based on the current ThumbnailDialog settings. - */ - private void refreshThumbnail() { - ThumbnailDialog thumbnailDialog = ThumbnailDialog.getDialog(trackerPanel, false); - BufferedImage image = thumbnailDialog.getThumbnail(); - thumbnailDisplay.setIcon(new ImageIcon(image)); - pack(); - } - - /** - * Refreshes the visible components of this dialog. - */ - private void refreshGUI() { - // refresh strings - String title = TrackerRes.getString("ZipResourceDialog.Title"); //$NON-NLS-1$ - setTitle(title); - - // borders - metadataBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Documentation")); //$NON-NLS-1$ - videoBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Video")); //$NON-NLS-1$ - thumbnailBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Thumbnail")); //$NON-NLS-1$ - - // buttons - clipCheckbox.setText(TrackerRes.getString("ZipResourceDialog.Checkbox.TrimVideo")); //$NON-NLS-1$ - helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ - addFilesButton.setText(TrackerRes.getString("ZipResourceDialog.Button.AddFiles")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - saveButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ - closeButton.setText(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ - thumbnailButton.setText(TrackerRes.getString("ZipResourceDialog.Button.ThumbnailSettings")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - showThumbnailCheckbox.setText(TrackerRes.getString("ZipResourceDialog.Checkbox.PreviewThumbnail")); //$NON-NLS-1$ - - // labels - formatLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Format")+": "); //$NON-NLS-1$ //$NON-NLS-2$ - htmlLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.HTML")); //$NON-NLS-1$ - titleLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Title")); //$NON-NLS-1$ - descriptionLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Description")); //$NON-NLS-1$ - authorLabel.setText(TrackerRes.getString("PropertiesDialog.Label.Author")); //$NON-NLS-1$ - contactLabel.setText(TrackerRes.getString("PropertiesDialog.Label.Contact")); //$NON-NLS-1$ - keywordsLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Keywords")); //$NON-NLS-1$ - urlLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Link")); //$NON-NLS-1$ - - // tooltips - htmlLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.HTML")+": "); //$NON-NLS-1$ //$NON-NLS-2$ - htmlField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.HTML")+": "); //$NON-NLS-1$ //$NON-NLS-2$ - titleLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Title")); //$NON-NLS-1$ - titleField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Title")); //$NON-NLS-1$ - descriptionLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Description")); //$NON-NLS-1$ - descriptionPane.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Description")); //$NON-NLS-1$ - authorLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Author")); //$NON-NLS-1$ - authorField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Author")); //$NON-NLS-1$ - contactLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Contact")); //$NON-NLS-1$ - contactField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Contact")); //$NON-NLS-1$ - keywordsLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Keywords")); //$NON-NLS-1$ - keywordsField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Keywords")); //$NON-NLS-1$ - urlLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Link")); //$NON-NLS-1$ - urlField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Link")); //$NON-NLS-1$ - clipCheckbox.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.TrimVideo")); //$NON-NLS-1$ - addFilesButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.AddFiles")); //$NON-NLS-1$ - thumbnailButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.ThumbnailSettings")); //$NON-NLS-1$ - loadHTMLButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.LoadHTML")); //$NON-NLS-1$ - - // set label sizes - FontRenderContext frc = new FontRenderContext(null, false, false); - Font font = titleLabel.getFont(); - int w = 0; - for(Iterator it = labels.iterator(); it.hasNext(); ) { - JLabel next = it.next(); - Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+1); - } - int h = titleField.getMinimumSize().height; - Dimension labelSize = new Dimension(w, h); - for(Iterator it = labels.iterator(); it.hasNext(); ) { - JLabel next = it.next(); - next.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); - next.setPreferredSize(labelSize); - next.setHorizontalAlignment(SwingConstants.TRAILING); - next.setAlignmentY(Box.TOP_ALIGNMENT); - } - - // video panel - boolean hasVideo = trackerPanel.getVideo()!=null; - clipCheckbox.setEnabled(hasVideo); - if (!hasVideo) { - clipCheckbox.setSelected(false); - } - formatDropdown.setEnabled(clipCheckbox.isSelected()); - formatLabel.setEnabled(clipCheckbox.isSelected()); - - // set html field properties - String path = htmlField.getText().trim(); - Resource res = null; - if (!path.equals(htmlField.getDefaultText()) && !path.equals("")) { //$NON-NLS-1$ - res = ResourceLoader.getResource(path); - htmlField.setFont(htmlField.getDefaultFont()); - htmlField.setForeground(res==null? Color.red: EntryField.defaultForeground); - } - htmlField.setBackground(Color.white); - - // set url field properties - path = urlField.getText().trim(); - if (!path.equals("")) { //$NON-NLS-1$ - try { - new URL(path); // throws exception if malformed - urlField.setForeground(EntryField.defaultForeground); - } catch (MalformedURLException e) { - urlField.setForeground(Color.red); - } - } - - // enable/disable urlField and descriptionPane - urlField.setEnabled(res==null); - urlLabel.setEnabled(res==null); - descriptionPane.setEnabled(res==null); - descriptionLabel.setEnabled(res==null); - - pack(); - } - - /** - * Refreshes the format dropdown. - */ - private void refreshFormatDropdown() { - ExportVideoDialog.refreshFormats(); - videoExporter.refreshFormatDropdown(preferredExtension); - formatDropdown.removeAllItems(); - for (Object format: videoExporter.getFormats()) { - formatDropdown.addItem(format); - } - formatDropdown.setSelectedItem(videoExporter.getFormat()); - } - - /** - * Refreshes the text fields by reading the HTML code of a file. - * @param htmlFile the file to read - */ - private void refreshFieldsFromHTML(File htmlFile) { - String html = ResourceLoader.getString(htmlFile.getAbsolutePath()); - if (html==null) return; - String title = ResourceLoader.getTitleFromHTMLCode(html); - if (title!=null) { - titleField.setText(title); - titleField.setBackground(Color.white); - } - ArrayList metadata = getMetadataFromHTML(html); - for (int i=metadata.size()-1; i>=0; i--) { - // go backwards so if multiple authors, first one in the list is only one changed - String[] next = metadata.get(i); - String key = next[0]; - String value = next[1]; - if (LibraryResource.META_AUTHOR.toLowerCase().contains(key.toLowerCase())) { - authorField.setText(value); - authorField.setBackground(Color.white); - } - else if (LibraryResource.META_CONTACT.toLowerCase().contains(key.toLowerCase())) { - contactField.setText(value); - contactField.setBackground(Color.white); - } - else if (LibraryResource.META_KEYWORDS.toLowerCase().contains(key.toLowerCase())) { - keywordsField.setText(value); - keywordsField.setBackground(Color.white); - } - } - } - - /** - * Saves the zip resource. This adds the trk, video and other files to those - * already in the zip list, then zips the whole list. - * @param zipList the list of files to be zipped - */ - private void saveZip(ArrayList zipList) { - // add video file or directory if target video exists - File videoFile = null; - if (targetVideo!=null) { - videoFile = new File(targetVideo); - if (!"".equals(videoSubdirectory)) { //$NON-NLS-1$ - videoFile = videoFile.getParentFile(); - // delete XML file, if any, from video directory - File xmlFile = null; - for (File next: videoFile.listFiles()) { - if (next.getName().endsWith(".xml")) { //$NON-NLS-1$ - xmlFile = next; - break; - } - } - if (xmlFile!=null) xmlFile.delete(); - } - zipList.add(videoFile); - } - // get TrackerPanel XMLControl - XMLControl control = new XMLControlElement(trackerPanel); - // modify video path, clip settings of XMLControl - if (clipCheckbox.isSelected()) { - modifyControlForClip(control, targetVideo); - } - else if (trackerPanel.getVideo()!=null) { - XMLControl videoControl = control.getChildControl("videoclip").getChildControl("video"); //$NON-NLS-1$ //$NON-NLS-2$ - if (videoControl!=null) { - videoControl.setValue("path", XML.getPathRelativeTo(targetVideo, getTempDirectory())); //$NON-NLS-1$ - } - } - - // add local HTML files - ArrayList htmlPaths = getHTMLPaths(control); - if (!htmlPaths.isEmpty()) { - String xml = control.toXML(); - for (String next: htmlPaths) { - String path = copyAndAddHTMLPage(next, zipList); - if (path!=null) { - xml = substitutePathInText(xml, next, path, ">", "<"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - control = new XMLControlElement(xml); - } - // add added files - for (File file: addedFilesDialog.addedFiles) { - String next = file.getAbsolutePath(); - boolean isHTML = XML.getExtension(next).startsWith("htm"); //$NON-NLS-1$ - if (isHTML) { - copyAndAddHTMLPage(next, zipList); - } - else { - String dir = getTempDirectory(); - File targetFile = new File(dir, XML.getName(next)); - VideoIO.copyFile(file, targetFile); - zipList.add(targetFile); - } - } - - // add trk file - String trkPath = control.write(getTRKTarget()); - File trkFile = new File(trkPath); - zipList.add(0, trkFile); - - // define zip target and compress with JarTool - File target = new File(getZIPTarget()); - if (JarTool.compress(zipList, target, null)) { - // delete temp directory - File temp = new File(getTempDirectory()); - if (!ResourceLoader.deleteFile(temp)) { - // unable to delete directory - } - // offer to open the newly created zip file - openZip(target.getAbsolutePath()); - } - } - - /** - * Writes an HTML info file from scratch, using the current field text. - */ - private File writeHTMLInfo(String thumbPath, String redirectPath) { - File htmlTarget = new File(getHTMLDirectory()); - htmlTarget.mkdirs(); - htmlTarget = new File(htmlTarget, targetName+"_info.html"); //$NON-NLS-1$ - thumbPath = XML.getPathRelativeTo(thumbPath, getHTMLDirectory()); - String title = titleField.getText().trim(); - String description = descriptionPane.getText().trim(); - String author = authorField.getText().trim(); - String contact = contactField.getText().trim(); - String keywords = keywordsField.getText().trim(); - String uri = urlField.getText().trim(); - - Map metadata = new TreeMap(); - if (!"".equals(author)) metadata.put("author", author); //$NON-NLS-1$ //$NON-NLS-2$ - if (!"".equals(contact)) metadata.put("contact", contact); //$NON-NLS-1$ //$NON-NLS-2$ - if (!"".equals(keywords)) metadata.put("keywords", keywords); //$NON-NLS-1$ //$NON-NLS-2$ - - String htmlCode = LibraryResource.getHTMLCode(title, LibraryResource.TRACKER_TYPE, - thumbPath, description, author, contact, uri, null, metadata); - - // insert redirect comment immediately after tag - if (redirectPath!=null) { - String comment = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ - int n = htmlCode.indexOf(""); //$NON-NLS-1$ - htmlCode = htmlCode.substring(0, n+6)+comment+htmlCode.substring(n+6); - } - - return writeFile(htmlCode, htmlTarget); - } - - /** - * Writes a text file. - * - * @param text the text - * @param target the File to write - * @return the written File, or null if failed - */ - private File writeFile(String text, File target) { - try { - FileWriter fout = new FileWriter(target); - fout.write(text); - fout.close(); - return target; - } catch(Exception ex) {} - return null; - } - - /** - * Writes a thumbnail image to the temp directory and adds it to the zip list. - * @param zipList the list of files to be zipped - * @return the absolute path to the image, or null if failed - */ - private String addThumbnail(ArrayList zipList) { - // use ThumbnailDialog to write image to temp folder and add to zip list - ThumbnailDialog dialog = ThumbnailDialog.getDialog(trackerPanel, false); - String ext = dialog.getFormat(); - String thumbPath = getTempDirectory()+targetName+"_thumbnail."+ext; //$NON-NLS-1$ - File thumbnail = dialog.saveThumbnail(thumbPath); - if (thumbnail==null) return null; - zipList.add(thumbnail); - return thumbPath; - } - - /** - * Copies, downloads or extracts a file to a target. - * @param filePath the path - * @param targetFile the target file - * @return true if successful - */ - private boolean copyOrExtractFile(String filePath, File targetFile) { - String lowercase = filePath.toLowerCase(); - // if file is on server, download it - if (filePath.startsWith("http")) { //$NON-NLS-1$ - targetFile = ResourceLoader.download(filePath, targetFile, false); - } - // if file is in zip or jar, then extract it - else if (lowercase.contains("trz!") || lowercase.contains("jar!") || lowercase.contains("zip!")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - targetFile = JarTool.extract(filePath, targetFile); - } - // otherwise copy it - else VideoIO.copyFile(new File(filePath), targetFile); - return targetFile.exists(); - } - - - /** - * Adds an appropriate HTML info file to the temp directory and adds it to the zip list. - * This looks first for a file specified in the htmlField, then for a file with name "zipName_info.html", - * and failing that writes a file from scratch. - * @param thumbPath the path to the thumbnail image - * @param zipList the list of files to be zipped - * @return true if succeeds - */ - private boolean addHTMLInfo(String thumbPath, ArrayList zipList) { - // see if HTML info resource is defined in htmlField - Resource res = ResourceLoader.getResource(htmlField.getText().trim()); - if (res==null) { - // look for HTML info resource in target directory - File[] files = new File(targetDirectory).listFiles(); - boolean added = false; - for (File next: files) { - String name = XML.stripExtension(next.getName()); - String ext = XML.getExtension(next.getName()); - if ("html".equals(ext) || "htm".equals(ext)) { //$NON-NLS-1$ //$NON-NLS-2$ - if (name.equals(targetName) || name.equals(targetName+"_info")) { //$NON-NLS-1$ - // look first in added files - for (File file: addedFilesDialog.addedFiles) { - added = added || file.getName().equals(next.getName()); - } - if (!added) { - // offer to add HTML to zip - final TFrame frame = trackerPanel.getTFrame(); - int response = javax.swing.JOptionPane.showConfirmDialog( - frame, - TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Message1") //$NON-NLS-1$ - +" \""+next.getName()+"\"\n" //$NON-NLS-1$ //$NON-NLS-2$ - +TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Message2"), //$NON-NLS-1$ - TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.YES_NO_OPTION, - javax.swing.JOptionPane.QUESTION_MESSAGE); - if (response == javax.swing.JOptionPane.YES_OPTION) { - res = ResourceLoader.getResource(next.getAbsolutePath()); - } - } - } - } - } - } - - String redirect = null; // used below in writeHTMLInfo method - if (res!=null) { - if (res.getFile()!=null) { - // resource is a local file, so write temp target and add to zip list - String html = res.getString(); - if (html!=null && html.trim().startsWith(" newFrameNumbers = new TreeMap(); - - int newFrameNum = 0; - for (int i = 0; i=realClip.getEndFrameNumber()) break; - newFrameNum = Math.max(realClip.frameToStep(i), 0); - if (i>realClip.getStartFrameNumber() && !realClip.includesFrame(i)) - newFrameNum++; - newFrameNumbers.put(newFrameNum, i); - } - ImageCoordSystem.FrameData[] newKeyFrames = new ImageCoordSystem.FrameData[newFrameNum+1]; - for (Integer k: newFrameNumbers.keySet()) { - newKeyFrames[k] = coordKeyFrames[newFrameNumbers.get(k)]; - } - coordsControl.setValue("framedata", newKeyFrames); //$NON-NLS-1$ - - // tracks - // first remove bad models, if any - if (!badModels.isEmpty()) { - ArrayList tracks = ArrayList.class.cast(toModify.getObject("tracks")); //$NON-NLS-1$ - for (Iterator it = tracks.iterator(); it.hasNext();) { - TTrack track = (TTrack)it.next(); - if (badModels.contains(track)) { - it.remove(); - } - } - toModify.setValue("tracks", tracks); //$NON-NLS-1$ - } - // then modify frame references in track XMLcontrols - for (Object next: toModify.getPropertyContent()) { - if (next instanceof XMLProperty) { - XMLProperty prop = (XMLProperty)next; - if (prop.getPropertyName().equals("tracks")) { //$NON-NLS-1$ - for (Object obj: prop.getPropertyContent()) { - // every item is an XMLProperty - XMLProperty item = (XMLProperty)obj; - // the content of each item is the track control - XMLControl trackControl = (XMLControl)item.getPropertyContent().get(0); - Class trackType = trackControl.getObjectClass(); - if (PointMass.class.equals(trackType)) { - array = trackControl.getObject("framedata"); //$NON-NLS-1$ - PointMass.FrameData[] pointMassKeyFrames = (PointMass.FrameData[])array; - newFrameNumbers.clear(); - newFrameNum = 0; - for (int i = 0; i0) { - int newStartFrameNum = realClip.frameToStep(frameNum); - // start frame should round up - if (frameNum>realClip.getStartFrameNumber() && !realClip.includesFrame(frameNum)) - newStartFrameNum++; - trackControl.setValue("start_frame", newStartFrameNum); //$NON-NLS-1$ - } - frameNum = trackControl.getInt("end_frame"); //$NON-NLS-1$ - if (frameNum>0) { - int newEndFrameNum = realClip.frameToStep(frameNum); - // end frame should round down - trackControl.setValue("end_frame", newEndFrameNum); //$NON-NLS-1$ - } - } - - else if (Calibration.class.equals(trackType) || OffsetOrigin.class.equals(trackType)) { - array = trackControl.getObject("world_coordinates"); //$NON-NLS-1$ - double[][] calKeyFrames = (double[][])array; - newFrameNumbers.clear(); - newFrameNum = 0; - for (int i = 0; i getModelsNotInClip() { - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - ArrayList models = trackerPanel.getDrawables(ParticleModel.class); - for (Iterator it = models.iterator(); it.hasNext();) { - ParticleModel model = it.next(); - if (clip.includesFrame(model.getStartFrame())) { - it.remove(); - } - } - return models; - } - - - /** - * Returns a list of local HTML paths found in the specified XMLControl. - * - * @param control XMLControl for a TrackerPanel - * @return the list - */ - private ArrayList getHTMLPaths(XMLControl control) { - ArrayList pageViews = new ArrayList(); // html pages used in page views - // extract page view HTML paths - String xml = control.toXML(); - int j = xml.indexOf("PageTView$TabView"); //$NON-NLS-1$ - while (j>-1) { // page view exists - xml = xml.substring(j+17); - String s = ""; //$NON-NLS-1$ - j = xml.indexOf(s); - if (j>-1) { - xml = xml.substring(j+s.length()); - j = xml.indexOf(""); //$NON-NLS-1$ - String text = xml.substring(0, j); - Resource res = ResourceLoader.getResource(text); - if (res!=null && res.getFile()!=null) { // exclude web files - pageViews.add(text); - } - } - j = xml.indexOf("PageTView$TabView"); //$NON-NLS-1$ - } - return pageViews; - } - - /** - * Returns a list of local image paths found in the specified HTML document. - * - * @param html the HTML code - * @param basePath the absolute path to the parent directory of the HTML file - * @param pre a String that should precede image paths - * @param post a String that should follow image paths - * @return the list - */ - private ArrayList getImagePaths(String html, String basePath, String pre, String post) { - ArrayList images = new ArrayList(); - // extract image paths from html text - int j = html.indexOf(pre); - while (j>-1) { // image reference found - html = html.substring(j+pre.length()); - j = html.indexOf(post); - if (j>-1) { - String text = html.substring(0, j); // the image path specified in the html itself - String path = XML.getResolvedPath(text, basePath); - Resource res = ResourceLoader.getResource(path); - if (res!=null && res.getFile()!=null) { // exclude web files - images.add(text); - } - } - j = html.indexOf(pre); - } - return images; - } - - /** - * Copies an HTML file to the temp directory and adds the copy to the target list. - * @param htmlPath the path to the original HTML file - * @param zipList the list of files to be zipped - * @return the relative path to the copy, or null if failed - */ - private String copyAndAddHTMLPage(String htmlPath, ArrayList zipList) { - // read html text - String html = null; - Resource res = ResourceLoader.getResource(htmlPath); - if (res!=null) { - html = res.getString(); - } - if (html!=null) { - String htmlBasePath = XML.getDirectoryPath(htmlPath); - // get target directory - File htmlTarget = new File(getHTMLDirectory()); - htmlTarget.mkdirs(); - // add image files - String pre = " imagePaths = getImagePaths(html, htmlBasePath, pre, post); - if (!imagePaths.isEmpty()) { - // copy images into target directory and modify html text - File imageDir = new File(getImageDirectory()); - imageDir.mkdirs(); - for (String next: imagePaths) { - String path = XML.getResolvedPath(next, htmlBasePath); - res = ResourceLoader.getResource(path); - // copy image and determine its path relative to target - File imageTarget = new File(imageDir, XML.getName(next)); - if (res.getFile()!=null) { - VideoIO.copyFile(res.getFile(), imageTarget); - } - path = XML.getPathRelativeTo(imageTarget.getAbsolutePath(), getHTMLDirectory()); - html = substitutePathInText(html, next, path, pre, post); - } - if (!zipList.contains(imageDir)) - zipList.add(imageDir); - } - - // if local stylesheet is found, copy it - String css = ResourceLoader.getStyleSheetFromHTMLCode(html); - if (css!=null && !css.startsWith("http:")) { //$NON-NLS-1$ - res = ResourceLoader.getResource(XML.getResolvedPath(css, htmlBasePath)); - if (res!=null) { - // copy css file into HTMLTarget directory - String cssName = XML.getName(css); - File cssTarget = new File(htmlTarget, XML.getName(cssName)); - VideoIO.copyFile(res.getFile(), cssTarget); - // substitute cssName in html - html = substitutePathInText(html, css, cssName, "\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - // write modified html text into target file - htmlTarget = new File(htmlTarget, XML.getName(htmlPath)); - try { - FileWriter fout = new FileWriter(htmlTarget); - fout.write(html); - fout.close(); - String relPath = XML.getPathRelativeTo(htmlTarget.getAbsolutePath(), getTempDirectory()); - if (!"".equals(htmlSubdirectory)) { //$NON-NLS-1$ - htmlTarget = htmlTarget.getParentFile(); - } - - if (!zipList.contains(htmlTarget)) - zipList.add(htmlTarget); - return relPath; - } catch(Exception exc) { - exc.printStackTrace(); - } - } - return null; - } - - /** - * Substitutes one path string for another in a body of text so long as the path is - * preceded by the "pre" string and followed by the "post" string. - * - * @param text the body of text - * @param prevPath the path to replace - * @param newPath the new path - * @param pre a String that precedes the path - * @param post a String that follows the path - * @return the modified text - */ - private String substitutePathInText(String text, String prevPath, String newPath, String pre, String post) { - if (prevPath.equals(newPath)) return text; - int i = text.indexOf(pre+prevPath+post); - while (i>0) { - text = text.substring(0, i+pre.length())+newPath+text.substring(i+pre.length()+prevPath.length()); - i = text.indexOf(pre+prevPath+post); - } - return text; - } - - /** - * Offers to open a newly saved zip file. - * - * @param path the path to the zip file - */ - private void openZip(String path) { - final TFrame frame = trackerPanel.getTFrame(); - int response = javax.swing.JOptionPane.showConfirmDialog( - frame, - TrackerRes.getString("ZipResourceDialog.Complete.Message1") //$NON-NLS-1$ - +" \""+XML.getName(path)+"\".\n" //$NON-NLS-1$ //$NON-NLS-2$ - +TrackerRes.getString("ZipResourceDialog.Complete.Message2"), //$NON-NLS-1$ - TrackerRes.getString("ZipResourceDialog.Complete.Title"), //$NON-NLS-1$ - javax.swing.JOptionPane.YES_NO_OPTION, - javax.swing.JOptionPane.QUESTION_MESSAGE); - if (response == javax.swing.JOptionPane.YES_OPTION) { - frame.loadedFiles.remove(path); - final File file = new File(path); - Runnable runner = new Runnable() { - public void run() { - TrackerIO.open(file, frame); - } - }; - SwingUtilities.invokeLater(runner); - } - - } - - /** - * Uses a file chooser to define a new target name and directory. - * - * @return empty List to fill with files to be zipped - */ - protected ArrayList defineTarget() { - // show file chooser to get directory and zip name - JFileChooser chooser = TrackerIO.getChooser(); - chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.SaveZip.Title")); //$NON-NLS-1$ - chooser.setAcceptAllFileFilterUsed(false); -// chooser.addChoosableFileFilter(TrackerIO.zipFileFilter); - chooser.setFileFilter(TrackerIO.trzFileFilter); - File[] files = TrackerIO.getChooserFiles("save"); //$NON-NLS-1$ - chooser.resetChoosableFileFilters(); - if (files==null) return null; // cancelled by user -// targetExtension = chooser.getFileFilter()==TrackerIO.zipFileFilter? "zip": "trz"; //$NON-NLS-1$ //$NON-NLS-2$ - - // define target filename and check for reserved characters, including spaces - targetName = XML.stripExtension(files[0].getName()); - String[] reserved = new String[] { - "/","\\","?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "<",">","\"", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "|",":","*","%"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - for (String next: reserved) { - if (targetName.indexOf(next)>-1) { - TFrame frame = trackerPanel.getTFrame(); - String list = ""; //$NON-NLS-1$ - for (int i = 1; i(); - } - - private String getTRKTarget() { - return getTempDirectory()+targetName+".trk"; //$NON-NLS-1$ - } - - private String getVideoTarget(String extension) { - String vidDir = getTempDirectory()+videoSubdirectory; - new File(vidDir).mkdirs(); - return vidDir+"/"+targetName+"."+extension; //$NON-NLS-1$ //$NON-NLS-2$ - } - - private String getZIPTarget() { - return targetDirectory+targetName+"."+targetExtension; //$NON-NLS-1$ - } - - private String getHTMLDirectory() { - return getTempDirectory()+htmlSubdirectory+"/"; //$NON-NLS-1$ - } - - private String getImageDirectory() { - return getTempDirectory()+imageSubdirectory+"/"; //$NON-NLS-1$ - } - - private String getTempDirectory() { - return targetDirectory+targetName+"_temp/"; //$NON-NLS-1$ - } - - protected class VideoListener implements PropertyChangeListener { - - ArrayList target; - ExportVideoDialog dialog; - - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("video_saved") && target!=null) { //$NON-NLS-1$ - // event's new value is saved file name (differ from original target name for image videos) - targetVideo = e.getNewValue().toString(); - // save video extension - preferredExtension = XML.getExtension(targetVideo); - // restore VideoIO preferred extension - VideoIO.setPreferredExportExtension(videoIOPreferredExtension); - - saveZip(target); - } - // clean up ExportVideoDialog - if (dialog!=null) { - dialog.removePropertyChangeListener("video_saved", videoExportListener); //$NON-NLS-1$ - dialog.removePropertyChangeListener("video_cancelled", videoExportListener); //$NON-NLS-1$ - } - } - void setTargetList(ArrayList list) { - target = list; - } - void setDialog(ExportVideoDialog evd) { - dialog = evd; - } - } - - protected class AddedFilesDialog extends JDialog { - - HashSet addedFiles = new HashSet(); - TreeSet fileNames = new TreeSet(); - JButton okButton, addButton, removeButton; - JList fileList; - DefaultListModel fileListModel; - - AddedFilesDialog() { - super(ExportZipDialog.this, true); - createGUI(); - } - - void createGUI() { - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - - // file list - fileListModel = new DefaultListModel(); - fileList = new JList(fileListModel); - fileList.addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - removeButton.setEnabled(fileList.getSelectedValue()!=null); - } - }); - JScrollPane scroller = new JScrollPane(fileList); - scroller.setPreferredSize(new Dimension(300, 150)); - contentPane.add(scroller, BorderLayout.CENTER); - - // button bar - JPanel buttonbar = new JPanel(); - addButton = new JButton(); - addButton.setForeground(labelColor); - addButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // show file chooser to add PDF and HTML files - JFileChooser chooser = TrackerIO.getChooser(); - chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.AddFile.Title")); //$NON-NLS-1$ - chooser.addChoosableFileFilter(LaunchBuilder.getPDFFilter()); - chooser.setFileFilter(LaunchBuilder.getHTMLFilter()); - File[] files = TrackerIO.getChooserFiles("open any"); //$NON-NLS-1$ - chooser.removeChoosableFileFilter(LaunchBuilder.getHTMLFilter()); - chooser.removeChoosableFileFilter(LaunchBuilder.getPDFFilter()); - if (files==null) return; // cancelled by user - addedFiles.add(files[0]); - refreshFileList(); - } - }); - removeButton = new JButton(); - removeButton.setForeground(labelColor); - removeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - String name = (String)fileList.getSelectedValue(); - if (name!=null) { - for (Iterator it = addedFiles.iterator(); it.hasNext();) { - File next = it.next(); - if (name.equals(next.getName())) { - it.remove(); - break; - } - } - refreshFileList(); - } - } - }); - okButton = new JButton(); - okButton.setForeground(labelColor); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - buttonbar.add(addButton); - buttonbar.add(removeButton); - buttonbar.add(okButton); - contentPane.add(buttonbar, BorderLayout.SOUTH); - - pack(); - } - - void refreshGUI() { - setTitle(TrackerRes.getString("ZipResourceDialog.Dialog.AddFiles.Title")); //$NON-NLS-1$ - okButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - addButton.setText(TrackerRes.getString("Dialog.Button.Add")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - removeButton.setText(TrackerRes.getString("Dialog.Button.Remove")); //$NON-NLS-1$ - removeButton.setEnabled(fileList.getSelectedValue()!=null); - } - - /** - * Refreshes the file list. - */ - void refreshFileList() { - fileListModel.clear(); - fileNames.clear(); - for (File next: addedFiles) { - fileNames.add(next.getName()); - } - for (String next: fileNames) { - fileListModel.addElement(next); - } - } - - } - - /** - * Returns the metadata, if any, defined in HTML code - * @param htmlCode the HTML code - * @return a Map containing metadata names to values found in the code - */ - public static ArrayList getMetadataFromHTML(String htmlCode) { - ArrayList results = new ArrayList(); - if (htmlCode==null) return results; - String[] parts = htmlCode.split(""); //$NON-NLS-1$ - if (n>-1) { - parts[i] = parts[i].substring(0, n); - String divider = "\" content=\""; //$NON-NLS-1$ - String[] subparts = parts[i].split(divider); - if (subparts.length>1) { - String name = subparts[0]; - String value = subparts[1]; - results.add(new String[] {name, value}); - } - } - } - return results; - } - - /** - * Replaces metadata in HTML code based on current text in metadata fields - * and writes the result to a temporary file that is added to the jar, then deleted. - * @param htmlCode the HTML code - * @param res the (local File) Resource that is the source of the html code - * @return the modified code - */ - private File writeTempHTMLTarget(String htmlCode, Resource res) { - if (res.getFile()==null) return null; - String title = ResourceLoader.getTitleFromHTMLCode(htmlCode); - String newTitle = titleField.getText().trim(); - if (!"".equals(newTitle) && !newTitle.equals(title)) { //$NON-NLS-1$ - title = ""+title+""; //$NON-NLS-1$ //$NON-NLS-2$ - newTitle = ""+newTitle+""; //$NON-NLS-1$ //$NON-NLS-2$ - htmlCode = htmlCode.replace(title, newTitle); - } - ArrayList metadata = getMetadataFromHTML(htmlCode); - for (String type: LibraryResource.META_TYPES) { - String newValue = type.equals(LibraryResource.META_AUTHOR)? authorField.getText().trim(): - type.equals(LibraryResource.META_CONTACT)? contactField.getText().trim(): - type.equals(LibraryResource.META_KEYWORDS)? keywordsField.getText().trim(): null; - String prevValue = null; - String key = null; - boolean found = false; - for (String[] next: metadata) { - if (found) break; - key = next[0]; - if (type.toLowerCase().contains(key.toLowerCase())) { - found = true; - prevValue = next[1]; - } - } - if (!found) key = type.toLowerCase(); - htmlCode = replaceMetadataInHTML(htmlCode, key, prevValue, newValue); - } - File htmlTarget = res.getFile().getParentFile(); - htmlTarget = new File(htmlTarget, targetName+"_info.html"); //$NON-NLS-1$ - htmlTarget = writeFile(htmlCode, htmlTarget); - return htmlTarget; - } - - /** - * Replaces metadata in HTML code based on current text in metadata fields. - * @param htmlCode the HTML code - * @return the modified code - */ - private String replaceMetadataInHTML(String htmlCode, String name, String prevValue, String newValue) { - if (newValue==null || newValue.trim().equals("")) //$NON-NLS-1$ - return htmlCode; - if (prevValue==null) { - // write new line - int n = htmlCode.indexOf("-1) { - String newCode = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - htmlCode = htmlCode.substring(0, n)+newCode+htmlCode.substring(n, htmlCode.length()); - } - } - else if (!"".equals(newValue) && !newValue.equals(prevValue)) { //$NON-NLS-1$ - prevValue = "meta name=\""+name+"\" content=\""+prevValue+"\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - newValue = "meta name=\""+name+"\" content=\""+newValue+"\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - htmlCode = htmlCode.replace(prevValue, newValue); - } - return htmlCode; - } - - /** - * A JTextField for editing ZipResourceDialog fields. - */ - protected static class EntryField extends JTextField { - - static Color defaultForeground = new JTextField().getForeground(); - - EntryField() { - getDocument().putProperty("parent", this); //$NON-NLS-1$ - addFocusListener(focusListener); - addActionListener(actionListener); - getDocument().addDocumentListener(documentListener); - } - - EntryField(int width) { - super(width); - getDocument().putProperty("parent", this); //$NON-NLS-1$ - addFocusListener(focusListener); - addActionListener(actionListener); - getDocument().addDocumentListener(documentListener); - } - - protected String getDefaultText() { - return null; - } - - protected Font getEmptyFont() { - return getFont(); - } - - protected Font getDefaultFont() { - return getFont(); - } - - protected Color getEmptyForeground() { - return Color.gray; - } - - static DocumentListener documentListener = new DocumentListener() { - public void insertUpdate(DocumentEvent e) { - JTextComponent field = (JTextComponent)e.getDocument().getProperty("parent"); //$NON-NLS-1$ - field.setBackground(Color.yellow); - } - public void removeUpdate(DocumentEvent e) { - JTextComponent field = (JTextComponent)e.getDocument().getProperty("parent"); //$NON-NLS-1$ - field.setBackground(Color.yellow); - } - public void changedUpdate(DocumentEvent e) {} - }; - - static FocusListener focusListener = new FocusAdapter() { - public void focusGained(FocusEvent e) { - EntryField field = (EntryField)e.getSource(); - if (field.getDefaultText()!=null && field.getText().equals(field.getDefaultText())) { - field.setText(null); - field.setFont(field.getDefaultFont()); - field.setForeground(defaultForeground); - } - field.selectAll(); - field.setBackground(Color.white); - } - public void focusLost(FocusEvent e) { - EntryField field = (EntryField)e.getSource(); - boolean fire = field.getBackground()==Color.yellow; - if (field.getDefaultText()!=null && "".equals(field.getText())) { //$NON-NLS-1$ - field.setText(field.getDefaultText()); - field.setForeground(field.getEmptyForeground()); - field.setFont(field.getEmptyFont()); - } - field.setBackground(Color.white); - if (fire) field.fireActionPerformed(); - } - }; - - static ActionListener actionListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - EntryField field = (EntryField)e.getSource(); - field.setBackground(Color.white); - } - }; - - } - - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeEvent; +import java.io.File; +import java.io.FileWriter; +import java.net.MalformedURLException; +import java.net.URL; + +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.text.JTextComponent; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLControlElement; +import org.opensourcephysics.controls.XMLProperty; +import org.opensourcephysics.media.core.ImageCoordSystem; +import org.opensourcephysics.media.core.ImageVideo; +import org.opensourcephysics.media.core.ImageVideoType; +import org.opensourcephysics.media.core.Video; +import org.opensourcephysics.media.core.VideoClip; +import org.opensourcephysics.media.core.VideoIO; +import org.opensourcephysics.media.core.VideoPlayer; +import org.opensourcephysics.media.core.VideoType; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.tools.JarTool; +import org.opensourcephysics.tools.LaunchBuilder; +import org.opensourcephysics.tools.LibraryResource; +import org.opensourcephysics.tools.Resource; +import org.opensourcephysics.tools.ResourceLoader; + +/** + * A dialog for exporting Tracker ZIP files. Steps are: + * 1. create temp folder in target directory which will contain all files to be zipped + * 2. write or copy the video clip to a video subfolder + * 3. write or copy HTML pages, stylesheets and image files into html and image subfolders + * 4. write the converted Tracker data file in the temp folder + * 5. zip the temp folder + * 6. delete temp folder + * + * @author Douglas Brown + */ +public class ExportZipDialog extends JDialog { + + protected static final String DEFAULT_VIDEO_EXTENSION = "jpg"; //$NON-NLS-1$ + + protected static ExportZipDialog zipExporter; // singleton + protected static String videoSubdirectory = "videos"; //$NON-NLS-1$ + protected static String htmlSubdirectory = "html"; //$NON-NLS-1$ + protected static String imageSubdirectory = "images"; //$NON-NLS-1$ + protected static Color labelColor = new Color(0, 0, 102); + protected static String preferredExtension = DEFAULT_VIDEO_EXTENSION; + + // instance fields + protected ExportVideoDialog videoExporter; + protected TrackerPanel trackerPanel; + protected AddedFilesDialog addedFilesDialog; + protected Icon openIcon; + protected JPanel videoPanel, thumbnailPanel, centerPanel, imagePanel; + protected Box metadataBox; + protected TitledBorder videoBorder, thumbnailBorder, metadataBorder; + protected JButton saveButton, closeButton, addFilesButton, thumbnailButton, loadHTMLButton, helpButton; + protected JComboBox formatDropdown; + protected JLabel formatLabel, authorLabel, contactLabel, descriptionLabel, keywordsLabel; + protected JLabel thumbnailDisplay, urlLabel, titleLabel, htmlLabel; + protected JCheckBox clipCheckbox, showThumbnailCheckbox; + protected ArrayList labels = new ArrayList(); + protected EntryField authorField, contactField, keywordsField, urlField, titleField, htmlField; + protected String targetName, targetDirectory, targetVideo, targetExtension; + protected JTextArea filelistPane, descriptionPane; + protected VideoListener videoExportListener; + protected XMLControl control; + protected boolean addThumbnail=true; + protected ArrayList badModels; // particle models with start frames not included in clip + protected String videoIOPreferredExtension; + + /** + * Returns the singleton ZipResourceDialog ready to create a zip resource for a TrackerPanel. + * + * @param panel the TrackerPanel + * @return the ZipResourceDialog + */ + public static ExportZipDialog getDialog(TrackerPanel panel) { + boolean reset = false; + if (zipExporter==null) { + zipExporter = new ExportZipDialog(panel); + reset = true; + } + reset = reset || zipExporter.trackerPanel!=panel; + if (reset) { + zipExporter.trackerPanel = panel; + zipExporter.control = new XMLControlElement(panel); + zipExporter.videoExporter = ExportVideoDialog.getDialog(panel); + zipExporter.addThumbnail = true; + zipExporter.addedFilesDialog.addedFiles.clear(); + zipExporter.htmlField.setText(zipExporter.htmlField.getDefaultText()); + zipExporter.htmlField.setForeground(zipExporter.htmlField.getEmptyForeground()); + zipExporter.htmlField.setFont(zipExporter.htmlField.getEmptyFont()); + zipExporter.htmlField.setBackground(Color.white); + zipExporter.clipCheckbox.setSelected(panel.getVideo()!=null); + zipExporter.titleField.requestFocusInWindow(); + } + zipExporter.refreshFormatDropdown(); + zipExporter.refreshThumbnail(); + zipExporter.refreshGUI(); + + return zipExporter; + } + + /** + * Private constructor. + * + * @param panel a TrackerPanel + */ + private ExportZipDialog(TrackerPanel panel) { + super(panel.getTFrame(), false); + trackerPanel = panel; + videoExporter = ExportVideoDialog.getDialog(panel); +// setResizable(false); + createGUI(); + refreshGUI(); + // center dialog on the screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - getBounds().width) / 2; + int y = (dim.height - getBounds().height) / 2; + setLocation(x, y); + } + + /** + * Sets the font level. + * + * @param level the desired font level + */ + public void setFontLevel(int level) { + FontSizer.setFonts(this, level); + // refresh the dropdowns + int n = formatDropdown.getSelectedIndex(); + Object[] items = new Object[formatDropdown.getItemCount()]; + for (int i=0; i it = labels.iterator(); it.hasNext(); ) { + JLabel next = it.next(); + Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+1); + } + int h = titleField.getMinimumSize().height; + Dimension labelSize = new Dimension(w, h); + for(Iterator it = labels.iterator(); it.hasNext(); ) { + JLabel next = it.next(); + next.setPreferredSize(labelSize); + } + pack(); + + // set font level of addedFilesDialog + FontSizer.setFonts(addedFilesDialog, level); + addedFilesDialog.pack(); + } + + //_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this dialog. + */ + private void createGUI() { + String path = "/org/opensourcephysics/cabrillo/tracker/resources/images/open.gif"; //$NON-NLS-1$ + openIcon = new ImageIcon(this.getClass().getResource(path)); + Color color = UIManager.getColor("Label.disabledForeground"); //$NON-NLS-1$ + if (color!=null) UIManager.put("ComboBox.disabledForeground", color); //$NON-NLS-1$ + videoExportListener = new VideoListener(); + + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + // video panel + videoPanel = new JPanel(); + clipCheckbox = new JCheckBox(); + clipCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshGUI(); + } + }); + formatLabel = new JLabel(); + formatLabel.setBorder(BorderFactory.createEmptyBorder(0, 12, 0, 0)); + formatDropdown = new JComboBox(videoExporter.getFormats()); + + + videoPanel.add(clipCheckbox); + videoPanel.add(formatLabel); + videoPanel.add(formatDropdown); + + // button bar + JPanel buttonbar = new JPanel(); + helpButton = new JButton(); + helpButton.setForeground(new Color(0, 0, 102)); + helpButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trackerPanel.getTFrame().showHelp("zip", 0); //$NON-NLS-1$ + } + }); + addFilesButton = new JButton(); + addFilesButton.setForeground(labelColor); + addFilesButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // show added files dialog + addedFilesDialog.refreshGUI(); + addedFilesDialog.refreshFileList(); + addedFilesDialog.setVisible(true); + } + }); + saveButton = new JButton(); + saveButton.setForeground(labelColor); + saveButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // if saving clip, warn if there are particle models with start frames not included in clip + if (clipCheckbox.isSelected()) { + badModels = getModelsNotInClip(); + if (!badModels.isEmpty()) { + final TFrame frame = trackerPanel.getTFrame(); + // show names of bad models and offer to exclude them from export + String names = ""; //$NON-NLS-1$ + for (ParticleModel next: badModels) { + if (!"".equals(names)) { //$NON-NLS-1$ + names += ", "; //$NON-NLS-1$ + } + names += "'"+next.getName()+"'"; //$NON-NLS-1$ //$NON-NLS-2$ + } + int response = javax.swing.JOptionPane.showConfirmDialog( + frame, + TrackerRes.getString("ZipResourceDialog.BadModels.Message1") //$NON-NLS-1$ + +"\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Message2") //$NON-NLS-1$ //$NON-NLS-2$ + +"\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Message3") //$NON-NLS-1$ //$NON-NLS-2$ + +"\n\n"+names //$NON-NLS-1$ + +"\n\n"+TrackerRes.getString("ZipResourceDialog.BadModels.Question"), //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("ZipResourceDialog.BadModels.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.YES_NO_CANCEL_OPTION, + javax.swing.JOptionPane.WARNING_MESSAGE); + if (response!=javax.swing.JOptionPane.YES_OPTION) { + return; + } + } + } + + ArrayList zipList = defineTarget(); + if (zipList==null) return; + setVisible(false); + // add thumbnail image + String thumbPath = addThumbnail(zipList); + // add HTML info file + addHTMLInfo(thumbPath, zipList); + // export video clip + if (clipCheckbox.isSelected()) { + VideoType format = ExportVideoDialog.formats.get(formatDropdown.getSelectedItem()); + videoExporter.setFormat(formatDropdown.getSelectedItem()); + // add videoExportListener to save zip file when video is finished + videoExportListener.setTargetList(zipList); + videoExportListener.setDialog(videoExporter); + videoExporter.addPropertyChangeListener("video_saved", videoExportListener); //$NON-NLS-1$ + videoExporter.addPropertyChangeListener("video_cancelled", videoExportListener); //$NON-NLS-1$ + String extension = format.getDefaultExtension(); + targetVideo = getVideoTarget(extension); + // save VideoIO preferred export format + videoIOPreferredExtension = VideoIO.getPreferredExportExtension(); + // render the video (also sets VideoIO preferred extension to this one) + videoExporter.exportFullSizeVideo(targetVideo); + } + else { // original or no video + Video vid = trackerPanel.getVideo(); + if (vid!=null && vid.getProperty("absolutePath")!=null) { //$NON-NLS-1$ + String originalPath = (String)vid.getProperty("absolutePath"); //$NON-NLS-1$ + // copy or extract original video to target directory + String vidDir = getTempDirectory()+videoSubdirectory; + targetVideo = vidDir+"/"+XML.getName(originalPath); //$NON-NLS-1$ + new File(vidDir).mkdirs(); + if (!copyOrExtractFile(originalPath, new File(targetVideo))) { + javax.swing.JOptionPane.showMessageDialog( + ExportZipDialog.this, + TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Message"), //$NON-NLS-1$ + TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.ERROR_MESSAGE); + return; + } + // if image video, then copy/extract additional image files + if (vid instanceof ImageVideo) { + ImageVideo imageVid = (ImageVideo)vid; + String[] paths = imageVid.getValidPaths(); + // first path is originalPath relative to base + int n = originalPath.indexOf(XML.getName(paths[0])); + if (n>0) { + String base = originalPath.substring(0, n); + for (String path: paths) { + String name = XML.getName(path); + path = base+name; + if (path.equals(originalPath)) continue; + File target = new File(vidDir+"/"+name); //$NON-NLS-1$ + if (!copyOrExtractFile(path, target)) { + javax.swing.JOptionPane.showMessageDialog( + ExportZipDialog.this, + TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Message"), //$NON-NLS-1$ + TrackerRes.getString("ZipResourceDialog.Dialog.ExportFailed.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.ERROR_MESSAGE); + return; + } + } + } + } + } + // explicitly save zip here, since no videoExportListener to do it + saveZip(zipList); + } + } + }); + closeButton = new JButton(); + closeButton.setForeground(labelColor); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + buttonbar.add(helpButton); + buttonbar.add(addFilesButton); + buttonbar.add(saveButton); + buttonbar.add(closeButton); + + Border toolbarBorder = BorderFactory.createEmptyBorder(6, 4, 2, 4); + + // metadata + metadataBox = Box.createVerticalBox(); + + // HTML file + htmlLabel = new JLabel(); + htmlField = new EntryField(30) { + protected String getDefaultText() { + return TrackerRes.getString("ZipResourceDialog.HTMLField.DefaultText"); //$NON-NLS-1$ + } + protected Font getEmptyFont() { + return getFont().deriveFont(Font.ITALIC); + } + protected Font getDefaultFont() { + return getFont().deriveFont(Font.PLAIN); + } + + }; + htmlField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + htmlField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshGUI(); + } + }); + loadHTMLButton = new JButton(openIcon); + loadHTMLButton.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 2)); + loadHTMLButton.setAlignmentY(JToolBar.TOP_ALIGNMENT); + loadHTMLButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = TrackerIO.getChooser(); + chooser.setAcceptAllFileFilterUsed(false); + chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.OpenHTML.Title")); //$NON-NLS-1$ + chooser.setFileFilter(LaunchBuilder.getHTMLFilter()); + File[] files = TrackerIO.getChooserFiles("open any"); //$NON-NLS-1$ + chooser.removeChoosableFileFilter(LaunchBuilder.getHTMLFilter()); + if (files==null) return; // cancelled by user + htmlField.setText(XML.getRelativePath(files[0].getPath())); + refreshFieldsFromHTML(files[0]); + refreshGUI(); + } + + }); + JToolBar htmlbar = new JToolBar(); + htmlbar.setBorder(toolbarBorder); + htmlbar.setFloatable(false); + htmlbar.setOpaque(false); + htmlbar.add(htmlLabel); + htmlbar.add(htmlField); + htmlbar.add(loadHTMLButton); + + // title + titleLabel = new JLabel(); + titleField = new EntryField(30); + titleField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + JToolBar titlebar = new JToolBar(); + titlebar.setBorder(toolbarBorder); + titlebar.setFloatable(false); + titlebar.setOpaque(false); + titlebar.add(titleLabel); + titlebar.add(titleField); + // description + descriptionLabel = new JLabel(); + descriptionPane = new JTextArea(); + descriptionPane.setLineWrap(true); + descriptionPane.setWrapStyleWord(true); + descriptionPane.getDocument().putProperty("parent", descriptionPane); //$NON-NLS-1$ + descriptionPane.getDocument().addDocumentListener(EntryField.documentListener); + descriptionPane.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + descriptionPane.setBackground(Color.white); + } + }); + JToolBar descriptionbar = new JToolBar(); + descriptionbar.setBorder(toolbarBorder); + descriptionbar.setFloatable(false); + descriptionbar.setOpaque(false); + descriptionbar.add(descriptionLabel); + JScrollPane scroller = new JScrollPane(descriptionPane) { + public Dimension getPreferredSize() { + int w = titleField.getPreferredSize().width; + return new Dimension(w, 60); + } + }; + scroller.setAlignmentY(JToolBar.TOP_ALIGNMENT); + descriptionbar.add(scroller); + // author + authorLabel = new JLabel(); + authorField = new EntryField(30); + authorField.setText(trackerPanel.author); + authorField.setBackground(Color.white); + authorField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + JToolBar authorbar = new JToolBar(); + authorbar.setBorder(toolbarBorder); + authorbar.setFloatable(false); + authorbar.setOpaque(false); + authorbar.add(authorLabel); + authorbar.add(authorField); + // contact + contactLabel = new JLabel(); + contactField = new EntryField(30); + contactField.setText(trackerPanel.contact); + contactField.setBackground(Color.white); + contactField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + JToolBar contactbar = new JToolBar(); + contactbar.setBorder(toolbarBorder); + contactbar.setFloatable(false); + contactbar.setOpaque(false); + contactbar.add(contactLabel); + contactbar.add(contactField); + // keywords + keywordsLabel = new JLabel(); + keywordsField = new EntryField(30); + keywordsField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + JToolBar keywordsbar = new JToolBar(); + keywordsbar.setBorder(toolbarBorder); + keywordsbar.setFloatable(false); + keywordsbar.setOpaque(false); + keywordsbar.add(keywordsLabel); + keywordsbar.add(keywordsField); + // URL + urlLabel = new JLabel(); + urlField = new EntryField(30); + urlField.setAlignmentY(JToolBar.TOP_ALIGNMENT); + urlField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + refreshGUI(); + } + }); + JToolBar urlbar = new JToolBar(); + urlbar.setBorder(toolbarBorder); + urlbar.setFloatable(false); + urlbar.setOpaque(false); + urlbar.add(urlLabel); + urlbar.add(urlField); + + metadataBox.add(htmlbar); + metadataBox.add(titlebar); + metadataBox.add(descriptionbar); + metadataBox.add(authorbar); + metadataBox.add(contactbar); + metadataBox.add(keywordsbar); + metadataBox.add(urlbar); + + // thumbnail panel + thumbnailDisplay = new JLabel(); + Border line = BorderFactory.createLineBorder(Color.black); + Border empty = BorderFactory.createEmptyBorder(0, 2, 0, 2); + thumbnailDisplay.setBorder(BorderFactory.createCompoundBorder(empty, line)); + thumbnailButton = new JButton(); + thumbnailButton.setForeground(labelColor); + thumbnailButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ThumbnailDialog.getDialog(trackerPanel, false).setVisible(true); + } + }); + showThumbnailCheckbox = new JCheckBox(); + showThumbnailCheckbox.setSelected(true); + showThumbnailCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (showThumbnailCheckbox.isSelected()) { + thumbnailPanel.add(imagePanel, BorderLayout.CENTER); + } + else { + thumbnailPanel.remove(imagePanel); + } + pack(); + repaint(); + } + }); + thumbnailPanel = new JPanel(new BorderLayout()); + imagePanel = new JPanel(); + imagePanel.add(thumbnailDisplay); + thumbnailPanel.add(imagePanel, BorderLayout.CENTER); + JPanel panel = new JPanel(); + panel.add(thumbnailButton); + panel.add(showThumbnailCheckbox); + thumbnailPanel.add(panel, BorderLayout.NORTH); + ThumbnailDialog dialog = ThumbnailDialog.getDialog(trackerPanel, false); + dialog.addPropertyChangeListener("accepted", new PropertyChangeListener() { //$NON-NLS-1$ + public void propertyChange(PropertyChangeEvent e) { + refreshThumbnail(); + } + }); + refreshThumbnail(); + + // assemble + centerPanel = new JPanel(new BorderLayout()); + centerPanel.add(videoPanel, BorderLayout.NORTH); + centerPanel.add(thumbnailPanel, BorderLayout.SOUTH); + contentPane.add(metadataBox, BorderLayout.NORTH); + contentPane.add(centerPanel, BorderLayout.CENTER); + contentPane.add(buttonbar, BorderLayout.SOUTH); + + labels.add(authorLabel); + labels.add(contactLabel); + labels.add(descriptionLabel); + labels.add(keywordsLabel); + labels.add(urlLabel); + labels.add(titleLabel); + labels.add(htmlLabel); + + videoBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ + videoPanel.setBorder(videoBorder); + videoBorder.setTitleColor(labelColor); + thumbnailBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ + thumbnailBorder.setTitleColor(labelColor); + thumbnailPanel.setBorder(thumbnailBorder); + metadataBorder = BorderFactory.createTitledBorder(""); //$NON-NLS-1$ + metadataBorder.setTitleColor(labelColor); + metadataBox.setBorder(metadataBorder); + + addedFilesDialog = new AddedFilesDialog(); + addedFilesDialog.setLocationRelativeTo(ExportZipDialog.this); + + } + + /** + * Refreshes the thumbnail image based on the current ThumbnailDialog settings. + */ + private void refreshThumbnail() { + ThumbnailDialog thumbnailDialog = ThumbnailDialog.getDialog(trackerPanel, false); + BufferedImage image = thumbnailDialog.getThumbnail(); + thumbnailDisplay.setIcon(new ImageIcon(image)); + pack(); + } + + /** + * Refreshes the visible components of this dialog. + */ + private void refreshGUI() { + // refresh strings + String title = TrackerRes.getString("ZipResourceDialog.Title"); //$NON-NLS-1$ + setTitle(title); + + // borders + metadataBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Documentation")); //$NON-NLS-1$ + videoBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Video")); //$NON-NLS-1$ + thumbnailBorder.setTitle(TrackerRes.getString("ZipResourceDialog.Border.Title.Thumbnail")); //$NON-NLS-1$ + + // buttons + clipCheckbox.setText(TrackerRes.getString("ZipResourceDialog.Checkbox.TrimVideo")); //$NON-NLS-1$ + helpButton.setText(TrackerRes.getString("Dialog.Button.Help")); //$NON-NLS-1$ + addFilesButton.setText(TrackerRes.getString("ZipResourceDialog.Button.AddFiles")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + saveButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ + thumbnailButton.setText(TrackerRes.getString("ZipResourceDialog.Button.ThumbnailSettings")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + showThumbnailCheckbox.setText(TrackerRes.getString("ZipResourceDialog.Checkbox.PreviewThumbnail")); //$NON-NLS-1$ + + // labels + formatLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Format")+": "); //$NON-NLS-1$ //$NON-NLS-2$ + htmlLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.HTML")); //$NON-NLS-1$ + titleLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Title")); //$NON-NLS-1$ + descriptionLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Description")); //$NON-NLS-1$ + authorLabel.setText(TrackerRes.getString("PropertiesDialog.Label.Author")); //$NON-NLS-1$ + contactLabel.setText(TrackerRes.getString("PropertiesDialog.Label.Contact")); //$NON-NLS-1$ + keywordsLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Keywords")); //$NON-NLS-1$ + urlLabel.setText(TrackerRes.getString("ZipResourceDialog.Label.Link")); //$NON-NLS-1$ + + // tooltips + htmlLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.HTML")+": "); //$NON-NLS-1$ //$NON-NLS-2$ + htmlField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.HTML")+": "); //$NON-NLS-1$ //$NON-NLS-2$ + titleLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Title")); //$NON-NLS-1$ + titleField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Title")); //$NON-NLS-1$ + descriptionLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Description")); //$NON-NLS-1$ + descriptionPane.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Description")); //$NON-NLS-1$ + authorLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Author")); //$NON-NLS-1$ + authorField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Author")); //$NON-NLS-1$ + contactLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Contact")); //$NON-NLS-1$ + contactField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Contact")); //$NON-NLS-1$ + keywordsLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Keywords")); //$NON-NLS-1$ + keywordsField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Keywords")); //$NON-NLS-1$ + urlLabel.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Link")); //$NON-NLS-1$ + urlField.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.Link")); //$NON-NLS-1$ + clipCheckbox.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.TrimVideo")); //$NON-NLS-1$ + addFilesButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.AddFiles")); //$NON-NLS-1$ + thumbnailButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.ThumbnailSettings")); //$NON-NLS-1$ + loadHTMLButton.setToolTipText(TrackerRes.getString("ZipResourceDialog.Tooltip.LoadHTML")); //$NON-NLS-1$ + + // set label sizes + FontRenderContext frc = new FontRenderContext(null, false, false); + Font font = titleLabel.getFont(); + int w = 0; + for(Iterator it = labels.iterator(); it.hasNext(); ) { + JLabel next = it.next(); + Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+1); + } + int h = titleField.getMinimumSize().height; + Dimension labelSize = new Dimension(w, h); + for(Iterator it = labels.iterator(); it.hasNext(); ) { + JLabel next = it.next(); + next.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 2)); + next.setPreferredSize(labelSize); + next.setHorizontalAlignment(SwingConstants.TRAILING); + next.setAlignmentY(Box.TOP_ALIGNMENT); + } + + // video panel + boolean hasVideo = trackerPanel.getVideo()!=null; + clipCheckbox.setEnabled(hasVideo); + if (!hasVideo) { + clipCheckbox.setSelected(false); + } + formatDropdown.setEnabled(clipCheckbox.isSelected()); + formatLabel.setEnabled(clipCheckbox.isSelected()); + + // set html field properties + String path = htmlField.getText().trim(); + Resource res = null; + if (!path.equals(htmlField.getDefaultText()) && !path.equals("")) { //$NON-NLS-1$ + res = ResourceLoader.getResource(path); + htmlField.setFont(htmlField.getDefaultFont()); + htmlField.setForeground(res==null? Color.red: EntryField.defaultForeground); + } + htmlField.setBackground(Color.white); + + // set url field properties + path = urlField.getText().trim(); + if (!path.equals("")) { //$NON-NLS-1$ + try { + new URL(path); // throws exception if malformed + urlField.setForeground(EntryField.defaultForeground); + } catch (MalformedURLException e) { + urlField.setForeground(Color.red); + } + } + + // enable/disable urlField and descriptionPane + urlField.setEnabled(res==null); + urlLabel.setEnabled(res==null); + descriptionPane.setEnabled(res==null); + descriptionLabel.setEnabled(res==null); + + pack(); + } + + /** + * Refreshes the format dropdown. + */ + private void refreshFormatDropdown() { + ExportVideoDialog.refreshFormats(); + videoExporter.refreshFormatDropdown(preferredExtension); + formatDropdown.removeAllItems(); + for (Object format: videoExporter.getFormats()) { + formatDropdown.addItem(format); + } + formatDropdown.setSelectedItem(videoExporter.getFormat()); + } + + /** + * Refreshes the text fields by reading the HTML code of a file. + * @param htmlFile the file to read + */ + private void refreshFieldsFromHTML(File htmlFile) { + String html = ResourceLoader.getString(htmlFile.getAbsolutePath()); + if (html==null) return; + String title = ResourceLoader.getTitleFromHTMLCode(html); + if (title!=null) { + titleField.setText(title); + titleField.setBackground(Color.white); + } + ArrayList metadata = getMetadataFromHTML(html); + for (int i=metadata.size()-1; i>=0; i--) { + // go backwards so if multiple authors, first one in the list is only one changed + String[] next = metadata.get(i); + String key = next[0]; + String value = next[1]; + if (LibraryResource.META_AUTHOR.toLowerCase().contains(key.toLowerCase())) { + authorField.setText(value); + authorField.setBackground(Color.white); + } + else if (LibraryResource.META_CONTACT.toLowerCase().contains(key.toLowerCase())) { + contactField.setText(value); + contactField.setBackground(Color.white); + } + else if (LibraryResource.META_KEYWORDS.toLowerCase().contains(key.toLowerCase())) { + keywordsField.setText(value); + keywordsField.setBackground(Color.white); + } + } + } + + /** + * Saves the zip resource. This adds the trk, video and other files to those + * already in the zip list, then zips the whole list. + * @param zipList the list of files to be zipped + */ + private void saveZip(ArrayList zipList) { + // add video file or directory if target video exists + File videoFile = null; + if (targetVideo!=null) { + videoFile = new File(targetVideo); + if (!"".equals(videoSubdirectory)) { //$NON-NLS-1$ + videoFile = videoFile.getParentFile(); + // delete XML file, if any, from video directory + File xmlFile = null; + for (File next: videoFile.listFiles()) { + if (next.getName().endsWith(".xml")) { //$NON-NLS-1$ + xmlFile = next; + break; + } + } + if (xmlFile!=null) xmlFile.delete(); + } + zipList.add(videoFile); + } + // get TrackerPanel XMLControl + XMLControl control = new XMLControlElement(trackerPanel); + // modify video path, clip settings of XMLControl + if (clipCheckbox.isSelected()) { + modifyControlForClip(control, targetVideo); + } + else if (trackerPanel.getVideo()!=null) { + XMLControl videoControl = control.getChildControl("videoclip").getChildControl("video"); //$NON-NLS-1$ //$NON-NLS-2$ + if (videoControl!=null) { + videoControl.setValue("path", XML.getPathRelativeTo(targetVideo, getTempDirectory())); //$NON-NLS-1$ + } + } + + // add local HTML files + ArrayList htmlPaths = getHTMLPaths(control); + if (!htmlPaths.isEmpty()) { + String xml = control.toXML(); + for (String next: htmlPaths) { + String path = copyAndAddHTMLPage(next, zipList); + if (path!=null) { + xml = substitutePathInText(xml, next, path, ">", "<"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + control = new XMLControlElement(xml); + } + // add added files + for (File file: addedFilesDialog.addedFiles) { + String next = file.getAbsolutePath(); + boolean isHTML = XML.getExtension(next).startsWith("htm"); //$NON-NLS-1$ + if (isHTML) { + copyAndAddHTMLPage(next, zipList); + } + else { + String dir = getTempDirectory(); + File targetFile = new File(dir, XML.getName(next)); + VideoIO.copyFile(file, targetFile); + zipList.add(targetFile); + } + } + + // add trk file + String trkPath = control.write(getTRKTarget()); + File trkFile = new File(trkPath); + zipList.add(0, trkFile); + + // define zip target and compress with JarTool + File target = new File(getZIPTarget()); + if (JarTool.compress(zipList, target, null)) { + // delete temp directory + File temp = new File(getTempDirectory()); + if (!ResourceLoader.deleteFile(temp)) { + // unable to delete directory + } + // offer to open the newly created zip file + openZip(target.getAbsolutePath()); + } + } + + /** + * Writes an HTML info file from scratch, using the current field text. + */ + private File writeHTMLInfo(String thumbPath, String redirectPath) { + File htmlTarget = new File(getHTMLDirectory()); + htmlTarget.mkdirs(); + htmlTarget = new File(htmlTarget, targetName+"_info.html"); //$NON-NLS-1$ + thumbPath = XML.getPathRelativeTo(thumbPath, getHTMLDirectory()); + String title = titleField.getText().trim(); + String description = descriptionPane.getText().trim(); + String author = authorField.getText().trim(); + String contact = contactField.getText().trim(); + String keywords = keywordsField.getText().trim(); + String uri = urlField.getText().trim(); + + Map metadata = new TreeMap(); + if (!"".equals(author)) metadata.put("author", author); //$NON-NLS-1$ //$NON-NLS-2$ + if (!"".equals(contact)) metadata.put("contact", contact); //$NON-NLS-1$ //$NON-NLS-2$ + if (!"".equals(keywords)) metadata.put("keywords", keywords); //$NON-NLS-1$ //$NON-NLS-2$ + + String htmlCode = LibraryResource.getHTMLCode(title, LibraryResource.TRACKER_TYPE, + thumbPath, description, author, contact, uri, null, metadata); + + // insert redirect comment immediately after tag + if (redirectPath!=null) { + String comment = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ + int n = htmlCode.indexOf(""); //$NON-NLS-1$ + htmlCode = htmlCode.substring(0, n+6)+comment+htmlCode.substring(n+6); + } + + return writeFile(htmlCode, htmlTarget); + } + + /** + * Writes a text file. + * + * @param text the text + * @param target the File to write + * @return the written File, or null if failed + */ + private File writeFile(String text, File target) { + try { + FileWriter fout = new FileWriter(target); + fout.write(text); + fout.close(); + return target; + } catch(Exception ex) {} + return null; + } + + /** + * Writes a thumbnail image to the temp directory and adds it to the zip list. + * @param zipList the list of files to be zipped + * @return the absolute path to the image, or null if failed + */ + private String addThumbnail(ArrayList zipList) { + // use ThumbnailDialog to write image to temp folder and add to zip list + ThumbnailDialog dialog = ThumbnailDialog.getDialog(trackerPanel, false); + String ext = dialog.getFormat(); + String thumbPath = getTempDirectory()+targetName+"_thumbnail."+ext; //$NON-NLS-1$ + File thumbnail = dialog.saveThumbnail(thumbPath); + if (thumbnail==null) return null; + zipList.add(thumbnail); + return thumbPath; + } + + /** + * Copies, downloads or extracts a file to a target. + * @param filePath the path + * @param targetFile the target file + * @return true if successful + */ + private boolean copyOrExtractFile(String filePath, File targetFile) { + String lowercase = filePath.toLowerCase(); + // if file is on server, download it + if (filePath.startsWith("http")) { //$NON-NLS-1$ + targetFile = ResourceLoader.download(filePath, targetFile, false); + } + // if file is in zip or jar, then extract it + else if (lowercase.contains("trz!") || lowercase.contains("jar!") || lowercase.contains("zip!")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + targetFile = JarTool.extract(filePath, targetFile); + } + // otherwise copy it + else VideoIO.copyFile(new File(filePath), targetFile); + return targetFile.exists(); + } + + + /** + * Adds an appropriate HTML info file to the temp directory and adds it to the zip list. + * This looks first for a file specified in the htmlField, then for a file with name "zipName_info.html", + * and failing that writes a file from scratch. + * @param thumbPath the path to the thumbnail image + * @param zipList the list of files to be zipped + * @return true if succeeds + */ + private boolean addHTMLInfo(String thumbPath, ArrayList zipList) { + // see if HTML info resource is defined in htmlField + Resource res = ResourceLoader.getResource(htmlField.getText().trim()); + if (res==null) { + // look for HTML info resource in target directory + File[] files = new File(targetDirectory).listFiles(); + boolean added = false; + for (File next: files) { + String name = XML.stripExtension(next.getName()); + String ext = XML.getExtension(next.getName()); + if ("html".equals(ext) || "htm".equals(ext)) { //$NON-NLS-1$ //$NON-NLS-2$ + if (name.equals(targetName) || name.equals(targetName+"_info")) { //$NON-NLS-1$ + // look first in added files + for (File file: addedFilesDialog.addedFiles) { + added = added || file.getName().equals(next.getName()); + } + if (!added) { + // offer to add HTML to zip + final TFrame frame = trackerPanel.getTFrame(); + int response = javax.swing.JOptionPane.showConfirmDialog( + frame, + TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Message1") //$NON-NLS-1$ + +" \""+next.getName()+"\"\n" //$NON-NLS-1$ //$NON-NLS-2$ + +TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Message2"), //$NON-NLS-1$ + TrackerRes.getString("ZipResourceDialog.AddHTMLInfo.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.YES_NO_OPTION, + javax.swing.JOptionPane.QUESTION_MESSAGE); + if (response == javax.swing.JOptionPane.YES_OPTION) { + res = ResourceLoader.getResource(next.getAbsolutePath()); + } + } + } + } + } + } + + String redirect = null; // used below in writeHTMLInfo method + if (res!=null) { + if (res.getFile()!=null) { + // resource is a local file, so write temp target and add to zip list + String html = res.getString(); + if (html!=null && html.trim().startsWith(" newFrameNumbers = new TreeMap(); + + int newFrameNum = 0; + for (int i = 0; i=realClip.getEndFrameNumber()) break; + newFrameNum = Math.max(realClip.frameToStep(i), 0); + if (i>realClip.getStartFrameNumber() && !realClip.includesFrame(i)) + newFrameNum++; + newFrameNumbers.put(newFrameNum, i); + } + ImageCoordSystem.FrameData[] newKeyFrames = new ImageCoordSystem.FrameData[newFrameNum+1]; + for (Integer k: newFrameNumbers.keySet()) { + newKeyFrames[k] = coordKeyFrames[newFrameNumbers.get(k)]; + } + coordsControl.setValue("framedata", newKeyFrames); //$NON-NLS-1$ + + // tracks + // first remove bad models, if any + if (!badModels.isEmpty()) { + ArrayList tracks = ArrayList.class.cast(toModify.getObject("tracks")); //$NON-NLS-1$ + for (Iterator it = tracks.iterator(); it.hasNext();) { + TTrack track = (TTrack)it.next(); + if (badModels.contains(track)) { + it.remove(); + } + } + toModify.setValue("tracks", tracks); //$NON-NLS-1$ + } + // then modify frame references in track XMLcontrols + for (Object next: toModify.getPropertyContent()) { + if (next instanceof XMLProperty) { + XMLProperty prop = (XMLProperty)next; + if (prop.getPropertyName().equals("tracks")) { //$NON-NLS-1$ + for (Object obj: prop.getPropertyContent()) { + // every item is an XMLProperty + XMLProperty item = (XMLProperty)obj; + // the content of each item is the track control + XMLControl trackControl = (XMLControl)item.getPropertyContent().get(0); + Class trackType = trackControl.getObjectClass(); + if (PointMass.class.equals(trackType)) { + array = trackControl.getObject("framedata"); //$NON-NLS-1$ + PointMass.FrameData[] pointMassKeyFrames = (PointMass.FrameData[])array; + newFrameNumbers.clear(); + newFrameNum = 0; + for (int i = 0; i0) { + int newStartFrameNum = realClip.frameToStep(frameNum); + // start frame should round up + if (frameNum>realClip.getStartFrameNumber() && !realClip.includesFrame(frameNum)) + newStartFrameNum++; + trackControl.setValue("start_frame", newStartFrameNum); //$NON-NLS-1$ + } + frameNum = trackControl.getInt("end_frame"); //$NON-NLS-1$ + if (frameNum>0) { + int newEndFrameNum = realClip.frameToStep(frameNum); + // end frame should round down + trackControl.setValue("end_frame", newEndFrameNum); //$NON-NLS-1$ + } + } + + else if (Calibration.class.equals(trackType) || OffsetOrigin.class.equals(trackType)) { + array = trackControl.getObject("world_coordinates"); //$NON-NLS-1$ + double[][] calKeyFrames = (double[][])array; + newFrameNumbers.clear(); + newFrameNum = 0; + for (int i = 0; i getModelsNotInClip() { + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + ArrayList models = trackerPanel.getDrawables(ParticleModel.class); + for (Iterator it = models.iterator(); it.hasNext();) { + ParticleModel model = it.next(); + if (clip.includesFrame(model.getStartFrame())) { + it.remove(); + } + } + return models; + } + + + /** + * Returns a list of local HTML paths found in the specified XMLControl. + * + * @param control XMLControl for a TrackerPanel + * @return the list + */ + private ArrayList getHTMLPaths(XMLControl control) { + ArrayList pageViews = new ArrayList(); // html pages used in page views + // extract page view HTML paths + String xml = control.toXML(); + int j = xml.indexOf("PageTView$TabView"); //$NON-NLS-1$ + while (j>-1) { // page view exists + xml = xml.substring(j+17); + String s = ""; //$NON-NLS-1$ + j = xml.indexOf(s); + if (j>-1) { + xml = xml.substring(j+s.length()); + j = xml.indexOf(""); //$NON-NLS-1$ + String text = xml.substring(0, j); + Resource res = ResourceLoader.getResource(text); + if (res!=null && res.getFile()!=null) { // exclude web files + pageViews.add(text); + } + } + j = xml.indexOf("PageTView$TabView"); //$NON-NLS-1$ + } + return pageViews; + } + + /** + * Returns a list of local image paths found in the specified HTML document. + * + * @param html the HTML code + * @param basePath the absolute path to the parent directory of the HTML file + * @param pre a String that should precede image paths + * @param post a String that should follow image paths + * @return the list + */ + private ArrayList getImagePaths(String html, String basePath, String pre, String post) { + ArrayList images = new ArrayList(); + // extract image paths from html text + int j = html.indexOf(pre); + while (j>-1) { // image reference found + html = html.substring(j+pre.length()); + j = html.indexOf(post); + if (j>-1) { + String text = html.substring(0, j); // the image path specified in the html itself + String path = XML.getResolvedPath(text, basePath); + Resource res = ResourceLoader.getResource(path); + if (res!=null && res.getFile()!=null) { // exclude web files + images.add(text); + } + } + j = html.indexOf(pre); + } + return images; + } + + /** + * Copies an HTML file to the temp directory and adds the copy to the target list. + * @param htmlPath the path to the original HTML file + * @param zipList the list of files to be zipped + * @return the relative path to the copy, or null if failed + */ + private String copyAndAddHTMLPage(String htmlPath, ArrayList zipList) { + // read html text + String html = null; + Resource res = ResourceLoader.getResource(htmlPath); + if (res!=null) { + html = res.getString(); + } + if (html!=null) { + String htmlBasePath = XML.getDirectoryPath(htmlPath); + // get target directory + File htmlTarget = new File(getHTMLDirectory()); + htmlTarget.mkdirs(); + // add image files + String pre = " imagePaths = getImagePaths(html, htmlBasePath, pre, post); + if (!imagePaths.isEmpty()) { + // copy images into target directory and modify html text + File imageDir = new File(getImageDirectory()); + imageDir.mkdirs(); + for (String next: imagePaths) { + String path = XML.getResolvedPath(next, htmlBasePath); + res = ResourceLoader.getResource(path); + // copy image and determine its path relative to target + File imageTarget = new File(imageDir, XML.getName(next)); + if (res.getFile()!=null) { + VideoIO.copyFile(res.getFile(), imageTarget); + } + path = XML.getPathRelativeTo(imageTarget.getAbsolutePath(), getHTMLDirectory()); + html = substitutePathInText(html, next, path, pre, post); + } + if (!zipList.contains(imageDir)) + zipList.add(imageDir); + } + + // if local stylesheet is found, copy it + String css = ResourceLoader.getStyleSheetFromHTMLCode(html); + if (css!=null && !css.startsWith("http:")) { //$NON-NLS-1$ + res = ResourceLoader.getResource(XML.getResolvedPath(css, htmlBasePath)); + if (res!=null) { + // copy css file into HTMLTarget directory + String cssName = XML.getName(css); + File cssTarget = new File(htmlTarget, XML.getName(cssName)); + VideoIO.copyFile(res.getFile(), cssTarget); + // substitute cssName in html + html = substitutePathInText(html, css, cssName, "\"", "\""); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + // write modified html text into target file + htmlTarget = new File(htmlTarget, XML.getName(htmlPath)); + try { + FileWriter fout = new FileWriter(htmlTarget); + fout.write(html); + fout.close(); + String relPath = XML.getPathRelativeTo(htmlTarget.getAbsolutePath(), getTempDirectory()); + if (!"".equals(htmlSubdirectory)) { //$NON-NLS-1$ + htmlTarget = htmlTarget.getParentFile(); + } + + if (!zipList.contains(htmlTarget)) + zipList.add(htmlTarget); + return relPath; + } catch(Exception exc) { + exc.printStackTrace(); + } + } + return null; + } + + /** + * Substitutes one path string for another in a body of text so long as the path is + * preceded by the "pre" string and followed by the "post" string. + * + * @param text the body of text + * @param prevPath the path to replace + * @param newPath the new path + * @param pre a String that precedes the path + * @param post a String that follows the path + * @return the modified text + */ + private String substitutePathInText(String text, String prevPath, String newPath, String pre, String post) { + if (prevPath.equals(newPath)) return text; + int i = text.indexOf(pre+prevPath+post); + while (i>0) { + text = text.substring(0, i+pre.length())+newPath+text.substring(i+pre.length()+prevPath.length()); + i = text.indexOf(pre+prevPath+post); + } + return text; + } + + /** + * Offers to open a newly saved zip file. + * + * @param path the path to the zip file + */ + private void openZip(String path) { + final TFrame frame = trackerPanel.getTFrame(); + int response = javax.swing.JOptionPane.showConfirmDialog( + frame, + TrackerRes.getString("ZipResourceDialog.Complete.Message1") //$NON-NLS-1$ + +" \""+XML.getName(path)+"\".\n" //$NON-NLS-1$ //$NON-NLS-2$ + +TrackerRes.getString("ZipResourceDialog.Complete.Message2"), //$NON-NLS-1$ + TrackerRes.getString("ZipResourceDialog.Complete.Title"), //$NON-NLS-1$ + javax.swing.JOptionPane.YES_NO_OPTION, + javax.swing.JOptionPane.QUESTION_MESSAGE); + if (response == javax.swing.JOptionPane.YES_OPTION) { + frame.loadedFiles.remove(path); + final File file = new File(path); + Runnable runner = new Runnable() { + public void run() { + TrackerIO.open(file, frame); + } + }; + SwingUtilities.invokeLater(runner); + } + + } + + /** + * Uses a file chooser to define a new target name and directory. + * + * @return empty List to fill with files to be zipped + */ + protected ArrayList defineTarget() { + // show file chooser to get directory and zip name + JFileChooser chooser = TrackerIO.getChooser(); + chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.SaveZip.Title")); //$NON-NLS-1$ + chooser.setAcceptAllFileFilterUsed(false); +// chooser.addChoosableFileFilter(TrackerIO.zipFileFilter); + chooser.setFileFilter(TrackerIO.trzFileFilter); + File[] files = TrackerIO.getChooserFiles("save"); //$NON-NLS-1$ + chooser.resetChoosableFileFilters(); + if (files==null) return null; // cancelled by user +// targetExtension = chooser.getFileFilter()==TrackerIO.zipFileFilter? "zip": "trz"; //$NON-NLS-1$ //$NON-NLS-2$ + + // define target filename and check for reserved characters, including spaces + targetName = XML.stripExtension(files[0].getName()); + String[] reserved = new String[] { + "/","\\","?", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "<",">","\"", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "|",":","*","%"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + for (String next: reserved) { + if (targetName.indexOf(next)>-1) { + TFrame frame = trackerPanel.getTFrame(); + String list = ""; //$NON-NLS-1$ + for (int i = 1; i(); + } + + private String getTRKTarget() { + return getTempDirectory()+targetName+".trk"; //$NON-NLS-1$ + } + + private String getVideoTarget(String extension) { + String vidDir = getTempDirectory()+videoSubdirectory; + new File(vidDir).mkdirs(); + return vidDir+"/"+targetName+"."+extension; //$NON-NLS-1$ //$NON-NLS-2$ + } + + private String getZIPTarget() { + return targetDirectory+targetName+"."+targetExtension; //$NON-NLS-1$ + } + + private String getHTMLDirectory() { + return getTempDirectory()+htmlSubdirectory+"/"; //$NON-NLS-1$ + } + + private String getImageDirectory() { + return getTempDirectory()+imageSubdirectory+"/"; //$NON-NLS-1$ + } + + private String getTempDirectory() { + return targetDirectory+targetName+"_temp/"; //$NON-NLS-1$ + } + + protected class VideoListener implements PropertyChangeListener { + + ArrayList target; + ExportVideoDialog dialog; + + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("video_saved") && target!=null) { //$NON-NLS-1$ + // event's new value is saved file name (differ from original target name for image videos) + targetVideo = e.getNewValue().toString(); + // save video extension + preferredExtension = XML.getExtension(targetVideo); + // restore VideoIO preferred extension + VideoIO.setPreferredExportExtension(videoIOPreferredExtension); + + saveZip(target); + } + // clean up ExportVideoDialog + if (dialog!=null) { + dialog.removePropertyChangeListener("video_saved", videoExportListener); //$NON-NLS-1$ + dialog.removePropertyChangeListener("video_cancelled", videoExportListener); //$NON-NLS-1$ + } + } + void setTargetList(ArrayList list) { + target = list; + } + void setDialog(ExportVideoDialog evd) { + dialog = evd; + } + } + + protected class AddedFilesDialog extends JDialog { + + HashSet addedFiles = new HashSet(); + TreeSet fileNames = new TreeSet(); + JButton okButton, addButton, removeButton; + JList fileList; + DefaultListModel fileListModel; + + AddedFilesDialog() { + super(ExportZipDialog.this, true); + createGUI(); + } + + void createGUI() { + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + // file list + fileListModel = new DefaultListModel(); + fileList = new JList(fileListModel); + fileList.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + removeButton.setEnabled(fileList.getSelectedValue()!=null); + } + }); + JScrollPane scroller = new JScrollPane(fileList); + scroller.setPreferredSize(new Dimension(300, 150)); + contentPane.add(scroller, BorderLayout.CENTER); + + // button bar + JPanel buttonbar = new JPanel(); + addButton = new JButton(); + addButton.setForeground(labelColor); + addButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // show file chooser to add PDF and HTML files + JFileChooser chooser = TrackerIO.getChooser(); + chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.AddFile.Title")); //$NON-NLS-1$ + chooser.addChoosableFileFilter(LaunchBuilder.getPDFFilter()); + chooser.setFileFilter(LaunchBuilder.getHTMLFilter()); + File[] files = TrackerIO.getChooserFiles("open any"); //$NON-NLS-1$ + chooser.removeChoosableFileFilter(LaunchBuilder.getHTMLFilter()); + chooser.removeChoosableFileFilter(LaunchBuilder.getPDFFilter()); + if (files==null) return; // cancelled by user + addedFiles.add(files[0]); + refreshFileList(); + } + }); + removeButton = new JButton(); + removeButton.setForeground(labelColor); + removeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String name = (String)fileList.getSelectedValue(); + if (name!=null) { + for (Iterator it = addedFiles.iterator(); it.hasNext();) { + File next = it.next(); + if (name.equals(next.getName())) { + it.remove(); + break; + } + } + refreshFileList(); + } + } + }); + okButton = new JButton(); + okButton.setForeground(labelColor); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + buttonbar.add(addButton); + buttonbar.add(removeButton); + buttonbar.add(okButton); + contentPane.add(buttonbar, BorderLayout.SOUTH); + + pack(); + } + + void refreshGUI() { + setTitle(TrackerRes.getString("ZipResourceDialog.Dialog.AddFiles.Title")); //$NON-NLS-1$ + okButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + addButton.setText(TrackerRes.getString("Dialog.Button.Add")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + removeButton.setText(TrackerRes.getString("Dialog.Button.Remove")); //$NON-NLS-1$ + removeButton.setEnabled(fileList.getSelectedValue()!=null); + } + + /** + * Refreshes the file list. + */ + void refreshFileList() { + fileListModel.clear(); + fileNames.clear(); + for (File next: addedFiles) { + fileNames.add(next.getName()); + } + for (String next: fileNames) { + fileListModel.addElement(next); + } + } + + } + + /** + * Returns the metadata, if any, defined in HTML code + * @param htmlCode the HTML code + * @return a Map containing metadata names to values found in the code + */ + public static ArrayList getMetadataFromHTML(String htmlCode) { + ArrayList results = new ArrayList(); + if (htmlCode==null) return results; + String[] parts = htmlCode.split(""); //$NON-NLS-1$ + if (n>-1) { + parts[i] = parts[i].substring(0, n); + String divider = "\" content=\""; //$NON-NLS-1$ + String[] subparts = parts[i].split(divider); + if (subparts.length>1) { + String name = subparts[0]; + String value = subparts[1]; + results.add(new String[] {name, value}); + } + } + } + return results; + } + + /** + * Replaces metadata in HTML code based on current text in metadata fields + * and writes the result to a temporary file that is added to the jar, then deleted. + * @param htmlCode the HTML code + * @param res the (local File) Resource that is the source of the html code + * @return the modified code + */ + private File writeTempHTMLTarget(String htmlCode, Resource res) { + if (res.getFile()==null) return null; + String title = ResourceLoader.getTitleFromHTMLCode(htmlCode); + String newTitle = titleField.getText().trim(); + if (!"".equals(newTitle) && !newTitle.equals(title)) { //$NON-NLS-1$ + title = ""+title+""; //$NON-NLS-1$ //$NON-NLS-2$ + newTitle = ""+newTitle+""; //$NON-NLS-1$ //$NON-NLS-2$ + htmlCode = htmlCode.replace(title, newTitle); + } + ArrayList metadata = getMetadataFromHTML(htmlCode); + for (String type: LibraryResource.META_TYPES) { + String newValue = type.equals(LibraryResource.META_AUTHOR)? authorField.getText().trim(): + type.equals(LibraryResource.META_CONTACT)? contactField.getText().trim(): + type.equals(LibraryResource.META_KEYWORDS)? keywordsField.getText().trim(): null; + String prevValue = null; + String key = null; + boolean found = false; + for (String[] next: metadata) { + if (found) break; + key = next[0]; + if (type.toLowerCase().contains(key.toLowerCase())) { + found = true; + prevValue = next[1]; + } + } + if (!found) key = type.toLowerCase(); + htmlCode = replaceMetadataInHTML(htmlCode, key, prevValue, newValue); + } + File htmlTarget = res.getFile().getParentFile(); + htmlTarget = new File(htmlTarget, targetName+"_info.html"); //$NON-NLS-1$ + htmlTarget = writeFile(htmlCode, htmlTarget); + return htmlTarget; + } + + /** + * Replaces metadata in HTML code based on current text in metadata fields. + * @param htmlCode the HTML code + * @return the modified code + */ + private String replaceMetadataInHTML(String htmlCode, String name, String prevValue, String newValue) { + if (newValue==null || newValue.trim().equals("")) //$NON-NLS-1$ + return htmlCode; + if (prevValue==null) { + // write new line + int n = htmlCode.indexOf("-1) { + String newCode = "\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + htmlCode = htmlCode.substring(0, n)+newCode+htmlCode.substring(n, htmlCode.length()); + } + } + else if (!"".equals(newValue) && !newValue.equals(prevValue)) { //$NON-NLS-1$ + prevValue = "meta name=\""+name+"\" content=\""+prevValue+"\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + newValue = "meta name=\""+name+"\" content=\""+newValue+"\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + htmlCode = htmlCode.replace(prevValue, newValue); + } + return htmlCode; + } + + /** + * A JTextField for editing ZipResourceDialog fields. + */ + protected static class EntryField extends JTextField { + + static Color defaultForeground = new JTextField().getForeground(); + + EntryField() { + getDocument().putProperty("parent", this); //$NON-NLS-1$ + addFocusListener(focusListener); + addActionListener(actionListener); + getDocument().addDocumentListener(documentListener); + } + + EntryField(int width) { + super(width); + getDocument().putProperty("parent", this); //$NON-NLS-1$ + addFocusListener(focusListener); + addActionListener(actionListener); + getDocument().addDocumentListener(documentListener); + } + + protected String getDefaultText() { + return null; + } + + protected Font getEmptyFont() { + return getFont(); + } + + protected Font getDefaultFont() { + return getFont(); + } + + protected Color getEmptyForeground() { + return Color.gray; + } + + static DocumentListener documentListener = new DocumentListener() { + public void insertUpdate(DocumentEvent e) { + JTextComponent field = (JTextComponent)e.getDocument().getProperty("parent"); //$NON-NLS-1$ + field.setBackground(Color.yellow); + } + public void removeUpdate(DocumentEvent e) { + JTextComponent field = (JTextComponent)e.getDocument().getProperty("parent"); //$NON-NLS-1$ + field.setBackground(Color.yellow); + } + public void changedUpdate(DocumentEvent e) {} + }; + + static FocusListener focusListener = new FocusAdapter() { + public void focusGained(FocusEvent e) { + EntryField field = (EntryField)e.getSource(); + if (field.getDefaultText()!=null && field.getText().equals(field.getDefaultText())) { + field.setText(null); + field.setFont(field.getDefaultFont()); + field.setForeground(defaultForeground); + } + field.selectAll(); + field.setBackground(Color.white); + } + public void focusLost(FocusEvent e) { + EntryField field = (EntryField)e.getSource(); + boolean fire = field.getBackground()==Color.yellow; + if (field.getDefaultText()!=null && "".equals(field.getText())) { //$NON-NLS-1$ + field.setText(field.getDefaultText()); + field.setForeground(field.getEmptyForeground()); + field.setFont(field.getEmptyFont()); + } + field.setBackground(Color.white); + if (fire) field.fireActionPerformed(); + } + }; + + static ActionListener actionListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + EntryField field = (EntryField)e.getSource(); + field.setBackground(Color.white); + } + }; + + } + + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java index 46acd0a3..ef2ea079 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java +++ b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java @@ -1,268 +1,268 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.io.File; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import java.awt.Component; -import java.awt.Cursor; -import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.Transferable; -import java.awt.dnd.DropTargetAdapter; -import java.awt.dnd.DropTargetDragEvent; -import java.awt.dnd.DropTargetDropEvent; -import java.awt.dnd.DropTargetEvent; -import java.awt.dnd.DropTargetListener; - -import javax.swing.JOptionPane; -import javax.swing.TransferHandler; -import javax.swing.filechooser.FileFilter; - -import org.opensourcephysics.controls.OSPLog; -import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.media.core.ImageVideo; -import org.opensourcephysics.media.core.ImageVideoType; -import org.opensourcephysics.media.core.VideoFileFilter; - -/** - * A TransferHandler for opening video, trk and zip files via DragNDrop. - * - * @author Douglas Brown - */ -public class FileDropHandler extends TransferHandler { - - static final String URI_LIST_MIME_TYPE = "text/uri-list;class=java.lang.String"; //$NON-NLS-1$ - - static FileFilter dataFilter = TrackerIO.trkFileFilter; - static FileFilter videoFilter = new VideoFileFilter(); - static FileFilter[] imageFilters = new ImageVideoType().getFileFilters(); - - TFrame frame; - DataFlavor uriListFlavor; // for Linux - List dropList; - Component dropComponent; - DropTargetListener dropListener = new DropListener(); - - /** - * Constructor. - * @param frame the TFrame that will be the drop target - */ - public FileDropHandler(TFrame frame) { - this.frame = frame; - try { - uriListFlavor = new DataFlavor(URI_LIST_MIME_TYPE); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - - @Override - public boolean canImport(TransferHandler.TransferSupport support) { - if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) - || (OSPRuntime.isLinux()&&support.isDataFlavorSupported(uriListFlavor))) { - if (dropList==null && support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { - try { - Transferable t = support.getTransferable(); - dropList = getFileList(t); - dropComponent = support.getComponent(); - dropComponent.getDropTarget().addDropTargetListener(dropListener); - } catch (Exception ex) { - } - } - boolean isImport = false; - if (dropList!=null && dropComponent instanceof TrackerPanel) { - if (dropList.size()==1) { - File file = (File)dropList.get(0); - if (videoFilter.accept(file)) { - isImport = true; - } - } - } - if (!isImport) { - support.setDropAction(TransferHandler.COPY); - } - return true; - } - return false; - } - - @Override - public boolean importData(TransferHandler.TransferSupport support) { - if (!canImport(support)) { - return false; - } - List fileList = getFileList(support.getTransferable()); - try { - // define frameNumber for insertions - int frameNumber = 0; - // get target tracker panel, if any - TrackerPanel targetPanel = null; - if (support.getComponent() instanceof TrackerPanel) { - targetPanel = (TrackerPanel)support.getComponent(); - } - if (targetPanel != null) { - targetPanel.setMouseCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); - if (targetPanel.getVideo() != null) { - frameNumber = targetPanel.getVideo().getFrameNumber(); - } - } - // load the files - for (int j = 0; j < fileList.size(); j++) { - final File file = (File)fileList.get(j); - OSPLog.finest("dropped file: "+file.getAbsolutePath()); //$NON-NLS-1$ - // if dropAction is COPY then open in new tab - if (support.getDropAction()==TransferHandler.COPY) { - TrackerIO.open(file, frame); - } - // if targetPanel has image video and file is image, add after current frame - else if (targetPanel != null - && targetPanel.getVideo() instanceof ImageVideo - && isImageFile(file)) { - File[] added = TrackerIO.insertImagesIntoVideo( - new File[] {file}, targetPanel, frameNumber+1); - frameNumber += added.length; - } - // if targetPanel not null and file is video then import - else if (targetPanel != null && videoFilter.accept(file)) { - // open in separate background thread - final TrackerPanel trackerPanel = targetPanel; - Runnable runner = new Runnable() { - public void run() { - TrackerIO.importVideo(file, trackerPanel, null); - } - }; - if (TrackerIO.loadInSeparateThread) { - Thread opener = new Thread(runner); - opener.setPriority(Thread.NORM_PRIORITY); - opener.setDaemon(true); - opener.start(); - } - else runner.run(); - } - // else inform user that file is not acceptable - else { - JOptionPane.showMessageDialog(frame, - "\""+file.getName()+"\" " //$NON-NLS-1$ //$NON-NLS-2$ - + TrackerRes.getString("FileDropHandler.Dialog.BadFile.Message"), //$NON-NLS-1$ - TrackerRes.getString("FileDropHandler.Dialog.BadFile.Title"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); - } - } - } catch (Exception e) { - frame.setCursor(Cursor.getDefaultCursor()); - return false; - } - frame.setCursor(Cursor.getDefaultCursor()); - return true; - } - - /** - * Gets the file list from a Transferable. - * @param t the Transferable - * @return a List of files - */ - private List getFileList(Transferable t) { - // expected data is a List of Files - List fileList = null; - try { - // get the data from the Transferable - if (OSPRuntime.isLinux()) { - String uriList = (String) t.getTransferData(uriListFlavor); - fileList = uriListToFileList(uriList); - } - else { - Object data = t.getTransferData(DataFlavor.javaFileListFlavor); - fileList = List.class.cast(data); - } - } catch (Exception ex) { - } - return fileList; - } - - /** - * Returns true if the specified file is an image. - * @param file the File - * @return true if an image - */ - private boolean isImageFile(File file) { - for (int i = 0; i < imageFilters.length; i++) { - if (imageFilters[i].accept(file)) return true; - } - return false; - } - - /** - * Converts a URIList (String) to a List of files. - * @param data the URIList String - * @return a List of files - */ - private static List uriListToFileList(String data) { - List list = new ArrayList(); - StringTokenizer st = new StringTokenizer(data, "\r\n"); //$NON-NLS-1$ - for (; st.hasMoreTokens();) { - String s = st.nextToken(); - if (s.startsWith("#")) { //$NON-NLS-1$ - // skip comments - continue; - } - try { - URI uri = new URI(s); - File file = new File(uri); - list.add(file); - } catch (Exception e) { - e.printStackTrace(); - } - } - return list; - } - - /** - * Inner DropTargetListener to reset the dropList to null when entering, exiting - * or dropping on a drop target. - */ - private class DropListener extends DropTargetAdapter { - - @Override - public void dragEnter(DropTargetDragEvent dtde) { - dropList = null; - } - - @Override - public void dragExit(DropTargetEvent dte) { - dropList = null; - } - - public void drop(DropTargetDropEvent e) { - dropList = null; - } - - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.io.File; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.dnd.DropTargetAdapter; +import java.awt.dnd.DropTargetDragEvent; +import java.awt.dnd.DropTargetDropEvent; +import java.awt.dnd.DropTargetEvent; +import java.awt.dnd.DropTargetListener; + +import javax.swing.JOptionPane; +import javax.swing.TransferHandler; +import javax.swing.filechooser.FileFilter; + +import org.opensourcephysics.controls.OSPLog; +import org.opensourcephysics.display.OSPRuntime; +import org.opensourcephysics.media.core.ImageVideo; +import org.opensourcephysics.media.core.ImageVideoType; +import org.opensourcephysics.media.core.VideoFileFilter; + +/** + * A TransferHandler for opening video, trk and zip files via DragNDrop. + * + * @author Douglas Brown + */ +public class FileDropHandler extends TransferHandler { + + static final String URI_LIST_MIME_TYPE = "text/uri-list;class=java.lang.String"; //$NON-NLS-1$ + + static FileFilter dataFilter = TrackerIO.trkFileFilter; + static FileFilter videoFilter = new VideoFileFilter(); + static FileFilter[] imageFilters = new ImageVideoType().getFileFilters(); + + TFrame frame; + DataFlavor uriListFlavor; // for Linux + List dropList; + Component dropComponent; + DropTargetListener dropListener = new DropListener(); + + /** + * Constructor. + * @param frame the TFrame that will be the drop target + */ + public FileDropHandler(TFrame frame) { + this.frame = frame; + try { + uriListFlavor = new DataFlavor(URI_LIST_MIME_TYPE); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + } + + @Override + public boolean canImport(TransferHandler.TransferSupport support) { + if (support.isDataFlavorSupported(DataFlavor.javaFileListFlavor) + || (OSPRuntime.isLinux()&&support.isDataFlavorSupported(uriListFlavor))) { + if (dropList==null && support.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + try { + Transferable t = support.getTransferable(); + dropList = getFileList(t); + dropComponent = support.getComponent(); + dropComponent.getDropTarget().addDropTargetListener(dropListener); + } catch (Exception ex) { + } + } + boolean isImport = false; + if (dropList!=null && dropComponent instanceof TrackerPanel) { + if (dropList.size()==1) { + File file = (File)dropList.get(0); + if (videoFilter.accept(file)) { + isImport = true; + } + } + } + if (!isImport) { + support.setDropAction(TransferHandler.COPY); + } + return true; + } + return false; + } + + @Override + public boolean importData(TransferHandler.TransferSupport support) { + if (!canImport(support)) { + return false; + } + List fileList = getFileList(support.getTransferable()); + try { + // define frameNumber for insertions + int frameNumber = 0; + // get target tracker panel, if any + TrackerPanel targetPanel = null; + if (support.getComponent() instanceof TrackerPanel) { + targetPanel = (TrackerPanel)support.getComponent(); + } + if (targetPanel != null) { + targetPanel.setMouseCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + frame.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); + if (targetPanel.getVideo() != null) { + frameNumber = targetPanel.getVideo().getFrameNumber(); + } + } + // load the files + for (int j = 0; j < fileList.size(); j++) { + final File file = (File)fileList.get(j); + OSPLog.finest("dropped file: "+file.getAbsolutePath()); //$NON-NLS-1$ + // if dropAction is COPY then open in new tab + if (support.getDropAction()==TransferHandler.COPY) { + TrackerIO.open(file, frame); + } + // if targetPanel has image video and file is image, add after current frame + else if (targetPanel != null + && targetPanel.getVideo() instanceof ImageVideo + && isImageFile(file)) { + File[] added = TrackerIO.insertImagesIntoVideo( + new File[] {file}, targetPanel, frameNumber+1); + frameNumber += added.length; + } + // if targetPanel not null and file is video then import + else if (targetPanel != null && videoFilter.accept(file)) { + // open in separate background thread + final TrackerPanel trackerPanel = targetPanel; + Runnable runner = new Runnable() { + public void run() { + TrackerIO.importVideo(file, trackerPanel, null); + } + }; + if (TrackerIO.loadInSeparateThread) { + Thread opener = new Thread(runner); + opener.setPriority(Thread.NORM_PRIORITY); + opener.setDaemon(true); + opener.start(); + } + else runner.run(); + } + // else inform user that file is not acceptable + else { + JOptionPane.showMessageDialog(frame, + "\""+file.getName()+"\" " //$NON-NLS-1$ //$NON-NLS-2$ + + TrackerRes.getString("FileDropHandler.Dialog.BadFile.Message"), //$NON-NLS-1$ + TrackerRes.getString("FileDropHandler.Dialog.BadFile.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + } + } + } catch (Exception e) { + frame.setCursor(Cursor.getDefaultCursor()); + return false; + } + frame.setCursor(Cursor.getDefaultCursor()); + return true; + } + + /** + * Gets the file list from a Transferable. + * @param t the Transferable + * @return a List of files + */ + private List getFileList(Transferable t) { + // expected data is a List of Files + List fileList = null; + try { + // get the data from the Transferable + if (OSPRuntime.isLinux()) { + String uriList = (String) t.getTransferData(uriListFlavor); + fileList = uriListToFileList(uriList); + } + else { + Object data = t.getTransferData(DataFlavor.javaFileListFlavor); + fileList = List.class.cast(data); + } + } catch (Exception ex) { + } + return fileList; + } + + /** + * Returns true if the specified file is an image. + * @param file the File + * @return true if an image + */ + private boolean isImageFile(File file) { + for (int i = 0; i < imageFilters.length; i++) { + if (imageFilters[i].accept(file)) return true; + } + return false; + } + + /** + * Converts a URIList (String) to a List of files. + * @param data the URIList String + * @return a List of files + */ + private static List uriListToFileList(String data) { + List list = new ArrayList(); + StringTokenizer st = new StringTokenizer(data, "\r\n"); //$NON-NLS-1$ + for (; st.hasMoreTokens();) { + String s = st.nextToken(); + if (s.startsWith("#")) { //$NON-NLS-1$ + // skip comments + continue; + } + try { + URI uri = new URI(s); + File file = new File(uri); + list.add(file); + } catch (Exception e) { + e.printStackTrace(); + } + } + return list; + } + + /** + * Inner DropTargetListener to reset the dropList to null when entering, exiting + * or dropping on a drop target. + */ + private class DropListener extends DropTargetAdapter { + + @Override + public void dragEnter(DropTargetDragEvent dtde) { + dropList = null; + } + + @Override + public void dragExit(DropTargetEvent dte) { + dropList = null; + } + + public void drop(DropTargetDropEvent e) { + dropList = null; + } + + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java b/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java index e2716a91..e08821b5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java @@ -1,110 +1,110 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -/** - * This implements an algorithm for finding a first derivative. - * - * @author Douglas Brown - */ -public class FirstDerivative implements Derivative { - - // instance fields - private int spill, start, step, count; - private double[] xDeriv, yDeriv = new double[0]; - private Object[] result = new Object[4]; - - /** - * Evaluates the derivative. - * - * Input data: - * data[0] = parameters (int[] {spill, start, stepsize, count}) - * data[1] = xData (double[]) - * data[2] = yData (double[]) - * data[3] = validData (boolean[]) - * - * Returned result: - * result[0] = xDeriv (double[]) (invalid values are NaN) - * result[1] = yDeriv (double[]) (invalid values are NaN) - * result[2] = null - * result[3] = null - * - * @param data the input data - * @return Object[] the result - */ - public Object[] evaluate(Object[] data) { - int[] params = (int[])data[0]; - spill = params[0]; - start = params[1]; - step = params[2]; - count = params[3]; - double[] x = (double[])data[1]; - double[] y = (double[])data[2]; - boolean[] valid = (boolean[])data[3]; - if (yDeriv.length != x.length) { - result[0] = xDeriv = new double[x.length]; - result[1] = yDeriv = new double[x.length]; - } - - // get upper and lower index checking limits - int lower = start; - int upper = Math.min(start + step*(count-1), x.length); - - // find v at each step index from lower to upper - outer: - for (int i = lower; i <= upper; i+=step) { - - // derivative at i will be valid only if all step positions - // between i-spill*step and i+spill*step are valid - for (int j = i - spill*step; j <= i + spill*step; j+=step) { - if (j < 0 || j >= valid.length || !valid[j]) { - if (i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +/** + * This implements an algorithm for finding a first derivative. + * + * @author Douglas Brown + */ +public class FirstDerivative implements Derivative { + + // instance fields + private int spill, start, step, count; + private double[] xDeriv, yDeriv = new double[0]; + private Object[] result = new Object[4]; + + /** + * Evaluates the derivative. + * + * Input data: + * data[0] = parameters (int[] {spill, start, stepsize, count}) + * data[1] = xData (double[]) + * data[2] = yData (double[]) + * data[3] = validData (boolean[]) + * + * Returned result: + * result[0] = xDeriv (double[]) (invalid values are NaN) + * result[1] = yDeriv (double[]) (invalid values are NaN) + * result[2] = null + * result[3] = null + * + * @param data the input data + * @return Object[] the result + */ + public Object[] evaluate(Object[] data) { + int[] params = (int[])data[0]; + spill = params[0]; + start = params[1]; + step = params[2]; + count = params[3]; + double[] x = (double[])data[1]; + double[] y = (double[])data[2]; + boolean[] valid = (boolean[])data[3]; + if (yDeriv.length != x.length) { + result[0] = xDeriv = new double[x.length]; + result[1] = yDeriv = new double[x.length]; + } + + // get upper and lower index checking limits + int lower = start; + int upper = Math.min(start + step*(count-1), x.length); + + // find v at each step index from lower to upper + outer: + for (int i = lower; i <= upper; i+=step) { + + // derivative at i will be valid only if all step positions + // between i-spill*step and i+spill*step are valid + for (int j = i - spill*step; j <= i + spill*step; j+=step) { + if (j < 0 || j >= valid.length || !valid[j]) { + if (i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import javax.swing.*; - -/** - * A Footprint creates a mark for a track step. - * - * @author Douglas Brown - */ -public interface Footprint { - - /** - * Gets the name of the footprint. - * - * @return the name - */ - public String getName(); - - /** - * Gets the display name of the footprint. - * - * @return the name - */ - public String getDisplayName(); - - /** - * Gets the point array length required by this footprint. - * - * @return the length - */ - public int getLength(); - - /** - * Gets an icon representing the footprint. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h); - - /** - * Gets the hit shapes associated with the footprint. - * - * @return an array of hit shapes - */ - public Shape[] getHitShapes(); - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points); - - /** - * Gets the footprint shape. - * - * @param points a Point array - * @return the shape - */ - public Shape getShape(Point[] points); - - /** - * Sets the stroke. Accepts only basic strokes. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke); - - /** - * Gets the stroke. - * - * @return the basic stroke - */ - public BasicStroke getStroke(); - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color); - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor(); - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import javax.swing.*; + +/** + * A Footprint creates a mark for a track step. + * + * @author Douglas Brown + */ +public interface Footprint { + + /** + * Gets the name of the footprint. + * + * @return the name + */ + public String getName(); + + /** + * Gets the display name of the footprint. + * + * @return the name + */ + public String getDisplayName(); + + /** + * Gets the point array length required by this footprint. + * + * @return the length + */ + public int getLength(); + + /** + * Gets an icon representing the footprint. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h); + + /** + * Gets the hit shapes associated with the footprint. + * + * @return an array of hit shapes + */ + public Shape[] getHitShapes(); + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points); + + /** + * Gets the footprint shape. + * + * @param points a Point array + * @return the shape + */ + public Shape getShape(Point[] points); + + /** + * Sets the stroke. Accepts only basic strokes. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke); + + /** + * Gets the stroke. + * + * @return the basic stroke + */ + public BasicStroke getStroke(); + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color); + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor(); + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java index 8e7c88ca..82be18ce 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java @@ -1,348 +1,348 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.geom.*; - -import javax.swing.*; - -/** - * A LineFootprint returns a line shape for a Point array of length 2. - * - * @author Douglas Brown - */ -public class LineFootprint implements Footprint, Cloneable { - - // instance fields - protected String name; - protected Shape highlight; - protected AffineTransform transform = new AffineTransform(); - protected BasicStroke stroke = new BasicStroke(); - protected Color color = Color.black; - protected GeneralPath path = new GeneralPath(); - protected Line2D line = new Line2D.Double(); - protected Shape[] hitShapes = new Shape[3]; - - /** - * Constructs a LineFootprint. - * - * @param name the name - */ - public LineFootprint(String name) { - this.name = name; - } - - /** - * Gets a predefined LineFootprint. - * - * @param name the name of the footprint - * @return the footprint - */ - public static Footprint getFootprint(String name) { - Iterator it = footprints.iterator(); - while(it.hasNext()) { - LineFootprint footprint = it.next(); - if (name == footprint.getName()) try { - return (LineFootprint)footprint.clone(); - } catch(CloneNotSupportedException ex) {ex.printStackTrace();} - } - return null; - } - - /** - * Gets the name of this footprint. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets the display name of the footprint. - * - * @return the localized display name - */ - public String getDisplayName() { - return TrackerRes.getString(name); - } - - /** - * Gets the minimum point array length required by this footprint. - * - * @return the length - */ - public int getLength() { - return 2; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; - Shape shape = getShape(points); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - return icon; - } - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points) { - final Shape shape = getShape(points); - final Shape highlight = this.highlight; - final Color color = this.color; - return new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Color gcolor = g.getColor(); - g.setColor(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(shape); - if (highlighted && highlight!=null) { - g.fill(highlight); - } - g.setColor(gcolor); - } - - public Rectangle getBounds(boolean highlighted) { - return shape.getBounds(); - } - }; - } - - /** - * Gets the hit shapes. Shape[0] is for p0, Shape[1] for p1 - * and Shape[2] for the line - * - * @return the hit shapes - */ - public Shape[] getHitShapes() { - return hitShapes; - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - this.stroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - } - - /** - * Gets the stroke. - * - * @return the stroke - */ - public BasicStroke getStroke() { - return stroke; - } - - /** - * Sets the dash array. - * - * @param dashArray the desired dash array - */ - public void setDashArray(float[] dashArray) { - setStroke(new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - dashArray, - stroke.getDashPhase())); - } - - /** - * Sets the line width. - * - * @param w the desired line width - */ - public void setLineWidth(double w) { - stroke = new BasicStroke((float)w, - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = color; - } - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor() { - return color; - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - Point p1 = points[0]; - Point p2 = points[1]; - line.setLine(p1, p2); - hitShapes[0] = new Rectangle(p1.x-1, p1.y-1, 2, 2); // for p1 - hitShapes[1] = new Rectangle(p2.x-1, p2.y-1, 2, 2); // for p2 - hitShapes[2] = (Line2D.Double)line.clone(); // for line - return stroke.createStrokedShape(line); - } - - // static fields - private static Collection footprints = new HashSet(); - - // static constants - /** A dashed line pattern */ - public static final float[] DASHED_LINE = new float[] {10, 4}; - /** A dotted line pattern */ - public static final float[] DOTTED_LINE = new float[] {2, 1}; - protected static final Shape HIGHLIGHT; - private static final LineFootprint LINE; - private static final LineFootprint BOLD_LINE; - private static final LineFootprint OUTLINE; - private static final LineFootprint BOLD_OUTLINE; - private static final LineFootprint DOUBLE_ARROW; - private static final LineFootprint BOLD_DOUBLE_ARROW; - private static final ArrowFootprint ARROW; - private static final ArrowFootprint BOLD_ARROW; - private static final ArrowFootprint BIG_ARROW; - private static final ArrowFootprint DASH_ARROW; - private static final ArrowFootprint BOLD_DASH_ARROW; - private static final ArrowFootprint BIG_DASH_ARROW; - private static final DoubleCrosshairFootprint DOUBLE_TARGET; - private static final DoubleCrosshairFootprint BOLD_DOUBLE_TARGET; - - // static initializers - static { - // HIGHLIGHT - Ellipse2D circle = new Ellipse2D.Double(); - circle.setFrame(-3, -3, 6, 6); - Stroke stroke = new BasicStroke(2); - HIGHLIGHT = stroke.createStrokedShape(circle); - - // LINE - LINE = new LineFootprint("Footprint.Line"); //$NON-NLS-1$ - footprints.add(LINE); - - // BOLD_LINE - BOLD_LINE = new LineFootprint("Footprint.BoldLine"); //$NON-NLS-1$ - BOLD_LINE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_LINE); - - // OUTLINE - OUTLINE = new OutlineFootprint("Footprint.Outline"); //$NON-NLS-1$ - footprints.add(OUTLINE); - - // BOLD_OUTLINE - BOLD_OUTLINE = new OutlineFootprint("Footprint.BoldOutline"); //$NON-NLS-1$ - BOLD_OUTLINE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_OUTLINE); - - // DOUBLE_ARROW - DOUBLE_ARROW = new DoubleArrowFootprint("Footprint.DoubleArrow"); //$NON-NLS-1$ - footprints.add(DOUBLE_ARROW); - - // BOLD_DOUBLE_ARROW - BOLD_DOUBLE_ARROW = new DoubleArrowFootprint("Footprint.BoldDoubleArrow"); //$NON-NLS-1$ - BOLD_DOUBLE_ARROW.setStroke(new BasicStroke(2)); - footprints.add(BOLD_DOUBLE_ARROW); - - // ARROW - ARROW = new ArrowFootprint("Footprint.Arrow"); //$NON-NLS-1$ - footprints.add(ARROW); - - // BOLD_ARROW - BOLD_ARROW = new ArrowFootprint("Footprint.BoldArrow"); //$NON-NLS-1$ - BOLD_ARROW.setStroke(new BasicStroke(2)); - footprints.add(BOLD_ARROW); - - // BIG_ARROW - BIG_ARROW = new ArrowFootprint("Footprint.BigArrow"); //$NON-NLS-1$ - BIG_ARROW.setStroke(new BasicStroke(4)); - BIG_ARROW.setTipLength(32); - footprints.add(BIG_ARROW); - - // DASH_ARROW - DASH_ARROW = new ArrowFootprint("Footprint.DashArrow"); //$NON-NLS-1$ - DASH_ARROW.setDashArray(DASHED_LINE); - footprints.add(DASH_ARROW); - - // BOLD_DASH_ARROW - BOLD_DASH_ARROW = new ArrowFootprint("Footprint.BoldDashArrow"); //$NON-NLS-1$ - BOLD_DASH_ARROW.setStroke(new BasicStroke(2)); - BOLD_DASH_ARROW.setDashArray(DASHED_LINE); - footprints.add(BOLD_DASH_ARROW); - - // BIG_DASH_ARROW - BIG_DASH_ARROW = new ArrowFootprint("Footprint.BigDashArrow"); //$NON-NLS-1$ - BIG_DASH_ARROW.setStroke(new BasicStroke(4)); - BIG_DASH_ARROW.setDashArray(DASHED_LINE); - BIG_DASH_ARROW.setTipLength(32); - footprints.add(BIG_DASH_ARROW); - - // DOUBLE_TARGET - DOUBLE_TARGET = new DoubleCrosshairFootprint("Footprint.DoubleTarget"); //$NON-NLS-1$ - footprints.add(DOUBLE_TARGET); - - // BOLD_DOUBLE_TARGET - BOLD_DOUBLE_TARGET = new DoubleCrosshairFootprint("Footprint.BoldDoubleTarget"); //$NON-NLS-1$ - BOLD_DOUBLE_TARGET.setStroke(new BasicStroke(2)); - footprints.add(BOLD_DOUBLE_TARGET); - - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.geom.*; + +import javax.swing.*; + +/** + * A LineFootprint returns a line shape for a Point array of length 2. + * + * @author Douglas Brown + */ +public class LineFootprint implements Footprint, Cloneable { + + // instance fields + protected String name; + protected Shape highlight; + protected AffineTransform transform = new AffineTransform(); + protected BasicStroke stroke = new BasicStroke(); + protected Color color = Color.black; + protected GeneralPath path = new GeneralPath(); + protected Line2D line = new Line2D.Double(); + protected Shape[] hitShapes = new Shape[3]; + + /** + * Constructs a LineFootprint. + * + * @param name the name + */ + public LineFootprint(String name) { + this.name = name; + } + + /** + * Gets a predefined LineFootprint. + * + * @param name the name of the footprint + * @return the footprint + */ + public static Footprint getFootprint(String name) { + Iterator it = footprints.iterator(); + while(it.hasNext()) { + LineFootprint footprint = it.next(); + if (name == footprint.getName()) try { + return (LineFootprint)footprint.clone(); + } catch(CloneNotSupportedException ex) {ex.printStackTrace();} + } + return null; + } + + /** + * Gets the name of this footprint. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the display name of the footprint. + * + * @return the localized display name + */ + public String getDisplayName() { + return TrackerRes.getString(name); + } + + /** + * Gets the minimum point array length required by this footprint. + * + * @return the length + */ + public int getLength() { + return 2; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; + Shape shape = getShape(points); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + return icon; + } + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points) { + final Shape shape = getShape(points); + final Shape highlight = this.highlight; + final Color color = this.color; + return new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Color gcolor = g.getColor(); + g.setColor(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(shape); + if (highlighted && highlight!=null) { + g.fill(highlight); + } + g.setColor(gcolor); + } + + public Rectangle getBounds(boolean highlighted) { + return shape.getBounds(); + } + }; + } + + /** + * Gets the hit shapes. Shape[0] is for p0, Shape[1] for p1 + * and Shape[2] for the line + * + * @return the hit shapes + */ + public Shape[] getHitShapes() { + return hitShapes; + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + this.stroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + } + + /** + * Gets the stroke. + * + * @return the stroke + */ + public BasicStroke getStroke() { + return stroke; + } + + /** + * Sets the dash array. + * + * @param dashArray the desired dash array + */ + public void setDashArray(float[] dashArray) { + setStroke(new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + dashArray, + stroke.getDashPhase())); + } + + /** + * Sets the line width. + * + * @param w the desired line width + */ + public void setLineWidth(double w) { + stroke = new BasicStroke((float)w, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = color; + } + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor() { + return color; + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + Point p1 = points[0]; + Point p2 = points[1]; + line.setLine(p1, p2); + hitShapes[0] = new Rectangle(p1.x-1, p1.y-1, 2, 2); // for p1 + hitShapes[1] = new Rectangle(p2.x-1, p2.y-1, 2, 2); // for p2 + hitShapes[2] = (Line2D.Double)line.clone(); // for line + return stroke.createStrokedShape(line); + } + + // static fields + private static Collection footprints = new HashSet(); + + // static constants + /** A dashed line pattern */ + public static final float[] DASHED_LINE = new float[] {10, 4}; + /** A dotted line pattern */ + public static final float[] DOTTED_LINE = new float[] {2, 1}; + protected static final Shape HIGHLIGHT; + private static final LineFootprint LINE; + private static final LineFootprint BOLD_LINE; + private static final LineFootprint OUTLINE; + private static final LineFootprint BOLD_OUTLINE; + private static final LineFootprint DOUBLE_ARROW; + private static final LineFootprint BOLD_DOUBLE_ARROW; + private static final ArrowFootprint ARROW; + private static final ArrowFootprint BOLD_ARROW; + private static final ArrowFootprint BIG_ARROW; + private static final ArrowFootprint DASH_ARROW; + private static final ArrowFootprint BOLD_DASH_ARROW; + private static final ArrowFootprint BIG_DASH_ARROW; + private static final DoubleCrosshairFootprint DOUBLE_TARGET; + private static final DoubleCrosshairFootprint BOLD_DOUBLE_TARGET; + + // static initializers + static { + // HIGHLIGHT + Ellipse2D circle = new Ellipse2D.Double(); + circle.setFrame(-3, -3, 6, 6); + Stroke stroke = new BasicStroke(2); + HIGHLIGHT = stroke.createStrokedShape(circle); + + // LINE + LINE = new LineFootprint("Footprint.Line"); //$NON-NLS-1$ + footprints.add(LINE); + + // BOLD_LINE + BOLD_LINE = new LineFootprint("Footprint.BoldLine"); //$NON-NLS-1$ + BOLD_LINE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_LINE); + + // OUTLINE + OUTLINE = new OutlineFootprint("Footprint.Outline"); //$NON-NLS-1$ + footprints.add(OUTLINE); + + // BOLD_OUTLINE + BOLD_OUTLINE = new OutlineFootprint("Footprint.BoldOutline"); //$NON-NLS-1$ + BOLD_OUTLINE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_OUTLINE); + + // DOUBLE_ARROW + DOUBLE_ARROW = new DoubleArrowFootprint("Footprint.DoubleArrow"); //$NON-NLS-1$ + footprints.add(DOUBLE_ARROW); + + // BOLD_DOUBLE_ARROW + BOLD_DOUBLE_ARROW = new DoubleArrowFootprint("Footprint.BoldDoubleArrow"); //$NON-NLS-1$ + BOLD_DOUBLE_ARROW.setStroke(new BasicStroke(2)); + footprints.add(BOLD_DOUBLE_ARROW); + + // ARROW + ARROW = new ArrowFootprint("Footprint.Arrow"); //$NON-NLS-1$ + footprints.add(ARROW); + + // BOLD_ARROW + BOLD_ARROW = new ArrowFootprint("Footprint.BoldArrow"); //$NON-NLS-1$ + BOLD_ARROW.setStroke(new BasicStroke(2)); + footprints.add(BOLD_ARROW); + + // BIG_ARROW + BIG_ARROW = new ArrowFootprint("Footprint.BigArrow"); //$NON-NLS-1$ + BIG_ARROW.setStroke(new BasicStroke(4)); + BIG_ARROW.setTipLength(32); + footprints.add(BIG_ARROW); + + // DASH_ARROW + DASH_ARROW = new ArrowFootprint("Footprint.DashArrow"); //$NON-NLS-1$ + DASH_ARROW.setDashArray(DASHED_LINE); + footprints.add(DASH_ARROW); + + // BOLD_DASH_ARROW + BOLD_DASH_ARROW = new ArrowFootprint("Footprint.BoldDashArrow"); //$NON-NLS-1$ + BOLD_DASH_ARROW.setStroke(new BasicStroke(2)); + BOLD_DASH_ARROW.setDashArray(DASHED_LINE); + footprints.add(BOLD_DASH_ARROW); + + // BIG_DASH_ARROW + BIG_DASH_ARROW = new ArrowFootprint("Footprint.BigDashArrow"); //$NON-NLS-1$ + BIG_DASH_ARROW.setStroke(new BasicStroke(4)); + BIG_DASH_ARROW.setDashArray(DASHED_LINE); + BIG_DASH_ARROW.setTipLength(32); + footprints.add(BIG_DASH_ARROW); + + // DOUBLE_TARGET + DOUBLE_TARGET = new DoubleCrosshairFootprint("Footprint.DoubleTarget"); //$NON-NLS-1$ + footprints.add(DOUBLE_TARGET); + + // BOLD_DOUBLE_TARGET + BOLD_DOUBLE_TARGET = new DoubleCrosshairFootprint("Footprint.BoldDoubleTarget"); //$NON-NLS-1$ + BOLD_DOUBLE_TARGET.setStroke(new BasicStroke(2)); + footprints.add(BOLD_DOUBLE_TARGET); + + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java b/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java index f3b93a0b..d9167a62 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java +++ b/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java @@ -1,715 +1,715 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.Border; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.controls.*; - -/** - * A LineProfile measures pixel brightness along a line on a video image. - * - * @author Douglas Brown - */ -public class LineProfile extends TTrack { - - // static constants - /** The maximum allowed spread */ - public static final int MAX_SPREAD = 100; - - // instance fields - protected boolean fixedLine = true; // line is the same at all times - protected JCheckBoxMenuItem fixedLineItem; - protected JMenu orientationMenu; - protected JMenuItem horizOrientationItem; - protected JMenuItem xaxisOrientationItem; - protected int spread = 0; - protected JLabel spreadLabel; - protected IntegerField spreadField; - protected boolean isHorizontal = true; - protected boolean loading; - - /** - * Constructs a LineProfile. - */ - public LineProfile() { - super(); - defaultColors = new Color[] {Color.magenta}; - // assign a default name - setName(TrackerRes.getString("LineProfile.New.Name")); //$NON-NLS-1$ - // assign default plot variables - setProperty("highlights", "false"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("xVarPlot0", "x"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot0", "luma"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("pointsPlot0", "false"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yMinPlot0", new Double(0)); //$NON-NLS-1$ - setProperty("yMaxPlot0", new Double(255)); //$NON-NLS-1$ - // assign default table variables: x, y and luma - setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar2", "5"); //$NON-NLS-1$ //$NON-NLS-2$ - // set up footprint choices and color - setFootprints(new Footprint[] - {LineFootprint.getFootprint("Footprint.Outline"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.BoldOutline")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("LineProfile.Unmarked.Hint"); //$NON-NLS-1$ - // create toolbar components - spreadLabel = new JLabel(); - spreadField = new IntegerField(3); - spreadField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setSpread(spreadField.getIntValue()); - spreadField.setIntValue(getSpread()); - spreadField.selectAll(); - spreadField.requestFocusInWindow(); - firePropertyChange("data", null, LineProfile.this); // to views //$NON-NLS-1$ - } - }); - spreadField.addFocusListener(new FocusAdapter() { - public void focusGained(FocusEvent e) { - spreadField.selectAll(); - } - public void focusLost(FocusEvent e) { - setSpread(spreadField.getIntValue()); - spreadField.setIntValue(getSpread()); - firePropertyChange("data", null, LineProfile.this); // to views //$NON-NLS-1$ - } - }); - spreadField.setBorder(fieldBorder); - // create fixed line item - fixedLineItem = new JCheckBoxMenuItem(TrackerRes.getString("LineProfile.MenuItem.Fixed")); //$NON-NLS-1$ - fixedLineItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixed(fixedLineItem.isSelected()); - } - }); - // create orientation items - orientationMenu = new JMenu(TrackerRes.getString("LineProfile.Menu.Orientation")); //$NON-NLS-1$ - ButtonGroup group = new ButtonGroup(); - horizOrientationItem = new JRadioButtonMenuItem( - TrackerRes.getString("LineProfile.MenuItem.Horizontal")); //$NON-NLS-1$ - horizOrientationItem.setSelected(true); - horizOrientationItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if (trackerPanel == null) return; - XMLControl control = new XMLControlElement(LineProfile.this); - isHorizontal = horizOrientationItem.isSelected(); - if (!steps.isEmpty()) { - int n = trackerPanel.getFrameNumber(); - LineProfileStep step = (LineProfileStep)steps.getStep(n); - refreshStep(step); - trackerPanel.repaint(); - if (!loading) - Undo.postTrackEdit(LineProfile.this, control); - } - trackerPanel.getTFrame().getToolBar(trackerPanel).refresh(false); - dataValid = false; - support.firePropertyChange("data", null, null); // to views //$NON-NLS-1$ - } - }); - orientationMenu.add(horizOrientationItem); - group.add(horizOrientationItem); - xaxisOrientationItem = new JRadioButtonMenuItem( - TrackerRes.getString("LineProfile.MenuItem.XAxis")); //$NON-NLS-1$ - orientationMenu.add(xaxisOrientationItem); - group.add(xaxisOrientationItem); - } - - /** - * Sets the fixed property. When it is fixed, it is in the same - * position at all times. - * - * @param fixed true to fix the line - */ - public void setFixed(boolean fixed) { - if (fixed==fixedLine) return; - if (steps.isEmpty()) { - fixedLine = fixed; - return; - } - XMLControl control = new XMLControlElement(this); - fixedLine = fixed; - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - if (step!=null) { - steps = new StepArray(getStep(n)); - trackerPanel.repaint(); - } - } - if (fixed) { - keyFrames.clear(); - keyFrames.add(0); - } - if (!loading) - Undo.postTrackEdit(this, control); - repaint(); - } - - /** - * Gets the fixed property. - * - * @return true if line is fixed - */ - public boolean isFixed() { - return fixedLine; - } - - /** - * Sets the spread. Spread determines how many pixels - * on each side of the line are given full weight in the average. - * - * @param spread the desired spread - */ - public void setSpread(int spread) { - if (isLocked() || this.spread==spread) return; - XMLControl control = new XMLControlElement(this); - spread = Math.max(spread, 0); - this.spread = Math.min(spread, MAX_SPREAD); - if (!loading) - Undo.postTrackEdit(this, control); - repaint(); - dataValid = false; - } - - /** - * Gets the spread. Spread determines how many pixels - * on each side of the line are given full weight in the average. - * - * @return the spread - */ - public int getSpread() { - return spread; - } - - /** - * Overrides TTrack draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - super.draw(panel, _g); - } - - /** - * Overrides TTrack setTrailVisible method to keep trails hidden. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Creates a new step. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - public Step createStep(int n, double x, double y) { - return createStep(n, x, y, x, y); - } - - /** - * Creates a new step or sets end positions of an existing step. - * - * @param n the frame number - * @param x1 the x coordinate of end1 in image space - * @param y1 the y coordinate of end1 in image space - * @param x2 the x coordinate of end2 in image space - * @param y2 the y coordinate of end2 in image space - * @return the step - */ - public Step createStep(int n, double x1, double y1, double x2, double y2) { - if (isLocked()) return null; - int frame = isFixed()? 0: n; - LineProfileStep step = (LineProfileStep)steps.getStep(frame); - if (step == null) { - keyFrames.add(0); - // create new step 0 and autofill array - double xx = x2, yy = y2; - if (x1 == x2 && y1 == y2) { // occurs when initially mouse-marked - // make a step of length 50 for the step array to clone - if (trackerPanel != null) { - double theta = -trackerPanel.getCoords().getAngle(n); - if (isHorizontal) theta = 0; - xx = x1+50*Math.cos(theta); - yy = y1+50*Math.sin(theta); - } - else xx = x1 + 50; - } - step = new LineProfileStep(this, 0, x1, y1, xx, yy); - step.setFootprint(getFootprint()); - steps = new StepArray(step); - // set location of line ends - if (x1 == x2 && y1 == y2) { // mouse-marked step - step = (LineProfileStep)getStep(frame); - step.getLineEnd1().setLocation(x2, y2); - if (trackerPanel != null) { - step = (LineProfileStep)getStep(n); - step.getLineEnd0().setTrackEditTrigger(false); - trackerPanel.setSelectedPoint(step.getDefaultPoint()); - } - } - } - else { - keyFrames.add(frame); - step.getLineEnd0().setLocation(x1, y1); - step.getLineEnd1().setLocation(x2, y2); - } - return getStep(n); - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - return null; - } - - /** - * Overrides TTrack getStep method to provide fixedLine behavior. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - LineProfileStep step = (LineProfileStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Returns true if the step at the specified frame number is complete. - * - * @param n the frame number - * @return true if the step is complete, otherwise false - */ - public boolean isStepComplete(int n) { - return getStep(n) != null; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return LineProfileStep.getLength(); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 2; - } - - /** - * Implements findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step or motion vector that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || !isVisible() || isLocked()) - return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - Interactive ia = null; - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - if (step != null && - trackerPanel.getPlayer().getVideoClip().includesFrame(n)) - ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia == null) { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (step==null) { - hint = TrackerRes.getString("LineProfile.Unmarked.Hint"); //$NON-NLS-1$ - } - else hint = TrackerRes.getString("LineProfile.Hint"); //$NON-NLS-1$ - if (trackerPanel.getVideo() == null) { - hint += ", "+TrackerRes.getString("TTrack.ImportVideo.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ - } - return null; - } - if (ia instanceof LineProfileStep.LineEnd) { - partName = TrackerRes.getString("LineProfile.End.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("LineProfile.End.Hint"); //$NON-NLS-1$ - } - else if (ia instanceof LineProfileStep.Handle) { - partName = TrackerRes.getString("LineProfile.Handle.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("LineProfile.Handle.Hint"); //$NON-NLS-1$ - } - return ia; - } - - /** - * Refreshes the data. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - // get the datasets - int count = 0; - Dataset x = data.getDataset(count++); - Dataset y = data.getDataset(count++); - Dataset r = data.getDataset(count++); - Dataset g = data.getDataset(count++); - Dataset b = data.getDataset(count++); - Dataset luma = data.getDataset(count++); - Dataset w = data.getDataset(count++); - // assign column names to the datasets - String pixelNum = "n"; //$NON-NLS-1$ - if (!x.getColumnName(0).equals(pixelNum)) { // not yet initialized - x.setXYColumnNames(pixelNum, "x"); //$NON-NLS-1$ - y.setXYColumnNames(pixelNum, "y"); //$NON-NLS-1$ - r.setXYColumnNames(pixelNum, "R"); //$NON-NLS-1$ - g.setXYColumnNames(pixelNum, "G"); //$NON-NLS-1$ - b.setXYColumnNames(pixelNum, "B"); //$NON-NLS-1$ - luma.setXYColumnNames(pixelNum, "luma"); //$NON-NLS-1$ - w.setXYColumnNames(pixelNum, "pixels"); //$NON-NLS-1$ - } - else for (int i = 0; i < count; i++) { - data.getDataset(i).clear(); - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < dataDescriptions.length; i++) { - dataDescriptions[i] = TrackerRes.getString("LineProfile.Data.Description."+i); //$NON-NLS-1$ - } - // get data from current line profile step if video is visible - if (trackerPanel.getVideo() != null && - trackerPanel.getVideo().isVisible()) { - int n = trackerPanel.getPlayer().getFrameNumber(); - LineProfileStep step = (LineProfileStep)getStep(n); - if (step != null) { - double[][] profile = step.getProfileData(trackerPanel); - // append the data to the data set - if (profile != null) { - for (int i = 0; i < profile[0].length; i++) { - x.append(i, profile[0][i]); - y.append(i, profile[1][i]); - r.append(i, profile[2][i]); - g.append(i, profile[3][i]); - b.append(i, profile[4][i]); - luma.append(i, profile[5][i]); - w.append(i, profile[6][i]); - } - } - } - } - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - fixedLineItem.setText(TrackerRes.getString("LineProfile.MenuItem.Fixed")); //$NON-NLS-1$ - fixedLineItem.setSelected(isFixed()); - menu.remove(deleteTrackItem); - if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) - menu.addSeparator(); - menu.add(orientationMenu); - menu.addSeparator(); - menu.add(fixedLineItem); - // replace delete item - if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ - if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) - menu.addSeparator(); - menu.add(deleteTrackItem); - } - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return a collection of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - spreadLabel.setText(TrackerRes.getString("LineProfile.Label.Spread")); //$NON-NLS-1$ - Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); - spreadLabel.setBorder(empty); - list.add(spreadLabel); - spreadField.setIntValue(getSpread()); - spreadField.setEnabled(!isLocked()); - list.add(spreadField); - return list; - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - Object[] objectsToSize = new Object[] - {spreadLabel}; - FontSizer.setFonts(objectsToSize, level); - } - - /** - * Responds to property change events. LineProfile listens for the following - * events: "stepnumber", "image" and "transform" from TrackerPanel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (trackerPanel != null) { - String name = e.getPropertyName(); - if (name.equals("stepnumber")) { //$NON-NLS-1$ - dataValid = false; - support.firePropertyChange(e); // to views - } - else if (name.equals("image")) { //$NON-NLS-1$ - dataValid = false; - support.firePropertyChange(e); // to views - } - else if (name.equals("transform") && !steps.isEmpty()) { //$NON-NLS-1$ - int n = trackerPanel.getFrameNumber(); - LineProfileStep step = (LineProfileStep)steps.getStep(n); - refreshStep(step); - } - } - super.propertyChange(e); // handled by TTrack - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("LineProfile.Name"); //$NON-NLS-1$ - } - -//_______________________ private and protected methods _______________________ - - /** - * Refreshes a step by setting it equal to a keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(LineProfileStep step) { - if (step==null) return; - int key = 0; - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - // compare step with keyStep - LineProfileStep keyStep = (LineProfileStep)steps.getStep(key); - boolean different = - keyStep.getLineEnd0().getX()!=step.getLineEnd0().getX() - || keyStep.getLineEnd0().getY()!=step.getLineEnd0().getY() - || keyStep.getLineEnd1().getX()!=step.getLineEnd1().getX() - || keyStep.getLineEnd1().getY()!=step.getLineEnd1().getY(); - // update step if needed - if (different) { - step.getLineEnd0().setLocation(keyStep.getLineEnd0()); - step.getLineEnd1().setLocation(keyStep.getLineEnd1()); - step.getHandle().setLocation(keyStep.getHandle()); - step.erase(); - } - step.getLineEnd0().setTrackEditTrigger(true); - step.rotate(); - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - XML.setLoader(FrameData.class, new FrameDataLoader()); - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - LineProfile profile = (LineProfile) obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save spread - control.setValue("spread", profile.getSpread()); //$NON-NLS-1$ - // save fixed - control.setValue("fixed", profile.isFixed()); //$NON-NLS-1$ - // save step data - Step[] steps = profile.getSteps(); - int count = steps.length; - if (profile.isFixed()) count = 1; - FrameData[] data = new FrameData[count]; - for (int n = 0; n < count; n++) { - // save only key frames - if (steps[n] == null || !profile.keyFrames.contains(n)) continue; - data[n] = new FrameData((LineProfileStep)steps[n]); - } - control.setValue("framedata", data); //$NON-NLS-1$ - // save orientation - control.setValue("horizontal", profile.isHorizontal); //$NON-NLS-1$ - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - LineProfile profile = new LineProfile(); - return profile; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - LineProfile profile = (LineProfile) obj; - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - boolean locked = profile.isLocked(); - profile.setLocked(false); - profile.loading = true; - // load orientation - if (control.getPropertyNames().contains("horizontal")) //$NON-NLS-1$ - profile.isHorizontal = control.getBoolean("horizontal"); //$NON-NLS-1$ - else profile.isHorizontal = !control.getBoolean("rotates"); //$NON-NLS-1$ - if (profile.isHorizontal) - profile.horizOrientationItem.setSelected(true); - else profile.xaxisOrientationItem.setSelected(true); - // load spread - int i = control.getInt("spread"); //$NON-NLS-1$ - if (i != Integer.MIN_VALUE) { - profile.setSpread(i); - } - // load fixed before steps data - if (control.getPropertyNames().contains("fixed")) //$NON-NLS-1$ - profile.fixedLine = control.getBoolean("fixed"); //$NON-NLS-1$ - // load step data - profile.keyFrames.clear(); - FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ - if (data != null) { - for (int n = 0; n < data.length; n++) { - if (data[n] != null) { - profile.createStep(n, data[n].data[0], data[n].data[1], data[n].data[2], data[n].data[3]); - } - } - } - profile.spreadField.setIntValue(profile.getSpread()); - profile.setLocked(locked); - profile.loading = false; - profile.repaint(); - return obj; - } - } - - /** - * Inner class containing the profile data for a single frame number. - */ - private static class FrameData { - double[] data = new double[4]; - FrameData() {} - FrameData(LineProfileStep step) { - data[0] = step.getLineEnd0().x; - data[1] = step.getLineEnd0().y; - data[2] = step.getLineEnd1().x; - data[3] = step.getLineEnd1().y; - } - } - - /** - * A class to save and load a FrameData. - */ - private static class FrameDataLoader - implements XML.ObjectLoader { - - public void saveObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - control.setValue("x1", data.data[0]); //$NON-NLS-1$ - control.setValue("y1", data.data[1]); //$NON-NLS-1$ - control.setValue("x2", data.data[2]); //$NON-NLS-1$ - control.setValue("y2", data.data[3]); //$NON-NLS-1$ - } - - public Object createObject(XMLControl control) { - return new FrameData(); - } - - public Object loadObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - if (control.getPropertyNames().contains("x1")) { //$NON-NLS-1$ - data.data[0] = control.getDouble("x1"); //$NON-NLS-1$ - data.data[1] = control.getDouble("y1"); //$NON-NLS-1$ - data.data[2] = control.getDouble("x2"); //$NON-NLS-1$ - data.data[3] = control.getDouble("y2"); //$NON-NLS-1$ - } - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.Border; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.controls.*; + +/** + * A LineProfile measures pixel brightness along a line on a video image. + * + * @author Douglas Brown + */ +public class LineProfile extends TTrack { + + // static constants + /** The maximum allowed spread */ + public static final int MAX_SPREAD = 100; + + // instance fields + protected boolean fixedLine = true; // line is the same at all times + protected JCheckBoxMenuItem fixedLineItem; + protected JMenu orientationMenu; + protected JMenuItem horizOrientationItem; + protected JMenuItem xaxisOrientationItem; + protected int spread = 0; + protected JLabel spreadLabel; + protected IntegerField spreadField; + protected boolean isHorizontal = true; + protected boolean loading; + + /** + * Constructs a LineProfile. + */ + public LineProfile() { + super(); + defaultColors = new Color[] {Color.magenta}; + // assign a default name + setName(TrackerRes.getString("LineProfile.New.Name")); //$NON-NLS-1$ + // assign default plot variables + setProperty("highlights", "false"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot0", "x"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot0", "luma"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("pointsPlot0", "false"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yMinPlot0", new Double(0)); //$NON-NLS-1$ + setProperty("yMaxPlot0", new Double(255)); //$NON-NLS-1$ + // assign default table variables: x, y and luma + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar2", "5"); //$NON-NLS-1$ //$NON-NLS-2$ + // set up footprint choices and color + setFootprints(new Footprint[] + {LineFootprint.getFootprint("Footprint.Outline"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.BoldOutline")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("LineProfile.Unmarked.Hint"); //$NON-NLS-1$ + // create toolbar components + spreadLabel = new JLabel(); + spreadField = new IntegerField(3); + spreadField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setSpread(spreadField.getIntValue()); + spreadField.setIntValue(getSpread()); + spreadField.selectAll(); + spreadField.requestFocusInWindow(); + firePropertyChange("data", null, LineProfile.this); // to views //$NON-NLS-1$ + } + }); + spreadField.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + spreadField.selectAll(); + } + public void focusLost(FocusEvent e) { + setSpread(spreadField.getIntValue()); + spreadField.setIntValue(getSpread()); + firePropertyChange("data", null, LineProfile.this); // to views //$NON-NLS-1$ + } + }); + spreadField.setBorder(fieldBorder); + // create fixed line item + fixedLineItem = new JCheckBoxMenuItem(TrackerRes.getString("LineProfile.MenuItem.Fixed")); //$NON-NLS-1$ + fixedLineItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixed(fixedLineItem.isSelected()); + } + }); + // create orientation items + orientationMenu = new JMenu(TrackerRes.getString("LineProfile.Menu.Orientation")); //$NON-NLS-1$ + ButtonGroup group = new ButtonGroup(); + horizOrientationItem = new JRadioButtonMenuItem( + TrackerRes.getString("LineProfile.MenuItem.Horizontal")); //$NON-NLS-1$ + horizOrientationItem.setSelected(true); + horizOrientationItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (trackerPanel == null) return; + XMLControl control = new XMLControlElement(LineProfile.this); + isHorizontal = horizOrientationItem.isSelected(); + if (!steps.isEmpty()) { + int n = trackerPanel.getFrameNumber(); + LineProfileStep step = (LineProfileStep)steps.getStep(n); + refreshStep(step); + trackerPanel.repaint(); + if (!loading) + Undo.postTrackEdit(LineProfile.this, control); + } + trackerPanel.getTFrame().getToolBar(trackerPanel).refresh(false); + dataValid = false; + support.firePropertyChange("data", null, null); // to views //$NON-NLS-1$ + } + }); + orientationMenu.add(horizOrientationItem); + group.add(horizOrientationItem); + xaxisOrientationItem = new JRadioButtonMenuItem( + TrackerRes.getString("LineProfile.MenuItem.XAxis")); //$NON-NLS-1$ + orientationMenu.add(xaxisOrientationItem); + group.add(xaxisOrientationItem); + } + + /** + * Sets the fixed property. When it is fixed, it is in the same + * position at all times. + * + * @param fixed true to fix the line + */ + public void setFixed(boolean fixed) { + if (fixed==fixedLine) return; + if (steps.isEmpty()) { + fixedLine = fixed; + return; + } + XMLControl control = new XMLControlElement(this); + fixedLine = fixed; + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + if (step!=null) { + steps = new StepArray(getStep(n)); + trackerPanel.repaint(); + } + } + if (fixed) { + keyFrames.clear(); + keyFrames.add(0); + } + if (!loading) + Undo.postTrackEdit(this, control); + repaint(); + } + + /** + * Gets the fixed property. + * + * @return true if line is fixed + */ + public boolean isFixed() { + return fixedLine; + } + + /** + * Sets the spread. Spread determines how many pixels + * on each side of the line are given full weight in the average. + * + * @param spread the desired spread + */ + public void setSpread(int spread) { + if (isLocked() || this.spread==spread) return; + XMLControl control = new XMLControlElement(this); + spread = Math.max(spread, 0); + this.spread = Math.min(spread, MAX_SPREAD); + if (!loading) + Undo.postTrackEdit(this, control); + repaint(); + dataValid = false; + } + + /** + * Gets the spread. Spread determines how many pixels + * on each side of the line are given full weight in the average. + * + * @return the spread + */ + public int getSpread() { + return spread; + } + + /** + * Overrides TTrack draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + super.draw(panel, _g); + } + + /** + * Overrides TTrack setTrailVisible method to keep trails hidden. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Creates a new step. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the step + */ + public Step createStep(int n, double x, double y) { + return createStep(n, x, y, x, y); + } + + /** + * Creates a new step or sets end positions of an existing step. + * + * @param n the frame number + * @param x1 the x coordinate of end1 in image space + * @param y1 the y coordinate of end1 in image space + * @param x2 the x coordinate of end2 in image space + * @param y2 the y coordinate of end2 in image space + * @return the step + */ + public Step createStep(int n, double x1, double y1, double x2, double y2) { + if (isLocked()) return null; + int frame = isFixed()? 0: n; + LineProfileStep step = (LineProfileStep)steps.getStep(frame); + if (step == null) { + keyFrames.add(0); + // create new step 0 and autofill array + double xx = x2, yy = y2; + if (x1 == x2 && y1 == y2) { // occurs when initially mouse-marked + // make a step of length 50 for the step array to clone + if (trackerPanel != null) { + double theta = -trackerPanel.getCoords().getAngle(n); + if (isHorizontal) theta = 0; + xx = x1+50*Math.cos(theta); + yy = y1+50*Math.sin(theta); + } + else xx = x1 + 50; + } + step = new LineProfileStep(this, 0, x1, y1, xx, yy); + step.setFootprint(getFootprint()); + steps = new StepArray(step); + // set location of line ends + if (x1 == x2 && y1 == y2) { // mouse-marked step + step = (LineProfileStep)getStep(frame); + step.getLineEnd1().setLocation(x2, y2); + if (trackerPanel != null) { + step = (LineProfileStep)getStep(n); + step.getLineEnd0().setTrackEditTrigger(false); + trackerPanel.setSelectedPoint(step.getDefaultPoint()); + } + } + } + else { + keyFrames.add(frame); + step.getLineEnd0().setLocation(x1, y1); + step.getLineEnd1().setLocation(x2, y2); + } + return getStep(n); + } + + /** + * Overrides TTrack deleteStep method to prevent deletion. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + return null; + } + + /** + * Overrides TTrack getStep method to provide fixedLine behavior. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + LineProfileStep step = (LineProfileStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Returns true if the step at the specified frame number is complete. + * + * @param n the frame number + * @return true if the step is complete, otherwise false + */ + public boolean isStepComplete(int n) { + return getStep(n) != null; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return LineProfileStep.getLength(); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 2; + } + + /** + * Implements findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step or motion vector that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || !isVisible() || isLocked()) + return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + Interactive ia = null; + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + if (step != null && + trackerPanel.getPlayer().getVideoClip().includesFrame(n)) + ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (step==null) { + hint = TrackerRes.getString("LineProfile.Unmarked.Hint"); //$NON-NLS-1$ + } + else hint = TrackerRes.getString("LineProfile.Hint"); //$NON-NLS-1$ + if (trackerPanel.getVideo() == null) { + hint += ", "+TrackerRes.getString("TTrack.ImportVideo.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ + } + return null; + } + if (ia instanceof LineProfileStep.LineEnd) { + partName = TrackerRes.getString("LineProfile.End.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("LineProfile.End.Hint"); //$NON-NLS-1$ + } + else if (ia instanceof LineProfileStep.Handle) { + partName = TrackerRes.getString("LineProfile.Handle.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("LineProfile.Handle.Hint"); //$NON-NLS-1$ + } + return ia; + } + + /** + * Refreshes the data. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + // get the datasets + int count = 0; + Dataset x = data.getDataset(count++); + Dataset y = data.getDataset(count++); + Dataset r = data.getDataset(count++); + Dataset g = data.getDataset(count++); + Dataset b = data.getDataset(count++); + Dataset luma = data.getDataset(count++); + Dataset w = data.getDataset(count++); + // assign column names to the datasets + String pixelNum = "n"; //$NON-NLS-1$ + if (!x.getColumnName(0).equals(pixelNum)) { // not yet initialized + x.setXYColumnNames(pixelNum, "x"); //$NON-NLS-1$ + y.setXYColumnNames(pixelNum, "y"); //$NON-NLS-1$ + r.setXYColumnNames(pixelNum, "R"); //$NON-NLS-1$ + g.setXYColumnNames(pixelNum, "G"); //$NON-NLS-1$ + b.setXYColumnNames(pixelNum, "B"); //$NON-NLS-1$ + luma.setXYColumnNames(pixelNum, "luma"); //$NON-NLS-1$ + w.setXYColumnNames(pixelNum, "pixels"); //$NON-NLS-1$ + } + else for (int i = 0; i < count; i++) { + data.getDataset(i).clear(); + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < dataDescriptions.length; i++) { + dataDescriptions[i] = TrackerRes.getString("LineProfile.Data.Description."+i); //$NON-NLS-1$ + } + // get data from current line profile step if video is visible + if (trackerPanel.getVideo() != null && + trackerPanel.getVideo().isVisible()) { + int n = trackerPanel.getPlayer().getFrameNumber(); + LineProfileStep step = (LineProfileStep)getStep(n); + if (step != null) { + double[][] profile = step.getProfileData(trackerPanel); + // append the data to the data set + if (profile != null) { + for (int i = 0; i < profile[0].length; i++) { + x.append(i, profile[0][i]); + y.append(i, profile[1][i]); + r.append(i, profile[2][i]); + g.append(i, profile[3][i]); + b.append(i, profile[4][i]); + luma.append(i, profile[5][i]); + w.append(i, profile[6][i]); + } + } + } + } + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + fixedLineItem.setText(TrackerRes.getString("LineProfile.MenuItem.Fixed")); //$NON-NLS-1$ + fixedLineItem.setSelected(isFixed()); + menu.remove(deleteTrackItem); + if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) + menu.addSeparator(); + menu.add(orientationMenu); + menu.addSeparator(); + menu.add(fixedLineItem); + // replace delete item + if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ + if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) + menu.addSeparator(); + menu.add(deleteTrackItem); + } + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return a collection of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + spreadLabel.setText(TrackerRes.getString("LineProfile.Label.Spread")); //$NON-NLS-1$ + Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); + spreadLabel.setBorder(empty); + list.add(spreadLabel); + spreadField.setIntValue(getSpread()); + spreadField.setEnabled(!isLocked()); + list.add(spreadField); + return list; + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {spreadLabel}; + FontSizer.setFonts(objectsToSize, level); + } + + /** + * Responds to property change events. LineProfile listens for the following + * events: "stepnumber", "image" and "transform" from TrackerPanel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (trackerPanel != null) { + String name = e.getPropertyName(); + if (name.equals("stepnumber")) { //$NON-NLS-1$ + dataValid = false; + support.firePropertyChange(e); // to views + } + else if (name.equals("image")) { //$NON-NLS-1$ + dataValid = false; + support.firePropertyChange(e); // to views + } + else if (name.equals("transform") && !steps.isEmpty()) { //$NON-NLS-1$ + int n = trackerPanel.getFrameNumber(); + LineProfileStep step = (LineProfileStep)steps.getStep(n); + refreshStep(step); + } + } + super.propertyChange(e); // handled by TTrack + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("LineProfile.Name"); //$NON-NLS-1$ + } + +//_______________________ private and protected methods _______________________ + + /** + * Refreshes a step by setting it equal to a keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(LineProfileStep step) { + if (step==null) return; + int key = 0; + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + // compare step with keyStep + LineProfileStep keyStep = (LineProfileStep)steps.getStep(key); + boolean different = + keyStep.getLineEnd0().getX()!=step.getLineEnd0().getX() + || keyStep.getLineEnd0().getY()!=step.getLineEnd0().getY() + || keyStep.getLineEnd1().getX()!=step.getLineEnd1().getX() + || keyStep.getLineEnd1().getY()!=step.getLineEnd1().getY(); + // update step if needed + if (different) { + step.getLineEnd0().setLocation(keyStep.getLineEnd0()); + step.getLineEnd1().setLocation(keyStep.getLineEnd1()); + step.getHandle().setLocation(keyStep.getHandle()); + step.erase(); + } + step.getLineEnd0().setTrackEditTrigger(true); + step.rotate(); + } + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + XML.setLoader(FrameData.class, new FrameDataLoader()); + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + LineProfile profile = (LineProfile) obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save spread + control.setValue("spread", profile.getSpread()); //$NON-NLS-1$ + // save fixed + control.setValue("fixed", profile.isFixed()); //$NON-NLS-1$ + // save step data + Step[] steps = profile.getSteps(); + int count = steps.length; + if (profile.isFixed()) count = 1; + FrameData[] data = new FrameData[count]; + for (int n = 0; n < count; n++) { + // save only key frames + if (steps[n] == null || !profile.keyFrames.contains(n)) continue; + data[n] = new FrameData((LineProfileStep)steps[n]); + } + control.setValue("framedata", data); //$NON-NLS-1$ + // save orientation + control.setValue("horizontal", profile.isHorizontal); //$NON-NLS-1$ + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + LineProfile profile = new LineProfile(); + return profile; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + LineProfile profile = (LineProfile) obj; + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + boolean locked = profile.isLocked(); + profile.setLocked(false); + profile.loading = true; + // load orientation + if (control.getPropertyNames().contains("horizontal")) //$NON-NLS-1$ + profile.isHorizontal = control.getBoolean("horizontal"); //$NON-NLS-1$ + else profile.isHorizontal = !control.getBoolean("rotates"); //$NON-NLS-1$ + if (profile.isHorizontal) + profile.horizOrientationItem.setSelected(true); + else profile.xaxisOrientationItem.setSelected(true); + // load spread + int i = control.getInt("spread"); //$NON-NLS-1$ + if (i != Integer.MIN_VALUE) { + profile.setSpread(i); + } + // load fixed before steps data + if (control.getPropertyNames().contains("fixed")) //$NON-NLS-1$ + profile.fixedLine = control.getBoolean("fixed"); //$NON-NLS-1$ + // load step data + profile.keyFrames.clear(); + FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ + if (data != null) { + for (int n = 0; n < data.length; n++) { + if (data[n] != null) { + profile.createStep(n, data[n].data[0], data[n].data[1], data[n].data[2], data[n].data[3]); + } + } + } + profile.spreadField.setIntValue(profile.getSpread()); + profile.setLocked(locked); + profile.loading = false; + profile.repaint(); + return obj; + } + } + + /** + * Inner class containing the profile data for a single frame number. + */ + private static class FrameData { + double[] data = new double[4]; + FrameData() {} + FrameData(LineProfileStep step) { + data[0] = step.getLineEnd0().x; + data[1] = step.getLineEnd0().y; + data[2] = step.getLineEnd1().x; + data[3] = step.getLineEnd1().y; + } + } + + /** + * A class to save and load a FrameData. + */ + private static class FrameDataLoader + implements XML.ObjectLoader { + + public void saveObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + control.setValue("x1", data.data[0]); //$NON-NLS-1$ + control.setValue("y1", data.data[1]); //$NON-NLS-1$ + control.setValue("x2", data.data[2]); //$NON-NLS-1$ + control.setValue("y2", data.data[3]); //$NON-NLS-1$ + } + + public Object createObject(XMLControl control) { + return new FrameData(); + } + + public Object loadObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + if (control.getPropertyNames().contains("x1")) { //$NON-NLS-1$ + data.data[0] = control.getDouble("x1"); //$NON-NLS-1$ + data.data[1] = control.getDouble("y1"); //$NON-NLS-1$ + data.data[2] = control.getDouble("x2"); //$NON-NLS-1$ + data.data[3] = control.getDouble("y2"); //$NON-NLS-1$ + } + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/MainTView.java b/src/org/opensourcephysics/cabrillo/tracker/MainTView.java index 91194f9b..7c4a9470 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/MainTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/MainTView.java @@ -1,768 +1,768 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; - -import javax.swing.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; - -/** - * This is the main video view for Tracker. It puts the tracker panel in a zoomable - * scrollpane and puts the player in a detachable toolbar. - * - * @author Douglas Brown - */ -public class MainTView extends JPanel implements TView { - - // instance fields - private TrackerPanel trackerPanel; - JScrollPane scrollPane; - Rectangle scrollRect = new Rectangle(); - private Point zoomCenter = new Point(); - private JToolBar playerBar; - - /** - * Constructs a main view of a tracker panel. - * - * @param panel the tracker panel - */ - public MainTView(TrackerPanel panel) { - trackerPanel = panel; - init(); - setLayout(new BorderLayout()); - scrollPane = new JScrollPane(); - scrollPane.addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - TToolBar toolbar = TToolBar.getToolbar(trackerPanel); - toolbar.refreshZoomButton(); - trackerPanel.eraseAll(); - trackerPanel.repaint(); - } - }); - SwingUtilities.replaceUIActionMap(scrollPane, null); - add(scrollPane, BorderLayout.CENTER); - // add player to the playerBar - playerBar = new JToolBar(); - add(playerBar, BorderLayout.SOUTH); - trackerPanel.getPlayer().setBorder(null); - trackerPanel.setPlayerVisible(false); - playerBar.add(trackerPanel.getPlayer()); - // add trackerPanel to scrollPane - scrollPane.setViewportView(trackerPanel); - trackerPanel.setScrollPane(scrollPane); - -// trackerPanel.addOptionController(); - // add mouse listener for zoom - trackerPanel.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - zoomCenter.setLocation(e.getPoint()); - } - public void mouseReleased(MouseEvent e) { - // handle zoom actions - if (trackerPanel.getCursor() == Tracker.zoomOutCursor) - zoomOut(false); - else if (trackerPanel.getCursor() == Tracker.zoomInCursor) - zoomIn(false); - } - }); - trackerPanel.addMouseWheelListener(new MouseWheelListener() { - public void mouseWheelMoved(MouseWheelEvent e) { - zoomCenter.setLocation(e.getPoint()); - if (e.getWheelRotation() > 0) { - zoomOut(true); // zoom by a step - } - else { - zoomIn(true); // zoom by a step - } - } - }); - trackerPanel.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - JButton z = trackerPanel.getTFrame().getToolBar(trackerPanel).zoomButton; - int d = trackerPanel.getSelectedPoint() == null? 10: 0; - Rectangle rect = scrollPane.getViewport().getViewRect(); - switch (e.getKeyCode()) { - case KeyEvent.VK_Z: - if (!e.isControlDown()) z.setSelected(true); - break; - case KeyEvent.VK_ALT: - break; - case KeyEvent.VK_PAGE_UP: - if (!trackerPanel.getPlayer().isEnabled()) return; - if (e.isShiftDown()) { - int n = trackerPanel.getPlayer().getStepNumber()-5; - trackerPanel.getPlayer().setStepNumber(n); - } - else trackerPanel.getPlayer().back(); - break; - case KeyEvent.VK_PAGE_DOWN: - if (!trackerPanel.getPlayer().isEnabled()) return; - if (e.isShiftDown()) { - int n = trackerPanel.getPlayer().getStepNumber()+5; - trackerPanel.getPlayer().setStepNumber(n); - } - else trackerPanel.getPlayer().step(); - break; - case KeyEvent.VK_HOME: - if (!trackerPanel.getPlayer().isEnabled()) return; - trackerPanel.getPlayer().setStepNumber(0); - break; - case KeyEvent.VK_END: - if (!trackerPanel.getPlayer().isEnabled()) return; - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); - break; - case KeyEvent.VK_UP: - rect.y -= d; - trackerPanel.scrollRectToVisible(rect); - break; - case KeyEvent.VK_DOWN: - rect.y += d; - trackerPanel.scrollRectToVisible(rect); - break; - case KeyEvent.VK_RIGHT: - rect.x += d; - trackerPanel.scrollRectToVisible(rect); - break; - case KeyEvent.VK_LEFT: - rect.x -= d; - trackerPanel.scrollRectToVisible(rect); - break; - } - if(z.isSelected()) { - trackerPanel.setCursor(e.isAltDown()? - Tracker.getZoomOutCursor(): - Tracker.getZoomInCursor()); - } - } - public void keyReleased(final KeyEvent e) { - final JButton z = trackerPanel.getTFrame().getToolBar(trackerPanel).zoomButton; - if(e.getKeyCode()==KeyEvent.VK_Z) { - z.setSelected(false); - trackerPanel.setCursor(Cursor.getDefaultCursor()); - } - if(z.isSelected()) { - Runnable runner = new Runnable() { - public synchronized void run() { - trackerPanel.setCursor(e.isAltDown()? - Tracker.getZoomOutCursor(): - Tracker.getZoomInCursor()); - } - }; - SwingUtilities.invokeLater(runner); - } - } - }); - } - - /** - * Gets the popup menu when right-clicked. - * - * @return the popup menu - */ - JPopupMenu getPopupMenu() { - if (trackerPanel.getCursor() == Tracker.zoomInCursor - || trackerPanel.getCursor() == Tracker.zoomOutCursor) { - return null; - } - JPopupMenu popup = trackerPanel.popup; - // see if a track has been clicked - boolean trackClicked = false; - Interactive iad = trackerPanel.getInteractive(); - if (iad instanceof TPoint) { - TPoint p = (TPoint)iad; - TTrack track = null; - Step step = null; - Iterator it = trackerPanel.getTracks().iterator(); - while(it.hasNext()) { - track = it.next(); - step = track.getStep(p, trackerPanel); - if (step != null) break; - } - if (step != null) { // found clicked track - trackClicked = true; - Step prev = trackerPanel.selectedStep; - trackerPanel.selectedStep = step; - popup = track.getMenu(trackerPanel).getPopupMenu(); - trackerPanel.selectedStep = prev; - } - } - if (!trackClicked) { // video or non-track TPoint was clicked - popup.removeAll(); - final Video vid = trackerPanel.getVideo(); - // add zoom menus - JMenuItem item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomIn")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - zoomIn(false); - } - }); - item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomOut")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - zoomOut(false); - } - }); - item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomToFit")); //$NON-NLS-1$ - popup.add(item); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trackerPanel.setMagnification(-1); - TToolBar toolbar = TToolBar.getToolbar(trackerPanel); - toolbar.refreshZoomButton(); - } - }); - - // selection items - DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); - if (zoomBox.isDragged() && isStepsInZoomBox()) { - popup.addSeparator(); - item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.Select")); //$NON-NLS-1$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - handleStepsInZoomBox(true); - } - }); - popup.add(item); - item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.Deselect")); //$NON-NLS-1$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - handleStepsInZoomBox(false); - } - }); - popup.add(item); - } - - // clip setting item - if (trackerPanel.isEnabled("button.clipSettings")) {//$NON-NLS-1$ - if (popup.getComponentCount() > 0) - popup.addSeparator(); - item = new JMenuItem(MediaRes.getString("ClipInspector.Title")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - ClipControl clipControl = trackerPanel.getPlayer().getClipControl(); - TFrame frame = trackerPanel.getTFrame(); - ClipInspector inspector = clip.getClipInspector(clipControl, frame); - if(inspector.isVisible()) { - return; - } - FontSizer.setFonts(inspector, FontSizer.getLevel()); - inspector.pack(); - Point p0 = new Frame().getLocation(); - Point loc = inspector.getLocation(); - if((loc.x==p0.x)&&(loc.y==p0.y)) { - // center inspector on the main view - Rectangle rect = trackerPanel.getVisibleRect(); - Point p = frame.getMainView(trackerPanel).scrollPane.getLocationOnScreen(); - int x = p.x+(rect.width-inspector.getBounds().width)/2; - int y = p.y+(rect.height-inspector.getBounds().height)/2; - inspector.setLocation(x, y); - } - inspector.initialize(); - inspector.setVisible(true); - refresh(); - } - }); - popup.add(item); - } - if (trackerPanel.isEnabled("edit.copyImage")) { //$NON-NLS-1$ - popup.addSeparator(); - // copy image item - Action copyImageAction = new AbstractAction(TrackerRes.getString("TMenuBar.Menu.CopyImage")) { //$NON-NLS-1$ - public void actionPerformed(ActionEvent e) { - BufferedImage image = new TrackerIO.ComponentImage(trackerPanel).getImage(); - DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); - if (zoomBox.isDragged()) { - Rectangle zRect = zoomBox.reportZoom(); - BufferedImage image2 = new BufferedImage(zRect.width, zRect.height, image.getType()); - Graphics2D g = image2.createGraphics(); - g.drawImage(image, -zRect.x, -zRect.y, null); - TrackerIO.copyImage(image2); - } - else TrackerIO.copyImage(image); - } - }; - JMenuItem copyImageItem = new JMenuItem(copyImageAction); - popup.add(copyImageItem); - // snapshot item - Action snapshotAction = new AbstractAction( - DisplayRes.getString("DisplayPanel.Snapshot_menu_item")) { //$NON-NLS-1$ - public void actionPerformed(ActionEvent e) { - trackerPanel.snapshot(); - } - }; - JMenuItem snapshotItem = new JMenuItem(snapshotAction); - popup.add(snapshotItem); - } - - TMenuBar menubar = TMenuBar.getMenuBar(trackerPanel); - // video filters menu - if (vid != null && trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ - JMenu filtersMenu = menubar.filtersMenu; - if (filtersMenu.getItemCount() > 0) { - popup.addSeparator(); - popup.add(filtersMenu); - } - } - JMenu tracksMenu = new JMenu(TrackerRes.getString("TMenuBar.Menu.Tracks")); //$NON-NLS-1$ - if (menubar.createMenu.getItemCount() == 0) - for (Component c: menubar.newTrackItems) { - menubar.createMenu.add(c); - } - if (menubar.createMenu.getItemCount() > 0) - tracksMenu.add(menubar.createMenu); - if (menubar.cloneMenu.getItemCount() > 0 - && trackerPanel.isEnabled("new.clone")) //$NON-NLS-1$ - tracksMenu.add(menubar.cloneMenu); - // get list of tracks for track menus - TTrack track = null; - CoordAxes axes = trackerPanel.getAxes(); - ArrayList tracks = trackerPanel.getUserTracks(); - // add track items - if (!tracks.isEmpty()) { - if (tracksMenu.getItemCount() > 0) - tracksMenu.addSeparator(); - Iterator it = tracks.iterator(); - while (it.hasNext()) { - tracksMenu.add(menubar.getMenu(it.next())); - } - } - // add axes and calibration tool items - if (trackerPanel.isEnabled("button.axes") //$NON-NLS-1$ - || trackerPanel.isEnabled("calibration.stick") //$NON-NLS-1$ - || trackerPanel.isEnabled("calibration.tape") //$NON-NLS-1$ - || trackerPanel.isEnabled("calibration.points") //$NON-NLS-1$ - || trackerPanel.isEnabled("calibration.offsetOrigin")) { //$NON-NLS-1$ - if (tracksMenu.getItemCount() > 0) - tracksMenu.addSeparator(); - if (axes != null && trackerPanel.isEnabled("button.axes")) { //$NON-NLS-1$ - track = axes; - tracksMenu.add(menubar.getMenu(track)); - } - - if (!trackerPanel.calibrationTools.isEmpty()) { - for (TTrack next: trackerPanel.getTracks()) { - if (trackerPanel.calibrationTools.contains(next)) { - if (next instanceof TapeMeasure) { - TapeMeasure tape = (TapeMeasure)next; - if (tape.isStickMode() - && !trackerPanel.isEnabled("calibration.stick")) //$NON-NLS-1$ - continue; - if (!tape.isStickMode() - && !trackerPanel.isEnabled("calibration.tape")) //$NON-NLS-1$ - continue; - } - if (next instanceof Calibration - && !trackerPanel.isEnabled("calibration.points")) //$NON-NLS-1$ - continue; - if (next instanceof OffsetOrigin - && !trackerPanel.isEnabled("calibration.offsetOrigin")) //$NON-NLS-1$ - continue; - tracksMenu.add(menubar.getMenu(next)); - } - } - } - } - if (tracksMenu.getItemCount() > 0) { - popup.addSeparator(); - popup.add(tracksMenu); - } - // video properties item - Action vidPropsAction = TActions.getAction("aboutVideo", trackerPanel); //$NON-NLS-1$ - JMenuItem propertiesItem = new JMenuItem(vidPropsAction); - popup.addSeparator(); - propertiesItem.setText(TrackerRes.getString("TActions.AboutVideo")); //$NON-NLS-1$ - popup.add(propertiesItem); - - // print menu item - if (trackerPanel.isEnabled("file.print")) { //$NON-NLS-1$ - if (popup.getComponentCount() > 0) - popup.addSeparator(); - Action printAction = TActions.getAction("print", trackerPanel); //$NON-NLS-1$ - popup.add(printAction); - } - // add help item - if (popup.getComponentCount() > 0) - popup.addSeparator(); - JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Tracker.Popup.MenuItem.Help")); //$NON-NLS-1$ - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.showHelp("GUI", 0); //$NON-NLS-1$ - } - } - }); - popup.add(helpItem); - } - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - - /** - * Sets the position of the zoom center point in image coordinates. - * - * @param x - * @param y - */ - public void setZoomCenter(int x, int y) { - zoomCenter.setLocation(x, y); - } - /** - * Scrolls to the zoom center after changing the magnification. - * - * @param size the current size of the TrackerPanel - * @param prevSize the previous size of the TrackerPanel - * @param panelLoc the current location of the TrackerPanel relative to the scrollPane viewport. - */ - public void scrollToZoomCenter(Dimension size, Dimension prevSize, Point panelLoc) { - double xRatio = size.getWidth() / prevSize.getWidth(); - double yRatio = size.getHeight() / prevSize.getHeight(); - final Rectangle rect = scrollPane.getViewport().getViewRect(); - if (prevSize.width getToolBarComponents() { - return new ArrayList(); - } - - /** - * Returns true if this view is in a custom state. - * - * @return false - */ - public boolean isCustomState() { - return false; - } - - /** - * Responds to property change events. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ - refresh(); - } - else if (name.equals("color")) { // track color has changed //$NON-NLS-1$ - repaint(); - } - } - - /** - * Zooms in. - * - * @param step true to zoom by a step - */ - public void zoomIn(boolean step) { - DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); - double m1 = trackerPanel.getMagnification(); // initial magnification - double m2 = TrackerPanel.ZOOM_STEP*m1; - if (step) { - // zoom by small factor, but set m2 to nearest defined zoom level if close - double dm = Math.sqrt(TrackerPanel.ZOOM_STEP); - for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { - if (TrackerPanel.ZOOM_LEVELS[i]m2/dm) { - m2 = TrackerPanel.ZOOM_LEVELS[i]; - break; - } - } - } - else if (!zoomBox.isDragged()) { - // zoom in to defined zoom levels - for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { - if (TrackerPanel.ZOOM_LEVELS[i]>=m2 && TrackerPanel.ZOOM_LEVELS[i]TrackerPanel.ZOOM_LEVELS[TrackerPanel.ZOOM_LEVELS.length-1]) { - m2 = TrackerPanel.MAX_ZOOM; - } - } - else { // zoom to box - // get pre-zoom viewport (v) and zoom (z) rectangles - Rectangle vRect = scrollPane.getViewport().getViewRect(); - Rectangle zRect = zoomBox.reportZoom(); - // get trackerPanel (t) rectangle - Dimension tDim = trackerPanel.getPreferredSize(); - Point p1 = new TPoint(0, 0).getScreenPosition(trackerPanel); - if (tDim.width==1 && tDim.height==1) { // zoomed to fit - double w = trackerPanel.getImageWidth(); - double h = trackerPanel.getImageHeight(); - Point p2 = new TPoint(w, h).getScreenPosition(trackerPanel); - tDim.width = p2.x-p1.x; - tDim.height = p2.y-p1.y; - } - Rectangle tRect = new Rectangle(p1.x, p1.y, tDim.width, tDim.height); - if (1.0*vRect.width/tDim.width<1) { // trackerPanel x is outside view - tRect.x = -vRect.x; - } - if (1.0*vRect.height/tDim.height<1) { // trackerPanel y is outside view - tRect.y = -vRect.y; - } - zRect = zRect.intersection(tRect); - - // determine zoom factor and new magnification - double fX = 1.0*vRect.width/zRect.width; - double fY = 1.0*vRect.height/zRect.height; - double xyRatio = fX/fY; - double factor = xyRatio<1? fX: fY; - m2 = m1*factor; - double dm = 1.011; // set m2 to defined zoom level if within 1% - for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { - if (TrackerPanel.ZOOM_LEVELS[i]m2/dm) { - m2 = TrackerPanel.ZOOM_LEVELS[i]; - factor = m2/m1; - break; - } - } - - // adjust zoom rect & set zoom center if trackerPanel > viewRect - if (factor*tDim.width>vRect.width || factor*tDim.height>vRect.height) { - // adjust zoom rect dimensions - if (xyRatio<1) { // short/wide-->increase height and move up - zRect.height = (int)(zRect.height/xyRatio); - zRect.y -= (int)(0.5*zRect.height*(1-xyRatio)); - zRect.y = Math.max(zRect.y, tRect.y); - zRect.y = Math.min(zRect.y, tRect.y+tRect.height-zRect.height); - } - else { // tall/narrow-->increase width and move left - zRect.width = (int)(zRect.width*xyRatio); - zRect.x -= (int)(0.5*zRect.width*(1-1/xyRatio)); - zRect.x = Math.max(zRect.x, tRect.x); - zRect.x = Math.min(zRect.x, tRect.x+tRect.width-zRect.width); - } - - // set location of zoom center - boolean small = m1*tDim.widthm2/dm) { - m2 = TrackerPanel.ZOOM_LEVELS[i]; - break; - } - } - } - else { - // zoom out to defined zoom levels - for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { - if (TrackerPanel.ZOOM_LEVELS[i]<=m2 && TrackerPanel.ZOOM_LEVELS[i]>m2/2) { - m2 = TrackerPanel.ZOOM_LEVELS[i]; - break; - } - } - if (m2 tracks = trackerPanel.getTracks(); - for (TTrack track: tracks) { - // search only visible PointMass tracks for now - if (!track.isVisible() || track.getClass()!=PointMass.class) continue; - if (!((PointMass)track).isPositionVisible(trackerPanel)) continue; - for (Step step: track.getSteps()) { - if (step==null) continue; - // need look only at points[0] for PositionStep - TPoint p = step.getPoints()[0]; - if (p==null || Double.isNaN(p.getX())) continue; - if (zRect.contains(p.getScreenPosition(trackerPanel))) { - return true; - } - } - } - return false; - } - - protected void handleStepsInZoomBox(boolean add) { - // determine what steps are in selection (zoom) box - DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); - Rectangle zRect = zoomBox.reportZoom(); - ArrayList tracks = trackerPanel.getTracks(); - for (TTrack track: tracks) { - // search only visible PointMass tracks for now - if (!track.isVisible() || track.getClass()!=PointMass.class) continue; - if (!((PointMass)track).isPositionVisible(trackerPanel)) continue; - for (Step step: track.getSteps()) { - if (step==null) continue; - // need look only at points[0] for PositionStep - TPoint p = step.getPoints()[0]; - if (p==null || Double.isNaN(p.getX())) continue; - if (zRect.contains(p.getScreenPosition(trackerPanel))) { - if (add) { - trackerPanel.selectedSteps.add(step); - } - else { - trackerPanel.selectedSteps.remove(step); - } - step.erase(); - } - } - } - if (add && trackerPanel.selectedSteps.size()==1) { - Step step = trackerPanel.selectedSteps.toArray(new Step[1])[0]; - trackerPanel.setSelectedPoint(step.points[0]); - } - else if (trackerPanel.selectedSteps.size()>1) { - trackerPanel.setSelectedPoint(null); - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; + +import javax.swing.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; + +/** + * This is the main video view for Tracker. It puts the tracker panel in a zoomable + * scrollpane and puts the player in a detachable toolbar. + * + * @author Douglas Brown + */ +public class MainTView extends JPanel implements TView { + + // instance fields + private TrackerPanel trackerPanel; + JScrollPane scrollPane; + Rectangle scrollRect = new Rectangle(); + private Point zoomCenter = new Point(); + private JToolBar playerBar; + + /** + * Constructs a main view of a tracker panel. + * + * @param panel the tracker panel + */ + public MainTView(TrackerPanel panel) { + trackerPanel = panel; + init(); + setLayout(new BorderLayout()); + scrollPane = new JScrollPane(); + scrollPane.addComponentListener(new ComponentAdapter() { + public void componentResized(ComponentEvent e) { + TToolBar toolbar = TToolBar.getToolbar(trackerPanel); + toolbar.refreshZoomButton(); + trackerPanel.eraseAll(); + trackerPanel.repaint(); + } + }); + SwingUtilities.replaceUIActionMap(scrollPane, null); + add(scrollPane, BorderLayout.CENTER); + // add player to the playerBar + playerBar = new JToolBar(); + add(playerBar, BorderLayout.SOUTH); + trackerPanel.getPlayer().setBorder(null); + trackerPanel.setPlayerVisible(false); + playerBar.add(trackerPanel.getPlayer()); + // add trackerPanel to scrollPane + scrollPane.setViewportView(trackerPanel); + trackerPanel.setScrollPane(scrollPane); + +// trackerPanel.addOptionController(); + // add mouse listener for zoom + trackerPanel.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + zoomCenter.setLocation(e.getPoint()); + } + public void mouseReleased(MouseEvent e) { + // handle zoom actions + if (trackerPanel.getCursor() == Tracker.zoomOutCursor) + zoomOut(false); + else if (trackerPanel.getCursor() == Tracker.zoomInCursor) + zoomIn(false); + } + }); + trackerPanel.addMouseWheelListener(new MouseWheelListener() { + public void mouseWheelMoved(MouseWheelEvent e) { + zoomCenter.setLocation(e.getPoint()); + if (e.getWheelRotation() > 0) { + zoomOut(true); // zoom by a step + } + else { + zoomIn(true); // zoom by a step + } + } + }); + trackerPanel.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + JButton z = trackerPanel.getTFrame().getToolBar(trackerPanel).zoomButton; + int d = trackerPanel.getSelectedPoint() == null? 10: 0; + Rectangle rect = scrollPane.getViewport().getViewRect(); + switch (e.getKeyCode()) { + case KeyEvent.VK_Z: + if (!e.isControlDown()) z.setSelected(true); + break; + case KeyEvent.VK_ALT: + break; + case KeyEvent.VK_PAGE_UP: + if (!trackerPanel.getPlayer().isEnabled()) return; + if (e.isShiftDown()) { + int n = trackerPanel.getPlayer().getStepNumber()-5; + trackerPanel.getPlayer().setStepNumber(n); + } + else trackerPanel.getPlayer().back(); + break; + case KeyEvent.VK_PAGE_DOWN: + if (!trackerPanel.getPlayer().isEnabled()) return; + if (e.isShiftDown()) { + int n = trackerPanel.getPlayer().getStepNumber()+5; + trackerPanel.getPlayer().setStepNumber(n); + } + else trackerPanel.getPlayer().step(); + break; + case KeyEvent.VK_HOME: + if (!trackerPanel.getPlayer().isEnabled()) return; + trackerPanel.getPlayer().setStepNumber(0); + break; + case KeyEvent.VK_END: + if (!trackerPanel.getPlayer().isEnabled()) return; + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); + break; + case KeyEvent.VK_UP: + rect.y -= d; + trackerPanel.scrollRectToVisible(rect); + break; + case KeyEvent.VK_DOWN: + rect.y += d; + trackerPanel.scrollRectToVisible(rect); + break; + case KeyEvent.VK_RIGHT: + rect.x += d; + trackerPanel.scrollRectToVisible(rect); + break; + case KeyEvent.VK_LEFT: + rect.x -= d; + trackerPanel.scrollRectToVisible(rect); + break; + } + if(z.isSelected()) { + trackerPanel.setCursor(e.isAltDown()? + Tracker.getZoomOutCursor(): + Tracker.getZoomInCursor()); + } + } + public void keyReleased(final KeyEvent e) { + final JButton z = trackerPanel.getTFrame().getToolBar(trackerPanel).zoomButton; + if(e.getKeyCode()==KeyEvent.VK_Z) { + z.setSelected(false); + trackerPanel.setCursor(Cursor.getDefaultCursor()); + } + if(z.isSelected()) { + Runnable runner = new Runnable() { + public synchronized void run() { + trackerPanel.setCursor(e.isAltDown()? + Tracker.getZoomOutCursor(): + Tracker.getZoomInCursor()); + } + }; + SwingUtilities.invokeLater(runner); + } + } + }); + } + + /** + * Gets the popup menu when right-clicked. + * + * @return the popup menu + */ + JPopupMenu getPopupMenu() { + if (trackerPanel.getCursor() == Tracker.zoomInCursor + || trackerPanel.getCursor() == Tracker.zoomOutCursor) { + return null; + } + JPopupMenu popup = trackerPanel.popup; + // see if a track has been clicked + boolean trackClicked = false; + Interactive iad = trackerPanel.getInteractive(); + if (iad instanceof TPoint) { + TPoint p = (TPoint)iad; + TTrack track = null; + Step step = null; + Iterator it = trackerPanel.getTracks().iterator(); + while(it.hasNext()) { + track = it.next(); + step = track.getStep(p, trackerPanel); + if (step != null) break; + } + if (step != null) { // found clicked track + trackClicked = true; + Step prev = trackerPanel.selectedStep; + trackerPanel.selectedStep = step; + popup = track.getMenu(trackerPanel).getPopupMenu(); + trackerPanel.selectedStep = prev; + } + } + if (!trackClicked) { // video or non-track TPoint was clicked + popup.removeAll(); + final Video vid = trackerPanel.getVideo(); + // add zoom menus + JMenuItem item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomIn")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + zoomIn(false); + } + }); + item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomOut")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + zoomOut(false); + } + }); + item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.ZoomToFit")); //$NON-NLS-1$ + popup.add(item); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trackerPanel.setMagnification(-1); + TToolBar toolbar = TToolBar.getToolbar(trackerPanel); + toolbar.refreshZoomButton(); + } + }); + + // selection items + DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); + if (zoomBox.isDragged() && isStepsInZoomBox()) { + popup.addSeparator(); + item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.Select")); //$NON-NLS-1$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handleStepsInZoomBox(true); + } + }); + popup.add(item); + item = new JMenuItem(TrackerRes.getString("MainTView.Popup.MenuItem.Deselect")); //$NON-NLS-1$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + handleStepsInZoomBox(false); + } + }); + popup.add(item); + } + + // clip setting item + if (trackerPanel.isEnabled("button.clipSettings")) {//$NON-NLS-1$ + if (popup.getComponentCount() > 0) + popup.addSeparator(); + item = new JMenuItem(MediaRes.getString("ClipInspector.Title")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + ClipControl clipControl = trackerPanel.getPlayer().getClipControl(); + TFrame frame = trackerPanel.getTFrame(); + ClipInspector inspector = clip.getClipInspector(clipControl, frame); + if(inspector.isVisible()) { + return; + } + FontSizer.setFonts(inspector, FontSizer.getLevel()); + inspector.pack(); + Point p0 = new Frame().getLocation(); + Point loc = inspector.getLocation(); + if((loc.x==p0.x)&&(loc.y==p0.y)) { + // center inspector on the main view + Rectangle rect = trackerPanel.getVisibleRect(); + Point p = frame.getMainView(trackerPanel).scrollPane.getLocationOnScreen(); + int x = p.x+(rect.width-inspector.getBounds().width)/2; + int y = p.y+(rect.height-inspector.getBounds().height)/2; + inspector.setLocation(x, y); + } + inspector.initialize(); + inspector.setVisible(true); + refresh(); + } + }); + popup.add(item); + } + if (trackerPanel.isEnabled("edit.copyImage")) { //$NON-NLS-1$ + popup.addSeparator(); + // copy image item + Action copyImageAction = new AbstractAction(TrackerRes.getString("TMenuBar.Menu.CopyImage")) { //$NON-NLS-1$ + public void actionPerformed(ActionEvent e) { + BufferedImage image = new TrackerIO.ComponentImage(trackerPanel).getImage(); + DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); + if (zoomBox.isDragged()) { + Rectangle zRect = zoomBox.reportZoom(); + BufferedImage image2 = new BufferedImage(zRect.width, zRect.height, image.getType()); + Graphics2D g = image2.createGraphics(); + g.drawImage(image, -zRect.x, -zRect.y, null); + TrackerIO.copyImage(image2); + } + else TrackerIO.copyImage(image); + } + }; + JMenuItem copyImageItem = new JMenuItem(copyImageAction); + popup.add(copyImageItem); + // snapshot item + Action snapshotAction = new AbstractAction( + DisplayRes.getString("DisplayPanel.Snapshot_menu_item")) { //$NON-NLS-1$ + public void actionPerformed(ActionEvent e) { + trackerPanel.snapshot(); + } + }; + JMenuItem snapshotItem = new JMenuItem(snapshotAction); + popup.add(snapshotItem); + } + + TMenuBar menubar = TMenuBar.getMenuBar(trackerPanel); + // video filters menu + if (vid != null && trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ + JMenu filtersMenu = menubar.filtersMenu; + if (filtersMenu.getItemCount() > 0) { + popup.addSeparator(); + popup.add(filtersMenu); + } + } + JMenu tracksMenu = new JMenu(TrackerRes.getString("TMenuBar.Menu.Tracks")); //$NON-NLS-1$ + if (menubar.createMenu.getItemCount() == 0) + for (Component c: menubar.newTrackItems) { + menubar.createMenu.add(c); + } + if (menubar.createMenu.getItemCount() > 0) + tracksMenu.add(menubar.createMenu); + if (menubar.cloneMenu.getItemCount() > 0 + && trackerPanel.isEnabled("new.clone")) //$NON-NLS-1$ + tracksMenu.add(menubar.cloneMenu); + // get list of tracks for track menus + TTrack track = null; + CoordAxes axes = trackerPanel.getAxes(); + ArrayList tracks = trackerPanel.getUserTracks(); + // add track items + if (!tracks.isEmpty()) { + if (tracksMenu.getItemCount() > 0) + tracksMenu.addSeparator(); + Iterator it = tracks.iterator(); + while (it.hasNext()) { + tracksMenu.add(menubar.getMenu(it.next())); + } + } + // add axes and calibration tool items + if (trackerPanel.isEnabled("button.axes") //$NON-NLS-1$ + || trackerPanel.isEnabled("calibration.stick") //$NON-NLS-1$ + || trackerPanel.isEnabled("calibration.tape") //$NON-NLS-1$ + || trackerPanel.isEnabled("calibration.points") //$NON-NLS-1$ + || trackerPanel.isEnabled("calibration.offsetOrigin")) { //$NON-NLS-1$ + if (tracksMenu.getItemCount() > 0) + tracksMenu.addSeparator(); + if (axes != null && trackerPanel.isEnabled("button.axes")) { //$NON-NLS-1$ + track = axes; + tracksMenu.add(menubar.getMenu(track)); + } + + if (!trackerPanel.calibrationTools.isEmpty()) { + for (TTrack next: trackerPanel.getTracks()) { + if (trackerPanel.calibrationTools.contains(next)) { + if (next instanceof TapeMeasure) { + TapeMeasure tape = (TapeMeasure)next; + if (tape.isStickMode() + && !trackerPanel.isEnabled("calibration.stick")) //$NON-NLS-1$ + continue; + if (!tape.isStickMode() + && !trackerPanel.isEnabled("calibration.tape")) //$NON-NLS-1$ + continue; + } + if (next instanceof Calibration + && !trackerPanel.isEnabled("calibration.points")) //$NON-NLS-1$ + continue; + if (next instanceof OffsetOrigin + && !trackerPanel.isEnabled("calibration.offsetOrigin")) //$NON-NLS-1$ + continue; + tracksMenu.add(menubar.getMenu(next)); + } + } + } + } + if (tracksMenu.getItemCount() > 0) { + popup.addSeparator(); + popup.add(tracksMenu); + } + // video properties item + Action vidPropsAction = TActions.getAction("aboutVideo", trackerPanel); //$NON-NLS-1$ + JMenuItem propertiesItem = new JMenuItem(vidPropsAction); + popup.addSeparator(); + propertiesItem.setText(TrackerRes.getString("TActions.AboutVideo")); //$NON-NLS-1$ + popup.add(propertiesItem); + + // print menu item + if (trackerPanel.isEnabled("file.print")) { //$NON-NLS-1$ + if (popup.getComponentCount() > 0) + popup.addSeparator(); + Action printAction = TActions.getAction("print", trackerPanel); //$NON-NLS-1$ + popup.add(printAction); + } + // add help item + if (popup.getComponentCount() > 0) + popup.addSeparator(); + JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Tracker.Popup.MenuItem.Help")); //$NON-NLS-1$ + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.showHelp("GUI", 0); //$NON-NLS-1$ + } + } + }); + popup.add(helpItem); + } + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + + /** + * Sets the position of the zoom center point in image coordinates. + * + * @param x + * @param y + */ + public void setZoomCenter(int x, int y) { + zoomCenter.setLocation(x, y); + } + /** + * Scrolls to the zoom center after changing the magnification. + * + * @param size the current size of the TrackerPanel + * @param prevSize the previous size of the TrackerPanel + * @param panelLoc the current location of the TrackerPanel relative to the scrollPane viewport. + */ + public void scrollToZoomCenter(Dimension size, Dimension prevSize, Point panelLoc) { + double xRatio = size.getWidth() / prevSize.getWidth(); + double yRatio = size.getHeight() / prevSize.getHeight(); + final Rectangle rect = scrollPane.getViewport().getViewRect(); + if (prevSize.width getToolBarComponents() { + return new ArrayList(); + } + + /** + * Returns true if this view is in a custom state. + * + * @return false + */ + public boolean isCustomState() { + return false; + } + + /** + * Responds to property change events. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ + refresh(); + } + else if (name.equals("color")) { // track color has changed //$NON-NLS-1$ + repaint(); + } + } + + /** + * Zooms in. + * + * @param step true to zoom by a step + */ + public void zoomIn(boolean step) { + DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); + double m1 = trackerPanel.getMagnification(); // initial magnification + double m2 = TrackerPanel.ZOOM_STEP*m1; + if (step) { + // zoom by small factor, but set m2 to nearest defined zoom level if close + double dm = Math.sqrt(TrackerPanel.ZOOM_STEP); + for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { + if (TrackerPanel.ZOOM_LEVELS[i]m2/dm) { + m2 = TrackerPanel.ZOOM_LEVELS[i]; + break; + } + } + } + else if (!zoomBox.isDragged()) { + // zoom in to defined zoom levels + for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { + if (TrackerPanel.ZOOM_LEVELS[i]>=m2 && TrackerPanel.ZOOM_LEVELS[i]TrackerPanel.ZOOM_LEVELS[TrackerPanel.ZOOM_LEVELS.length-1]) { + m2 = TrackerPanel.MAX_ZOOM; + } + } + else { // zoom to box + // get pre-zoom viewport (v) and zoom (z) rectangles + Rectangle vRect = scrollPane.getViewport().getViewRect(); + Rectangle zRect = zoomBox.reportZoom(); + // get trackerPanel (t) rectangle + Dimension tDim = trackerPanel.getPreferredSize(); + Point p1 = new TPoint(0, 0).getScreenPosition(trackerPanel); + if (tDim.width==1 && tDim.height==1) { // zoomed to fit + double w = trackerPanel.getImageWidth(); + double h = trackerPanel.getImageHeight(); + Point p2 = new TPoint(w, h).getScreenPosition(trackerPanel); + tDim.width = p2.x-p1.x; + tDim.height = p2.y-p1.y; + } + Rectangle tRect = new Rectangle(p1.x, p1.y, tDim.width, tDim.height); + if (1.0*vRect.width/tDim.width<1) { // trackerPanel x is outside view + tRect.x = -vRect.x; + } + if (1.0*vRect.height/tDim.height<1) { // trackerPanel y is outside view + tRect.y = -vRect.y; + } + zRect = zRect.intersection(tRect); + + // determine zoom factor and new magnification + double fX = 1.0*vRect.width/zRect.width; + double fY = 1.0*vRect.height/zRect.height; + double xyRatio = fX/fY; + double factor = xyRatio<1? fX: fY; + m2 = m1*factor; + double dm = 1.011; // set m2 to defined zoom level if within 1% + for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { + if (TrackerPanel.ZOOM_LEVELS[i]m2/dm) { + m2 = TrackerPanel.ZOOM_LEVELS[i]; + factor = m2/m1; + break; + } + } + + // adjust zoom rect & set zoom center if trackerPanel > viewRect + if (factor*tDim.width>vRect.width || factor*tDim.height>vRect.height) { + // adjust zoom rect dimensions + if (xyRatio<1) { // short/wide-->increase height and move up + zRect.height = (int)(zRect.height/xyRatio); + zRect.y -= (int)(0.5*zRect.height*(1-xyRatio)); + zRect.y = Math.max(zRect.y, tRect.y); + zRect.y = Math.min(zRect.y, tRect.y+tRect.height-zRect.height); + } + else { // tall/narrow-->increase width and move left + zRect.width = (int)(zRect.width*xyRatio); + zRect.x -= (int)(0.5*zRect.width*(1-1/xyRatio)); + zRect.x = Math.max(zRect.x, tRect.x); + zRect.x = Math.min(zRect.x, tRect.x+tRect.width-zRect.width); + } + + // set location of zoom center + boolean small = m1*tDim.widthm2/dm) { + m2 = TrackerPanel.ZOOM_LEVELS[i]; + break; + } + } + } + else { + // zoom out to defined zoom levels + for (int i = 0; i< TrackerPanel.ZOOM_LEVELS.length; i++) { + if (TrackerPanel.ZOOM_LEVELS[i]<=m2 && TrackerPanel.ZOOM_LEVELS[i]>m2/2) { + m2 = TrackerPanel.ZOOM_LEVELS[i]; + break; + } + } + if (m2 tracks = trackerPanel.getTracks(); + for (TTrack track: tracks) { + // search only visible PointMass tracks for now + if (!track.isVisible() || track.getClass()!=PointMass.class) continue; + if (!((PointMass)track).isPositionVisible(trackerPanel)) continue; + for (Step step: track.getSteps()) { + if (step==null) continue; + // need look only at points[0] for PositionStep + TPoint p = step.getPoints()[0]; + if (p==null || Double.isNaN(p.getX())) continue; + if (zRect.contains(p.getScreenPosition(trackerPanel))) { + return true; + } + } + } + return false; + } + + protected void handleStepsInZoomBox(boolean add) { + // determine what steps are in selection (zoom) box + DrawingPanel.ZoomBox zoomBox = trackerPanel.getZoomBox(); + Rectangle zRect = zoomBox.reportZoom(); + ArrayList tracks = trackerPanel.getTracks(); + for (TTrack track: tracks) { + // search only visible PointMass tracks for now + if (!track.isVisible() || track.getClass()!=PointMass.class) continue; + if (!((PointMass)track).isPositionVisible(trackerPanel)) continue; + for (Step step: track.getSteps()) { + if (step==null) continue; + // need look only at points[0] for PositionStep + TPoint p = step.getPoints()[0]; + if (p==null || Double.isNaN(p.getX())) continue; + if (zRect.contains(p.getScreenPosition(trackerPanel))) { + if (add) { + trackerPanel.selectedSteps.add(step); + } + else { + trackerPanel.selectedSteps.remove(step); + } + step.erase(); + } + } + } + if (add && trackerPanel.selectedSteps.size()==1) { + Step step = trackerPanel.selectedSteps.toArray(new Step[1])[0]; + trackerPanel.setSelectedPoint(step.points[0]); + } + else if (trackerPanel.selectedSteps.size()>1) { + trackerPanel.setSelectedPoint(null); + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/Mark.java b/src/org/opensourcephysics/cabrillo/tracker/Mark.java index 70075bbe..ec16730b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Mark.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Mark.java @@ -1,54 +1,54 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; - -/** - * A Mark draws itself and has rectangular bounds. A track Step - * has a Mark for each tracker panel on which it is drawn. The Mark - * is created by the Step's Footprint. - * - * @author Douglas Brown - */ -public interface Mark { - - /** - * Draws this object. - * - * @param g the Graphics2D context - * @param highlighted true to draw a highlighted version - */ - public void draw(Graphics2D g, boolean highlighted); - - /** - * Gets the bounds of this object. - * - * @param highlighted true to get the highlighted bounds - * @return the bounding rectangle - */ - public Rectangle getBounds(boolean highlighted); - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; + +/** + * A Mark draws itself and has rectangular bounds. A track Step + * has a Mark for each tracker panel on which it is drawn. The Mark + * is created by the Step's Footprint. + * + * @author Douglas Brown + */ +public interface Mark { + + /** + * Draws this object. + * + * @param g the Graphics2D context + * @param highlighted true to draw a highlighted version + */ + public void draw(Graphics2D g, boolean highlighted); + + /** + * Gets the bounds of this object. + * + * @param highlighted true to get the highlighted bounds + * @return the bounding rectangle + */ + public Rectangle getBounds(boolean highlighted); + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java b/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java index f0dd0d3f..8413dc13 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java @@ -1,189 +1,189 @@ -/* - * Open Source Physics software is free software as described near the bottom of this code file. - * - * For additional information and documentation on Open Source Physics please see: - * - */ - -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.PropertyChangeEvent; - -import javax.swing.Icon; - -import org.opensourcephysics.tools.*; - -/** - * This is a FunctionPanel for particle models. - * - * @author Douglas Brown - */ -@SuppressWarnings("serial") -public class ModelFunctionPanel extends FunctionPanel { - - InitialValueEditor initEditor; - ParticleModel model; - - /** - * Constructor with user function editor. - * - * @param editor the user function editor - * @param track a ParticleModel - */ - public ModelFunctionPanel(UserFunctionEditor editor, ParticleModel track) { - super(editor); - model = track; - setName(track.getName()); - } - - /** - * Gets the function type. - * - * @return a string describing the type of function - */ - public String getLabel() { - return TrackerRes.getString("ModelFunctionPanel.Label"); //$NON-NLS-1$ - } - - /** - * Gets the display name for the FunctionTool dropdown. - * - * @return the display name - */ - public String getDisplayName() { - if (model != null) - return model.getDisplayName(); - return super.getDisplayName(); - } - - /** - * Returns the function editor. - * - * @return UserFunctionEditor - */ - public UserFunctionEditor getUserFunctionEditor() { - return (UserFunctionEditor)functionEditor; - } - - /** - * Gets the initial value editor. - * - * @return the initial value editor - */ - public InitialValueEditor getInitEditor() { - return initEditor; - } - - /** - * Creates the GUI. - */ - protected void createGUI() { - super.createGUI(); - initEditor = new InitialValueEditor(getParamEditor()); - box.add(initEditor, 1); - initEditor.addPropertyChangeListener(this); - paramEditor.addPropertyChangeListener(initEditor); - functionEditor.addPropertyChangeListener(initEditor); - initEditor.addPropertyChangeListener(paramEditor); - initEditor.addPropertyChangeListener(functionEditor); - FunctionEditor[] editors = new FunctionEditor[] {functionEditor, initEditor}; - paramEditor.setFunctionEditors(editors); - } - - /** - * Gets an Icon associated with this panel, if any. - * - * @return the icon - */ - public Icon getIcon() { - if (model != null) - return model.getFootprint().getIcon(21, 16); - return null; - } - - /** - * Refreshes the GUI. - */ - protected void refreshGUI() { - super.refreshGUI(); - initEditor.refreshGUI(); - } - - /** - * Refreshes the functions. - */ - protected void refreshFunctions() { - if (paramEditor != null) { - UserFunction[] functions = ((UserFunctionEditor)functionEditor).getMainFunctions(); - for (int i = 0; i < functions.length; i++) { - functions[i].setParameters(paramEditor.getNames(), paramEditor.getValues(), paramEditor.getDescriptions()); - } - functions = ((UserFunctionEditor)functionEditor).getSupportFunctions(); - for (int i = 0; i < functions.length; i++) { - functions[i].setParameters(paramEditor.getNames(), paramEditor.getValues(), paramEditor.getDescriptions()); - } - } - // evaluate the initial values - initEditor.evaluateAll(); - // evaluate the functions - functionEditor.evaluateAll(); - } - - /** - * Clears the selection. - */ - protected void clearSelection() { - super.clearSelection(); - initEditor.getTable().clearSelection(); - } - - /** - * Tabs to the next editor. - * - * @param editor the current editor - */ - protected void tabToNext(FunctionEditor editor) { - if (editor == paramEditor) { - initEditor.getTable().requestFocusInWindow(); - } - else super.tabToNext(editor); - } - - /** - * Listens for property changes "edit" and "function" - * - * @param e the event - */ - public void propertyChange(PropertyChangeEvent e) { - super.propertyChange(e); - String name = e.getPropertyName(); - if (e.getSource() == paramEditor && name.equals("edit")) { //$NON-NLS-1$ - initEditor.getTable().selectOnFocus = false; - } - } - -} - -/* - * Open Source Physics software is free software; you can redistribute - * it and/or modify it under the terms of the GNU General Public License (GPL) as - * published by the Free Software Foundation; either version 3 of the License, - * or(at your option) any later version. - - * Code that uses any portion of the code in the org.opensourcephysics package - * or any subpackage (subdirectory) of this package must must also be be released - * under the GNU GPL license. - * - * This software 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; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at http://www.gnu.org/copyleft/gpl.html - * - * Copyright (c) 2007 The Open Source Physics project - * http://www.opensourcephysics.org - */ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.PropertyChangeEvent; + +import javax.swing.Icon; + +import org.opensourcephysics.tools.*; + +/** + * This is a FunctionPanel for particle models. + * + * @author Douglas Brown + */ +@SuppressWarnings("serial") +public class ModelFunctionPanel extends FunctionPanel { + + InitialValueEditor initEditor; + ParticleModel model; + + /** + * Constructor with user function editor. + * + * @param editor the user function editor + * @param track a ParticleModel + */ + public ModelFunctionPanel(UserFunctionEditor editor, ParticleModel track) { + super(editor); + model = track; + setName(track.getName()); + } + + /** + * Gets the function type. + * + * @return a string describing the type of function + */ + public String getLabel() { + return TrackerRes.getString("ModelFunctionPanel.Label"); //$NON-NLS-1$ + } + + /** + * Gets the display name for the FunctionTool dropdown. + * + * @return the display name + */ + public String getDisplayName() { + if (model != null) + return model.getDisplayName(); + return super.getDisplayName(); + } + + /** + * Returns the function editor. + * + * @return UserFunctionEditor + */ + public UserFunctionEditor getUserFunctionEditor() { + return (UserFunctionEditor)functionEditor; + } + + /** + * Gets the initial value editor. + * + * @return the initial value editor + */ + public InitialValueEditor getInitEditor() { + return initEditor; + } + + /** + * Creates the GUI. + */ + protected void createGUI() { + super.createGUI(); + initEditor = new InitialValueEditor(getParamEditor()); + box.add(initEditor, 1); + initEditor.addPropertyChangeListener(this); + paramEditor.addPropertyChangeListener(initEditor); + functionEditor.addPropertyChangeListener(initEditor); + initEditor.addPropertyChangeListener(paramEditor); + initEditor.addPropertyChangeListener(functionEditor); + FunctionEditor[] editors = new FunctionEditor[] {functionEditor, initEditor}; + paramEditor.setFunctionEditors(editors); + } + + /** + * Gets an Icon associated with this panel, if any. + * + * @return the icon + */ + public Icon getIcon() { + if (model != null) + return model.getFootprint().getIcon(21, 16); + return null; + } + + /** + * Refreshes the GUI. + */ + protected void refreshGUI() { + super.refreshGUI(); + initEditor.refreshGUI(); + } + + /** + * Refreshes the functions. + */ + protected void refreshFunctions() { + if (paramEditor != null) { + UserFunction[] functions = ((UserFunctionEditor)functionEditor).getMainFunctions(); + for (int i = 0; i < functions.length; i++) { + functions[i].setParameters(paramEditor.getNames(), paramEditor.getValues(), paramEditor.getDescriptions()); + } + functions = ((UserFunctionEditor)functionEditor).getSupportFunctions(); + for (int i = 0; i < functions.length; i++) { + functions[i].setParameters(paramEditor.getNames(), paramEditor.getValues(), paramEditor.getDescriptions()); + } + } + // evaluate the initial values + initEditor.evaluateAll(); + // evaluate the functions + functionEditor.evaluateAll(); + } + + /** + * Clears the selection. + */ + protected void clearSelection() { + super.clearSelection(); + initEditor.getTable().clearSelection(); + } + + /** + * Tabs to the next editor. + * + * @param editor the current editor + */ + protected void tabToNext(FunctionEditor editor) { + if (editor == paramEditor) { + initEditor.getTable().requestFocusInWindow(); + } + else super.tabToNext(editor); + } + + /** + * Listens for property changes "edit" and "function" + * + * @param e the event + */ + public void propertyChange(PropertyChangeEvent e) { + super.propertyChange(e); + String name = e.getPropertyName(); + if (e.getSource() == paramEditor && name.equals("edit")) { //$NON-NLS-1$ + initEditor.getTable().selectOnFocus = false; + } + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 3 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java b/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java index 0d8c6025..72b7fcea 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java +++ b/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java @@ -1,578 +1,578 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.Point2D; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * An OffsetOrigin controls the origin of an image coordinate system. - * - * @author Douglas Brown - */ -public class OffsetOrigin extends TTrack { - - // instance fields - private Component separator; - protected boolean fixedCoordinates = true; - protected JCheckBoxMenuItem fixedCoordinatesItem; - protected JLabel unmarkedLabel; - - /** - * Constructs an OffsetOrigin. - */ - public OffsetOrigin() { - defaultColors = new Color[] {Color.cyan, Color.magenta, Color.yellow.darker()}; - // set up footprint choices and color - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.Crosshair")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - // assign a default name - setName(TrackerRes.getString("OffsetOrigin.New.Name")); //$NON-NLS-1$ - setColor(defaultColors[0]); - // hide this track from views - viewable = false; - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("OffsetOrigin.Unmarked.Hint"); //$NON-NLS-1$ - keyFrames.add(0); - createGUI(); - } - - /** - * Creates a new offset origin step with specified image coordinates. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the new step - */ - public Step createStep(int n, double x, double y) { - if (isLocked()) return null; - OffsetOriginStep step = (OffsetOriginStep)getStep(n); - if (step == null) { - step = new OffsetOriginStep(this, n, x, y); - step.setFootprint(getFootprint()); - steps = new StepArray(step); - support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ - } - else if (trackerPanel!=null) { - XMLControl currentState = new XMLControlElement(this); - TPoint p = step.getPosition(); - p.setLocation(x, y); - Point2D pt = p.getWorldPosition(trackerPanel); - step.worldX = pt.getX(); - step.worldY = pt.getY(); - keyFrames.add(n); - Undo.postTrackEdit(this, currentState); - } - return step; - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - OffsetOriginStep step = (OffsetOriginStep)getStep(n); - // be sure coords have unfixed origin - ImageCoordSystem coords = trackerPanel.getCoords(); - coords.setFixedOrigin(false); - if (step == null) { - step = (OffsetOriginStep)createStep(n, x, y); - if (step!=null) { - return step.getPoints()[0]; - } - } - else { - TPoint p = step.getPoints()[0]; - if (p!=null) { - Mark mark = step.marks.get(trackerPanel); - if (mark==null) { - // set step location to image position of current world coordinates - double xx = coords.worldToImageX(n, step.worldX, step.worldY); - double yy = coords.worldToImageY(n, step.worldX, step.worldY); - p.setLocation(xx, yy); - } - p.setAdjusting(true); - p.setXY(x, y); - p.setAdjusting(false); - firePropertyChange("step", null, n); //$NON-NLS-1$ - return p; - } - } - return null; - } - - /** - * Determines if at least one point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Determines if the world coordinates are fixed. - * - * @return true if fixed - */ - public boolean isFixedCoordinates() { - return fixedCoordinates; - } - - /** - * Sets the fixed coordinates property. When fixed, the world coordinates - * are the same at all times. - * - * @param fixed true to fix the coordinates - */ - public void setFixedCoordinates(boolean fixed) { - if (fixedCoordinates == fixed) return; - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - steps = new StepArray(getStep(n)); - trackerPanel.repaint(); - } - if (fixed) { - keyFrames.clear(); - keyFrames.add(0); - } - fixedCoordinates = fixed; - Undo.postTrackEdit(this, control); - } - - /** - * Overrides TTrack getStep method. This refreshes the step before - * returning it since its position and/or world coordinates may change - * due to external factors. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - OffsetOriginStep step = (OffsetOriginStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Overrides TTrack isLocked method. Returns true if this is locked or - * if the coordinate system is locked. - * - * @return true if this is locked - */ - public boolean isLocked() { - boolean locked = super.isLocked(); - if (trackerPanel != null) { - locked = locked || trackerPanel.getCoords().isLocked(); - } - return locked; - } - - /** - * Overrides TTrack setTrailVisible method. - * Offset origin trails are never visible. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return OffsetOriginStep.getLength(); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 1; - } - - /** - * Overrides TTrack findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the current step or null - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || - !isVisible() || - !isEnabled()) return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - Interactive ia = null; - Step step = getStep(trackerPanel.getFrameNumber()); - if (step != null) - ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia != null) { - partName = TrackerRes.getString("OffsetOrigin.Position.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("OffsetOrigin.Position.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("OffsetOrigin.Unmarked.Hint"); //$NON-NLS-1$ - } - return ia; - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); - // remove end items and last separator - menu.remove(deleteTrackItem); - menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); - - // add fixed and delete items - fixedCoordinatesItem.setText(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ - fixedCoordinatesItem.setSelected(isFixedCoordinates()); - menu.add(fixedCoordinatesItem); - menu.addSeparator(); - menu.add(deleteTrackItem); - return menu; - } - -// /** -// * Overrides TTrack getToolbarPointComponents method. -// * -// * @param trackerPanel the tracker panel -// * @param point the TPoint -// * @return a list of components -// */ -// public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, -// TPoint point) { -// ArrayList list = super.getToolbarPointComponents(trackerPanel, point); -// list.add(stepSeparator); -// list.add(xLabel); -// list.add(xField); -// list.add(separator); -// list.add(yLabel); -// list.add(yField); -// boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); -// xField.setEnabled(!locked); -// yField.setEnabled(!locked); -// return list; -// } - - /** - * Overrides TTrack method. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - list.add(stepSeparator); - unmarkedLabel.setText(TrackerRes.getString("TTrack.Label.Unmarked")); //$NON-NLS-1$ - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - - if (step==null) { - list.add(unmarkedLabel); - } - else { - list.add(xLabel); - list.add(xField); - list.add(separator); - list.add(yLabel); - list.add(yField); - } - - boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); - xField.setEnabled(!locked); - yField.setEnabled(!locked); - displayWorldCoordinates(); - return list; - } - - /** - * Responds to property change events. Overrides TTrack method. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("stepnumber")) { //$NON-NLS-1$ - if (trackerPanel.getSelectedTrack() == this) { - displayWorldCoordinates(); - } - } - else if (name.equals("locked")) { //$NON-NLS-1$ - xField.setEnabled(!isLocked()); - yField.setEnabled(!isLocked()); - } - else super.propertyChange(e); - } - - /** - * Overrides TTrack method. - * - * @param locked true to lock this - */ - public void setLocked(boolean locked) { - super.setLocked(locked); - xField.setEnabled(!isLocked()); - yField.setEnabled(!isLocked()); - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("OffsetOrigin.Name"); //$NON-NLS-1$ - } - - /** - * Returns a description of the point at a given index. Used by AutoTracker. - * - * @param pointIndex the points[] index - * @return the description - */ - protected String getTargetDescription(int pointIndex) { - return TrackerRes.getString("OffsetOrigin.Position.Name"); //$NON-NLS-1$ - } - - /** - * Refreshes a step by setting it equal to the previous keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(OffsetOriginStep step) { - if (step==null) return; - int key = 0; - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - // compare step with keyStep - OffsetOriginStep keyStep = (OffsetOriginStep)steps.getStep(key); - boolean different = keyStep.worldX!=step.worldX || keyStep.worldY!=step.worldY; - // update step if needed - if (different) { - step.worldX = keyStep.worldX; - step.worldY = keyStep.worldY; - } - step.erase(); - } - - /** - * Sets the world values of the currently selected point based on the values - * in the x and y fields. - */ - private void setWorldCoordinatesFromFields() { - if (trackerPanel == null) return; - OffsetOriginStep step = (OffsetOriginStep)getStep(trackerPanel.getFrameNumber()); - boolean different = step.worldX!=xField.getValue() || step.worldY!=yField.getValue(); - if (different) { - XMLControl trackControl = new XMLControlElement(this); - XMLControl coordsControl = new XMLControlElement(trackerPanel.getCoords()); - step.setWorldXY(xField.getValue(), yField.getValue()); - step.getPosition().showCoordinates(trackerPanel); - Undo.postTrackAndCoordsEdit(this, trackControl, coordsControl); - } - } - - /** - * Displays the world coordinates of the currently selected step. - */ - private void displayWorldCoordinates() { - int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); - OffsetOriginStep step = (OffsetOriginStep)getStep(n); - if (step==null) { - xField.setText(null); - yField.setText(null); - } - else { - xField.setValue(step.worldX); - yField.setValue(step.worldY); - } - } - - /** - * Creates the GUI. - */ - private void createGUI() { - unmarkedLabel = new JLabel(); - unmarkedLabel.setForeground(Color.red.darker()); - fixedCoordinatesItem = new JCheckBoxMenuItem(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ - fixedCoordinatesItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixedCoordinates(fixedCoordinatesItem.isSelected()); - } - }); - // create xy ActionListener and FocusListener - ActionListener xyAction = new ActionListener() { - public void actionPerformed(ActionEvent e) { - setWorldCoordinatesFromFields(); - ( (NumberField) e.getSource()).requestFocusInWindow(); - } - }; - FocusListener xyFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - setWorldCoordinatesFromFields(); - } - }; - xField.addActionListener(xyAction); - xField.addFocusListener(xyFocusListener); - yField.addActionListener(xyAction); - yField.addFocusListener(xyFocusListener); - separator = Box.createRigidArea(new Dimension(4, 4)); - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - OffsetOrigin offset = (OffsetOrigin) obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save fixed coordinates - control.setValue("fixed_coordinates", offset.isFixedCoordinates()); //$NON-NLS-1$ - // save world coordinates - if (!offset.steps.isEmpty()) { - Step[] steps = offset.getSteps(); - double[][] stepData = new double[steps.length][]; - for (int i = 0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * An OffsetOrigin controls the origin of an image coordinate system. + * + * @author Douglas Brown + */ +public class OffsetOrigin extends TTrack { + + // instance fields + private Component separator; + protected boolean fixedCoordinates = true; + protected JCheckBoxMenuItem fixedCoordinatesItem; + protected JLabel unmarkedLabel; + + /** + * Constructs an OffsetOrigin. + */ + public OffsetOrigin() { + defaultColors = new Color[] {Color.cyan, Color.magenta, Color.yellow.darker()}; + // set up footprint choices and color + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.BoldCrosshair"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.Crosshair")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + // assign a default name + setName(TrackerRes.getString("OffsetOrigin.New.Name")); //$NON-NLS-1$ + setColor(defaultColors[0]); + // hide this track from views + viewable = false; + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("OffsetOrigin.Unmarked.Hint"); //$NON-NLS-1$ + keyFrames.add(0); + createGUI(); + } + + /** + * Creates a new offset origin step with specified image coordinates. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the new step + */ + public Step createStep(int n, double x, double y) { + if (isLocked()) return null; + OffsetOriginStep step = (OffsetOriginStep)getStep(n); + if (step == null) { + step = new OffsetOriginStep(this, n, x, y); + step.setFootprint(getFootprint()); + steps = new StepArray(step); + support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ + } + else if (trackerPanel!=null) { + XMLControl currentState = new XMLControlElement(this); + TPoint p = step.getPosition(); + p.setLocation(x, y); + Point2D pt = p.getWorldPosition(trackerPanel); + step.worldX = pt.getX(); + step.worldY = pt.getY(); + keyFrames.add(n); + Undo.postTrackEdit(this, currentState); + } + return step; + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + OffsetOriginStep step = (OffsetOriginStep)getStep(n); + // be sure coords have unfixed origin + ImageCoordSystem coords = trackerPanel.getCoords(); + coords.setFixedOrigin(false); + if (step == null) { + step = (OffsetOriginStep)createStep(n, x, y); + if (step!=null) { + return step.getPoints()[0]; + } + } + else { + TPoint p = step.getPoints()[0]; + if (p!=null) { + Mark mark = step.marks.get(trackerPanel); + if (mark==null) { + // set step location to image position of current world coordinates + double xx = coords.worldToImageX(n, step.worldX, step.worldY); + double yy = coords.worldToImageY(n, step.worldX, step.worldY); + p.setLocation(xx, yy); + } + p.setAdjusting(true); + p.setXY(x, y); + p.setAdjusting(false); + firePropertyChange("step", null, n); //$NON-NLS-1$ + return p; + } + } + return null; + } + + /** + * Determines if at least one point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Determines if the world coordinates are fixed. + * + * @return true if fixed + */ + public boolean isFixedCoordinates() { + return fixedCoordinates; + } + + /** + * Sets the fixed coordinates property. When fixed, the world coordinates + * are the same at all times. + * + * @param fixed true to fix the coordinates + */ + public void setFixedCoordinates(boolean fixed) { + if (fixedCoordinates == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + steps = new StepArray(getStep(n)); + trackerPanel.repaint(); + } + if (fixed) { + keyFrames.clear(); + keyFrames.add(0); + } + fixedCoordinates = fixed; + Undo.postTrackEdit(this, control); + } + + /** + * Overrides TTrack getStep method. This refreshes the step before + * returning it since its position and/or world coordinates may change + * due to external factors. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + OffsetOriginStep step = (OffsetOriginStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Overrides TTrack isLocked method. Returns true if this is locked or + * if the coordinate system is locked. + * + * @return true if this is locked + */ + public boolean isLocked() { + boolean locked = super.isLocked(); + if (trackerPanel != null) { + locked = locked || trackerPanel.getCoords().isLocked(); + } + return locked; + } + + /** + * Overrides TTrack setTrailVisible method. + * Offset origin trails are never visible. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return OffsetOriginStep.getLength(); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 1; + } + + /** + * Overrides TTrack findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the current step or null + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || + !isVisible() || + !isEnabled()) return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + Interactive ia = null; + Step step = getStep(trackerPanel.getFrameNumber()); + if (step != null) + ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia != null) { + partName = TrackerRes.getString("OffsetOrigin.Position.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("OffsetOrigin.Position.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("OffsetOrigin.Unmarked.Hint"); //$NON-NLS-1$ + } + return ia; + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + + // add fixed and delete items + fixedCoordinatesItem.setText(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ + fixedCoordinatesItem.setSelected(isFixedCoordinates()); + menu.add(fixedCoordinatesItem); + menu.addSeparator(); + menu.add(deleteTrackItem); + return menu; + } + +// /** +// * Overrides TTrack getToolbarPointComponents method. +// * +// * @param trackerPanel the tracker panel +// * @param point the TPoint +// * @return a list of components +// */ +// public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, +// TPoint point) { +// ArrayList list = super.getToolbarPointComponents(trackerPanel, point); +// list.add(stepSeparator); +// list.add(xLabel); +// list.add(xField); +// list.add(separator); +// list.add(yLabel); +// list.add(yField); +// boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); +// xField.setEnabled(!locked); +// yField.setEnabled(!locked); +// return list; +// } + + /** + * Overrides TTrack method. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + list.add(stepSeparator); + unmarkedLabel.setText(TrackerRes.getString("TTrack.Label.Unmarked")); //$NON-NLS-1$ + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + + if (step==null) { + list.add(unmarkedLabel); + } + else { + list.add(xLabel); + list.add(xField); + list.add(separator); + list.add(yLabel); + list.add(yField); + } + + boolean locked = trackerPanel.getCoords().isLocked() || super.isLocked(); + xField.setEnabled(!locked); + yField.setEnabled(!locked); + displayWorldCoordinates(); + return list; + } + + /** + * Responds to property change events. Overrides TTrack method. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("stepnumber")) { //$NON-NLS-1$ + if (trackerPanel.getSelectedTrack() == this) { + displayWorldCoordinates(); + } + } + else if (name.equals("locked")) { //$NON-NLS-1$ + xField.setEnabled(!isLocked()); + yField.setEnabled(!isLocked()); + } + else super.propertyChange(e); + } + + /** + * Overrides TTrack method. + * + * @param locked true to lock this + */ + public void setLocked(boolean locked) { + super.setLocked(locked); + xField.setEnabled(!isLocked()); + yField.setEnabled(!isLocked()); + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("OffsetOrigin.Name"); //$NON-NLS-1$ + } + + /** + * Returns a description of the point at a given index. Used by AutoTracker. + * + * @param pointIndex the points[] index + * @return the description + */ + protected String getTargetDescription(int pointIndex) { + return TrackerRes.getString("OffsetOrigin.Position.Name"); //$NON-NLS-1$ + } + + /** + * Refreshes a step by setting it equal to the previous keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(OffsetOriginStep step) { + if (step==null) return; + int key = 0; + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + // compare step with keyStep + OffsetOriginStep keyStep = (OffsetOriginStep)steps.getStep(key); + boolean different = keyStep.worldX!=step.worldX || keyStep.worldY!=step.worldY; + // update step if needed + if (different) { + step.worldX = keyStep.worldX; + step.worldY = keyStep.worldY; + } + step.erase(); + } + + /** + * Sets the world values of the currently selected point based on the values + * in the x and y fields. + */ + private void setWorldCoordinatesFromFields() { + if (trackerPanel == null) return; + OffsetOriginStep step = (OffsetOriginStep)getStep(trackerPanel.getFrameNumber()); + boolean different = step.worldX!=xField.getValue() || step.worldY!=yField.getValue(); + if (different) { + XMLControl trackControl = new XMLControlElement(this); + XMLControl coordsControl = new XMLControlElement(trackerPanel.getCoords()); + step.setWorldXY(xField.getValue(), yField.getValue()); + step.getPosition().showCoordinates(trackerPanel); + Undo.postTrackAndCoordsEdit(this, trackControl, coordsControl); + } + } + + /** + * Displays the world coordinates of the currently selected step. + */ + private void displayWorldCoordinates() { + int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); + OffsetOriginStep step = (OffsetOriginStep)getStep(n); + if (step==null) { + xField.setText(null); + yField.setText(null); + } + else { + xField.setValue(step.worldX); + yField.setValue(step.worldY); + } + } + + /** + * Creates the GUI. + */ + private void createGUI() { + unmarkedLabel = new JLabel(); + unmarkedLabel.setForeground(Color.red.darker()); + fixedCoordinatesItem = new JCheckBoxMenuItem(TrackerRes.getString("OffsetOrigin.MenuItem.Fixed")); //$NON-NLS-1$ + fixedCoordinatesItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixedCoordinates(fixedCoordinatesItem.isSelected()); + } + }); + // create xy ActionListener and FocusListener + ActionListener xyAction = new ActionListener() { + public void actionPerformed(ActionEvent e) { + setWorldCoordinatesFromFields(); + ( (NumberField) e.getSource()).requestFocusInWindow(); + } + }; + FocusListener xyFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + setWorldCoordinatesFromFields(); + } + }; + xField.addActionListener(xyAction); + xField.addFocusListener(xyFocusListener); + yField.addActionListener(xyAction); + yField.addFocusListener(xyFocusListener); + separator = Box.createRigidArea(new Dimension(4, 4)); + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + OffsetOrigin offset = (OffsetOrigin) obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed coordinates + control.setValue("fixed_coordinates", offset.isFixedCoordinates()); //$NON-NLS-1$ + // save world coordinates + if (!offset.steps.isEmpty()) { + Step[] steps = offset.getSteps(); + double[][] stepData = new double[steps.length][]; + for (int i = 0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; - -import org.opensourcephysics.media.core.*; - -/** - * This is a Step for a OffsetOrigin. It is used for - * setting the origin of an ImageCoordSystem. - * - * @author Douglas Brown - */ -public class OffsetOriginStep extends Step { - - // instance fields - private OffsetOrigin offset; - private Position p; - protected double worldX, worldY; - - /** - * Constructs a OffsetOriginStep with specified image coordinates. - * - * @param track the offset origin - * @param n the frame number - * @param x the image x coordinate - * @param y the image y coordinate - */ - public OffsetOriginStep(OffsetOrigin track, int n, double x, double y) { - super(track, n); - offset = track; - screenPoints = new Point[getLength()]; - points = new TPoint[getLength()]; - p = new Position(x, y); // sets initial worldX and worldY - points[0] = p; - } - - /** - * Gets the position. - * - * @return the position - */ - public Position getPosition() { - return p; - } - - /** - * Sets the world coordinates. This moves the origin so the - * image location does not change. - * - * @param x the world x coordinate - * @param y the world y coordinate - */ - public void setWorldXY(double x, double y) { - if (track.isLocked()) return; - - if (offset.isFixedCoordinates()) { - OffsetOriginStep step = (OffsetOriginStep)offset.steps.getStep(0); - step.worldX = x; - step.worldY = y; - step.erase(); - offset.refreshStep(OffsetOriginStep.this); // sets properties of this step - } - else { - worldX = x; - worldY = y; - offset.keyFrames.add(n); - } - - if (offset.trackerPanel == null) return; - ImageCoordSystem coords = offset.trackerPanel.getCoords(); - int n = offset.trackerPanel.getFrameNumber(); - // get the current image position of the origin - double x0 = coords.getOriginX(n); - double y0 = coords.getOriginY(n); - // get the current image position of the world coordinates - double x1 = coords.worldToImageX(n, x, y); - double y1 = coords.worldToImageY(n, x, y); - // translate the origin - coords.setOriginXY(n, x0+p.x-x1, y0+p.y-y1); - } - - /** - * Overrides Step getMark method. - * - * @param trackerPanel the tracker panel - * @return the mark - */ - protected Mark getMark(TrackerPanel trackerPanel) { - Mark mark = marks.get(trackerPanel); - TPoint selection = null; - if (mark == null) { - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - // set position location to image position of world coordinates - double x = coords.worldToImageX(n, worldX, worldY); - double y = coords.worldToImageY(n, worldX, worldY); - p.setLocation(x, y); - // get point shape - Shape shape; - selection = trackerPanel.getSelectedPoint(); - Point pt = points[0].getScreenPosition(trackerPanel); - if (selection == points[0]) { // point is selected - transform.setToTranslation(pt.x, pt.y); - shape = transform.createTransformedShape(selectionShape); - } - else { // point is not selected - shape = footprint.getShape(new Point[] {pt}); - } - // create mark - final Color color = footprint.getColor(); - final Shape fillShape = shape; - mark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.setPaint(color); - g.fill(fillShape); - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - return fillShape.getBounds(); - } - }; - marks.put(trackerPanel, mark); - } - return mark; - } - - /** - * Clones this Step. - * - * @return a clone of this step - */ - public Object clone() { - OffsetOriginStep step = (OffsetOriginStep)super.clone(); - step.points[0] = step.p = step.new Position(p.x, p.y); - return step; - } - - /** - * Returns a String describing this step. - * - * @return a descriptive string - */ - public String toString() { - String s = "Offset Origin Step " + n //$NON-NLS-1$ - + " [" + format.format(worldX) //$NON-NLS-1$ - + ", " + format.format(worldY) //$NON-NLS-1$ - + "]"; //$NON-NLS-1$ - return s; - } - - //______________________ inner Position class ________________________ - - /** - * A class to represent the position of the offset origin. - */ - public class Position extends TPoint { - - private double lastX, lastY; - - /** - * Constructs a position with specified image coordinates, - * and transforms those coordinates to set the world coordinates. - * - * @param x the image x coordinate - * @param y the image y coordinate - */ - public Position(double x, double y) { - super.setXY(x, y); - setCoordsEditTrigger(true); - if (offset.trackerPanel == null) return; - // set the world coordinates using x and y - ImageCoordSystem coords = offset.trackerPanel.getCoords(); - int n = offset.trackerPanel.getFrameNumber(); - worldX = coords.imageToWorldX(n, x, y); - worldY = coords.imageToWorldY(n, x, y); - } - - /** - * Overrides TPoint setXY method. This moves the origin so the world - * coordinates do not change. - * - * @param x the x position - * @param y the y position - */ - public void setXY(double x, double y) { - if (track.isLocked()) return; - if (isAdjusting()) { - lastX = x; - lastY = y; - } - double dx = x - getX(); - double dy = y - getY(); - super.setXY(x, y); - if (offset.trackerPanel == null) return; - ImageCoordSystem coords = offset.trackerPanel.getCoords(); - coords.setAdjusting(isAdjusting()); - int n = offset.trackerPanel.getFrameNumber(); - // get the current image position of the origin - double x0 = coords.getOriginX(n); - double y0 = coords.getOriginY(n); - // translate the origin - coords.setOriginXY(n, x0 + dx, y0 + dy); - if (isAdjusting()) { - repaint(); - } - } - - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - setXY(lastX, lastY); - track.firePropertyChange("step", null, n); //$NON-NLS-1$ - } - } - - /** - * Overrides TPoint showCoordinates method. This updates the values - * of the x and y fields. - * - * @param vidPanel the video panel - */ - public void showCoordinates(VideoPanel vidPanel) { - // put values into offset x and y fields - offset.xField.setValue(worldX); - offset.yField.setValue(worldY); - super.showCoordinates(vidPanel); - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; + +import org.opensourcephysics.media.core.*; + +/** + * This is a Step for a OffsetOrigin. It is used for + * setting the origin of an ImageCoordSystem. + * + * @author Douglas Brown + */ +public class OffsetOriginStep extends Step { + + // instance fields + private OffsetOrigin offset; + private Position p; + protected double worldX, worldY; + + /** + * Constructs a OffsetOriginStep with specified image coordinates. + * + * @param track the offset origin + * @param n the frame number + * @param x the image x coordinate + * @param y the image y coordinate + */ + public OffsetOriginStep(OffsetOrigin track, int n, double x, double y) { + super(track, n); + offset = track; + screenPoints = new Point[getLength()]; + points = new TPoint[getLength()]; + p = new Position(x, y); // sets initial worldX and worldY + points[0] = p; + } + + /** + * Gets the position. + * + * @return the position + */ + public Position getPosition() { + return p; + } + + /** + * Sets the world coordinates. This moves the origin so the + * image location does not change. + * + * @param x the world x coordinate + * @param y the world y coordinate + */ + public void setWorldXY(double x, double y) { + if (track.isLocked()) return; + + if (offset.isFixedCoordinates()) { + OffsetOriginStep step = (OffsetOriginStep)offset.steps.getStep(0); + step.worldX = x; + step.worldY = y; + step.erase(); + offset.refreshStep(OffsetOriginStep.this); // sets properties of this step + } + else { + worldX = x; + worldY = y; + offset.keyFrames.add(n); + } + + if (offset.trackerPanel == null) return; + ImageCoordSystem coords = offset.trackerPanel.getCoords(); + int n = offset.trackerPanel.getFrameNumber(); + // get the current image position of the origin + double x0 = coords.getOriginX(n); + double y0 = coords.getOriginY(n); + // get the current image position of the world coordinates + double x1 = coords.worldToImageX(n, x, y); + double y1 = coords.worldToImageY(n, x, y); + // translate the origin + coords.setOriginXY(n, x0+p.x-x1, y0+p.y-y1); + } + + /** + * Overrides Step getMark method. + * + * @param trackerPanel the tracker panel + * @return the mark + */ + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + TPoint selection = null; + if (mark == null) { + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + // set position location to image position of world coordinates + double x = coords.worldToImageX(n, worldX, worldY); + double y = coords.worldToImageY(n, worldX, worldY); + p.setLocation(x, y); + // get point shape + Shape shape; + selection = trackerPanel.getSelectedPoint(); + Point pt = points[0].getScreenPosition(trackerPanel); + if (selection == points[0]) { // point is selected + transform.setToTranslation(pt.x, pt.y); + shape = transform.createTransformedShape(selectionShape); + } + else { // point is not selected + shape = footprint.getShape(new Point[] {pt}); + } + // create mark + final Color color = footprint.getColor(); + final Shape fillShape = shape; + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.setPaint(color); + g.fill(fillShape); + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + return fillShape.getBounds(); + } + }; + marks.put(trackerPanel, mark); + } + return mark; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + OffsetOriginStep step = (OffsetOriginStep)super.clone(); + step.points[0] = step.p = step.new Position(p.x, p.y); + return step; + } + + /** + * Returns a String describing this step. + * + * @return a descriptive string + */ + public String toString() { + String s = "Offset Origin Step " + n //$NON-NLS-1$ + + " [" + format.format(worldX) //$NON-NLS-1$ + + ", " + format.format(worldY) //$NON-NLS-1$ + + "]"; //$NON-NLS-1$ + return s; + } + + //______________________ inner Position class ________________________ + + /** + * A class to represent the position of the offset origin. + */ + public class Position extends TPoint { + + private double lastX, lastY; + + /** + * Constructs a position with specified image coordinates, + * and transforms those coordinates to set the world coordinates. + * + * @param x the image x coordinate + * @param y the image y coordinate + */ + public Position(double x, double y) { + super.setXY(x, y); + setCoordsEditTrigger(true); + if (offset.trackerPanel == null) return; + // set the world coordinates using x and y + ImageCoordSystem coords = offset.trackerPanel.getCoords(); + int n = offset.trackerPanel.getFrameNumber(); + worldX = coords.imageToWorldX(n, x, y); + worldY = coords.imageToWorldY(n, x, y); + } + + /** + * Overrides TPoint setXY method. This moves the origin so the world + * coordinates do not change. + * + * @param x the x position + * @param y the y position + */ + public void setXY(double x, double y) { + if (track.isLocked()) return; + if (isAdjusting()) { + lastX = x; + lastY = y; + } + double dx = x - getX(); + double dy = y - getY(); + super.setXY(x, y); + if (offset.trackerPanel == null) return; + ImageCoordSystem coords = offset.trackerPanel.getCoords(); + coords.setAdjusting(isAdjusting()); + int n = offset.trackerPanel.getFrameNumber(); + // get the current image position of the origin + double x0 = coords.getOriginX(n); + double y0 = coords.getOriginY(n); + // translate the origin + coords.setOriginXY(n, x0 + dx, y0 + dy); + if (isAdjusting()) { + repaint(); + } + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + setXY(lastX, lastY); + track.firePropertyChange("step", null, n); //$NON-NLS-1$ + } + } + + /** + * Overrides TPoint showCoordinates method. This updates the values + * of the x and y fields. + * + * @param vidPanel the video panel + */ + public void showCoordinates(VideoPanel vidPanel) { + // put values into offset x and y fields + offset.xField.setValue(worldX); + offset.yField.setValue(worldY); + super.showCoordinates(vidPanel); + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java index 2c495504..bac955b8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java @@ -1,144 +1,144 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import javax.swing.*; - -/** - * An OutlineFootprint returns an outline shape for a Point array of length 2. - * - * @author Douglas Brown - */ -public class OutlineFootprint extends LineFootprint { - - // instance fields - private int spread; // outline width is (2 + 2*spread) pixels - - /** - * Constructs an OutlineFootprint. - * - * @param name the name of the footprint - */ - public OutlineFootprint(String name) { - super(name); - setStroke(stroke); - } - - /** - * Sets the spread. The width of the outline is (1 + 2*spread). - * - * @param spread the desired spread - */ - public void setSpread(int spread) { - this.spread = spread; - } - - /** - * Gets the spread. - * - * @return the spread - */ - public int getSpread() { - return spread; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; - int prevSpread = spread; - spread = 1; - Shape shape = getShape(points); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - spread = prevSpread; - return icon; - } - - /** - * Overrides LineProfile setStroke method. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - super.setStroke(stroke); - } - - /** - * Gets the shape of this footprint. - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - Point p1 = points[0]; - Point p2 = points[1]; - double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); - transform.setToRotation(theta, p2.x, p2.y); - transform.translate(p2.x, p2.y); - float d = (float)p1.distance(p2); // length of the line - // create outline - path.reset(); - path.moveTo(0, -1 - spread); - path.lineTo(0, 1 + spread); - path.lineTo(d, 1 + spread); - path.lineTo(d, -1 - spread); - path.closePath(); - // handle marker - int w = Math.min(spread + 1, 4); - path.moveTo(d/2, w); - path.lineTo(d/2, -w); - // centerline - if (getSpread() > 4) { - path.moveTo(0, 0); - path.lineTo(d, 0); - } - Shape outline = transform.createTransformedShape(path); // outline shape - outline = stroke.createStrokedShape(outline); - // ceate hitshapes - path.reset(); - path.moveTo(d, -1 - spread); - path.lineTo(d, 1 + spread); - hitShapes[0] = transform.createTransformedShape(path); // end 1 - path.reset(); - path.moveTo(0, -1 - spread); - path.lineTo(0, 1 + spread); - hitShapes[1] = transform.createTransformedShape(path); // end 2 - // set handle hitshape to center line - float f = 0.45f; // hitshape will be 90% of tape length - path.reset(); - path.moveTo(d * (0.5f + f), 0); - path.lineTo(d * (0.5f - f), 0); - hitShapes[2] = transform.createTransformedShape(path); // sides - return outline; - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import javax.swing.*; + +/** + * An OutlineFootprint returns an outline shape for a Point array of length 2. + * + * @author Douglas Brown + */ +public class OutlineFootprint extends LineFootprint { + + // instance fields + private int spread; // outline width is (2 + 2*spread) pixels + + /** + * Constructs an OutlineFootprint. + * + * @param name the name of the footprint + */ + public OutlineFootprint(String name) { + super(name); + setStroke(stroke); + } + + /** + * Sets the spread. The width of the outline is (1 + 2*spread). + * + * @param spread the desired spread + */ + public void setSpread(int spread) { + this.spread = spread; + } + + /** + * Gets the spread. + * + * @return the spread + */ + public int getSpread() { + return spread; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; + int prevSpread = spread; + spread = 1; + Shape shape = getShape(points); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + spread = prevSpread; + return icon; + } + + /** + * Overrides LineProfile setStroke method. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + super.setStroke(stroke); + } + + /** + * Gets the shape of this footprint. + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + Point p1 = points[0]; + Point p2 = points[1]; + double theta = Math.atan2(p1.y - p2.y, p1.x - p2.x); + transform.setToRotation(theta, p2.x, p2.y); + transform.translate(p2.x, p2.y); + float d = (float)p1.distance(p2); // length of the line + // create outline + path.reset(); + path.moveTo(0, -1 - spread); + path.lineTo(0, 1 + spread); + path.lineTo(d, 1 + spread); + path.lineTo(d, -1 - spread); + path.closePath(); + // handle marker + int w = Math.min(spread + 1, 4); + path.moveTo(d/2, w); + path.lineTo(d/2, -w); + // centerline + if (getSpread() > 4) { + path.moveTo(0, 0); + path.lineTo(d, 0); + } + Shape outline = transform.createTransformedShape(path); // outline shape + outline = stroke.createStrokedShape(outline); + // ceate hitshapes + path.reset(); + path.moveTo(d, -1 - spread); + path.lineTo(d, 1 + spread); + hitShapes[0] = transform.createTransformedShape(path); // end 1 + path.reset(); + path.moveTo(0, -1 - spread); + path.lineTo(0, 1 + spread); + hitShapes[1] = transform.createTransformedShape(path); // end 2 + // set handle hitshape to center line + float f = 0.45f; // hitshape will be 90% of tape length + path.reset(); + path.moveTo(d * (0.5f + f), 0); + path.lineTo(d * (0.5f - f), 0); + hitShapes[2] = transform.createTransformedShape(path); // sides + return outline; + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/PageTView.java b/src/org/opensourcephysics/cabrillo/tracker/PageTView.java index e8e8f52a..7fa4c26c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PageTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PageTView.java @@ -1,1012 +1,1012 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; - -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.event.HyperlinkEvent; -import javax.swing.event.HyperlinkListener; -import javax.swing.undo.AbstractUndoableEdit; -import javax.swing.undo.CannotUndoException; -import javax.swing.undo.UndoManager; -import javax.swing.undo.UndoableEdit; -import javax.swing.undo.UndoableEditSupport; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.desktop.OSPDesktop; -import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.tools.LaunchBuilder; -import org.opensourcephysics.tools.Resource; -import org.opensourcephysics.tools.ResourceLoader; - -/** - * This displays html or plain text in one or more tabs. - * - * @author Douglas Brown - */ -public class PageTView extends JPanel implements TView { - - // instance fields - protected Icon icon; - protected TrackerPanel trackerPanel; - protected ArrayList tabs = new ArrayList(); - protected JTabbedPane tabbedPane; // each tab is a TabView - protected JButton pageButton; - protected ArrayList toolbarComponents = new ArrayList(); - protected JDialog nameDialog; - protected JTextField nameField; - protected JPanel noTab; - protected JLabel noTabLabel; - protected JLabel tabTitleLabel; - protected Box.Filler filler = (Box.Filler)Box.createHorizontalGlue(); - protected Border titleBorder; - protected boolean locked; - - static { - XML.setLoader(TabView.class, new TabLoader()); - } - - /** - * Constructs a TextTView for the specified tracker panel. - * - * @param panel the tracker panel - */ - protected PageTView(TrackerPanel panel) { - trackerPanel = panel; - icon = new ImageIcon( - Tracker.class.getResource("resources/images/html.gif")); //$NON-NLS-1$ - setBackground(panel.getBackground()); - createGUI(); - refresh(); - } - - /** - * Refreshes this view. - */ - public void refresh() { - refreshTabs(); - removeAll(); - pageButton.setText(TrackerRes.getString("PageTView.Button.Page")); //$NON-NLS-1$ - if (tabs.isEmpty()) { - noTabLabel.setText(TrackerRes.getString("TextTView.Label.NoTab")); //$NON-NLS-1$ - add(noTab, BorderLayout.CENTER); - } - else if (tabs.size()==1) { - add(tabs.get(0), BorderLayout.CENTER); - } - else { - add(tabbedPane, BorderLayout.CENTER); - } - FontSizer.setFonts(this, FontSizer.getLevel()); - - validate(); - repaint(); - } - - /** - * Initializes this view - */ - public void init() { - } - - /** - * Cleans up this view - */ - public void cleanup() { - } - - /** - * Gets the tracker panel containing the tracks - * - * @return the tracker panel - */ - public TrackerPanel getTrackerPanel() { - return trackerPanel; - } - - - /** - * Gets the name of the view - * - * @return the name of this view - */ - public String getViewName() { - return TrackerRes.getString("TFrame.View.Text"); //$NON-NLS-1$ - } - - /** - * Gets the icon for this view - * - * @return the icon - */ - public Icon getViewIcon() { - return icon; - } - - /** - * Gets the toolbar components - * - * @return an ArrayList of components to be added to a toolbar - */ - public ArrayList getToolBarComponents() { - return toolbarComponents; - } - - /** - * Returns true if this view is in a custom state. - * - * @return true if in a custom state, false if in the default state - */ - public boolean isCustomState() { - return tabs.size()>0; - } - - /** - * Adds a tab to the tabbed pane. - * - * @param tab the tab to add - */ - public void addTab(TabView tab) { - tabs.add(tab); - if (trackerPanel!=null) { - trackerPanel.changed = true; - } - refresh(); - } - - /** - * Removes a tab from the tabbed pane. - * - * @param tab the tab to remove - */ - public void removeTab(TabView tab) { - tabs.remove(tab); - if (trackerPanel!=null) { - trackerPanel.changed = true; - } - refresh(); - } - - /** - * Renames a tab. - * - * @param tab the tab to rename - */ - public void renameTab(TabView tab) { - // show dialog with name of this track selected - nameDialog = getNameDialog(); - nameDialog.setTitle(TrackerRes.getString("TextTView.Dialog.TabTitle.Title")); //$NON-NLS-1$ - nameField.setText(tab.data.title); - nameField.setBackground(Color.white); - nameField.selectAll(); - nameDialog.pack(); - Point p = getLocationOnScreen(); - p.x += (getWidth()-nameDialog.getWidth())/2; - p.y -= pageButton.getHeight(); - nameDialog.setLocation(p); - nameDialog.setVisible(true); - } - - /** - * Gets the selected tab. - * - * @return the tab - */ - public TabView getSelectedTab() { - TabView tab = (TabView)tabbedPane.getSelectedComponent(); - if (tab==null && !tabs.isEmpty()) { - tab = tabs.get(0); - } - return tab; - } - - /** - * Sets the selected tab. - * - * @param tab the tab - */ - public void setSelectedTab(TabView tab) { - if (tabs.size()>1) - tabbedPane.setSelectedComponent(tab); - } - - /** - * Responds to property change events. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { -// String name = e.getPropertyName(); - } - -//_________________________ protected and private methods _________________ - - /** - * Creates the GUI. - */ - protected void createGUI() { - setPreferredSize(new Dimension(400, 200)); - setLayout(new BorderLayout()); - // create the tabbed pane - tabbedPane = new JTabbedPane(SwingConstants.TOP); - tabbedPane.setBackground(trackerPanel.getBackground()); - tabbedPane.addChangeListener(new ChangeListener() { - public void stateChanged(ChangeEvent e) { - refreshTitle(); - } - }); - tabbedPane.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - tabbedPane.requestFocusInWindow(); - if (OSPRuntime.isPopupTrigger(e)) { - // show popup menu - JPopupMenu popup = getPopup(getSelectedTab()); - popup.show(tabbedPane, e.getX(), e.getY()); - } - else if (e.getClickCount()==2 && !locked - && trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ - renameTab(getSelectedTab()); - } - } - }); - // create the new tab button - pageButton = new TButton() { - // override getMaximumSize method so has same height as chooser button - public Dimension getMaximumSize() { - Dimension dim = super.getMaximumSize(); - Dimension min = getMinimumSize(); - Container c = getParent().getParent(); - if (c instanceof TViewChooser) { - int h = ((TViewChooser)c).chooserButton.getHeight(); - dim.height = Math.max(h, min.height); - } - return dim; - } - - public JPopupMenu getPopup() { - JPopupMenu popup = new JPopupMenu(); - if (!trackerPanel.isEnabled("pageView.edit")) {//$NON-NLS-1$ - JMenuItem item = new JMenuItem(TrackerRes.getString("TTrack.MenuItem.Locked")); //$NON-NLS-1$ - item.setEnabled(false); - popup.add(item); - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - JMenuItem item = new JMenuItem(TrackerRes.getString("TextTView.Button.NewTab")); //$NON-NLS-1$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - TabView tab = new TabView(new TabData()); - int n = tabs.size()+1; - if (n>1) { - tab.data.title += " "+n; //$NON-NLS-1$ - } - addTab(tab); - setSelectedTab(tab); - } - }); - item.setEnabled(!locked); - popup.add(item); - item = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.OpenHTML")); //$NON-NLS-1$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = LaunchBuilder.getHTMLChooser(); - int result = chooser.showOpenDialog(trackerPanel); - if(result==JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - TabView tab = getSelectedTab(); - if (tab==null) { - tab = new TabView(new TabData()); - addTab(tab); - } - tab.setUndoableText(XML.getAbsolutePath(file)); - refresh(); - OSPRuntime.chooserDir = XML.getDirectoryPath(file.getPath()); - } - } - }); - item.setEnabled(!locked); - popup.add(item); - popup.addSeparator(); - item = new JRadioButtonMenuItem(TrackerRes.getString("TTrack.MenuItem.Locked")); //$NON-NLS-1$ - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JMenuItem item = (JMenuItem)e.getSource(); - locked = item.isSelected(); - } - }); - item.setSelected(locked); - popup.add(item); - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - }; - // create tabTitleLabel - tabTitleLabel = new JLabel(); - tabTitleLabel.setOpaque(false); - tabTitleLabel.setForeground(Color.BLUE.darker()); - tabTitleLabel.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if ("".equals(tabTitleLabel.getText())) return; //$NON-NLS-1$ - tabTitleLabel.requestFocusInWindow(); - if (OSPRuntime.isPopupTrigger(e)) { - // show popup menu - JPopupMenu popup = getPopup(getSelectedTab()); - popup.show(tabTitleLabel, e.getX(), e.getY()); - } - else if (e.getClickCount()==2 && !locked - && trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ - renameTab(getSelectedTab()); - } - } - - public void mouseEntered(MouseEvent e) { - if (!locked && trackerPanel.isEnabled("pageView.edit")) //$NON-NLS-1$ - tabTitleLabel.setBorder(titleBorder); - } - - public void mouseExited(MouseEvent e) { - tabTitleLabel.setBorder(null); - } - - }); - Border empty = BorderFactory.createEmptyBorder(0, 2, 1, 2); - Border line = BorderFactory.createLineBorder(tabTitleLabel.getForeground()); - titleBorder = BorderFactory.createCompoundBorder(line, empty); - // asssemble toolbar components - toolbarComponents.add(pageButton); - toolbarComponents.add(filler); - toolbarComponents.add(tabTitleLabel); - // create the noTab panel - noTab = new JPanel(); - noTabLabel = new JLabel(); - Font font = new JTextField().getFont(); - noTabLabel.setFont(font); - noTab.add(noTabLabel); - noTab.setBackground(getBackground()); - noTab.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (OSPRuntime.isPopupTrigger(e)) { - JPopupMenu popup = new JPopupMenu(); - JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ - } - }); - popup.add(helpItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(noTab, e.getX(), e.getY()); - } - } - }); - } - - /** - * Refreshes all tabs. - */ - protected void refreshTabs() { - TabView prev = getSelectedTab(); - tabbedPane.removeAll(); - for (TabView tab: tabs) { - tab.pageView = this; - tab.data.trackerPanel = trackerPanel; - tab.refreshView(false); - tabbedPane.addTab(tab.data.title, tab); - } - if (prev!=null && tabbedPane.indexOfComponent(prev)>-1) { - tabbedPane.setSelectedComponent(prev); - } - refreshTitle(); - if (trackerPanel!=null) { - TToolBar.getToolbar(trackerPanel).refresh(false); - } - } - - /** - * Refreshes the title bar. - */ - protected void refreshTitle() { - TabView tab = getSelectedTab(); - tabTitleLabel.setText(tab==null? null: tab.data.title); - } - - /** - * Gets the popup menu for a specified tab. - * - * @param tab the tab - * @return the popup menu - */ - protected JPopupMenu getPopup(final TabView tab) { - JPopupMenu popup = new JPopupMenu(); - String s = null; - if (trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ - int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); - JMenuItem renameItem = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.SetTitle")); //$NON-NLS-1$ - renameItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - renameTab(tab); - } - }); - renameItem.setEnabled(!locked); - popup.add(renameItem); - JMenuItem openItem = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.OpenHTML")); //$NON-NLS-1$ - openItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JFileChooser chooser = LaunchBuilder.getHTMLChooser(); - int result = chooser.showOpenDialog(trackerPanel); - if(result==JFileChooser.APPROVE_OPTION) { - File file = chooser.getSelectedFile(); - tab.setUndoableText(XML.getAbsolutePath(file)); - refresh(); - OSPRuntime.chooserDir = XML.getDirectoryPath(file.getPath()); - } - } - }); - openItem.setEnabled(!locked); - popup.add(openItem); - popup.addSeparator(); - s = TrackerRes.getString("PageTView.MenuItem.ClosePage")+" \""; //$NON-NLS-1$ //$NON-NLS-2$ - s += tab.data.title+"\""; //$NON-NLS-1$ - JMenuItem closeItem = new JMenuItem(s); - closeItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - removeTab(tab); - } - }); - closeItem.setEnabled(!locked); - popup.add(closeItem); - if (tab.data.url!=null) { - s = TrackerRes.getString("PageTView.MenuItem.OpenInBrowser"); //$NON-NLS-1$ - JMenuItem item = new JMenuItem(s); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - OSPDesktop.displayURL(tab.data.url.toExternalForm()); - } - }); - popup.add(item); - } - if (tab.undoManager.canUndoOrRedo()) { - popup.addSeparator(); - if (tab.undoManager.canUndo()) { - s = TrackerRes.getString("TMenuBar.MenuItem.Undo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ - s += TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ - JMenuItem undoItem = new JMenuItem(s); - undoItem.setAccelerator(KeyStroke.getKeyStroke('Z', keyMask)); - undoItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - tab.undoManager.undo(); - } - }); - undoItem.setEnabled(!locked); - popup.add(undoItem); - } - if (tab.undoManager.canRedo()) { - s = TrackerRes.getString("TMenuBar.MenuItem.Redo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ - s += TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ - JMenuItem redoItem = new JMenuItem(s); - redoItem.setAccelerator(KeyStroke.getKeyStroke('Y', keyMask)); - redoItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - tab.undoManager.redo(); - } - }); - redoItem.setEnabled(!locked); - popup.add(redoItem); - } - } - popup.addSeparator(); - } - s = TrackerRes.getString("Dialog.Button.Help")+"..."; //$NON-NLS-1$ //$NON-NLS-2$ - JMenuItem helpItem = new JMenuItem(s); - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ - } - }); - popup.add(helpItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - - protected JDialog getNameDialog() { - if (nameDialog==null) { - // create the name dialog - nameField = new JTextField(20); - nameField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - TabView tab = getSelectedTab(); - tab.data.setTitle(nameField.getText()); - refresh(); - nameDialog.setVisible(false); - } - }); - nameField.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - nameField.setBackground(Color.yellow); - } - }); - JToolBar bar = new JToolBar(); - bar.setFloatable(false); - bar.add(nameField); - JPanel contentPane = new JPanel(new BorderLayout()); - contentPane.add(bar, BorderLayout.CENTER); - nameDialog = new JDialog(JOptionPane.getFrameForComponent(this), true); - nameDialog.addWindowListener(new WindowAdapter() { - public void windowClosing(WindowEvent e) { - TabView tab = getSelectedTab(); - tab.data.setTitle(nameField.getText()); - refresh(); - } - }); - nameDialog.setContentPane(contentPane); - nameDialog.pack(); - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - nameDialog.getBounds().width) / 2; - int y = (dim.height - nameDialog.getBounds().height) / 2; - nameDialog.setLocation(x, y); - } - FontSizer.setFonts(nameDialog, FontSizer.getLevel()); - return nameDialog; - } - -//__________________________________ inner classes _________________________ - - /** - * A class to hold the view for a single tab. - */ - public static class TabView extends JPanel { - - protected TabData data; - protected JEditorPane displayPane; - protected JEditorPane editorPane; - protected JScrollPane scroller; - protected PageTView pageView; - protected UndoableEditSupport undoSupport; - protected UndoManager undoManager; - protected HyperlinkListener hyperlinkListener; - - TabView(TabData tab) { - super(new BorderLayout()); - data = tab; - class TextView extends JTextPane { - public void paintComponent(Graphics g) { - if(OSPRuntime.antiAliasText) { - Graphics2D g2 = (Graphics2D) g; - RenderingHints rh = g2.getRenderingHints(); - rh.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); - rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - } - super.paintComponent(g); - } - } - - // display pane - displayPane = new TextView(); - displayPane.setEditable(false); - hyperlinkListener = new HyperlinkListener() { - public void hyperlinkUpdate(HyperlinkEvent e) { - if(data.hyperlinksEnabled - && e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) { - try { - if(!org.opensourcephysics.desktop.OSPDesktop.browse(e.getURL().toURI())) { - // try the old way - org.opensourcephysics.desktop.ostermiller.Browser.init(); - org.opensourcephysics.desktop.ostermiller.Browser.displayURL(e.getURL().toString()); - } - } catch(Exception ex) {} - } - } - }; - displayPane.addHyperlinkListener(hyperlinkListener); - displayPane.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if(e.getKeyCode()==KeyEvent.VK_Z && e.isControlDown()) { - if (undoManager.canUndo()) { - undoManager.undo(); - } - } - else if(e.getKeyCode()==KeyEvent.VK_Y && e.isControlDown()) { - if (undoManager.canRedo()) { - undoManager.redo(); - } - } - } - }); - displayPane.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (OSPRuntime.isPopupTrigger(e)) { - // show popup menu - JPopupMenu popup = pageView.getPopup(pageView.getSelectedTab()); - popup.show(displayPane, e.getX(), e.getY()); - } - else if (e.getClickCount()==2 && !pageView.locked - && pageView.trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ - editorPane.setBackground(Color.white); - refreshView(true); - editorPane.selectAll(); - } - } - }); - - // editor pane - editorPane = new TextView(); - editorPane.setContentType("text"); //$NON-NLS-1$ - editorPane.setEditable(true); - editorPane.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (OSPRuntime.isPopupTrigger(e)) { - // show popup menu - JPopupMenu popup = pageView.getPopup(pageView.getSelectedTab()); - popup.show(editorPane, e.getX(), e.getY()); - } - } - }); - editorPane.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (editorPane.getBackground().equals(Color.yellow)) { - setUndoableText(editorPane.getText()); - } - refreshView(false); - } - }); - editorPane.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if(e.getKeyCode()==KeyEvent.VK_Z && e.isControlDown()) { - setUndoableText(editorPane.getText()); - refreshView(false); - if (undoManager.canUndo()) { - undoManager.undo(); - } - } - else if(e.getKeyCode()==KeyEvent.VK_ENTER && e.isShiftDown()) { - setUndoableText(editorPane.getText()); - refreshView(false); - } else { - editorPane.setBackground(Color.yellow); - } - } - }); - scroller = new JScrollPane(displayPane); - add(scroller, BorderLayout.CENTER); - refreshView(false); - // set up the undo system - undoManager = new UndoManager(); - undoSupport = new UndoableEditSupport(); - undoSupport.addUndoableEditListener(undoManager); - } - - void refreshView(boolean editing) { - if (editing) { - scroller.setViewportView(editorPane); - editorPane.setText(data.text); - editorPane.requestFocusInWindow(); - } - else { - editorPane.setBackground(Color.white); - scroller.setViewportView(displayPane); - if (data.getURL()!=null) { - try { - displayPane.setContentType("text/html"); //$NON-NLS-1$ - displayPane.setPage(data.url); - if(data.url.getRef()!=null) { - displayPane.scrollToReference(data.url.getRef()); - } - } catch(IOException e) { - displayPane.setContentType("text"); //$NON-NLS-1$ - displayPane.setText(data.text); - } - } - else { - displayPane.setContentType("text"); //$NON-NLS-1$ - displayPane.setText(data.text); - } - displayPane.requestFocusInWindow(); - } - revalidate(); - repaint(); - } - - void setUndoableText(String text) { - if (text==null || text.equals(data.text)) return; - UndoableEdit edit = new TextEdit(this, text, data.text); - undoSupport.postEdit(edit); - data.setText(text); - } - } - - /** - * A class to hold the data for a single tab. - */ - public static class TabData { - String title; - boolean hyperlinksEnabled = true; - String text; // may be text for display or url path - URL url; - TrackerPanel trackerPanel; - - /** - * No-arg constructor. - */ - TabData() { - text = TrackerRes.getString("TextTView.NewTab.Text1"); //$NON-NLS-1$ - text += XML.NEW_LINE+XML.NEW_LINE; - text += TrackerRes.getString("TextTView.NewTab.Text2"); //$NON-NLS-1$ - title = TrackerRes.getString("TextTView.NewTab.Title"); //$NON-NLS-1$ - } - - /** - * Constructor with tab text and title. - * - * @param title the tab title (may be null) - * @param text the text - */ - TabData(String title, String text) { - this.title = title; - setText(text); - } - - /** - * Sets the title. - * - * @param title the title - */ - public void setTitle(String title) { - if (title==null) return; - this.title = title; - if (trackerPanel!=null) { - trackerPanel.changed = true; - TToolBar.getToolbar(trackerPanel).refresh(false); - } - } - - /** - * Sets the text. - * - * @param text the text - */ - public void setText(String text) { - if (text==null) return; - this.text = text; - setURL(text); // fails for non-url text - } - - /** - * Gets the URL. May return null. - * - * @return the URL - */ - public URL getURL() { - if(url==null) { - setURL(text); - } - return url; - } - - /** - * Sets the URL. - * - * @param path the url path - */ - private void setURL(String path) { - url = null; - Resource res = ResourceLoader.getResource(path); - if((res!=null)&&(res.getURL()!=null)) { - url = res.getURL(); - try { - InputStream in = url.openStream(); - in.close(); - } catch(Exception ex) { - url = null; - } - } - if (trackerPanel!=null) { - trackerPanel.changed = true; - TToolBar.getToolbar(trackerPanel).refresh(false); - } - } - - } - - /** - * A class to undo/redo a text edit. - */ - protected static class TextEdit extends AbstractUndoableEdit { - TabView tab; - String text, prev; - - /** - * Constructor. - * @param tab the TabView being edited - * @param newText the new text - * @param prevText the previous text - */ - public TextEdit(TabView tab, String newText, String prevText) { - this.tab = tab; - text = newText; - prev = prevText; - } - - public void undo() throws CannotUndoException { - super.undo(); - tab.data.setText(prev); - tab.refreshView(false); - } - - public void redo() throws CannotUndoException { - super.redo(); - tab.data.setText(text); - tab.refreshView(false); - } - - public String getPresentationName() { - return TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ - } - - } - - /** - * A class to save and load object data for the TabData class. - */ - static class TabLoader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - TabView tab = (TabView)obj; - TabData data = tab.data; - control.setValue("title", data.title); //$NON-NLS-1$ - if (data.url==null) { - control.setValue("text", data.text); //$NON-NLS-1$ - } - else if (data.url.getProtocol().equals("file")) { //$NON-NLS-1$ - TrackerPanel panel = data.trackerPanel; - File file = panel.getDataFile(); - if (file!=null) { - String path = data.url.getFile(); - // strip leading slashes from path - while (path.startsWith("/")) { //$NON-NLS-1$ - path = path.substring(1); - } - String base = XML.getDirectoryPath(XML.getAbsolutePath(file)); - control.setValue("text", XML.getPathRelativeTo(path, base)); //$NON-NLS-1$ - } - else { - control.setValue("text", data.url.toExternalForm()); //$NON-NLS-1$ - } - } - else { - control.setValue("text", data.url.toExternalForm()); //$NON-NLS-1$ - } - } - - /** - * Creates an object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - String title = control.getString("title"); //$NON-NLS-1$ - String text = control.getString("text"); //$NON-NLS-1$ - return new TabView(new TabData(title, text)); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - return obj; - } - } - - /** - * Returns an XML.ObjectLoader to save/load data for the TextTView class. - * - * @return the XML.ObjectLoader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load object data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - PageTView view = (PageTView)obj; - control.setValue("tabs", view.tabs); //$NON-NLS-1$ - control.setValue("locked", view.locked); //$NON-NLS-1$ - } - - /** - * Creates an object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - PageTView view = (PageTView)obj; - view.locked = control.getBoolean("locked"); //$NON-NLS-1$ - // load the tabs - ArrayList tabs = ArrayList.class.cast(control.getObject("tabs")); //$NON-NLS-1$ - if (tabs != null) { - Iterator it = tabs.iterator(); - while (it.hasNext()) { - view.addTab((TabView)it.next()); - } - } - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusAdapter; +import java.awt.event.FocusEvent; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.undo.AbstractUndoableEdit; +import javax.swing.undo.CannotUndoException; +import javax.swing.undo.UndoManager; +import javax.swing.undo.UndoableEdit; +import javax.swing.undo.UndoableEditSupport; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.desktop.OSPDesktop; +import org.opensourcephysics.display.OSPRuntime; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.tools.LaunchBuilder; +import org.opensourcephysics.tools.Resource; +import org.opensourcephysics.tools.ResourceLoader; + +/** + * This displays html or plain text in one or more tabs. + * + * @author Douglas Brown + */ +public class PageTView extends JPanel implements TView { + + // instance fields + protected Icon icon; + protected TrackerPanel trackerPanel; + protected ArrayList tabs = new ArrayList(); + protected JTabbedPane tabbedPane; // each tab is a TabView + protected JButton pageButton; + protected ArrayList toolbarComponents = new ArrayList(); + protected JDialog nameDialog; + protected JTextField nameField; + protected JPanel noTab; + protected JLabel noTabLabel; + protected JLabel tabTitleLabel; + protected Box.Filler filler = (Box.Filler)Box.createHorizontalGlue(); + protected Border titleBorder; + protected boolean locked; + + static { + XML.setLoader(TabView.class, new TabLoader()); + } + + /** + * Constructs a TextTView for the specified tracker panel. + * + * @param panel the tracker panel + */ + protected PageTView(TrackerPanel panel) { + trackerPanel = panel; + icon = new ImageIcon( + Tracker.class.getResource("resources/images/html.gif")); //$NON-NLS-1$ + setBackground(panel.getBackground()); + createGUI(); + refresh(); + } + + /** + * Refreshes this view. + */ + public void refresh() { + refreshTabs(); + removeAll(); + pageButton.setText(TrackerRes.getString("PageTView.Button.Page")); //$NON-NLS-1$ + if (tabs.isEmpty()) { + noTabLabel.setText(TrackerRes.getString("TextTView.Label.NoTab")); //$NON-NLS-1$ + add(noTab, BorderLayout.CENTER); + } + else if (tabs.size()==1) { + add(tabs.get(0), BorderLayout.CENTER); + } + else { + add(tabbedPane, BorderLayout.CENTER); + } + FontSizer.setFonts(this, FontSizer.getLevel()); + + validate(); + repaint(); + } + + /** + * Initializes this view + */ + public void init() { + } + + /** + * Cleans up this view + */ + public void cleanup() { + } + + /** + * Gets the tracker panel containing the tracks + * + * @return the tracker panel + */ + public TrackerPanel getTrackerPanel() { + return trackerPanel; + } + + + /** + * Gets the name of the view + * + * @return the name of this view + */ + public String getViewName() { + return TrackerRes.getString("TFrame.View.Text"); //$NON-NLS-1$ + } + + /** + * Gets the icon for this view + * + * @return the icon + */ + public Icon getViewIcon() { + return icon; + } + + /** + * Gets the toolbar components + * + * @return an ArrayList of components to be added to a toolbar + */ + public ArrayList getToolBarComponents() { + return toolbarComponents; + } + + /** + * Returns true if this view is in a custom state. + * + * @return true if in a custom state, false if in the default state + */ + public boolean isCustomState() { + return tabs.size()>0; + } + + /** + * Adds a tab to the tabbed pane. + * + * @param tab the tab to add + */ + public void addTab(TabView tab) { + tabs.add(tab); + if (trackerPanel!=null) { + trackerPanel.changed = true; + } + refresh(); + } + + /** + * Removes a tab from the tabbed pane. + * + * @param tab the tab to remove + */ + public void removeTab(TabView tab) { + tabs.remove(tab); + if (trackerPanel!=null) { + trackerPanel.changed = true; + } + refresh(); + } + + /** + * Renames a tab. + * + * @param tab the tab to rename + */ + public void renameTab(TabView tab) { + // show dialog with name of this track selected + nameDialog = getNameDialog(); + nameDialog.setTitle(TrackerRes.getString("TextTView.Dialog.TabTitle.Title")); //$NON-NLS-1$ + nameField.setText(tab.data.title); + nameField.setBackground(Color.white); + nameField.selectAll(); + nameDialog.pack(); + Point p = getLocationOnScreen(); + p.x += (getWidth()-nameDialog.getWidth())/2; + p.y -= pageButton.getHeight(); + nameDialog.setLocation(p); + nameDialog.setVisible(true); + } + + /** + * Gets the selected tab. + * + * @return the tab + */ + public TabView getSelectedTab() { + TabView tab = (TabView)tabbedPane.getSelectedComponent(); + if (tab==null && !tabs.isEmpty()) { + tab = tabs.get(0); + } + return tab; + } + + /** + * Sets the selected tab. + * + * @param tab the tab + */ + public void setSelectedTab(TabView tab) { + if (tabs.size()>1) + tabbedPane.setSelectedComponent(tab); + } + + /** + * Responds to property change events. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { +// String name = e.getPropertyName(); + } + +//_________________________ protected and private methods _________________ + + /** + * Creates the GUI. + */ + protected void createGUI() { + setPreferredSize(new Dimension(400, 200)); + setLayout(new BorderLayout()); + // create the tabbed pane + tabbedPane = new JTabbedPane(SwingConstants.TOP); + tabbedPane.setBackground(trackerPanel.getBackground()); + tabbedPane.addChangeListener(new ChangeListener() { + public void stateChanged(ChangeEvent e) { + refreshTitle(); + } + }); + tabbedPane.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + tabbedPane.requestFocusInWindow(); + if (OSPRuntime.isPopupTrigger(e)) { + // show popup menu + JPopupMenu popup = getPopup(getSelectedTab()); + popup.show(tabbedPane, e.getX(), e.getY()); + } + else if (e.getClickCount()==2 && !locked + && trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ + renameTab(getSelectedTab()); + } + } + }); + // create the new tab button + pageButton = new TButton() { + // override getMaximumSize method so has same height as chooser button + public Dimension getMaximumSize() { + Dimension dim = super.getMaximumSize(); + Dimension min = getMinimumSize(); + Container c = getParent().getParent(); + if (c instanceof TViewChooser) { + int h = ((TViewChooser)c).chooserButton.getHeight(); + dim.height = Math.max(h, min.height); + } + return dim; + } + + public JPopupMenu getPopup() { + JPopupMenu popup = new JPopupMenu(); + if (!trackerPanel.isEnabled("pageView.edit")) {//$NON-NLS-1$ + JMenuItem item = new JMenuItem(TrackerRes.getString("TTrack.MenuItem.Locked")); //$NON-NLS-1$ + item.setEnabled(false); + popup.add(item); + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + JMenuItem item = new JMenuItem(TrackerRes.getString("TextTView.Button.NewTab")); //$NON-NLS-1$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + TabView tab = new TabView(new TabData()); + int n = tabs.size()+1; + if (n>1) { + tab.data.title += " "+n; //$NON-NLS-1$ + } + addTab(tab); + setSelectedTab(tab); + } + }); + item.setEnabled(!locked); + popup.add(item); + item = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.OpenHTML")); //$NON-NLS-1$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = LaunchBuilder.getHTMLChooser(); + int result = chooser.showOpenDialog(trackerPanel); + if(result==JFileChooser.APPROVE_OPTION) { + File file = chooser.getSelectedFile(); + TabView tab = getSelectedTab(); + if (tab==null) { + tab = new TabView(new TabData()); + addTab(tab); + } + tab.setUndoableText(XML.getAbsolutePath(file)); + refresh(); + OSPRuntime.chooserDir = XML.getDirectoryPath(file.getPath()); + } + } + }); + item.setEnabled(!locked); + popup.add(item); + popup.addSeparator(); + item = new JRadioButtonMenuItem(TrackerRes.getString("TTrack.MenuItem.Locked")); //$NON-NLS-1$ + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JMenuItem item = (JMenuItem)e.getSource(); + locked = item.isSelected(); + } + }); + item.setSelected(locked); + popup.add(item); + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + }; + // create tabTitleLabel + tabTitleLabel = new JLabel(); + tabTitleLabel.setOpaque(false); + tabTitleLabel.setForeground(Color.BLUE.darker()); + tabTitleLabel.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if ("".equals(tabTitleLabel.getText())) return; //$NON-NLS-1$ + tabTitleLabel.requestFocusInWindow(); + if (OSPRuntime.isPopupTrigger(e)) { + // show popup menu + JPopupMenu popup = getPopup(getSelectedTab()); + popup.show(tabTitleLabel, e.getX(), e.getY()); + } + else if (e.getClickCount()==2 && !locked + && trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ + renameTab(getSelectedTab()); + } + } + + public void mouseEntered(MouseEvent e) { + if (!locked && trackerPanel.isEnabled("pageView.edit")) //$NON-NLS-1$ + tabTitleLabel.setBorder(titleBorder); + } + + public void mouseExited(MouseEvent e) { + tabTitleLabel.setBorder(null); + } + + }); + Border empty = BorderFactory.createEmptyBorder(0, 2, 1, 2); + Border line = BorderFactory.createLineBorder(tabTitleLabel.getForeground()); + titleBorder = BorderFactory.createCompoundBorder(line, empty); + // asssemble toolbar components + toolbarComponents.add(pageButton); + toolbarComponents.add(filler); + toolbarComponents.add(tabTitleLabel); + // create the noTab panel + noTab = new JPanel(); + noTabLabel = new JLabel(); + Font font = new JTextField().getFont(); + noTabLabel.setFont(font); + noTab.add(noTabLabel); + noTab.setBackground(getBackground()); + noTab.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (OSPRuntime.isPopupTrigger(e)) { + JPopupMenu popup = new JPopupMenu(); + JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ + } + }); + popup.add(helpItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(noTab, e.getX(), e.getY()); + } + } + }); + } + + /** + * Refreshes all tabs. + */ + protected void refreshTabs() { + TabView prev = getSelectedTab(); + tabbedPane.removeAll(); + for (TabView tab: tabs) { + tab.pageView = this; + tab.data.trackerPanel = trackerPanel; + tab.refreshView(false); + tabbedPane.addTab(tab.data.title, tab); + } + if (prev!=null && tabbedPane.indexOfComponent(prev)>-1) { + tabbedPane.setSelectedComponent(prev); + } + refreshTitle(); + if (trackerPanel!=null) { + TToolBar.getToolbar(trackerPanel).refresh(false); + } + } + + /** + * Refreshes the title bar. + */ + protected void refreshTitle() { + TabView tab = getSelectedTab(); + tabTitleLabel.setText(tab==null? null: tab.data.title); + } + + /** + * Gets the popup menu for a specified tab. + * + * @param tab the tab + * @return the popup menu + */ + protected JPopupMenu getPopup(final TabView tab) { + JPopupMenu popup = new JPopupMenu(); + String s = null; + if (trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ + int keyMask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask(); + JMenuItem renameItem = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.SetTitle")); //$NON-NLS-1$ + renameItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + renameTab(tab); + } + }); + renameItem.setEnabled(!locked); + popup.add(renameItem); + JMenuItem openItem = new JMenuItem(TrackerRes.getString("TextTView.MenuItem.OpenHTML")); //$NON-NLS-1$ + openItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser chooser = LaunchBuilder.getHTMLChooser(); + int result = chooser.showOpenDialog(trackerPanel); + if(result==JFileChooser.APPROVE_OPTION) { + File file = chooser.getSelectedFile(); + tab.setUndoableText(XML.getAbsolutePath(file)); + refresh(); + OSPRuntime.chooserDir = XML.getDirectoryPath(file.getPath()); + } + } + }); + openItem.setEnabled(!locked); + popup.add(openItem); + popup.addSeparator(); + s = TrackerRes.getString("PageTView.MenuItem.ClosePage")+" \""; //$NON-NLS-1$ //$NON-NLS-2$ + s += tab.data.title+"\""; //$NON-NLS-1$ + JMenuItem closeItem = new JMenuItem(s); + closeItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + removeTab(tab); + } + }); + closeItem.setEnabled(!locked); + popup.add(closeItem); + if (tab.data.url!=null) { + s = TrackerRes.getString("PageTView.MenuItem.OpenInBrowser"); //$NON-NLS-1$ + JMenuItem item = new JMenuItem(s); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + OSPDesktop.displayURL(tab.data.url.toExternalForm()); + } + }); + popup.add(item); + } + if (tab.undoManager.canUndoOrRedo()) { + popup.addSeparator(); + if (tab.undoManager.canUndo()) { + s = TrackerRes.getString("TMenuBar.MenuItem.Undo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ + s += TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ + JMenuItem undoItem = new JMenuItem(s); + undoItem.setAccelerator(KeyStroke.getKeyStroke('Z', keyMask)); + undoItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tab.undoManager.undo(); + } + }); + undoItem.setEnabled(!locked); + popup.add(undoItem); + } + if (tab.undoManager.canRedo()) { + s = TrackerRes.getString("TMenuBar.MenuItem.Redo")+" "; //$NON-NLS-1$ //$NON-NLS-2$ + s += TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ + JMenuItem redoItem = new JMenuItem(s); + redoItem.setAccelerator(KeyStroke.getKeyStroke('Y', keyMask)); + redoItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tab.undoManager.redo(); + } + }); + redoItem.setEnabled(!locked); + popup.add(redoItem); + } + } + popup.addSeparator(); + } + s = TrackerRes.getString("Dialog.Button.Help")+"..."; //$NON-NLS-1$ //$NON-NLS-2$ + JMenuItem helpItem = new JMenuItem(s); + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ + } + }); + popup.add(helpItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + + protected JDialog getNameDialog() { + if (nameDialog==null) { + // create the name dialog + nameField = new JTextField(20); + nameField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + TabView tab = getSelectedTab(); + tab.data.setTitle(nameField.getText()); + refresh(); + nameDialog.setVisible(false); + } + }); + nameField.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + nameField.setBackground(Color.yellow); + } + }); + JToolBar bar = new JToolBar(); + bar.setFloatable(false); + bar.add(nameField); + JPanel contentPane = new JPanel(new BorderLayout()); + contentPane.add(bar, BorderLayout.CENTER); + nameDialog = new JDialog(JOptionPane.getFrameForComponent(this), true); + nameDialog.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + TabView tab = getSelectedTab(); + tab.data.setTitle(nameField.getText()); + refresh(); + } + }); + nameDialog.setContentPane(contentPane); + nameDialog.pack(); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - nameDialog.getBounds().width) / 2; + int y = (dim.height - nameDialog.getBounds().height) / 2; + nameDialog.setLocation(x, y); + } + FontSizer.setFonts(nameDialog, FontSizer.getLevel()); + return nameDialog; + } + +//__________________________________ inner classes _________________________ + + /** + * A class to hold the view for a single tab. + */ + public static class TabView extends JPanel { + + protected TabData data; + protected JEditorPane displayPane; + protected JEditorPane editorPane; + protected JScrollPane scroller; + protected PageTView pageView; + protected UndoableEditSupport undoSupport; + protected UndoManager undoManager; + protected HyperlinkListener hyperlinkListener; + + TabView(TabData tab) { + super(new BorderLayout()); + data = tab; + class TextView extends JTextPane { + public void paintComponent(Graphics g) { + if(OSPRuntime.antiAliasText) { + Graphics2D g2 = (Graphics2D) g; + RenderingHints rh = g2.getRenderingHints(); + rh.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + rh.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + } + super.paintComponent(g); + } + } + + // display pane + displayPane = new TextView(); + displayPane.setEditable(false); + hyperlinkListener = new HyperlinkListener() { + public void hyperlinkUpdate(HyperlinkEvent e) { + if(data.hyperlinksEnabled + && e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) { + try { + if(!org.opensourcephysics.desktop.OSPDesktop.browse(e.getURL().toURI())) { + // try the old way + org.opensourcephysics.desktop.ostermiller.Browser.init(); + org.opensourcephysics.desktop.ostermiller.Browser.displayURL(e.getURL().toString()); + } + } catch(Exception ex) {} + } + } + }; + displayPane.addHyperlinkListener(hyperlinkListener); + displayPane.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if(e.getKeyCode()==KeyEvent.VK_Z && e.isControlDown()) { + if (undoManager.canUndo()) { + undoManager.undo(); + } + } + else if(e.getKeyCode()==KeyEvent.VK_Y && e.isControlDown()) { + if (undoManager.canRedo()) { + undoManager.redo(); + } + } + } + }); + displayPane.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (OSPRuntime.isPopupTrigger(e)) { + // show popup menu + JPopupMenu popup = pageView.getPopup(pageView.getSelectedTab()); + popup.show(displayPane, e.getX(), e.getY()); + } + else if (e.getClickCount()==2 && !pageView.locked + && pageView.trackerPanel.isEnabled("pageView.edit")) { //$NON-NLS-1$ + editorPane.setBackground(Color.white); + refreshView(true); + editorPane.selectAll(); + } + } + }); + + // editor pane + editorPane = new TextView(); + editorPane.setContentType("text"); //$NON-NLS-1$ + editorPane.setEditable(true); + editorPane.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (OSPRuntime.isPopupTrigger(e)) { + // show popup menu + JPopupMenu popup = pageView.getPopup(pageView.getSelectedTab()); + popup.show(editorPane, e.getX(), e.getY()); + } + } + }); + editorPane.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (editorPane.getBackground().equals(Color.yellow)) { + setUndoableText(editorPane.getText()); + } + refreshView(false); + } + }); + editorPane.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if(e.getKeyCode()==KeyEvent.VK_Z && e.isControlDown()) { + setUndoableText(editorPane.getText()); + refreshView(false); + if (undoManager.canUndo()) { + undoManager.undo(); + } + } + else if(e.getKeyCode()==KeyEvent.VK_ENTER && e.isShiftDown()) { + setUndoableText(editorPane.getText()); + refreshView(false); + } else { + editorPane.setBackground(Color.yellow); + } + } + }); + scroller = new JScrollPane(displayPane); + add(scroller, BorderLayout.CENTER); + refreshView(false); + // set up the undo system + undoManager = new UndoManager(); + undoSupport = new UndoableEditSupport(); + undoSupport.addUndoableEditListener(undoManager); + } + + void refreshView(boolean editing) { + if (editing) { + scroller.setViewportView(editorPane); + editorPane.setText(data.text); + editorPane.requestFocusInWindow(); + } + else { + editorPane.setBackground(Color.white); + scroller.setViewportView(displayPane); + if (data.getURL()!=null) { + try { + displayPane.setContentType("text/html"); //$NON-NLS-1$ + displayPane.setPage(data.url); + if(data.url.getRef()!=null) { + displayPane.scrollToReference(data.url.getRef()); + } + } catch(IOException e) { + displayPane.setContentType("text"); //$NON-NLS-1$ + displayPane.setText(data.text); + } + } + else { + displayPane.setContentType("text"); //$NON-NLS-1$ + displayPane.setText(data.text); + } + displayPane.requestFocusInWindow(); + } + revalidate(); + repaint(); + } + + void setUndoableText(String text) { + if (text==null || text.equals(data.text)) return; + UndoableEdit edit = new TextEdit(this, text, data.text); + undoSupport.postEdit(edit); + data.setText(text); + } + } + + /** + * A class to hold the data for a single tab. + */ + public static class TabData { + String title; + boolean hyperlinksEnabled = true; + String text; // may be text for display or url path + URL url; + TrackerPanel trackerPanel; + + /** + * No-arg constructor. + */ + TabData() { + text = TrackerRes.getString("TextTView.NewTab.Text1"); //$NON-NLS-1$ + text += XML.NEW_LINE+XML.NEW_LINE; + text += TrackerRes.getString("TextTView.NewTab.Text2"); //$NON-NLS-1$ + title = TrackerRes.getString("TextTView.NewTab.Title"); //$NON-NLS-1$ + } + + /** + * Constructor with tab text and title. + * + * @param title the tab title (may be null) + * @param text the text + */ + TabData(String title, String text) { + this.title = title; + setText(text); + } + + /** + * Sets the title. + * + * @param title the title + */ + public void setTitle(String title) { + if (title==null) return; + this.title = title; + if (trackerPanel!=null) { + trackerPanel.changed = true; + TToolBar.getToolbar(trackerPanel).refresh(false); + } + } + + /** + * Sets the text. + * + * @param text the text + */ + public void setText(String text) { + if (text==null) return; + this.text = text; + setURL(text); // fails for non-url text + } + + /** + * Gets the URL. May return null. + * + * @return the URL + */ + public URL getURL() { + if(url==null) { + setURL(text); + } + return url; + } + + /** + * Sets the URL. + * + * @param path the url path + */ + private void setURL(String path) { + url = null; + Resource res = ResourceLoader.getResource(path); + if((res!=null)&&(res.getURL()!=null)) { + url = res.getURL(); + try { + InputStream in = url.openStream(); + in.close(); + } catch(Exception ex) { + url = null; + } + } + if (trackerPanel!=null) { + trackerPanel.changed = true; + TToolBar.getToolbar(trackerPanel).refresh(false); + } + } + + } + + /** + * A class to undo/redo a text edit. + */ + protected static class TextEdit extends AbstractUndoableEdit { + TabView tab; + String text, prev; + + /** + * Constructor. + * @param tab the TabView being edited + * @param newText the new text + * @param prevText the previous text + */ + public TextEdit(TabView tab, String newText, String prevText) { + this.tab = tab; + text = newText; + prev = prevText; + } + + public void undo() throws CannotUndoException { + super.undo(); + tab.data.setText(prev); + tab.refreshView(false); + } + + public void redo() throws CannotUndoException { + super.redo(); + tab.data.setText(text); + tab.refreshView(false); + } + + public String getPresentationName() { + return TrackerRes.getString("TextTView.TextEdit.Description"); //$NON-NLS-1$ + } + + } + + /** + * A class to save and load object data for the TabData class. + */ + static class TabLoader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + TabView tab = (TabView)obj; + TabData data = tab.data; + control.setValue("title", data.title); //$NON-NLS-1$ + if (data.url==null) { + control.setValue("text", data.text); //$NON-NLS-1$ + } + else if (data.url.getProtocol().equals("file")) { //$NON-NLS-1$ + TrackerPanel panel = data.trackerPanel; + File file = panel.getDataFile(); + if (file!=null) { + String path = data.url.getFile(); + // strip leading slashes from path + while (path.startsWith("/")) { //$NON-NLS-1$ + path = path.substring(1); + } + String base = XML.getDirectoryPath(XML.getAbsolutePath(file)); + control.setValue("text", XML.getPathRelativeTo(path, base)); //$NON-NLS-1$ + } + else { + control.setValue("text", data.url.toExternalForm()); //$NON-NLS-1$ + } + } + else { + control.setValue("text", data.url.toExternalForm()); //$NON-NLS-1$ + } + } + + /** + * Creates an object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + String title = control.getString("title"); //$NON-NLS-1$ + String text = control.getString("text"); //$NON-NLS-1$ + return new TabView(new TabData(title, text)); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + return obj; + } + } + + /** + * Returns an XML.ObjectLoader to save/load data for the TextTView class. + * + * @return the XML.ObjectLoader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load object data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + PageTView view = (PageTView)obj; + control.setValue("tabs", view.tabs); //$NON-NLS-1$ + control.setValue("locked", view.locked); //$NON-NLS-1$ + } + + /** + * Creates an object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + PageTView view = (PageTView)obj; + view.locked = control.getBoolean("locked"); //$NON-NLS-1$ + // load the tabs + ArrayList tabs = ArrayList.class.cast(control.getObject("tabs")); //$NON-NLS-1$ + if (tabs != null) { + Iterator it = tabs.iterator(); + while (it.hasNext()) { + view.addTab((TabView)it.next()); + } + } + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/PerspectiveStep.java b/src/org/opensourcephysics/cabrillo/tracker/PerspectiveStep.java index e61fc1bb..ac1566da 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PerspectiveStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PerspectiveStep.java @@ -1,133 +1,133 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Point; - -import org.opensourcephysics.media.core.*; - -/** - * This is a Step for a PerspectiveTrack. - * - * @author Douglas Brown - */ -public class PerspectiveStep extends Step { - - /** - * Constructs a PerspectiveStep with specified image coordinates. - * - * @param track the PerspectiveTrack track - * @param n the frame number - * @param x the x coordinate - * @param y the y coordinate - */ - public PerspectiveStep(PerspectiveTrack track, int n, double x, double y) { - super(track, n); - points = new TPoint[] {new Corner(), new Corner(), new Corner(), new Corner()}; - screenPoints = new Point[getLength()]; - } - - /** - * Gets the index of a position or perspective filter corner point. - * - * @param p the point - * @return the index, or -1 if not found - */ - public int getPointIndex(TPoint p) { - if (p instanceof PerspectiveFilter.Corner) { - PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; - PerspectiveTrack ptrack = (PerspectiveTrack)track; - int i = ptrack.filter.getCornerIndex(corner); - if (i<4) return i; - } - for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Point; + +import org.opensourcephysics.media.core.*; + +/** + * This is a Step for a PerspectiveTrack. + * + * @author Douglas Brown + */ +public class PerspectiveStep extends Step { + + /** + * Constructs a PerspectiveStep with specified image coordinates. + * + * @param track the PerspectiveTrack track + * @param n the frame number + * @param x the x coordinate + * @param y the y coordinate + */ + public PerspectiveStep(PerspectiveTrack track, int n, double x, double y) { + super(track, n); + points = new TPoint[] {new Corner(), new Corner(), new Corner(), new Corner()}; + screenPoints = new Point[getLength()]; + } + + /** + * Gets the index of a position or perspective filter corner point. + * + * @param p the point + * @return the index, or -1 if not found + */ + public int getPointIndex(TPoint p) { + if (p instanceof PerspectiveFilter.Corner) { + PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; + PerspectiveTrack ptrack = (PerspectiveTrack)track; + int i = ptrack.filter.getCornerIndex(corner); + if (i<4) return i; + } + for (int i=0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Color; -import java.awt.Graphics; -import java.beans.PropertyChangeEvent; - -import javax.swing.JMenu; - -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.controls.XMLControlElement; -import org.opensourcephysics.display.DrawingPanel; -import org.opensourcephysics.display.Interactive; -import org.opensourcephysics.media.core.MediaRes; -import org.opensourcephysics.media.core.PerspectiveFilter; -import org.opensourcephysics.media.core.TPoint; - -/** - * This is a track used for autotracking perspective filter corners. - * - * @author Douglas Brown - */ -public class PerspectiveTrack extends TTrack { - - PerspectiveFilter filter; - - /** - * Constructor requires a PerspectiveFilter to control. - * - * @param filter the filter - */ - public PerspectiveTrack(PerspectiveFilter filter) { - this.filter = filter; - this.viewable = false; - CircleFootprint c = (CircleFootprint) CircleFootprint.getFootprint("CircleFootprint.Circle"); //$NON-NLS-1$ - c.setColor(filter.getColor()); - c.setSpotShown(false); - c.setAlpha(0); - setFootprints(new Footprint[] {c}); - setName(MediaRes.getString("Filter.Perspective.Title").toLowerCase()); //$NON-NLS-1$ - Step step = new PerspectiveStep(this, 0, 0, 0); - step.setFootprint(getFootprint()); - steps = new StepArray(step); - filter.addPropertyChangeListener("color", this); //$NON-NLS-1$ - filter.addPropertyChangeListener("visible", this); //$NON-NLS-1$ - filter.addPropertyChangeListener("enabled", this); //$NON-NLS-1$ - filter.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - filter.addPropertyChangeListener("cornerlocation", this); //$NON-NLS-1$ - } - - /** - * Responds to property change events. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (e.getSource()==filter) { - if (name.equals("color")) { //$NON-NLS-1$ - setColor((Color)e.getNewValue()); - } - else if (name.equals("enabled") || name.equals("tab") || name.equals("visible")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - boolean visible = filter.hasInspector() && filter.getInspector().isVisible(); - boolean isInput = filter.isInputEnabled(); - boolean isActive = filter.isActive(); - boolean nullPoint = trackerPanel.getSelectedPoint()==null; - if (visible && isActive && isInput && nullPoint) { - trackerPanel.setSelectedTrack(this); - } - else if (trackerPanel.getSelectedTrack()==this) { - trackerPanel.setSelectedTrack(null); - trackerPanel.setSelectedPoint(null); - } - } - else if (name.equals("cornerlocation") && filter.isInputEnabled()) { //$NON-NLS-1$ - PerspectiveFilter.Corner filtercorner = (PerspectiveFilter.Corner)e.getNewValue(); - int i = filter.getCornerIndex(filtercorner); - int n = trackerPanel.getFrameNumber(); - getStep(n).points[i].setXY(filtercorner.getX(), filtercorner.getY()); - } - } - if (name.equals("selectedtrack")) { //$NON-NLS-1$ - if (e.getNewValue()==this) { - if (!filter.isEnabled()) filter.setEnabled(true); - if (!filter.isInputEnabled()) filter.setInputEnabled(true); - if (filter.hasInspector() && !filter.getInspector().isVisible()) filter.getInspector().setVisible(true); - } - } - } - - /** - * Finds the interactive drawable object located at the specified - * pixel position. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step TPoint that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - return null; - } - /** - * Prepares menu items and returns a new menu. - * Subclasses should override this method and add track-specific menu items. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(final TrackerPanel trackerPanel) { - menu = new JMenu(getName()); - menu.setIcon(getFootprint().getIcon(21, 16)); - return menu; - } - - /** - * Gets the step associated with a TPoint. - * - * @param p a TPoint - * @param trackerPanel the tracker panel holding the TPoint - * @return the step associated with the TPoint - */ - public Step getStep(TPoint p, TrackerPanel trackerPanel) { - if (filter.isEnabled()) return null; - if (p instanceof PerspectiveFilter.Corner) { - PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; - int i = filter.getCornerIndex(corner); - if (i>-1) { - return getStep(trackerPanel.getFrameNumber()); - } - } - return super.getStep(p, trackerPanel); - } - - /** - * Deletes a step. This removes the perspective filter key frame data. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - if (locked) return null; - TPoint p = trackerPanel.getSelectedPoint(); - if (p instanceof PerspectiveFilter.Corner) { - XMLControl control = new XMLControlElement(filter); - PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; - filter.deleteKeyFrame(n, corner); - Undo.postFilterEdit(trackerPanel, filter, control); - trackerPanel.repaint(); - } - Step step = getStep(n); - return step; - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - @Override - public TPoint autoMarkAt(int n, double x, double y) { - int index = getTargetIndex(); - PerspectiveStep step = (PerspectiveStep)getStep(n); - step.points[index].setXY(x, y); - filter.setCornerLocation(n, index, x, y); - return getMarkedPoint(n, index); - } - - /** - * Used by autoTracker to get the marked point for a given frame and index. - * - * @param n the frame number - * @param index the index - * @return the step TPoint at the index - */ - public TPoint getMarkedPoint(int n, int index) { - Step step = getStep(n); - return step.points[index]; - } - - /** - * Sets the target index for the autotracker. - * - * @param p a TPoint associated with this track - */ - @Override - protected void setTargetIndex(TPoint p) { - Step step = getStep(p, trackerPanel); - if (step!=null) - setTargetIndex(step.getPointIndex(p)); - } - - /** - * Returns a description of a target point with a given index. - * - * @param pointIndex the index - * @return the description - */ - @Override - protected String getTargetDescription(int pointIndex) { - return TrackerRes.getString("PerspectiveTrack.Corner")+" "+pointIndex; //$NON-NLS-1$ //$NON-NLS-2$ - } - - /** - * Determines if the given point index is autotrackable. - * - * @param pointIndex the points[] index - * @return true if autotrackable - */ - @Override - protected boolean isAutoTrackable(int pointIndex) { - return pointIndex<4; - } - - /** - * Determines if at least one point in this track is autotrackable. - * - * @return true if autotrackable - */ - @Override - protected boolean isAutoTrackable() { - return true; - } - - - - @Override - public void draw(DrawingPanel panel, Graphics _g) { - } - - @Override - public int getStepLength() { - return 4; - } - - @Override - public int getFootprintLength() { - return 1; - } - - @Override - public Step createStep(int n, double x, double y) { - autoMarkAt(n, x, y); - return getStep(n); - } - - @Override - public void remark(TrackerPanel trackerPanel) { - } - - - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Color; +import java.awt.Graphics; +import java.beans.PropertyChangeEvent; + +import javax.swing.JMenu; + +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLControlElement; +import org.opensourcephysics.display.DrawingPanel; +import org.opensourcephysics.display.Interactive; +import org.opensourcephysics.media.core.MediaRes; +import org.opensourcephysics.media.core.PerspectiveFilter; +import org.opensourcephysics.media.core.TPoint; + +/** + * This is a track used for autotracking perspective filter corners. + * + * @author Douglas Brown + */ +public class PerspectiveTrack extends TTrack { + + PerspectiveFilter filter; + + /** + * Constructor requires a PerspectiveFilter to control. + * + * @param filter the filter + */ + public PerspectiveTrack(PerspectiveFilter filter) { + this.filter = filter; + this.viewable = false; + CircleFootprint c = (CircleFootprint) CircleFootprint.getFootprint("CircleFootprint.Circle"); //$NON-NLS-1$ + c.setColor(filter.getColor()); + c.setSpotShown(false); + c.setAlpha(0); + setFootprints(new Footprint[] {c}); + setName(MediaRes.getString("Filter.Perspective.Title").toLowerCase()); //$NON-NLS-1$ + Step step = new PerspectiveStep(this, 0, 0, 0); + step.setFootprint(getFootprint()); + steps = new StepArray(step); + filter.addPropertyChangeListener("color", this); //$NON-NLS-1$ + filter.addPropertyChangeListener("visible", this); //$NON-NLS-1$ + filter.addPropertyChangeListener("enabled", this); //$NON-NLS-1$ + filter.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + filter.addPropertyChangeListener("cornerlocation", this); //$NON-NLS-1$ + } + + /** + * Responds to property change events. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (e.getSource()==filter) { + if (name.equals("color")) { //$NON-NLS-1$ + setColor((Color)e.getNewValue()); + } + else if (name.equals("enabled") || name.equals("tab") || name.equals("visible")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + boolean visible = filter.hasInspector() && filter.getInspector().isVisible(); + boolean isInput = filter.isInputEnabled(); + boolean isActive = filter.isActive(); + boolean nullPoint = trackerPanel.getSelectedPoint()==null; + if (visible && isActive && isInput && nullPoint) { + trackerPanel.setSelectedTrack(this); + } + else if (trackerPanel.getSelectedTrack()==this) { + trackerPanel.setSelectedTrack(null); + trackerPanel.setSelectedPoint(null); + } + } + else if (name.equals("cornerlocation") && filter.isInputEnabled()) { //$NON-NLS-1$ + PerspectiveFilter.Corner filtercorner = (PerspectiveFilter.Corner)e.getNewValue(); + int i = filter.getCornerIndex(filtercorner); + int n = trackerPanel.getFrameNumber(); + getStep(n).points[i].setXY(filtercorner.getX(), filtercorner.getY()); + } + } + if (name.equals("selectedtrack")) { //$NON-NLS-1$ + if (e.getNewValue()==this) { + if (!filter.isEnabled()) filter.setEnabled(true); + if (!filter.isInputEnabled()) filter.setInputEnabled(true); + if (filter.hasInspector() && !filter.getInspector().isVisible()) filter.getInspector().setVisible(true); + } + } + } + + /** + * Finds the interactive drawable object located at the specified + * pixel position. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step TPoint that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + return null; + } + /** + * Prepares menu items and returns a new menu. + * Subclasses should override this method and add track-specific menu items. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(final TrackerPanel trackerPanel) { + menu = new JMenu(getName()); + menu.setIcon(getFootprint().getIcon(21, 16)); + return menu; + } + + /** + * Gets the step associated with a TPoint. + * + * @param p a TPoint + * @param trackerPanel the tracker panel holding the TPoint + * @return the step associated with the TPoint + */ + public Step getStep(TPoint p, TrackerPanel trackerPanel) { + if (filter.isEnabled()) return null; + if (p instanceof PerspectiveFilter.Corner) { + PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; + int i = filter.getCornerIndex(corner); + if (i>-1) { + return getStep(trackerPanel.getFrameNumber()); + } + } + return super.getStep(p, trackerPanel); + } + + /** + * Deletes a step. This removes the perspective filter key frame data. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + if (locked) return null; + TPoint p = trackerPanel.getSelectedPoint(); + if (p instanceof PerspectiveFilter.Corner) { + XMLControl control = new XMLControlElement(filter); + PerspectiveFilter.Corner corner = (PerspectiveFilter.Corner)p; + filter.deleteKeyFrame(n, corner); + Undo.postFilterEdit(trackerPanel, filter, control); + trackerPanel.repaint(); + } + Step step = getStep(n); + return step; + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + @Override + public TPoint autoMarkAt(int n, double x, double y) { + int index = getTargetIndex(); + PerspectiveStep step = (PerspectiveStep)getStep(n); + step.points[index].setXY(x, y); + filter.setCornerLocation(n, index, x, y); + return getMarkedPoint(n, index); + } + + /** + * Used by autoTracker to get the marked point for a given frame and index. + * + * @param n the frame number + * @param index the index + * @return the step TPoint at the index + */ + public TPoint getMarkedPoint(int n, int index) { + Step step = getStep(n); + return step.points[index]; + } + + /** + * Sets the target index for the autotracker. + * + * @param p a TPoint associated with this track + */ + @Override + protected void setTargetIndex(TPoint p) { + Step step = getStep(p, trackerPanel); + if (step!=null) + setTargetIndex(step.getPointIndex(p)); + } + + /** + * Returns a description of a target point with a given index. + * + * @param pointIndex the index + * @return the description + */ + @Override + protected String getTargetDescription(int pointIndex) { + return TrackerRes.getString("PerspectiveTrack.Corner")+" "+pointIndex; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * Determines if the given point index is autotrackable. + * + * @param pointIndex the points[] index + * @return true if autotrackable + */ + @Override + protected boolean isAutoTrackable(int pointIndex) { + return pointIndex<4; + } + + /** + * Determines if at least one point in this track is autotrackable. + * + * @return true if autotrackable + */ + @Override + protected boolean isAutoTrackable() { + return true; + } + + + + @Override + public void draw(DrawingPanel panel, Graphics _g) { + } + + @Override + public int getStepLength() { + return 4; + } + + @Override + public int getFootprintLength() { + return 1; + } + + @Override + public Step createStep(int n, double x, double y) { + autoMarkAt(n, x, y); + return getStep(n); + } + + @Override + public void remark(TrackerPanel trackerPanel) { + } + + + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java b/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java index 9e89cefe..a34d3990 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java @@ -1,201 +1,201 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import javax.swing.*; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.controls.XMLProperty; - -/** - * This displays plot track views selected from a dropdown list. - * - * @author Douglas Brown - */ -public class PlotTView extends TrackChooserTView { - - protected Icon icon; - - /** - * Constructs a TrackChooserView for the specified tracker panel. - * - * @param panel the tracker panel - */ - public PlotTView(TrackerPanel panel) { - super(panel); - icon = new ImageIcon( - Tracker.class.getResource("resources/images/plot.gif")); //$NON-NLS-1$ - } - - /** - * Gets the name of the view - * - * @return the name - */ - public String getViewName() { - return TrackerRes.getString("TFrame.View.Plot"); //$NON-NLS-1$ - } - - /** - * Gets the icon for this view - * - * @return the icon - */ - public Icon getViewIcon() { - return icon; - } - - /** - * Creates a view for the specified track - * - * @param track the track - * @return the track view - */ - protected TrackView createTrackView(TTrack track) { - return new PlotTrackView(track, trackerPanel); - } - - /** - * Refreshes the popup menus. - */ - @Override - protected void refreshMenus() { - for (TrackView next: trackViews.values()) { - PlotTrackView plots = (PlotTrackView)next; - for (TrackPlottingPanel panel: plots.plots) { - panel.buildPopupmenu(); - } - } - } - - /** - * Overrides TrackChooserTView method. - * - * @param track the track to be selected - */ - @Override - public void setSelectedTrack(TTrack track) { - if (track == null) { - noDataLabel.setText(TrackerRes.getString("PlotTView.Label.NoData")); //$NON-NLS-1$ - } - super.setSelectedTrack(track); - } - - /** - * Returns an XML.ObjectLoader to save and load object data. - * - * @return the XML.ObjectLoader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load object data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the TrackerPanel object to save - */ - public void saveObject(XMLControl control, Object obj) { - PlotTView view = (PlotTView)obj; - TTrack track = view.getSelectedTrack(); - if (track != null) { - control.setValue("selected_track", track.getName()); //$NON-NLS-1$ - java.util.ArrayList list = new java.util.ArrayList(); - for (TrackView next: view.trackViews.values()) { - if (next.isCustomState()) - list.add(next); - } -// list.addAll(view.trackViews.values()); - if (!list.isEmpty()) - control.setValue("track_views", list); //$NON-NLS-1$ - } - } - - /** - * Creates an object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - PlotTView view = (PlotTView)obj; - TTrack track = view.getTrack(control.getString("selected_track")); //$NON-NLS-1$ - if (track != null) { - view.setSelectedTrack(track); - // following code is for legacy xml only - PlotTrackView trackView = (PlotTrackView)view.getTrackView(track); - TrackPlottingPanel[] plots = trackView.plots; - for (int i = 0; i < plots.length; i++) { - XMLControl child = control.getChildControl("plot"+i); //$NON-NLS-1$ - if (child != null) { - child.loadObject(plots[i]); - } - else { - trackView.setPlotCount(Math.max(1, i)); - break; - } - } - // end legacy code - } - // load the track_views property, if any - java.util.List props = control.getPropertyContent(); - for (int i = 0; i < props.size(); i++) { - XMLProperty prop = (XMLProperty)props.get(i); - if (prop.getPropertyName().equals("track_views")) { //$NON-NLS-1$ - XMLControl[] controls = prop.getChildControls(); - for (int j = 0; j < controls.length; j++) { - // get name of track, find its track view and load it - String trackName = controls[j].getString("track"); //$NON-NLS-1$ - track = view.getTrack(trackName); - if (track != null) { - PlotTrackView trackView = (PlotTrackView)view.getTrackView(track); - controls[j].loadObject(trackView); - } - } - break; - } - } - return obj; - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import javax.swing.*; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLProperty; + +/** + * This displays plot track views selected from a dropdown list. + * + * @author Douglas Brown + */ +public class PlotTView extends TrackChooserTView { + + protected Icon icon; + + /** + * Constructs a TrackChooserView for the specified tracker panel. + * + * @param panel the tracker panel + */ + public PlotTView(TrackerPanel panel) { + super(panel); + icon = new ImageIcon( + Tracker.class.getResource("resources/images/plot.gif")); //$NON-NLS-1$ + } + + /** + * Gets the name of the view + * + * @return the name + */ + public String getViewName() { + return TrackerRes.getString("TFrame.View.Plot"); //$NON-NLS-1$ + } + + /** + * Gets the icon for this view + * + * @return the icon + */ + public Icon getViewIcon() { + return icon; + } + + /** + * Creates a view for the specified track + * + * @param track the track + * @return the track view + */ + protected TrackView createTrackView(TTrack track) { + return new PlotTrackView(track, trackerPanel); + } + + /** + * Refreshes the popup menus. + */ + @Override + protected void refreshMenus() { + for (TrackView next: trackViews.values()) { + PlotTrackView plots = (PlotTrackView)next; + for (TrackPlottingPanel panel: plots.plots) { + panel.buildPopupmenu(); + } + } + } + + /** + * Overrides TrackChooserTView method. + * + * @param track the track to be selected + */ + @Override + public void setSelectedTrack(TTrack track) { + if (track == null) { + noDataLabel.setText(TrackerRes.getString("PlotTView.Label.NoData")); //$NON-NLS-1$ + } + super.setSelectedTrack(track); + } + + /** + * Returns an XML.ObjectLoader to save and load object data. + * + * @return the XML.ObjectLoader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load object data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the TrackerPanel object to save + */ + public void saveObject(XMLControl control, Object obj) { + PlotTView view = (PlotTView)obj; + TTrack track = view.getSelectedTrack(); + if (track != null) { + control.setValue("selected_track", track.getName()); //$NON-NLS-1$ + java.util.ArrayList list = new java.util.ArrayList(); + for (TrackView next: view.trackViews.values()) { + if (next.isCustomState()) + list.add(next); + } +// list.addAll(view.trackViews.values()); + if (!list.isEmpty()) + control.setValue("track_views", list); //$NON-NLS-1$ + } + } + + /** + * Creates an object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + PlotTView view = (PlotTView)obj; + TTrack track = view.getTrack(control.getString("selected_track")); //$NON-NLS-1$ + if (track != null) { + view.setSelectedTrack(track); + // following code is for legacy xml only + PlotTrackView trackView = (PlotTrackView)view.getTrackView(track); + TrackPlottingPanel[] plots = trackView.plots; + for (int i = 0; i < plots.length; i++) { + XMLControl child = control.getChildControl("plot"+i); //$NON-NLS-1$ + if (child != null) { + child.loadObject(plots[i]); + } + else { + trackView.setPlotCount(Math.max(1, i)); + break; + } + } + // end legacy code + } + // load the track_views property, if any + java.util.List props = control.getPropertyContent(); + for (int i = 0; i < props.size(); i++) { + XMLProperty prop = (XMLProperty)props.get(i); + if (prop.getPropertyName().equals("track_views")) { //$NON-NLS-1$ + XMLControl[] controls = prop.getChildControls(); + for (int j = 0; j < controls.length; j++) { + // get name of track, find its track view and load it + String trackName = controls[j].getString("track"); //$NON-NLS-1$ + track = view.getTrack(trackName); + if (track != null) { + PlotTrackView trackView = (PlotTrackView)view.getTrackView(track); + controls[j].loadObject(trackView); + } + } + break; + } + } + return obj; + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java index a233692d..d1c447a7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java @@ -1,372 +1,372 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -import java.awt.*; -import java.awt.geom.*; -import javax.swing.*; - -/** - * A PointShapeFootprint returns a shape for a Point[] of length 1. - */ -public class PointShapeFootprint implements Footprint, Cloneable { - - // instance fields - protected String name; - protected Shape shape; - protected Shape highlight; - protected AffineTransform transform = new AffineTransform(); - protected BasicStroke stroke = new BasicStroke(); - protected Color color = Color.black; - protected Shape[] hitShapes = new Shape[1]; - protected double defaultWidth = 1; - - /** - * Constructs a PointShapeFootprint with a point shape. - * - * @param name the name - * @param shape point shape of the footprint - */ - public PointShapeFootprint(String name, Shape shape) { - this.name = name; - this.shape = shape; - } - - /** - * Gets a named footprint. - * - * @param name the name of the footprint - * @return the footprint - */ - public static PointShapeFootprint getFootprint(String name) { - Iterator it = footprints.iterator(); - while(it.hasNext()) { - PointShapeFootprint footprint = it.next(); - if (name == footprint.getName()) try { - return (PointShapeFootprint)footprint.clone(); - } catch(CloneNotSupportedException ex) {ex.printStackTrace();} - } - return null; - } - - /** - * Gets the name of this footprint. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets the display name of the footprint. - * - * @return the localized display name - */ - public String getDisplayName() { - return TrackerRes.getString(name); - } - - /** - * Gets the minimum point array length required by this footprint. - * - * @return the length - */ - public int getLength() { - return 1; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Shape shape = getShape(new Point[] {new Point()}); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - return icon; - } - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points) { - final Shape shape = getShape(points); - final Shape highlight = this.highlight; - return new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setPaint(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(shape); - if (highlighted) g.fill(highlight); - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - Rectangle bounds = shape.getBounds(); - if (highlighted) bounds.add(highlight.getBounds()); - return bounds; - } - }; - } - - /** - * Gets the hit shapes. - * - * @return the hit shapes - */ - public Shape[] getHitShapes() { - return hitShapes; - } - - /** - * Sets the stroke. May be set to null. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - this.stroke = stroke; - if (stroke != null) { - defaultWidth = stroke.getLineWidth(); - } - } - - /** - * Gets the stroke. May return null; - * - * @return the stroke - */ - public BasicStroke getStroke() { - return stroke; - } - - /** - * Sets the line width. - * - * @param w the desired line width - */ - public void setLineWidth(double w) { - if (stroke == null) return; - stroke = new BasicStroke((float)w, - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = color; - } - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor() { - return color; - } - - /** - * Gets the fill shape for a specified point. - * - * @param points an array of points - * @return the fill shape - */ - public Shape getShape(Point[] points) { - Point p = points[0]; - transform.setToTranslation(p.x, p.y); - Shape transformedShape = transform.createTransformedShape(shape); - highlight = transform.createTransformedShape(HIGHLIGHT); - if (stroke != null) - transformedShape = stroke.createStrokedShape(transformedShape); - hitShapes[0] = transformedShape; - return transformedShape; - } - - // static fields - protected static Collection footprints - = new HashSet(); - - // static constants - private static final Shape HIGHLIGHT; - private static final PointShapeFootprint DIAMOND; - private static final PointShapeFootprint BOLD_DIAMOND; - private static final PointShapeFootprint SOLID_DIAMOND; - private static final PointShapeFootprint TRIANGLE; - private static final PointShapeFootprint BOLD_TRIANGLE; - private static final PointShapeFootprint SOLID_TRIANGLE; - private static final PointShapeFootprint CIRCLE; - private static final PointShapeFootprint BOLD_CIRCLE; - private static final PointShapeFootprint SOLID_CIRCLE; - private static final PointShapeFootprint VERT_LINE; - private static final PointShapeFootprint BOLD_VERT_LINE; - private static final PointShapeFootprint HORZ_LINE; - private static final PointShapeFootprint BOLD_HORZ_LINE; - private static final PointShapeFootprint CROSSHAIR; - private static final PointShapeFootprint BOLD_CROSSHAIR; - private static final PointShapeFootprint SIMPLE_AXES; - private static final PointShapeFootprint BOLD_SIMPLE_AXES; - private static final PointShapeFootprint SMALL_SPOT; - private static final PointShapeFootprint SMALL_CIRCLE; - private static final PointShapeFootprint SOLID_SQUARE; - - // static initializers - static { - float w = 3000; // pixel length of axes and line shapes - - // HIGHLIGHT - Ellipse2D circle = new Ellipse2D.Double(); - circle.setFrame(-6, -6, 12, 12); - Stroke stroke = new BasicStroke(2); - HIGHLIGHT = stroke.createStrokedShape(circle); - - // DIAMOND - GeneralPath diamond = new GeneralPath(); - diamond.moveTo(-5, 0); - diamond.lineTo(0, 5); - diamond.lineTo(5.01f, 0); - diamond.lineTo(0, -5); - diamond.closePath(); - DIAMOND = new PointShapeFootprint("Footprint.Diamond", diamond); //$NON-NLS-1$ - footprints.add(DIAMOND); - BOLD_DIAMOND = new PointShapeFootprint("Footprint.BoldDiamond", diamond); //$NON-NLS-1$ - BOLD_DIAMOND.setStroke(new BasicStroke(2)); - footprints.add(BOLD_DIAMOND); - SOLID_DIAMOND = new PointShapeFootprint("Footprint.SolidDiamond", diamond); //$NON-NLS-1$ - SOLID_DIAMOND.setStroke(null); - footprints.add(SOLID_DIAMOND); - - // TRIANGLE - GeneralPath triangle = new GeneralPath(); - triangle.moveTo(0, -5); - triangle.lineTo(4, 3); - triangle.lineTo(-4, 3); - triangle.closePath(); - TRIANGLE = new PointShapeFootprint("Footprint.Triangle", triangle); //$NON-NLS-1$ - footprints.add(TRIANGLE); - BOLD_TRIANGLE = new PointShapeFootprint("Footprint.BoldTriangle", triangle); //$NON-NLS-1$ - BOLD_TRIANGLE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_TRIANGLE); - SOLID_TRIANGLE = new PointShapeFootprint("Footprint.SolidTriangle", triangle); //$NON-NLS-1$ - SOLID_TRIANGLE.setStroke(null); - footprints.add(SOLID_TRIANGLE); - - // CIRCLE - circle.setFrame(-5, -5, 10, 10); - CIRCLE = new PointShapeFootprint("Footprint.Circle", circle); //$NON-NLS-1$ - footprints.add(CIRCLE); - BOLD_CIRCLE = new PointShapeFootprint("Footprint.BoldCircle", circle); //$NON-NLS-1$ - BOLD_CIRCLE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_CIRCLE); - SOLID_CIRCLE = new PointShapeFootprint("Footprint.SolidCircle", circle); //$NON-NLS-1$ - SOLID_CIRCLE.setStroke(null); - footprints.add(SOLID_CIRCLE); - circle.setFrame(-3, -3, 6, 6); - SMALL_CIRCLE = new PointShapeFootprint("Footprint.SmallCircle", circle); //$NON-NLS-1$ - footprints.add(SMALL_CIRCLE); - - // SMALL_SPOT - Ellipse2D smallSpot = new Ellipse2D.Double(-2, -2, 4, 4); - SMALL_SPOT = new PointShapeFootprint("Footprint.Spot", smallSpot); //$NON-NLS-1$ - SMALL_SPOT.setStroke(null); - footprints.add(SMALL_SPOT); - - // VERT_LINE - GeneralPath vertLine = new GeneralPath(); - vertLine.moveTo(0, -w); - vertLine.lineTo(0, w); - vertLine.moveTo(-3, 0); - vertLine.lineTo(3, 0); - VERT_LINE = new PointShapeFootprint("Footprint.VerticalLine", vertLine); //$NON-NLS-1$ - footprints.add(VERT_LINE); - BOLD_VERT_LINE = new PointShapeFootprint("Footprint.BoldVerticalLine", vertLine); //$NON-NLS-1$ - BOLD_VERT_LINE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_VERT_LINE); - - // HORZ_LINE - GeneralPath horzLine = new GeneralPath(); - horzLine.moveTo(0, -3); - horzLine.lineTo(0, 3); - horzLine.moveTo(-w, 0); - horzLine.lineTo(w, 0); - HORZ_LINE = new PointShapeFootprint("Footprint.HorizontalLine", horzLine); //$NON-NLS-1$ - footprints.add(HORZ_LINE); - BOLD_HORZ_LINE = new PointShapeFootprint("Footprint.BoldHorizontalLine", horzLine); //$NON-NLS-1$ - BOLD_HORZ_LINE.setStroke(new BasicStroke(2)); - footprints.add(BOLD_HORZ_LINE); - - // CROSSHAIR - GeneralPath crosshair = new GeneralPath(); - crosshair.moveTo(0, -4); - crosshair.lineTo(0, 4); - crosshair.moveTo( -4, 0); - crosshair.lineTo(4, 0); - CROSSHAIR = new PointShapeFootprint("Footprint.Crosshair", crosshair); //$NON-NLS-1$ - footprints.add(CROSSHAIR); - BOLD_CROSSHAIR = new PointShapeFootprint("Footprint.BoldCrosshair", crosshair); //$NON-NLS-1$ - BOLD_CROSSHAIR.setStroke(new BasicStroke(2)); - footprints.add(BOLD_CROSSHAIR); - - // SIMPLE_AXES - GeneralPath axes = new GeneralPath(); - axes.reset(); - axes.moveTo(w, 0); - axes.lineTo(-w, 0); - axes.moveTo(0, w); - axes.lineTo(0, -w); - axes.moveTo(15, 5); // x axis crosshair - axes.lineTo(15, -5); - SIMPLE_AXES = new PointShapeFootprint("Footprint.SimpleAxes", axes); //$NON-NLS-1$ - footprints.add(SIMPLE_AXES); - BOLD_SIMPLE_AXES = new PointShapeFootprint("Footprint.BoldSimpleAxes", axes); //$NON-NLS-1$ - BOLD_SIMPLE_AXES.setStroke(new BasicStroke(2)); - footprints.add(BOLD_SIMPLE_AXES); - - // SQUARE - Rectangle2D square = new Rectangle(-3, -3, 6, 6); - SOLID_SQUARE = new PointShapeFootprint("Footprint.SolidSquare", square); //$NON-NLS-1$ - SOLID_SQUARE.setStroke(null); - footprints.add(SOLID_SQUARE); - - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +import java.awt.*; +import java.awt.geom.*; +import javax.swing.*; + +/** + * A PointShapeFootprint returns a shape for a Point[] of length 1. + */ +public class PointShapeFootprint implements Footprint, Cloneable { + + // instance fields + protected String name; + protected Shape shape; + protected Shape highlight; + protected AffineTransform transform = new AffineTransform(); + protected BasicStroke stroke = new BasicStroke(); + protected Color color = Color.black; + protected Shape[] hitShapes = new Shape[1]; + protected double defaultWidth = 1; + + /** + * Constructs a PointShapeFootprint with a point shape. + * + * @param name the name + * @param shape point shape of the footprint + */ + public PointShapeFootprint(String name, Shape shape) { + this.name = name; + this.shape = shape; + } + + /** + * Gets a named footprint. + * + * @param name the name of the footprint + * @return the footprint + */ + public static PointShapeFootprint getFootprint(String name) { + Iterator it = footprints.iterator(); + while(it.hasNext()) { + PointShapeFootprint footprint = it.next(); + if (name == footprint.getName()) try { + return (PointShapeFootprint)footprint.clone(); + } catch(CloneNotSupportedException ex) {ex.printStackTrace();} + } + return null; + } + + /** + * Gets the name of this footprint. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the display name of the footprint. + * + * @return the localized display name + */ + public String getDisplayName() { + return TrackerRes.getString(name); + } + + /** + * Gets the minimum point array length required by this footprint. + * + * @return the length + */ + public int getLength() { + return 1; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Shape shape = getShape(new Point[] {new Point()}); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + return icon; + } + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points) { + final Shape shape = getShape(points); + final Shape highlight = this.highlight; + return new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setPaint(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(shape); + if (highlighted) g.fill(highlight); + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = shape.getBounds(); + if (highlighted) bounds.add(highlight.getBounds()); + return bounds; + } + }; + } + + /** + * Gets the hit shapes. + * + * @return the hit shapes + */ + public Shape[] getHitShapes() { + return hitShapes; + } + + /** + * Sets the stroke. May be set to null. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + this.stroke = stroke; + if (stroke != null) { + defaultWidth = stroke.getLineWidth(); + } + } + + /** + * Gets the stroke. May return null; + * + * @return the stroke + */ + public BasicStroke getStroke() { + return stroke; + } + + /** + * Sets the line width. + * + * @param w the desired line width + */ + public void setLineWidth(double w) { + if (stroke == null) return; + stroke = new BasicStroke((float)w, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = color; + } + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor() { + return color; + } + + /** + * Gets the fill shape for a specified point. + * + * @param points an array of points + * @return the fill shape + */ + public Shape getShape(Point[] points) { + Point p = points[0]; + transform.setToTranslation(p.x, p.y); + Shape transformedShape = transform.createTransformedShape(shape); + highlight = transform.createTransformedShape(HIGHLIGHT); + if (stroke != null) + transformedShape = stroke.createStrokedShape(transformedShape); + hitShapes[0] = transformedShape; + return transformedShape; + } + + // static fields + protected static Collection footprints + = new HashSet(); + + // static constants + private static final Shape HIGHLIGHT; + private static final PointShapeFootprint DIAMOND; + private static final PointShapeFootprint BOLD_DIAMOND; + private static final PointShapeFootprint SOLID_DIAMOND; + private static final PointShapeFootprint TRIANGLE; + private static final PointShapeFootprint BOLD_TRIANGLE; + private static final PointShapeFootprint SOLID_TRIANGLE; + private static final PointShapeFootprint CIRCLE; + private static final PointShapeFootprint BOLD_CIRCLE; + private static final PointShapeFootprint SOLID_CIRCLE; + private static final PointShapeFootprint VERT_LINE; + private static final PointShapeFootprint BOLD_VERT_LINE; + private static final PointShapeFootprint HORZ_LINE; + private static final PointShapeFootprint BOLD_HORZ_LINE; + private static final PointShapeFootprint CROSSHAIR; + private static final PointShapeFootprint BOLD_CROSSHAIR; + private static final PointShapeFootprint SIMPLE_AXES; + private static final PointShapeFootprint BOLD_SIMPLE_AXES; + private static final PointShapeFootprint SMALL_SPOT; + private static final PointShapeFootprint SMALL_CIRCLE; + private static final PointShapeFootprint SOLID_SQUARE; + + // static initializers + static { + float w = 3000; // pixel length of axes and line shapes + + // HIGHLIGHT + Ellipse2D circle = new Ellipse2D.Double(); + circle.setFrame(-6, -6, 12, 12); + Stroke stroke = new BasicStroke(2); + HIGHLIGHT = stroke.createStrokedShape(circle); + + // DIAMOND + GeneralPath diamond = new GeneralPath(); + diamond.moveTo(-5, 0); + diamond.lineTo(0, 5); + diamond.lineTo(5.01f, 0); + diamond.lineTo(0, -5); + diamond.closePath(); + DIAMOND = new PointShapeFootprint("Footprint.Diamond", diamond); //$NON-NLS-1$ + footprints.add(DIAMOND); + BOLD_DIAMOND = new PointShapeFootprint("Footprint.BoldDiamond", diamond); //$NON-NLS-1$ + BOLD_DIAMOND.setStroke(new BasicStroke(2)); + footprints.add(BOLD_DIAMOND); + SOLID_DIAMOND = new PointShapeFootprint("Footprint.SolidDiamond", diamond); //$NON-NLS-1$ + SOLID_DIAMOND.setStroke(null); + footprints.add(SOLID_DIAMOND); + + // TRIANGLE + GeneralPath triangle = new GeneralPath(); + triangle.moveTo(0, -5); + triangle.lineTo(4, 3); + triangle.lineTo(-4, 3); + triangle.closePath(); + TRIANGLE = new PointShapeFootprint("Footprint.Triangle", triangle); //$NON-NLS-1$ + footprints.add(TRIANGLE); + BOLD_TRIANGLE = new PointShapeFootprint("Footprint.BoldTriangle", triangle); //$NON-NLS-1$ + BOLD_TRIANGLE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_TRIANGLE); + SOLID_TRIANGLE = new PointShapeFootprint("Footprint.SolidTriangle", triangle); //$NON-NLS-1$ + SOLID_TRIANGLE.setStroke(null); + footprints.add(SOLID_TRIANGLE); + + // CIRCLE + circle.setFrame(-5, -5, 10, 10); + CIRCLE = new PointShapeFootprint("Footprint.Circle", circle); //$NON-NLS-1$ + footprints.add(CIRCLE); + BOLD_CIRCLE = new PointShapeFootprint("Footprint.BoldCircle", circle); //$NON-NLS-1$ + BOLD_CIRCLE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_CIRCLE); + SOLID_CIRCLE = new PointShapeFootprint("Footprint.SolidCircle", circle); //$NON-NLS-1$ + SOLID_CIRCLE.setStroke(null); + footprints.add(SOLID_CIRCLE); + circle.setFrame(-3, -3, 6, 6); + SMALL_CIRCLE = new PointShapeFootprint("Footprint.SmallCircle", circle); //$NON-NLS-1$ + footprints.add(SMALL_CIRCLE); + + // SMALL_SPOT + Ellipse2D smallSpot = new Ellipse2D.Double(-2, -2, 4, 4); + SMALL_SPOT = new PointShapeFootprint("Footprint.Spot", smallSpot); //$NON-NLS-1$ + SMALL_SPOT.setStroke(null); + footprints.add(SMALL_SPOT); + + // VERT_LINE + GeneralPath vertLine = new GeneralPath(); + vertLine.moveTo(0, -w); + vertLine.lineTo(0, w); + vertLine.moveTo(-3, 0); + vertLine.lineTo(3, 0); + VERT_LINE = new PointShapeFootprint("Footprint.VerticalLine", vertLine); //$NON-NLS-1$ + footprints.add(VERT_LINE); + BOLD_VERT_LINE = new PointShapeFootprint("Footprint.BoldVerticalLine", vertLine); //$NON-NLS-1$ + BOLD_VERT_LINE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_VERT_LINE); + + // HORZ_LINE + GeneralPath horzLine = new GeneralPath(); + horzLine.moveTo(0, -3); + horzLine.lineTo(0, 3); + horzLine.moveTo(-w, 0); + horzLine.lineTo(w, 0); + HORZ_LINE = new PointShapeFootprint("Footprint.HorizontalLine", horzLine); //$NON-NLS-1$ + footprints.add(HORZ_LINE); + BOLD_HORZ_LINE = new PointShapeFootprint("Footprint.BoldHorizontalLine", horzLine); //$NON-NLS-1$ + BOLD_HORZ_LINE.setStroke(new BasicStroke(2)); + footprints.add(BOLD_HORZ_LINE); + + // CROSSHAIR + GeneralPath crosshair = new GeneralPath(); + crosshair.moveTo(0, -4); + crosshair.lineTo(0, 4); + crosshair.moveTo( -4, 0); + crosshair.lineTo(4, 0); + CROSSHAIR = new PointShapeFootprint("Footprint.Crosshair", crosshair); //$NON-NLS-1$ + footprints.add(CROSSHAIR); + BOLD_CROSSHAIR = new PointShapeFootprint("Footprint.BoldCrosshair", crosshair); //$NON-NLS-1$ + BOLD_CROSSHAIR.setStroke(new BasicStroke(2)); + footprints.add(BOLD_CROSSHAIR); + + // SIMPLE_AXES + GeneralPath axes = new GeneralPath(); + axes.reset(); + axes.moveTo(w, 0); + axes.lineTo(-w, 0); + axes.moveTo(0, w); + axes.lineTo(0, -w); + axes.moveTo(15, 5); // x axis crosshair + axes.lineTo(15, -5); + SIMPLE_AXES = new PointShapeFootprint("Footprint.SimpleAxes", axes); //$NON-NLS-1$ + footprints.add(SIMPLE_AXES); + BOLD_SIMPLE_AXES = new PointShapeFootprint("Footprint.BoldSimpleAxes", axes); //$NON-NLS-1$ + BOLD_SIMPLE_AXES.setStroke(new BasicStroke(2)); + footprints.add(BOLD_SIMPLE_AXES); + + // SQUARE + Rectangle2D square = new Rectangle(-3, -3, 6, 6); + SOLID_SQUARE = new PointShapeFootprint("Footprint.SolidSquare", square); //$NON-NLS-1$ + SOLID_SQUARE.setStroke(null); + footprints.add(SOLID_SQUARE); + + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java index 609390e3..8788fadb 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java @@ -1,108 +1,108 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.*; - -import javax.swing.Icon; - -/** - * A PositionVectorFootprint returns a vector shape for a Point[] of length 2, - * but creates a hit shape only at the tip of the vector. - */ -public class PositionVectorFootprint extends PointShapeFootprint { - - // instance fields - TTrack track; - LineFootprint arrow; - Point[] onePoint = new Point[1]; - - /** - * Constructs a PositionVectorFootprint. - * - * @param track the (PointMass) track that will use this footprint - * @param name the name of the footprint - * @param w the stroke line width - */ - public PositionVectorFootprint(TTrack track, String name, int w) { - super(name, new Ellipse2D.Double(-2, -2, 4, 4)); - this.track = track; - arrow = (LineFootprint)LineFootprint.getFootprint("Footprint.Arrow"); //$NON-NLS-1$ - arrow.setLineWidth(w); - stroke = null; - } - - /** - * Gets the fill shape for a specified point. - * - * @param points an array of points - * @return the fill shape - */ - public Shape getShape(Point[] points) { - super.getShape(points); // this sets up hitShapes[] at vector tip - return arrow.getShape(points); - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - arrow.setColor(color); - return arrow.getIcon(w, h); - } - - /** - * Sets the stroke. May be set to null. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - arrow.setStroke(stroke); - } - - /** - * Gets the stroke. May return null; - * - * @return the stroke - */ - public BasicStroke getStroke() { - return arrow.getStroke(); - } - - /** - * Sets the line width. - * - * @param w the desired line width - */ - public void setLineWidth(double w) { - arrow.setLineWidth(w); - } - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.*; + +import javax.swing.Icon; + +/** + * A PositionVectorFootprint returns a vector shape for a Point[] of length 2, + * but creates a hit shape only at the tip of the vector. + */ +public class PositionVectorFootprint extends PointShapeFootprint { + + // instance fields + TTrack track; + LineFootprint arrow; + Point[] onePoint = new Point[1]; + + /** + * Constructs a PositionVectorFootprint. + * + * @param track the (PointMass) track that will use this footprint + * @param name the name of the footprint + * @param w the stroke line width + */ + public PositionVectorFootprint(TTrack track, String name, int w) { + super(name, new Ellipse2D.Double(-2, -2, 4, 4)); + this.track = track; + arrow = (LineFootprint)LineFootprint.getFootprint("Footprint.Arrow"); //$NON-NLS-1$ + arrow.setLineWidth(w); + stroke = null; + } + + /** + * Gets the fill shape for a specified point. + * + * @param points an array of points + * @return the fill shape + */ + public Shape getShape(Point[] points) { + super.getShape(points); // this sets up hitShapes[] at vector tip + return arrow.getShape(points); + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + arrow.setColor(color); + return arrow.getIcon(w, h); + } + + /** + * Sets the stroke. May be set to null. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + arrow.setStroke(stroke); + } + + /** + * Gets the stroke. May return null; + * + * @return the stroke + */ + public BasicStroke getStroke() { + return arrow.getStroke(); + } + + /** + * Sets the line width. + * + * @param w the desired line width + */ + public void setLineWidth(double w) { + arrow.setLineWidth(w); + } + } \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java index 809e9171..610c861b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java @@ -1,382 +1,382 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.StringSelection; -import java.awt.event.*; -import java.awt.font.FontRenderContext; -import java.awt.geom.Rectangle2D; - -import javax.swing.*; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableModel; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.media.core.Video; -import org.opensourcephysics.media.core.VideoClip; -import org.opensourcephysics.media.core.VideoIO; -import org.opensourcephysics.media.core.VideoType; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.tools.ResourceLoader; - -import java.text.NumberFormat; -import java.util.ArrayList; - -/** - * A dialog for viewing and setting document properties and metadata. - * - * @author Douglas Brown - */ -public class PropertiesDialog extends JDialog { - - final static Color DARK_RED = new Color(220, 0, 0); - final static Color MEDIUM_RED = new Color(255, 120, 140); - final static Color LIGHT_RED = new Color(255, 180, 200); - - protected TrackerPanel trackerPanel; - protected JButton okButton, cancelButton; - protected JTextField authorField, contactField; - protected JLabel authorLabel, contactLabel; - protected JTabbedPane tabbedPane; - protected JPanel metaPanel, videoPanel, trkPanel; - protected JTable videoTable, trkTable; - protected PropertyCellRenderer cellRenderer = new PropertyCellRenderer(); - protected String[] vidProps = new String[6], vidValues = new String[6]; - protected ArrayList trkProps = new ArrayList(), - trkValues = new ArrayList(); - protected boolean hasVid; - - /** - * Constructor. - * - * @param panel the tracker panel - */ - public PropertiesDialog(TrackerPanel panel) { - super(panel.getTFrame(), true); - trackerPanel = panel; - createGUI(); - setFontLevel(FontSizer.getLevel()); - setLabelSizes(); - pack(); - okButton.requestFocusInWindow(); - } - - /** - * Sets the font level. - * - * @param level the desired font level - */ - public void setFontLevel(int level) { - FontSizer.setFonts(this, level); - - Font font = cellRenderer.getFont(); - font = FontSizer.getResizedFont(font, level); - if (videoTable!=null) { - videoTable.setRowHeight(font.getSize()+4); - } - trkTable.setRowHeight(font.getSize()+4); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - setTitle(TrackerRes.getString("PropertiesDialog.Title")); //$NON-NLS-1$ - JPanel contentPane = new JPanel(new BorderLayout()); - setContentPane(contentPane); - tabbedPane = new JTabbedPane(); - contentPane.add(tabbedPane, BorderLayout.CENTER); - - // Tracker File tab - trkPanel = new JPanel(new BorderLayout()); - tabbedPane.addTab(TrackerRes.getString("PropertiesDialog.Tab.TrackerFile"), trkPanel); //$NON-NLS-1$ - trkProps.add(TrackerRes.getString("TActions.Dialog.AboutVideo.Name")); //$NON-NLS-1$ - trkProps.add(TrackerRes.getString("TActions.Dialog.AboutVideo.Path")); //$NON-NLS-1$ - String path = XML.forwardSlash(trackerPanel.openedFromPath); - path = ResourceLoader.getNonURIPath(path); - String name = XML.getName(path); - trkValues.add(name); - trkValues.add(path); - TableModel model = new TRKTableModel(); - trkTable = new JTable(model); - trkTable.setBackground(trkPanel.getBackground()); - trkTable.setDefaultRenderer(String.class, cellRenderer); - trkTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - trkTable.setColumnSelectionAllowed(true); - trkTable.getColumnModel().getColumn(0).setPreferredWidth(50); - trkTable.getColumnModel().getColumn(1).setPreferredWidth(250); - trkPanel.add(trkTable.getTableHeader(), BorderLayout.NORTH); - trkPanel.add(trkTable, BorderLayout.CENTER); - ToolTipManager.sharedInstance().setInitialDelay(0); - ToolTipManager.sharedInstance().setDismissDelay(20000); - ToolTipManager.sharedInstance().registerComponent(trkTable); - JButton button = new JButton(TrackerRes.getString("PropertiesDialog.Button.CopyFilePath")); //$NON-NLS-1$ - button.setForeground(new Color(0, 0, 102)); - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - trkTable.setRowSelectionInterval(1, 1); - trkTable.setColumnSelectionInterval(1, 1); - String s = trkTable.getValueAt(1, 1).toString(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection stringSelection = new StringSelection(s); - clipboard.setContents(stringSelection, stringSelection); - } - }); - button.setEnabled(trackerPanel.openedFromPath!=null); - JPanel buttonPanel = new JPanel(); - buttonPanel.add(button); - trkPanel.add(buttonPanel, BorderLayout.SOUTH); - - // Video tab - Video video = trackerPanel.getVideo(); - hasVid = video!=null; - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - if (hasVid || clip.getVideoPath()!=null) { - videoPanel = new JPanel(new BorderLayout()); - tabbedPane.addTab(TrackerRes.getString("TMenuBar.Menu.Video"), videoPanel); //$NON-NLS-1$ - NumberFormat format = NumberFormat.getNumberInstance(); - format.setMinimumIntegerDigits(1); - format.setMinimumFractionDigits(1); - format.setMaximumFractionDigits(1); - name = hasVid? XML.getName((String)video.getProperty("name")): null; //$NON-NLS-1$ - path = clip.getVideoPath(); - path = XML.forwardSlash(path); - path = ResourceLoader.getNonURIPath(path); - String type = null; - String size = null; - String length = null; - String fps = null; - if (hasVid) { - VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - type = videoType==null? - video.getClass().getSimpleName(): - videoType.getDescription(); - // eliminate extension list and replace with video engine if ffmpeg or QT - int n = type.lastIndexOf("("); //$NON-NLS-1$ - if (n>-1) { - type = type.substring(0, n); - if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { - type += "(FFMPeg)"; //$NON-NLS-1$ - } - else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_QUICKTIME)) { - type += "(QuickTime)"; //$NON-NLS-1$ - } - } - size = video.getImage().getWidth()+" x "+video.getImage().getHeight(); //$NON-NLS-1$ - length = video.getFrameCount()+" "; //$NON-NLS-1$ - length += TrackerRes.getString("TActions.Dialog.AboutVideo.Frames"); //$NON-NLS-1$ -// double duration = video.getDuration()/1000.0; -// duration = video.getFrameCount()<=1? 0: duration; -// length += ", "+format.format(duration)+" "; //$NON-NLS-1$ //$NON-NLS-2$ -// length += TrackerRes.getString("TActions.Dialog.AboutVideo.Seconds"); //$NON-NLS-1$ - double dt = trackerPanel.getPlayer().getClipControl().getMeanFrameDuration(); - double frameRate = video.getFrameCount()<=1? 0: 1000/dt; - fps = frameRate==0? "": format.format(frameRate)+" "; //$NON-NLS-1$ //$NON-NLS-2$ - if (frameRate>0) - fps += TrackerRes.getString("TActions.Dialog.AboutVideo.FramesPerSecond"); //$NON-NLS-1$ - ArrayList badFrames = TrackerIO.findBadVideoFrames(trackerPanel, TrackerIO.defaultBadFrameTolerance, - false, false, false); // don't show dialog, just get bad frames - if (!badFrames.isEmpty()) { - fps += " ("+TrackerRes.getString("TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant")+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - vidProps[0] = TrackerRes.getString("TActions.Dialog.AboutVideo.Name"); //$NON-NLS-1$ - vidProps[1] = TrackerRes.getString("TActions.Dialog.AboutVideo.Path"); //$NON-NLS-1$ - vidProps[2] = TrackerRes.getString("TActions.Dialog.AboutVideo.Type"); //$NON-NLS-1$ - vidProps[3] = TrackerRes.getString("TActions.Dialog.AboutVideo.Size"); //$NON-NLS-1$ - vidProps[4] = TrackerRes.getString("TActions.Dialog.AboutVideo.Length"); //$NON-NLS-1$ - vidProps[5] = TrackerRes.getString("TActions.Dialog.AboutVideo.FrameRate"); //$NON-NLS-1$ - vidValues[0] = name; - vidValues[1] = path; - vidValues[2] = type; - vidValues[3] = size; - vidValues[4] = length; - vidValues[5] = fps; - model = new VideoTableModel(); - videoTable = new JTable(model); - videoTable.setBackground(videoPanel.getBackground()); - videoTable.setDefaultRenderer(String.class, cellRenderer); - videoTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - videoTable.setColumnSelectionAllowed(true); - videoTable.getColumnModel().getColumn(0).setPreferredWidth(50); - videoTable.getColumnModel().getColumn(1).setPreferredWidth(250); - videoPanel.add(videoTable.getTableHeader(), BorderLayout.NORTH); - videoPanel.add(videoTable, BorderLayout.CENTER); - ToolTipManager.sharedInstance().registerComponent(videoTable); - button = new JButton(TrackerRes.getString("PropertiesDialog.Button.CopyVideoPath")); //$NON-NLS-1$ - button.setForeground(new Color(0, 0, 102)); - button.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - videoTable.setRowSelectionInterval(1, 1); - videoTable.setColumnSelectionInterval(1, 1); - String s = videoTable.getValueAt(1, 1).toString(); - Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection stringSelection = new StringSelection(s); - clipboard.setContents(stringSelection, stringSelection); - } - }); - button.setEnabled(!path.equals("")); //$NON-NLS-1$ - buttonPanel = new JPanel(); - buttonPanel.add(button); - videoPanel.add(buttonPanel, BorderLayout.SOUTH); - } - - // Metadata tab - metaPanel = new JPanel(new BorderLayout()); - tabbedPane.addTab(TrackerRes.getString("PropertiesDialog.Tab.Metadata"), metaPanel); //$NON-NLS-1$ - authorLabel = new JLabel(TrackerRes.getString("PropertiesDialog.Label.Author")); //$NON-NLS-1$ - authorField = new JTextField(30); - authorField.setText(trackerPanel.author); - JToolBar authorbar = new JToolBar(); - authorbar.setBorder(BorderFactory.createEmptyBorder(6, 4, 2, 4)); - authorbar.setFloatable(false); - authorbar.setOpaque(false); - authorbar.add(authorLabel); - authorbar.add(authorField); - - contactLabel = new JLabel(TrackerRes.getString("PropertiesDialog.Label.Contact")); //$NON-NLS-1$ - contactField = new JTextField(30); - contactField.setText(trackerPanel.contact); - JToolBar contactbar = new JToolBar(); - contactbar.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); - contactbar.setFloatable(false); - contactbar.setOpaque(false); - contactbar.add(contactLabel); - contactbar.add(contactField); - - Box box = Box.createVerticalBox(); - box.add(authorbar); - box.add(contactbar); - metaPanel.add(box, BorderLayout.NORTH); - - // create OK button - okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - okButton.setForeground(new Color(0, 0, 102)); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - String s = authorField.getText(); - trackerPanel.author = "".equals(s)? null: s; //$NON-NLS-1$ - s = contactField.getText(); - trackerPanel.contact = "".equals(s)? null: s; //$NON-NLS-1$ - setVisible(false); - } - }); - // create cancel button - cancelButton = new JButton(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ - cancelButton.setForeground(new Color(0, 0, 102)); - cancelButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - // create buttonbar at bottom - JPanel buttonbar = new JPanel(); - buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); - contentPane.add(buttonbar, BorderLayout.SOUTH); - buttonbar.add(okButton); - buttonbar.add(cancelButton); - } - - private void setLabelSizes() { - ArrayList labels = new ArrayList(); - labels.add(authorLabel); - labels.add(contactLabel); - FontRenderContext frc = new FontRenderContext(null, false, false); - Font font = authorLabel.getFont(); - int w = 0; - for(JLabel next: labels) { - Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ - w = Math.max(w, (int) rect.getWidth()+1); - } - Dimension labelSize = new Dimension(w, 20); - for(JLabel next: labels) { - next.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 2)); - next.setPreferredSize(labelSize); - next.setHorizontalAlignment(SwingConstants.TRAILING); - } - } - - /** - * A class to provide model data for the video table. - */ - class VideoTableModel extends AbstractTableModel { - public int getRowCount() {return vidProps.length;} - - public int getColumnCount() {return 2;} - - public Object getValueAt(int row, int col) {return col==0? vidProps[row]: vidValues[row];} - - public String getColumnName(int col) { - return col==0? TrackerRes.getString("PropertiesDialog.Header.Property"): //$NON-NLS-1$ - TrackerRes.getString("PropertiesDialog.Header.Value"); //$NON-NLS-1$ - } - - public Class getColumnClass(int col) {return String.class;} - } - - /** - * A class to provide model data for the trk table. - */ - class TRKTableModel extends AbstractTableModel { - public int getRowCount() {return trkProps.size();} - - public int getColumnCount() {return 2;} - - public Object getValueAt(int row, int col) { - return col==0? trkProps.get(row): trkValues.get(row); - } - - public String getColumnName(int col) { - return col==0? TrackerRes.getString("PropertiesDialog.Header.Property"): //$NON-NLS-1$ - TrackerRes.getString("PropertiesDialog.Header.Value"); //$NON-NLS-1$ - } - - public Class getColumnClass(int col) {return String.class;} - } - - /** - * A class to render table cells. - */ - class PropertyCellRenderer extends DefaultTableCellRenderer { - public Component getTableCellRendererComponent(JTable table, Object val, - boolean selected, boolean hasFocus, int row, int col) { - setToolTipText(row==1 && col==1 && val!=null? val.toString(): null); - setBackground(Color.white); - Component c = super.getTableCellRendererComponent(table, val, selected, hasFocus, row, col); - boolean red = col==1 && table == videoTable && !hasVid && val!=null; - setForeground(red? DARK_RED: Color.black); - if (red) { - setBackground(selected? MEDIUM_RED: LIGHT_RED); - } - return c; - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.StringSelection; +import java.awt.event.*; +import java.awt.font.FontRenderContext; +import java.awt.geom.Rectangle2D; + +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.TableModel; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.media.core.Video; +import org.opensourcephysics.media.core.VideoClip; +import org.opensourcephysics.media.core.VideoIO; +import org.opensourcephysics.media.core.VideoType; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.tools.ResourceLoader; + +import java.text.NumberFormat; +import java.util.ArrayList; + +/** + * A dialog for viewing and setting document properties and metadata. + * + * @author Douglas Brown + */ +public class PropertiesDialog extends JDialog { + + final static Color DARK_RED = new Color(220, 0, 0); + final static Color MEDIUM_RED = new Color(255, 120, 140); + final static Color LIGHT_RED = new Color(255, 180, 200); + + protected TrackerPanel trackerPanel; + protected JButton okButton, cancelButton; + protected JTextField authorField, contactField; + protected JLabel authorLabel, contactLabel; + protected JTabbedPane tabbedPane; + protected JPanel metaPanel, videoPanel, trkPanel; + protected JTable videoTable, trkTable; + protected PropertyCellRenderer cellRenderer = new PropertyCellRenderer(); + protected String[] vidProps = new String[6], vidValues = new String[6]; + protected ArrayList trkProps = new ArrayList(), + trkValues = new ArrayList(); + protected boolean hasVid; + + /** + * Constructor. + * + * @param panel the tracker panel + */ + public PropertiesDialog(TrackerPanel panel) { + super(panel.getTFrame(), true); + trackerPanel = panel; + createGUI(); + setFontLevel(FontSizer.getLevel()); + setLabelSizes(); + pack(); + okButton.requestFocusInWindow(); + } + + /** + * Sets the font level. + * + * @param level the desired font level + */ + public void setFontLevel(int level) { + FontSizer.setFonts(this, level); + + Font font = cellRenderer.getFont(); + font = FontSizer.getResizedFont(font, level); + if (videoTable!=null) { + videoTable.setRowHeight(font.getSize()+4); + } + trkTable.setRowHeight(font.getSize()+4); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + setTitle(TrackerRes.getString("PropertiesDialog.Title")); //$NON-NLS-1$ + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + tabbedPane = new JTabbedPane(); + contentPane.add(tabbedPane, BorderLayout.CENTER); + + // Tracker File tab + trkPanel = new JPanel(new BorderLayout()); + tabbedPane.addTab(TrackerRes.getString("PropertiesDialog.Tab.TrackerFile"), trkPanel); //$NON-NLS-1$ + trkProps.add(TrackerRes.getString("TActions.Dialog.AboutVideo.Name")); //$NON-NLS-1$ + trkProps.add(TrackerRes.getString("TActions.Dialog.AboutVideo.Path")); //$NON-NLS-1$ + String path = XML.forwardSlash(trackerPanel.openedFromPath); + path = ResourceLoader.getNonURIPath(path); + String name = XML.getName(path); + trkValues.add(name); + trkValues.add(path); + TableModel model = new TRKTableModel(); + trkTable = new JTable(model); + trkTable.setBackground(trkPanel.getBackground()); + trkTable.setDefaultRenderer(String.class, cellRenderer); + trkTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + trkTable.setColumnSelectionAllowed(true); + trkTable.getColumnModel().getColumn(0).setPreferredWidth(50); + trkTable.getColumnModel().getColumn(1).setPreferredWidth(250); + trkPanel.add(trkTable.getTableHeader(), BorderLayout.NORTH); + trkPanel.add(trkTable, BorderLayout.CENTER); + ToolTipManager.sharedInstance().setInitialDelay(0); + ToolTipManager.sharedInstance().setDismissDelay(20000); + ToolTipManager.sharedInstance().registerComponent(trkTable); + JButton button = new JButton(TrackerRes.getString("PropertiesDialog.Button.CopyFilePath")); //$NON-NLS-1$ + button.setForeground(new Color(0, 0, 102)); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + trkTable.setRowSelectionInterval(1, 1); + trkTable.setColumnSelectionInterval(1, 1); + String s = trkTable.getValueAt(1, 1).toString(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection stringSelection = new StringSelection(s); + clipboard.setContents(stringSelection, stringSelection); + } + }); + button.setEnabled(trackerPanel.openedFromPath!=null); + JPanel buttonPanel = new JPanel(); + buttonPanel.add(button); + trkPanel.add(buttonPanel, BorderLayout.SOUTH); + + // Video tab + Video video = trackerPanel.getVideo(); + hasVid = video!=null; + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + if (hasVid || clip.getVideoPath()!=null) { + videoPanel = new JPanel(new BorderLayout()); + tabbedPane.addTab(TrackerRes.getString("TMenuBar.Menu.Video"), videoPanel); //$NON-NLS-1$ + NumberFormat format = NumberFormat.getNumberInstance(); + format.setMinimumIntegerDigits(1); + format.setMinimumFractionDigits(1); + format.setMaximumFractionDigits(1); + name = hasVid? XML.getName((String)video.getProperty("name")): null; //$NON-NLS-1$ + path = clip.getVideoPath(); + path = XML.forwardSlash(path); + path = ResourceLoader.getNonURIPath(path); + String type = null; + String size = null; + String length = null; + String fps = null; + if (hasVid) { + VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ + type = videoType==null? + video.getClass().getSimpleName(): + videoType.getDescription(); + // eliminate extension list and replace with video engine if ffmpeg or QT + int n = type.lastIndexOf("("); //$NON-NLS-1$ + if (n>-1) { + type = type.substring(0, n); + if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + type += "(FFMPeg)"; //$NON-NLS-1$ + } + else if (video.getClass().getSimpleName().contains(VideoIO.ENGINE_QUICKTIME)) { + type += "(QuickTime)"; //$NON-NLS-1$ + } + } + size = video.getImage().getWidth()+" x "+video.getImage().getHeight(); //$NON-NLS-1$ + length = video.getFrameCount()+" "; //$NON-NLS-1$ + length += TrackerRes.getString("TActions.Dialog.AboutVideo.Frames"); //$NON-NLS-1$ +// double duration = video.getDuration()/1000.0; +// duration = video.getFrameCount()<=1? 0: duration; +// length += ", "+format.format(duration)+" "; //$NON-NLS-1$ //$NON-NLS-2$ +// length += TrackerRes.getString("TActions.Dialog.AboutVideo.Seconds"); //$NON-NLS-1$ + double dt = trackerPanel.getPlayer().getClipControl().getMeanFrameDuration(); + double frameRate = video.getFrameCount()<=1? 0: 1000/dt; + fps = frameRate==0? "": format.format(frameRate)+" "; //$NON-NLS-1$ //$NON-NLS-2$ + if (frameRate>0) + fps += TrackerRes.getString("TActions.Dialog.AboutVideo.FramesPerSecond"); //$NON-NLS-1$ + ArrayList badFrames = TrackerIO.findBadVideoFrames(trackerPanel, TrackerIO.defaultBadFrameTolerance, + false, false, false); // don't show dialog, just get bad frames + if (!badFrames.isEmpty()) { + fps += " ("+TrackerRes.getString("TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant")+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + vidProps[0] = TrackerRes.getString("TActions.Dialog.AboutVideo.Name"); //$NON-NLS-1$ + vidProps[1] = TrackerRes.getString("TActions.Dialog.AboutVideo.Path"); //$NON-NLS-1$ + vidProps[2] = TrackerRes.getString("TActions.Dialog.AboutVideo.Type"); //$NON-NLS-1$ + vidProps[3] = TrackerRes.getString("TActions.Dialog.AboutVideo.Size"); //$NON-NLS-1$ + vidProps[4] = TrackerRes.getString("TActions.Dialog.AboutVideo.Length"); //$NON-NLS-1$ + vidProps[5] = TrackerRes.getString("TActions.Dialog.AboutVideo.FrameRate"); //$NON-NLS-1$ + vidValues[0] = name; + vidValues[1] = path; + vidValues[2] = type; + vidValues[3] = size; + vidValues[4] = length; + vidValues[5] = fps; + model = new VideoTableModel(); + videoTable = new JTable(model); + videoTable.setBackground(videoPanel.getBackground()); + videoTable.setDefaultRenderer(String.class, cellRenderer); + videoTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + videoTable.setColumnSelectionAllowed(true); + videoTable.getColumnModel().getColumn(0).setPreferredWidth(50); + videoTable.getColumnModel().getColumn(1).setPreferredWidth(250); + videoPanel.add(videoTable.getTableHeader(), BorderLayout.NORTH); + videoPanel.add(videoTable, BorderLayout.CENTER); + ToolTipManager.sharedInstance().registerComponent(videoTable); + button = new JButton(TrackerRes.getString("PropertiesDialog.Button.CopyVideoPath")); //$NON-NLS-1$ + button.setForeground(new Color(0, 0, 102)); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + videoTable.setRowSelectionInterval(1, 1); + videoTable.setColumnSelectionInterval(1, 1); + String s = videoTable.getValueAt(1, 1).toString(); + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection stringSelection = new StringSelection(s); + clipboard.setContents(stringSelection, stringSelection); + } + }); + button.setEnabled(!path.equals("")); //$NON-NLS-1$ + buttonPanel = new JPanel(); + buttonPanel.add(button); + videoPanel.add(buttonPanel, BorderLayout.SOUTH); + } + + // Metadata tab + metaPanel = new JPanel(new BorderLayout()); + tabbedPane.addTab(TrackerRes.getString("PropertiesDialog.Tab.Metadata"), metaPanel); //$NON-NLS-1$ + authorLabel = new JLabel(TrackerRes.getString("PropertiesDialog.Label.Author")); //$NON-NLS-1$ + authorField = new JTextField(30); + authorField.setText(trackerPanel.author); + JToolBar authorbar = new JToolBar(); + authorbar.setBorder(BorderFactory.createEmptyBorder(6, 4, 2, 4)); + authorbar.setFloatable(false); + authorbar.setOpaque(false); + authorbar.add(authorLabel); + authorbar.add(authorField); + + contactLabel = new JLabel(TrackerRes.getString("PropertiesDialog.Label.Contact")); //$NON-NLS-1$ + contactField = new JTextField(30); + contactField.setText(trackerPanel.contact); + JToolBar contactbar = new JToolBar(); + contactbar.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4)); + contactbar.setFloatable(false); + contactbar.setOpaque(false); + contactbar.add(contactLabel); + contactbar.add(contactField); + + Box box = Box.createVerticalBox(); + box.add(authorbar); + box.add(contactbar); + metaPanel.add(box, BorderLayout.NORTH); + + // create OK button + okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + okButton.setForeground(new Color(0, 0, 102)); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String s = authorField.getText(); + trackerPanel.author = "".equals(s)? null: s; //$NON-NLS-1$ + s = contactField.getText(); + trackerPanel.contact = "".equals(s)? null: s; //$NON-NLS-1$ + setVisible(false); + } + }); + // create cancel button + cancelButton = new JButton(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ + cancelButton.setForeground(new Color(0, 0, 102)); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + // create buttonbar at bottom + JPanel buttonbar = new JPanel(); + buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); + contentPane.add(buttonbar, BorderLayout.SOUTH); + buttonbar.add(okButton); + buttonbar.add(cancelButton); + } + + private void setLabelSizes() { + ArrayList labels = new ArrayList(); + labels.add(authorLabel); + labels.add(contactLabel); + FontRenderContext frc = new FontRenderContext(null, false, false); + Font font = authorLabel.getFont(); + int w = 0; + for(JLabel next: labels) { + Rectangle2D rect = font.getStringBounds(next.getText()+" ", frc); //$NON-NLS-1$ + w = Math.max(w, (int) rect.getWidth()+1); + } + Dimension labelSize = new Dimension(w, 20); + for(JLabel next: labels) { + next.setBorder(BorderFactory.createEmptyBorder(1, 1, 1, 2)); + next.setPreferredSize(labelSize); + next.setHorizontalAlignment(SwingConstants.TRAILING); + } + } + + /** + * A class to provide model data for the video table. + */ + class VideoTableModel extends AbstractTableModel { + public int getRowCount() {return vidProps.length;} + + public int getColumnCount() {return 2;} + + public Object getValueAt(int row, int col) {return col==0? vidProps[row]: vidValues[row];} + + public String getColumnName(int col) { + return col==0? TrackerRes.getString("PropertiesDialog.Header.Property"): //$NON-NLS-1$ + TrackerRes.getString("PropertiesDialog.Header.Value"); //$NON-NLS-1$ + } + + public Class getColumnClass(int col) {return String.class;} + } + + /** + * A class to provide model data for the trk table. + */ + class TRKTableModel extends AbstractTableModel { + public int getRowCount() {return trkProps.size();} + + public int getColumnCount() {return 2;} + + public Object getValueAt(int row, int col) { + return col==0? trkProps.get(row): trkValues.get(row); + } + + public String getColumnName(int col) { + return col==0? TrackerRes.getString("PropertiesDialog.Header.Property"): //$NON-NLS-1$ + TrackerRes.getString("PropertiesDialog.Header.Value"); //$NON-NLS-1$ + } + + public Class getColumnClass(int col) {return String.class;} + } + + /** + * A class to render table cells. + */ + class PropertyCellRenderer extends DefaultTableCellRenderer { + public Component getTableCellRendererComponent(JTable table, Object val, + boolean selected, boolean hasFocus, int row, int col) { + setToolTipText(row==1 && col==1 && val!=null? val.toString(): null); + setBackground(Color.white); + Component c = super.getTableCellRendererComponent(table, val, selected, hasFocus, row, col); + boolean red = col==1 && table == videoTable && !hasVid && val!=null; + setForeground(red? DARK_RED: Color.black); + if (red) { + setBackground(selected? MEDIUM_RED: LIGHT_RED); + } + return c; + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/Protractor.java b/src/org/opensourcephysics/cabrillo/tracker/Protractor.java index f0219a96..2ed42860 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Protractor.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Protractor.java @@ -1,759 +1,759 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.text.NumberFormat; -import java.util.ArrayList; -import java.awt.*; -import java.awt.event.*; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; -import javax.swing.border.Border; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * A Protractor measures and displays an angular arc. - * - * @author Douglas Brown - */ -public class Protractor extends TTrack { - - // instance fields - protected boolean fixedPosition = true; - protected JCheckBoxMenuItem fixedItem; - protected JMenuItem attachmentItem; - protected boolean editing = false; - protected final DecimalField inputField; - protected JPanel inputPanel; - protected JPanel glassPanel; - protected NumberFormat format; - protected MouseListener editListener; - - /** - * Constructs a Protractor. - */ - public Protractor() { - defaultColors = new Color[] {new Color(0, 140, 40)}; - // assign a default name - setName(TrackerRes.getString("Protractor.New.Name")); //$NON-NLS-1$ - // set up footprint choices and color - setFootprints(new Footprint[] - {ProtractorFootprint.getFootprint("ProtractorFootprint.Circle3"), //$NON-NLS-1$ - ProtractorFootprint.getFootprint("ProtractorFootprint.Circle5"), //$NON-NLS-1$ - ProtractorFootprint.getFootprint("ProtractorFootprint.Circle3Bold"), //$NON-NLS-1$ - ProtractorFootprint.getFootprint("ProtractorFootprint.Circle5Bold")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - - // assign default table variables - setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - - keyFrames.add(0); - // create input field and panel - inputField = new DecimalField(4, 1); - inputField.setBorder(null); - - format = inputField.getFormat(); - inputPanel = new JPanel(null); - inputPanel.setOpaque(false); - inputPanel.add(inputField); - // add inputField action listener to exit editing mode - inputField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - ProtractorStep step = ((ProtractorStep)getStep(n)); - setEditing(false, step); - } - } - }); - // add inputField focus listener - inputField.addFocusListener(new FocusAdapter() { - public void focusGained(FocusEvent e) { - inputField.selectAll(); - } - public void focusLost(FocusEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - ProtractorStep step = ((ProtractorStep)getStep(n)); - setEditing(false, step); - } - } - }); - // add mouse listener to toggle editing mode - editListener = new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - ProtractorStep tape = (ProtractorStep)getStep(n); - setEditing(false, tape); - } - } - public void mouseClicked(MouseEvent e) { - if (isLocked()) return; - int n = trackerPanel.getFrameNumber(); - ProtractorStep step = (ProtractorStep)getStep(n); - Rectangle bounds = step.layoutBounds.get(trackerPanel); - if (bounds != null && - bounds.contains(e.getPoint())) { - setEditing(true, step); - } - } - }; - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Hint"); //$NON-NLS-1$ - // initialize the autofill step array - ProtractorStep step = new ProtractorStep(this, 0, 100, 150, 200, 150); - step.setFootprint(getFootprint()); - steps = new StepArray(step); // autofills - fixedItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixed(fixedItem.isSelected()); - } - }); - final FocusListener arcFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (angleField.getBackground() == Color.yellow) { - int n = trackerPanel.getFrameNumber(); - ProtractorStep step = (ProtractorStep)getStep(n); - if (!isFixed()) { - keyFrames.add(n); - } - step = getKeyStep(step); - double theta = angleField.getValue(); - step.setProtractorAngle(theta); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - }; - angleField.addFocusListener(arcFocusListener); - angleField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - arcFocusListener.focusLost(null); - angleField.requestFocusInWindow(); - } - }); - } - - /** - * Sets the fixed property. When fixed, it has the same position at all times. - * - * @param fixed true to fix - */ - public void setFixed(boolean fixed) { - if (fixedPosition == fixed) return; - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - steps = new StepArray(getStep(n)); - trackerPanel.repaint(); - } - fixedPosition = fixed; - if (fixed) { // refresh data and post undo only when fixing - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - Undo.postTrackEdit(this, control); - } - } - - /** - * Gets the fixed property. - * - * @return true if fixed - */ - public boolean isFixed() { - return fixedPosition; - } - - /** - * Responds to property change events. Overrides TTrack method. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (trackerPanel.getSelectedTrack() == this) { - if (name.equals("stepnumber")) { //$NON-NLS-1$ - ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); - step.getProtractorAngle(); // refreshes angle field - step.arcHighlight = null; - } - else if (name.equals("selectedpoint")) { //$NON-NLS-1$ - TPoint p = trackerPanel.getSelectedPoint(); - if (!(p instanceof ProtractorStep.Rotator)) { - ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); - step.arcHighlight = null; - } - } - } - if (name.equals("adjusting") && e.getSource() instanceof TrackerPanel) { //$NON-NLS-1$ - refreshDataLater = (Boolean)e.getNewValue(); - if (!refreshDataLater) { // stopped adjusting - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - super.propertyChange(e); - } - - /** - * Overrides TTrack setTrailVisible method to keep trails hidden. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Implements createStep but only mimics step creation since - * steps are created automatically by the autofill StepArray. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - public Step createStep(int n, double x, double y) { - Step step = steps.getStep(n); - ((ProtractorStep)step).end1.setLocation(x, y); - return step; - } - - /** - * Mimics step creation by setting end positions of an existing step. - * - * @param n the frame number - * @param x1 the x coordinate of end1 in image space - * @param y1 the y coordinate of end1 in image space - * @param x2 the x coordinate of end2 in image space - * @param y2 the y coordinate of end2 in image space - * @return the step - */ - public Step createStep(int n, double x1, double y1, double x2, double y2) { - ProtractorStep step = (ProtractorStep)steps.getStep(n); - step.end1.setLocation(x1, y1); - step.end2.setLocation(x2, y2); - keyFrames.add(n); - return step; - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - setFixed(false); - ProtractorStep step = (ProtractorStep)steps.getStep(n); - int i = getTargetIndex(); - if (i==0) { - step.vertex.setLocation(x, y); - } - else if (i==1) { - step.end1.setLocation(x, y); - } - else { - step.end2.setLocation(x, y); - } - keyFrames.add(n); - step.repaint(); - return getMarkedPoint(n, i); - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - return null; - } - - /** - * Overrides TTrack getStep method to provide fixed behavior. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - ProtractorStep step = (ProtractorStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return ProtractorStep.getLength(); - } - - /** - * Determines if any point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Determines if the given point index is autotrackable. - * - * @param pointIndex the points[] index - * @return true if autotrackable - */ - protected boolean isAutoTrackable(int pointIndex) { - return pointIndex<3; - } - - /** - * Returns a description of a target point with a given index. - * - * @param pointIndex the index - * @return the description - */ - protected String getTargetDescription(int pointIndex) { - if (pointIndex==0) return TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ - String s = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ - return s+" "+(pointIndex); //$NON-NLS-1$ - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 3; - } - - /** - * Refreshes the data. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - if (refreshDataLater || trackerPanel == null || data == null) return; - dataFrames.clear(); - // get the datasets - int count = 0; - Dataset theta = data.getDataset(count++); - Dataset arm1Length = data.getDataset(count++); - Dataset arm2Length = data.getDataset(count++); - Dataset stepNum = data.getDataset(count++); - Dataset frameNum = data.getDataset(count++); - // assign column names to the datasets - String time = "t"; //$NON-NLS-1$ - if (!theta.getColumnName(0).equals(time)) { // not yet initialized - theta.setXYColumnNames(time, Tracker.THETA); - arm1Length.setXYColumnNames(time, "L_{1}"); //$NON-NLS-1$ - arm2Length.setXYColumnNames(time, "L_{2}"); //$NON-NLS-1$ - stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ - frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ - } - else for (int i = 0; i < count; i++) { - data.getDataset(i).clear(); - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < dataDescriptions.length; i++) { - dataDescriptions[i] = TrackerRes.getString("Protractor.Data.Description."+i); //$NON-NLS-1$ - } - // look thru steps and get data for those included in clip - VideoPlayer player = trackerPanel.getPlayer(); - VideoClip clip = player.getVideoClip(); - int len = clip.getStepCount(); - double[][] validData = new double[data.getDatasets().size()+1][len]; - for (int n = 0; n < len; n++) { - int frame = clip.stepToFrame(n); - ProtractorStep next = (ProtractorStep)getStep(frame); - next.dataVisible = true; - // get the step number and time - double t = player.getStepTime(n)/1000.0; - validData[0][n] = t; - validData[1][n] = next.getProtractorAngle(); - validData[2][n] = next.getArmLength(next.end1); - validData[3][n] = next.getArmLength(next.end2); - validData[4][n] = n; - validData[5][n] = frame; - dataFrames.add(frame); - } - // append the data to the data set - theta.append(validData[0], validData[1]); - arm1Length.append(validData[0], validData[2]); - arm2Length.append(validData[0], validData[3]); - stepNum.append(validData[0], validData[4]); - frameNum.append(validData[0], validData[5]); - } - - /** - * Returns a menu with items that control this track. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - -// lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); - fixedItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedItem.setSelected(isFixed()); - fixedItem.setEnabled(attachments==null || (attachments[0]==null && attachments[1]==null && attachments[2]==null)); - - // remove end items and last separator - menu.remove(deleteTrackItem); - menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); - menu.add(fixedItem); - - // add an attachment dialog item - attachmentItem = new JMenuItem(TrackerRes.getString("MeasuringTool.MenuItem.Attach")); //$NON-NLS-1$ - attachmentItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - AttachmentDialog control = Protractor.this.trackerPanel.getAttachmentDialog(Protractor.this); - control.setVisible(true); - } - }); - menu.addSeparator(); - menu.add(attachmentItem); - - menu.addSeparator(); - menu.add(deleteTrackItem); - return menu; - } - - /** - * Returns a list of point-related toolbar components. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - list.add(stepSeparator); - angleLabel.setText(TrackerRes.getString("Protractor.Label.Angle")); //$NON-NLS-1$ - angleField.setToolTipText(TrackerRes.getString("Protractor.Field.Angle.Tooltip")); //$NON-NLS-1$ - angleField.setEnabled(!isLocked()); - list.add(angleLabel); - list.add(angleField); - return list; - } - - /** - * Implements findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step or motion vector that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || !isVisible()) - return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - int n = trackerPanel.getFrameNumber(); - ProtractorStep step = (ProtractorStep)getStep(n); - if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { - Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia == null) { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Hint"); //$NON-NLS-1$ - return null; - } - if (ia==step.vertex) { - partName = TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Vertex.Hint"); //$NON-NLS-1$ - } - else if (ia instanceof ProtractorStep.Tip) { - partName = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.End.Hint"); //$NON-NLS-1$ - } - else if (ia==step.handle) { - partName = TrackerRes.getString("Protractor.Handle.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Handle.Hint"); //$NON-NLS-1$ - } - else if (ia==step.rotator) { - partName = TrackerRes.getString("Protractor.Rotator.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Rotator.Hint"); //$NON-NLS-1$ - } - else if (ia==this) { - partName = TrackerRes.getString("Protractor.Readout.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Protractor.Readout.Hint"); //$NON-NLS-1$ - trackerPanel.setMessage(getMessage()); - } - return ia; - } - return null; - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("Protractor.Name"); //$NON-NLS-1$ - } - -//__________________________ protected methods ________________________ - - /** - * Overrides TTrack setTrackerPanel method. - * - * @param panel the TrackerPanel - */ - protected void setTrackerPanel(TrackerPanel panel) { - if (trackerPanel != null) { - trackerPanel.removeMouseListener(editListener); - trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - super.setTrackerPanel(panel); - if (trackerPanel != null) { - trackerPanel.addMouseListener(editListener); - trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - setFixed(isFixed()); - } - - /** - * Overrides TTrack method. - * - * @param radians true for radians, false for degrees - */ - @Override - protected void setAnglesInRadians(boolean radians) { - super.setAnglesInRadians(radians); - inputField.setDecimalPlaces(radians? 3: 1); - inputField.setConversionFactor(radians? 1.0: 180/Math.PI); - ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); - step.repaint(); // refreshes angle readout - } - - /** - * Refreshes a step by setting it equal to a keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(ProtractorStep step) { - // compare step with keyStep - ProtractorStep keyStep = getKeyStep(step); - boolean different = - keyStep.vertex.getX()!=step.vertex.getX() - || keyStep.vertex.getY()!=step.vertex.getY() - || keyStep.end1.getX()!=step.end1.getX() - || keyStep.end1.getY()!=step.end1.getY() - || keyStep.end2.getX()!=step.end2.getX() - || keyStep.end2.getY()!=step.end2.getY(); - // update step if needed - if (different) { - step.vertex.setLocation(keyStep.vertex); - step.end1.setLocation(keyStep.end1); - step.end2.setLocation(keyStep.end2); - step.erase(); - } - } - - /** - * Returns the key step for a given step. - * @param step the step - * @return the key step - */ - private ProtractorStep getKeyStep(ProtractorStep step) { - int key = 0; - if (!this.isFixed()) { - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - } - return (ProtractorStep)steps.getStep(key); - } - - - - /** - * Sets the editing flag. - * - * @param edit true to edit the angle - * @param target the step that handles the edit process - */ - private void setEditing(boolean edit, ProtractorStep target) { - editing = edit; - if (!editing) { - // if not fixed, add target frame to key frames - if (!isFixed()) - keyFrames.add(target.n); - // replace target with key frame step - target = getKeyStep(target); - } - final ProtractorStep step = target; - Runnable runner = new Runnable() { - public void run() { - if (editing) { - trackerPanel.setSelectedTrack(Protractor.this); - inputField.setForeground(footprint.getColor()); - Rectangle bounds = step.layoutBounds.get(trackerPanel); - bounds.grow(3, 3); - bounds.setLocation(bounds.x+1, bounds.y); - for (Component c: trackerPanel.getComponents()) { - if (c == trackerPanel.noData) { - bounds.setLocation(bounds.x, bounds.y-c.getHeight()); - } - } - inputField.setBounds(bounds); - glassPanel = trackerPanel.getGlassPanel(); - trackerPanel.remove(glassPanel); - trackerPanel.add(inputPanel, BorderLayout.CENTER); - Border space = BorderFactory.createEmptyBorder(0, 1, 1, 0); - Color color = getFootprint().getColor(); - Border line = BorderFactory.createLineBorder(color); - inputField.setBorder(BorderFactory.createCompoundBorder(line, space)); - inputField.setValue(step.getProtractorAngle()); - trackerPanel.revalidate(); - trackerPanel.repaint(); - inputField.requestFocus(); - } - else { // end editing - step.drawLayoutBounds = false; - step.setProtractorAngle(inputField.getValue()); - inputField.setSigFigs(4); - trackerPanel.add(glassPanel, BorderLayout.CENTER); - trackerPanel.remove(inputPanel); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - trackerPanel.revalidate(); - trackerPanel.repaint(); - } - } - }; - EventQueue.invokeLater(runner); - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - Protractor protractor = (Protractor)obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save fixed property - control.setValue("fixed", protractor.isFixed()); //$NON-NLS-1$ - // save steps - Step[] steps = protractor.getSteps(); - int count = steps.length; - if (protractor.isFixed()) count = 1; - double[][] data = new double[count][]; - for (int n = 0; n < count; n++) { - // save only key frames - if (steps[n] == null || !protractor.keyFrames.contains(n)) continue; - ProtractorStep pStep = (ProtractorStep)steps[n]; - double[] stepData = new double[6]; - stepData[0] = pStep.end1.getX(); - stepData[1] = pStep.end1.getY(); - stepData[2] = pStep.end2.getX(); - stepData[3] = pStep.end2.getY(); - stepData[4] = pStep.vertex.getX(); - stepData[5] = pStep.vertex.getY(); - data[n] = stepData; - } - control.setValue("framedata", data); //$NON-NLS-1$ - } - - /** - * Creates a new object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new Protractor(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - Protractor protractor = (Protractor)obj; - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - boolean locked = protractor.isLocked(); - protractor.setLocked(false); - // load fixed property - protractor.fixedPosition = control.getBoolean("fixed"); //$NON-NLS-1$ - // load step data - protractor.keyFrames.clear(); - double[][] data = (double[][])control.getObject("framedata"); //$NON-NLS-1$ - for (int n = 0; n < data.length; n++) { - if (data[n] == null) continue; - Step step = protractor.createStep(n, data[n][0], data[n][1], data[n][2], data[n][3]); - ProtractorStep tapeStep = (ProtractorStep)step; - // set vertex position - tapeStep.vertex.setLocation(data[n][4], data[n][5]); - tapeStep.erase(); - } - protractor.setLocked(locked); - return obj; - } - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.text.NumberFormat; +import java.util.ArrayList; +import java.awt.*; +import java.awt.event.*; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.border.Border; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * A Protractor measures and displays an angular arc. + * + * @author Douglas Brown + */ +public class Protractor extends TTrack { + + // instance fields + protected boolean fixedPosition = true; + protected JCheckBoxMenuItem fixedItem; + protected JMenuItem attachmentItem; + protected boolean editing = false; + protected final DecimalField inputField; + protected JPanel inputPanel; + protected JPanel glassPanel; + protected NumberFormat format; + protected MouseListener editListener; + + /** + * Constructs a Protractor. + */ + public Protractor() { + defaultColors = new Color[] {new Color(0, 140, 40)}; + // assign a default name + setName(TrackerRes.getString("Protractor.New.Name")); //$NON-NLS-1$ + // set up footprint choices and color + setFootprints(new Footprint[] + {ProtractorFootprint.getFootprint("ProtractorFootprint.Circle3"), //$NON-NLS-1$ + ProtractorFootprint.getFootprint("ProtractorFootprint.Circle5"), //$NON-NLS-1$ + ProtractorFootprint.getFootprint("ProtractorFootprint.Circle3Bold"), //$NON-NLS-1$ + ProtractorFootprint.getFootprint("ProtractorFootprint.Circle5Bold")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + + // assign default table variables + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + + keyFrames.add(0); + // create input field and panel + inputField = new DecimalField(4, 1); + inputField.setBorder(null); + + format = inputField.getFormat(); + inputPanel = new JPanel(null); + inputPanel.setOpaque(false); + inputPanel.add(inputField); + // add inputField action listener to exit editing mode + inputField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + ProtractorStep step = ((ProtractorStep)getStep(n)); + setEditing(false, step); + } + } + }); + // add inputField focus listener + inputField.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + inputField.selectAll(); + } + public void focusLost(FocusEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + ProtractorStep step = ((ProtractorStep)getStep(n)); + setEditing(false, step); + } + } + }); + // add mouse listener to toggle editing mode + editListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + ProtractorStep tape = (ProtractorStep)getStep(n); + setEditing(false, tape); + } + } + public void mouseClicked(MouseEvent e) { + if (isLocked()) return; + int n = trackerPanel.getFrameNumber(); + ProtractorStep step = (ProtractorStep)getStep(n); + Rectangle bounds = step.layoutBounds.get(trackerPanel); + if (bounds != null && + bounds.contains(e.getPoint())) { + setEditing(true, step); + } + } + }; + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Hint"); //$NON-NLS-1$ + // initialize the autofill step array + ProtractorStep step = new ProtractorStep(this, 0, 100, 150, 200, 150); + step.setFootprint(getFootprint()); + steps = new StepArray(step); // autofills + fixedItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixed(fixedItem.isSelected()); + } + }); + final FocusListener arcFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (angleField.getBackground() == Color.yellow) { + int n = trackerPanel.getFrameNumber(); + ProtractorStep step = (ProtractorStep)getStep(n); + if (!isFixed()) { + keyFrames.add(n); + } + step = getKeyStep(step); + double theta = angleField.getValue(); + step.setProtractorAngle(theta); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + } + }; + angleField.addFocusListener(arcFocusListener); + angleField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + arcFocusListener.focusLost(null); + angleField.requestFocusInWindow(); + } + }); + } + + /** + * Sets the fixed property. When fixed, it has the same position at all times. + * + * @param fixed true to fix + */ + public void setFixed(boolean fixed) { + if (fixedPosition == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + steps = new StepArray(getStep(n)); + trackerPanel.repaint(); + } + fixedPosition = fixed; + if (fixed) { // refresh data and post undo only when fixing + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + Undo.postTrackEdit(this, control); + } + } + + /** + * Gets the fixed property. + * + * @return true if fixed + */ + public boolean isFixed() { + return fixedPosition; + } + + /** + * Responds to property change events. Overrides TTrack method. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (trackerPanel.getSelectedTrack() == this) { + if (name.equals("stepnumber")) { //$NON-NLS-1$ + ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); + step.getProtractorAngle(); // refreshes angle field + step.arcHighlight = null; + } + else if (name.equals("selectedpoint")) { //$NON-NLS-1$ + TPoint p = trackerPanel.getSelectedPoint(); + if (!(p instanceof ProtractorStep.Rotator)) { + ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); + step.arcHighlight = null; + } + } + } + if (name.equals("adjusting") && e.getSource() instanceof TrackerPanel) { //$NON-NLS-1$ + refreshDataLater = (Boolean)e.getNewValue(); + if (!refreshDataLater) { // stopped adjusting + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + } + super.propertyChange(e); + } + + /** + * Overrides TTrack setTrailVisible method to keep trails hidden. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Implements createStep but only mimics step creation since + * steps are created automatically by the autofill StepArray. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the step + */ + public Step createStep(int n, double x, double y) { + Step step = steps.getStep(n); + ((ProtractorStep)step).end1.setLocation(x, y); + return step; + } + + /** + * Mimics step creation by setting end positions of an existing step. + * + * @param n the frame number + * @param x1 the x coordinate of end1 in image space + * @param y1 the y coordinate of end1 in image space + * @param x2 the x coordinate of end2 in image space + * @param y2 the y coordinate of end2 in image space + * @return the step + */ + public Step createStep(int n, double x1, double y1, double x2, double y2) { + ProtractorStep step = (ProtractorStep)steps.getStep(n); + step.end1.setLocation(x1, y1); + step.end2.setLocation(x2, y2); + keyFrames.add(n); + return step; + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + setFixed(false); + ProtractorStep step = (ProtractorStep)steps.getStep(n); + int i = getTargetIndex(); + if (i==0) { + step.vertex.setLocation(x, y); + } + else if (i==1) { + step.end1.setLocation(x, y); + } + else { + step.end2.setLocation(x, y); + } + keyFrames.add(n); + step.repaint(); + return getMarkedPoint(n, i); + } + + /** + * Overrides TTrack deleteStep method to prevent deletion. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + return null; + } + + /** + * Overrides TTrack getStep method to provide fixed behavior. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + ProtractorStep step = (ProtractorStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return ProtractorStep.getLength(); + } + + /** + * Determines if any point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Determines if the given point index is autotrackable. + * + * @param pointIndex the points[] index + * @return true if autotrackable + */ + protected boolean isAutoTrackable(int pointIndex) { + return pointIndex<3; + } + + /** + * Returns a description of a target point with a given index. + * + * @param pointIndex the index + * @return the description + */ + protected String getTargetDescription(int pointIndex) { + if (pointIndex==0) return TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ + String s = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ + return s+" "+(pointIndex); //$NON-NLS-1$ + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 3; + } + + /** + * Refreshes the data. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (refreshDataLater || trackerPanel == null || data == null) return; + dataFrames.clear(); + // get the datasets + int count = 0; + Dataset theta = data.getDataset(count++); + Dataset arm1Length = data.getDataset(count++); + Dataset arm2Length = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + // assign column names to the datasets + String time = "t"; //$NON-NLS-1$ + if (!theta.getColumnName(0).equals(time)) { // not yet initialized + theta.setXYColumnNames(time, Tracker.THETA); + arm1Length.setXYColumnNames(time, "L_{1}"); //$NON-NLS-1$ + arm2Length.setXYColumnNames(time, "L_{2}"); //$NON-NLS-1$ + stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ + frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ + } + else for (int i = 0; i < count; i++) { + data.getDataset(i).clear(); + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < dataDescriptions.length; i++) { + dataDescriptions[i] = TrackerRes.getString("Protractor.Data.Description."+i); //$NON-NLS-1$ + } + // look thru steps and get data for those included in clip + VideoPlayer player = trackerPanel.getPlayer(); + VideoClip clip = player.getVideoClip(); + int len = clip.getStepCount(); + double[][] validData = new double[data.getDatasets().size()+1][len]; + for (int n = 0; n < len; n++) { + int frame = clip.stepToFrame(n); + ProtractorStep next = (ProtractorStep)getStep(frame); + next.dataVisible = true; + // get the step number and time + double t = player.getStepTime(n)/1000.0; + validData[0][n] = t; + validData[1][n] = next.getProtractorAngle(); + validData[2][n] = next.getArmLength(next.end1); + validData[3][n] = next.getArmLength(next.end2); + validData[4][n] = n; + validData[5][n] = frame; + dataFrames.add(frame); + } + // append the data to the data set + theta.append(validData[0], validData[1]); + arm1Length.append(validData[0], validData[2]); + arm2Length.append(validData[0], validData[3]); + stepNum.append(validData[0], validData[4]); + frameNum.append(validData[0], validData[5]); + } + + /** + * Returns a menu with items that control this track. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + +// lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); + fixedItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.setSelected(isFixed()); + fixedItem.setEnabled(attachments==null || (attachments[0]==null && attachments[1]==null && attachments[2]==null)); + + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + menu.add(fixedItem); + + // add an attachment dialog item + attachmentItem = new JMenuItem(TrackerRes.getString("MeasuringTool.MenuItem.Attach")); //$NON-NLS-1$ + attachmentItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + AttachmentDialog control = Protractor.this.trackerPanel.getAttachmentDialog(Protractor.this); + control.setVisible(true); + } + }); + menu.addSeparator(); + menu.add(attachmentItem); + + menu.addSeparator(); + menu.add(deleteTrackItem); + return menu; + } + + /** + * Returns a list of point-related toolbar components. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + list.add(stepSeparator); + angleLabel.setText(TrackerRes.getString("Protractor.Label.Angle")); //$NON-NLS-1$ + angleField.setToolTipText(TrackerRes.getString("Protractor.Field.Angle.Tooltip")); //$NON-NLS-1$ + angleField.setEnabled(!isLocked()); + list.add(angleLabel); + list.add(angleField); + return list; + } + + /** + * Implements findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step or motion vector that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || !isVisible()) + return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + int n = trackerPanel.getFrameNumber(); + ProtractorStep step = (ProtractorStep)getStep(n); + if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { + Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Hint"); //$NON-NLS-1$ + return null; + } + if (ia==step.vertex) { + partName = TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Vertex.Hint"); //$NON-NLS-1$ + } + else if (ia instanceof ProtractorStep.Tip) { + partName = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.End.Hint"); //$NON-NLS-1$ + } + else if (ia==step.handle) { + partName = TrackerRes.getString("Protractor.Handle.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Handle.Hint"); //$NON-NLS-1$ + } + else if (ia==step.rotator) { + partName = TrackerRes.getString("Protractor.Rotator.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Rotator.Hint"); //$NON-NLS-1$ + } + else if (ia==this) { + partName = TrackerRes.getString("Protractor.Readout.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Protractor.Readout.Hint"); //$NON-NLS-1$ + trackerPanel.setMessage(getMessage()); + } + return ia; + } + return null; + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("Protractor.Name"); //$NON-NLS-1$ + } + +//__________________________ protected methods ________________________ + + /** + * Overrides TTrack setTrackerPanel method. + * + * @param panel the TrackerPanel + */ + protected void setTrackerPanel(TrackerPanel panel) { + if (trackerPanel != null) { + trackerPanel.removeMouseListener(editListener); + trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + super.setTrackerPanel(panel); + if (trackerPanel != null) { + trackerPanel.addMouseListener(editListener); + trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + setFixed(isFixed()); + } + + /** + * Overrides TTrack method. + * + * @param radians true for radians, false for degrees + */ + @Override + protected void setAnglesInRadians(boolean radians) { + super.setAnglesInRadians(radians); + inputField.setDecimalPlaces(radians? 3: 1); + inputField.setConversionFactor(radians? 1.0: 180/Math.PI); + ProtractorStep step = (ProtractorStep)getStep(trackerPanel.getFrameNumber()); + step.repaint(); // refreshes angle readout + } + + /** + * Refreshes a step by setting it equal to a keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(ProtractorStep step) { + // compare step with keyStep + ProtractorStep keyStep = getKeyStep(step); + boolean different = + keyStep.vertex.getX()!=step.vertex.getX() + || keyStep.vertex.getY()!=step.vertex.getY() + || keyStep.end1.getX()!=step.end1.getX() + || keyStep.end1.getY()!=step.end1.getY() + || keyStep.end2.getX()!=step.end2.getX() + || keyStep.end2.getY()!=step.end2.getY(); + // update step if needed + if (different) { + step.vertex.setLocation(keyStep.vertex); + step.end1.setLocation(keyStep.end1); + step.end2.setLocation(keyStep.end2); + step.erase(); + } + } + + /** + * Returns the key step for a given step. + * @param step the step + * @return the key step + */ + private ProtractorStep getKeyStep(ProtractorStep step) { + int key = 0; + if (!this.isFixed()) { + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + } + return (ProtractorStep)steps.getStep(key); + } + + + + /** + * Sets the editing flag. + * + * @param edit true to edit the angle + * @param target the step that handles the edit process + */ + private void setEditing(boolean edit, ProtractorStep target) { + editing = edit; + if (!editing) { + // if not fixed, add target frame to key frames + if (!isFixed()) + keyFrames.add(target.n); + // replace target with key frame step + target = getKeyStep(target); + } + final ProtractorStep step = target; + Runnable runner = new Runnable() { + public void run() { + if (editing) { + trackerPanel.setSelectedTrack(Protractor.this); + inputField.setForeground(footprint.getColor()); + Rectangle bounds = step.layoutBounds.get(trackerPanel); + bounds.grow(3, 3); + bounds.setLocation(bounds.x+1, bounds.y); + for (Component c: trackerPanel.getComponents()) { + if (c == trackerPanel.noData) { + bounds.setLocation(bounds.x, bounds.y-c.getHeight()); + } + } + inputField.setBounds(bounds); + glassPanel = trackerPanel.getGlassPanel(); + trackerPanel.remove(glassPanel); + trackerPanel.add(inputPanel, BorderLayout.CENTER); + Border space = BorderFactory.createEmptyBorder(0, 1, 1, 0); + Color color = getFootprint().getColor(); + Border line = BorderFactory.createLineBorder(color); + inputField.setBorder(BorderFactory.createCompoundBorder(line, space)); + inputField.setValue(step.getProtractorAngle()); + trackerPanel.revalidate(); + trackerPanel.repaint(); + inputField.requestFocus(); + } + else { // end editing + step.drawLayoutBounds = false; + step.setProtractorAngle(inputField.getValue()); + inputField.setSigFigs(4); + trackerPanel.add(glassPanel, BorderLayout.CENTER); + trackerPanel.remove(inputPanel); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + trackerPanel.revalidate(); + trackerPanel.repaint(); + } + } + }; + EventQueue.invokeLater(runner); + } + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + Protractor protractor = (Protractor)obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed property + control.setValue("fixed", protractor.isFixed()); //$NON-NLS-1$ + // save steps + Step[] steps = protractor.getSteps(); + int count = steps.length; + if (protractor.isFixed()) count = 1; + double[][] data = new double[count][]; + for (int n = 0; n < count; n++) { + // save only key frames + if (steps[n] == null || !protractor.keyFrames.contains(n)) continue; + ProtractorStep pStep = (ProtractorStep)steps[n]; + double[] stepData = new double[6]; + stepData[0] = pStep.end1.getX(); + stepData[1] = pStep.end1.getY(); + stepData[2] = pStep.end2.getX(); + stepData[3] = pStep.end2.getY(); + stepData[4] = pStep.vertex.getX(); + stepData[5] = pStep.vertex.getY(); + data[n] = stepData; + } + control.setValue("framedata", data); //$NON-NLS-1$ + } + + /** + * Creates a new object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new Protractor(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + Protractor protractor = (Protractor)obj; + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + boolean locked = protractor.isLocked(); + protractor.setLocked(false); + // load fixed property + protractor.fixedPosition = control.getBoolean("fixed"); //$NON-NLS-1$ + // load step data + protractor.keyFrames.clear(); + double[][] data = (double[][])control.getObject("framedata"); //$NON-NLS-1$ + for (int n = 0; n < data.length; n++) { + if (data[n] == null) continue; + Step step = protractor.createStep(n, data[n][0], data[n][1], data[n][2], data[n][3]); + ProtractorStep tapeStep = (ProtractorStep)step; + // set vertex position + tapeStep.vertex.setLocation(data[n][4], data[n][5]); + tapeStep.erase(); + } + protractor.setLocked(locked); + return obj; + } + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java index d7826d5b..26f4bb4d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java @@ -1,395 +1,395 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.geom.Arc2D; -import java.awt.geom.Area; -import java.awt.geom.Ellipse2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.util.Collection; -import java.util.HashSet; - -import javax.swing.Icon; - -/** - * A ProtractorFootprint returns a pair of lines that meet at a vertex - * at one end and have a specified end shape at the other. - * This requires a Point array of length 3. - * - * @author Douglas Brown - */ -public class ProtractorFootprint implements Footprint, Cloneable { - - // static constants - @SuppressWarnings("javadoc") - public static final float[] DOTTED_LINE = new float[] {2, 2}; - private static final ProtractorFootprint CIRCLE_3, CIRCLE_5, - CIRCLE_3_BOLD, CIRCLE_5_BOLD; - - // static fields - protected static int arcRadius = 24; - private static Collection footprints - = new HashSet(); - private static Shape hitShape = new Ellipse2D.Double(-6, -6, 12, 12); - private static Shape arrowhead; - private static Line2D line1 = new Line2D.Double(), line2 = new Line2D.Double(); - private static Point p = new Point(); - private static AffineTransform transform = new AffineTransform(); - private static Arc2D arc = new Arc2D.Double(-arcRadius, -arcRadius, - 2*arcRadius, 2*arcRadius, 0, 0, Arc2D.OPEN); - private static BasicStroke arcStroke = new BasicStroke(); - - - // instance fields - protected String name; - protected BasicStroke stroke; - protected Color color = Color.black; - protected Shape[] hitShapes = new Shape[6]; - protected Shape circle; - protected int radius; - private Stroke arcAdjustStroke; - - /** - * Constructs a ProtractorFootprint. - * - * @param name the name - * @param r the radius - */ - public ProtractorFootprint(String name, int r) { - this.name = name; - radius = r; - circle = new Ellipse2D.Double(-r, -r, 2*r, 2*r); - setStroke(new BasicStroke()); - } - - /** - * Gets the name of this footprint. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets the display name of the footprint. - * - * @return the localized display name - */ - public String getDisplayName() { - return TrackerRes.getString(name); - } - - /** - * Gets the minimum point array length required by this footprint. - * - * @return the length - */ - public int getLength() { - return 3; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - Shape shape = stroke.createStrokedShape(circle); - Area area = new Area(shape); - double x0 = radius-w+2; - double y0 = h-radius-2; - double d = Math.sqrt(x0*x0+y0*y0); - double x1 = x0*radius/d; - double y1 = y0*radius/d; - Line2D line = new Line2D.Double(x0, y0, x1, y1); - area.add(new Area(stroke.createStrokedShape(line))); - line.setLine(x0, y0, radius-2, y0); - area.add(new Area(stroke.createStrokedShape(line))); - ShapeIcon icon = new ShapeIcon(area, w, h); - icon.setColor(color); - return icon; - } - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points) { - final Shape shape = getShape(points); - final Color color = this.color; - return new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Color gcolor = g.getColor(); - g.setColor(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(shape); - g.setColor(gcolor); - } - - public Rectangle getBounds(boolean highlighted) { - return shape.getBounds(); - } - }; - } - - /** - * Gets the hit shapes {vertex, end1, end2, line1, line2, rotator}. - * - * @return the hit shapes - */ - public Shape[] getHitShapes() { - return hitShapes; - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - this.stroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - arcAdjustStroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - DOTTED_LINE, - stroke.getDashPhase()); - } - - /** - * Gets the stroke. - * - * @return the stroke - */ - public BasicStroke getStroke() { - return stroke; - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = color; - } - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor() { - return color; - } - - /** - * Gets a circle shape. - * - * @param p the desired screen point of the circle - * @return the circle shape - */ - public Shape getCircleShape(Point p) { - transform.setToTranslation(p.x, p.y); - Shape shape = stroke.createStrokedShape(circle); - shape = transform.createTransformedShape(shape); - return shape; - } - - /** - * Gets an arcAdjust shape. - * - * @param vertex the screen point of the vertex - * @param rotator the screen point of the rotator - * - * @return the arc-adjusting shape - */ - public Shape getArcAdjustShape(Point vertex, Point rotator) { - double theta = Math.toRadians(arc.getAngleStart()+arc.getAngleExtent()/2); - p.x = (int)Math.round(vertex.x + arcRadius*Math.cos(theta)); - p.y = (int)Math.round(vertex.y - arcRadius*Math.sin(theta)); - Shape circle = getCircleShape(p); - Area area = new Area(circle); - if (rotator!=null) { - int r = circle.getBounds().width/2; - double d = p.distance(rotator); - line1.setLine(p.getX(), p.getY(), rotator.getX(), rotator.getY()); - if (d>1) adjustLineLength(line1, (d-r)/d, (d-6)/d); - area.add(new Area(arcAdjustStroke.createStrokedShape(line1))); - } - return area; - } - - /** - * Gets the shape of this footprint for a Point array {vertex, end1, end2}. - * Also sets up hit shapes {vertex, end1, end2, line1, line2, rotator} - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - Point vertex = points[0]; - Point end1 = points[1]; - Point end2 = points[2]; - int r = circle.getBounds().width/2; - - // line1 and line2 shapes - line1.setLine(vertex, end1); - double d1 = vertex.distance(end1); - if (d1>1) adjustLineLength(line1, 1, (d1-r)/d1); - line2.setLine(vertex, end2); - double d2 = vertex.distance(end2); - if (d2>1) adjustLineLength(line2, 1, (d2-r)/d2); - - // end1 & end2 shapes - transform.setToTranslation(end1.x, end1.y); - Shape end1Shape = transform.createTransformedShape(circle); - end1Shape = stroke.createStrokedShape(end1Shape); - transform.setToTranslation(end2.x, end2.y); - Shape end2Shape = transform.createTransformedShape(circle); - end2Shape = stroke.createStrokedShape(end2Shape); - - // arc shape - double theta1 = -Math.atan2(end1.y - vertex.y, end1.x - vertex.x); - double theta2 = -Math.atan2(end2.y - vertex.y, end2.x - vertex.x); - arc.setAngleStart(Math.toDegrees(theta1)); - double degrees = Math.toDegrees(theta2-theta1); - if (degrees > 180) degrees -= 360; - if (degrees < -180) degrees += 360; - arc.setAngleExtent(degrees); - transform.setToTranslation(vertex.x, vertex.y); - Shape arcShape = transform.createTransformedShape(arc); - - // arrowhead where arc hits line2 - Shape dotShape = null; - if (Math.abs(degrees)>10) { - double xDot = vertex.getX() + arcRadius*(end2.getX()-vertex.getX())/d2; - double yDot = vertex.getY() + arcRadius*(end2.getY()-vertex.getY())/d2; - double angle = -theta2-Math.PI/2; - if (degrees<0) - angle += Math.PI; - transform.setToRotation(angle, xDot, yDot); - transform.translate(xDot, yDot); - dotShape = transform.createTransformedShape(arrowhead); - } - - Area drawMe = new Area(stroke.createStrokedShape(line1)); - drawMe.add(new Area(stroke.createStrokedShape(line2))); - drawMe.add(new Area(end1Shape)); - drawMe.add(new Area(end2Shape)); - drawMe.add(new Area(arcStroke.createStrokedShape(arcShape))); - if (dotShape!=null) drawMe.add(new Area(dotShape)); - - // hit shapes - transform.setToTranslation(vertex.x, vertex.y); - hitShapes[0] = transform.createTransformedShape(hitShape); // vertex - transform.setToTranslation(end1.x, end1.y); - hitShapes[1] = transform.createTransformedShape(hitShape); // end1 - transform.setToTranslation(end2.x, end2.y); - hitShapes[2] = transform.createTransformedShape(hitShape); // end2 - if (d1>1) adjustLineLength(line1, (d1-arcRadius-8)/d1, (d1-8)/d1); - if (d2>1) adjustLineLength(line2, (d2-arcRadius-8)/d2, (d2-8)/d2); - hitShapes[3] = stroke.createStrokedShape(line1); - hitShapes[4] = stroke.createStrokedShape(line2); - hitShapes[5] = stroke.createStrokedShape(arcShape); - - return drawMe; - } - - /** - * Adjusts the length of a Line. Each end is adjusted independently - * by a specified factor. - * - * @param line the Line - * @param end1Factor the factor by which to change end1 - * @param end2Factor the factor by which to change end2 - */ - private static void adjustLineLength(Line2D line, double end1Factor, double end2Factor) { - double x1 = line.getX2() + (line.getX1()-line.getX2())*end1Factor; - double y1 = line.getY2() + (line.getY1()-line.getY2())*end1Factor; - double x2 = line.getX1() + (line.getX2()-line.getX1())*end2Factor; - double y2 = line.getY1() + (line.getY2()-line.getY1())*end2Factor; - line.setLine(x1, y1, x2, y2); - } - - /** - * Gets a predefined Footprint. - * - * @param name the name of the footprint - * @return the footprint - */ - public static Footprint getFootprint(String name) { - for (ProtractorFootprint footprint: footprints) { - if (name == footprint.getName()) try { - return (ProtractorFootprint)footprint.clone(); - } catch(CloneNotSupportedException ex) {ex.printStackTrace();} - } - return null; - } - - // static initializers - static { - BasicStroke stroke = new BasicStroke(1); - - GeneralPath path = new GeneralPath(); - path.moveTo(-6, 2); - path.lineTo(0, 0); - path.lineTo(-6, -3); - arrowhead = stroke.createStrokedShape(path); - - // create standard footprints - CIRCLE_3 = new ProtractorFootprint("ProtractorFootprint.Circle3", 3); //$NON-NLS-1$ - CIRCLE_3.setStroke(stroke); - footprints.add(CIRCLE_3); - - CIRCLE_5 = new ProtractorFootprint("ProtractorFootprint.Circle5", 5); //$NON-NLS-1$ - CIRCLE_5.setStroke(stroke); - footprints.add(CIRCLE_5); - - stroke = new BasicStroke(2); - CIRCLE_3_BOLD = new ProtractorFootprint("ProtractorFootprint.Circle3Bold", 3); //$NON-NLS-1$ - CIRCLE_3_BOLD.setStroke(stroke); - footprints.add(CIRCLE_3_BOLD); - - CIRCLE_5_BOLD = new ProtractorFootprint("ProtractorFootprint.Circle5Bold", 5); //$NON-NLS-1$ - CIRCLE_5_BOLD.setStroke(stroke); - footprints.add(CIRCLE_5_BOLD); - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.geom.Arc2D; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; +import java.util.Collection; +import java.util.HashSet; + +import javax.swing.Icon; + +/** + * A ProtractorFootprint returns a pair of lines that meet at a vertex + * at one end and have a specified end shape at the other. + * This requires a Point array of length 3. + * + * @author Douglas Brown + */ +public class ProtractorFootprint implements Footprint, Cloneable { + + // static constants + @SuppressWarnings("javadoc") + public static final float[] DOTTED_LINE = new float[] {2, 2}; + private static final ProtractorFootprint CIRCLE_3, CIRCLE_5, + CIRCLE_3_BOLD, CIRCLE_5_BOLD; + + // static fields + protected static int arcRadius = 24; + private static Collection footprints + = new HashSet(); + private static Shape hitShape = new Ellipse2D.Double(-6, -6, 12, 12); + private static Shape arrowhead; + private static Line2D line1 = new Line2D.Double(), line2 = new Line2D.Double(); + private static Point p = new Point(); + private static AffineTransform transform = new AffineTransform(); + private static Arc2D arc = new Arc2D.Double(-arcRadius, -arcRadius, + 2*arcRadius, 2*arcRadius, 0, 0, Arc2D.OPEN); + private static BasicStroke arcStroke = new BasicStroke(); + + + // instance fields + protected String name; + protected BasicStroke stroke; + protected Color color = Color.black; + protected Shape[] hitShapes = new Shape[6]; + protected Shape circle; + protected int radius; + private Stroke arcAdjustStroke; + + /** + * Constructs a ProtractorFootprint. + * + * @param name the name + * @param r the radius + */ + public ProtractorFootprint(String name, int r) { + this.name = name; + radius = r; + circle = new Ellipse2D.Double(-r, -r, 2*r, 2*r); + setStroke(new BasicStroke()); + } + + /** + * Gets the name of this footprint. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the display name of the footprint. + * + * @return the localized display name + */ + public String getDisplayName() { + return TrackerRes.getString(name); + } + + /** + * Gets the minimum point array length required by this footprint. + * + * @return the length + */ + public int getLength() { + return 3; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + Shape shape = stroke.createStrokedShape(circle); + Area area = new Area(shape); + double x0 = radius-w+2; + double y0 = h-radius-2; + double d = Math.sqrt(x0*x0+y0*y0); + double x1 = x0*radius/d; + double y1 = y0*radius/d; + Line2D line = new Line2D.Double(x0, y0, x1, y1); + area.add(new Area(stroke.createStrokedShape(line))); + line.setLine(x0, y0, radius-2, y0); + area.add(new Area(stroke.createStrokedShape(line))); + ShapeIcon icon = new ShapeIcon(area, w, h); + icon.setColor(color); + return icon; + } + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points) { + final Shape shape = getShape(points); + final Color color = this.color; + return new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Color gcolor = g.getColor(); + g.setColor(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(shape); + g.setColor(gcolor); + } + + public Rectangle getBounds(boolean highlighted) { + return shape.getBounds(); + } + }; + } + + /** + * Gets the hit shapes {vertex, end1, end2, line1, line2, rotator}. + * + * @return the hit shapes + */ + public Shape[] getHitShapes() { + return hitShapes; + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + this.stroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + arcAdjustStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + DOTTED_LINE, + stroke.getDashPhase()); + } + + /** + * Gets the stroke. + * + * @return the stroke + */ + public BasicStroke getStroke() { + return stroke; + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = color; + } + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor() { + return color; + } + + /** + * Gets a circle shape. + * + * @param p the desired screen point of the circle + * @return the circle shape + */ + public Shape getCircleShape(Point p) { + transform.setToTranslation(p.x, p.y); + Shape shape = stroke.createStrokedShape(circle); + shape = transform.createTransformedShape(shape); + return shape; + } + + /** + * Gets an arcAdjust shape. + * + * @param vertex the screen point of the vertex + * @param rotator the screen point of the rotator + * + * @return the arc-adjusting shape + */ + public Shape getArcAdjustShape(Point vertex, Point rotator) { + double theta = Math.toRadians(arc.getAngleStart()+arc.getAngleExtent()/2); + p.x = (int)Math.round(vertex.x + arcRadius*Math.cos(theta)); + p.y = (int)Math.round(vertex.y - arcRadius*Math.sin(theta)); + Shape circle = getCircleShape(p); + Area area = new Area(circle); + if (rotator!=null) { + int r = circle.getBounds().width/2; + double d = p.distance(rotator); + line1.setLine(p.getX(), p.getY(), rotator.getX(), rotator.getY()); + if (d>1) adjustLineLength(line1, (d-r)/d, (d-6)/d); + area.add(new Area(arcAdjustStroke.createStrokedShape(line1))); + } + return area; + } + + /** + * Gets the shape of this footprint for a Point array {vertex, end1, end2}. + * Also sets up hit shapes {vertex, end1, end2, line1, line2, rotator} + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + Point vertex = points[0]; + Point end1 = points[1]; + Point end2 = points[2]; + int r = circle.getBounds().width/2; + + // line1 and line2 shapes + line1.setLine(vertex, end1); + double d1 = vertex.distance(end1); + if (d1>1) adjustLineLength(line1, 1, (d1-r)/d1); + line2.setLine(vertex, end2); + double d2 = vertex.distance(end2); + if (d2>1) adjustLineLength(line2, 1, (d2-r)/d2); + + // end1 & end2 shapes + transform.setToTranslation(end1.x, end1.y); + Shape end1Shape = transform.createTransformedShape(circle); + end1Shape = stroke.createStrokedShape(end1Shape); + transform.setToTranslation(end2.x, end2.y); + Shape end2Shape = transform.createTransformedShape(circle); + end2Shape = stroke.createStrokedShape(end2Shape); + + // arc shape + double theta1 = -Math.atan2(end1.y - vertex.y, end1.x - vertex.x); + double theta2 = -Math.atan2(end2.y - vertex.y, end2.x - vertex.x); + arc.setAngleStart(Math.toDegrees(theta1)); + double degrees = Math.toDegrees(theta2-theta1); + if (degrees > 180) degrees -= 360; + if (degrees < -180) degrees += 360; + arc.setAngleExtent(degrees); + transform.setToTranslation(vertex.x, vertex.y); + Shape arcShape = transform.createTransformedShape(arc); + + // arrowhead where arc hits line2 + Shape dotShape = null; + if (Math.abs(degrees)>10) { + double xDot = vertex.getX() + arcRadius*(end2.getX()-vertex.getX())/d2; + double yDot = vertex.getY() + arcRadius*(end2.getY()-vertex.getY())/d2; + double angle = -theta2-Math.PI/2; + if (degrees<0) + angle += Math.PI; + transform.setToRotation(angle, xDot, yDot); + transform.translate(xDot, yDot); + dotShape = transform.createTransformedShape(arrowhead); + } + + Area drawMe = new Area(stroke.createStrokedShape(line1)); + drawMe.add(new Area(stroke.createStrokedShape(line2))); + drawMe.add(new Area(end1Shape)); + drawMe.add(new Area(end2Shape)); + drawMe.add(new Area(arcStroke.createStrokedShape(arcShape))); + if (dotShape!=null) drawMe.add(new Area(dotShape)); + + // hit shapes + transform.setToTranslation(vertex.x, vertex.y); + hitShapes[0] = transform.createTransformedShape(hitShape); // vertex + transform.setToTranslation(end1.x, end1.y); + hitShapes[1] = transform.createTransformedShape(hitShape); // end1 + transform.setToTranslation(end2.x, end2.y); + hitShapes[2] = transform.createTransformedShape(hitShape); // end2 + if (d1>1) adjustLineLength(line1, (d1-arcRadius-8)/d1, (d1-8)/d1); + if (d2>1) adjustLineLength(line2, (d2-arcRadius-8)/d2, (d2-8)/d2); + hitShapes[3] = stroke.createStrokedShape(line1); + hitShapes[4] = stroke.createStrokedShape(line2); + hitShapes[5] = stroke.createStrokedShape(arcShape); + + return drawMe; + } + + /** + * Adjusts the length of a Line. Each end is adjusted independently + * by a specified factor. + * + * @param line the Line + * @param end1Factor the factor by which to change end1 + * @param end2Factor the factor by which to change end2 + */ + private static void adjustLineLength(Line2D line, double end1Factor, double end2Factor) { + double x1 = line.getX2() + (line.getX1()-line.getX2())*end1Factor; + double y1 = line.getY2() + (line.getY1()-line.getY2())*end1Factor; + double x2 = line.getX1() + (line.getX2()-line.getX1())*end2Factor; + double y2 = line.getY1() + (line.getY2()-line.getY1())*end2Factor; + line.setLine(x1, y1, x2, y2); + } + + /** + * Gets a predefined Footprint. + * + * @param name the name of the footprint + * @return the footprint + */ + public static Footprint getFootprint(String name) { + for (ProtractorFootprint footprint: footprints) { + if (name == footprint.getName()) try { + return (ProtractorFootprint)footprint.clone(); + } catch(CloneNotSupportedException ex) {ex.printStackTrace();} + } + return null; + } + + // static initializers + static { + BasicStroke stroke = new BasicStroke(1); + + GeneralPath path = new GeneralPath(); + path.moveTo(-6, 2); + path.lineTo(0, 0); + path.lineTo(-6, -3); + arrowhead = stroke.createStrokedShape(path); + + // create standard footprints + CIRCLE_3 = new ProtractorFootprint("ProtractorFootprint.Circle3", 3); //$NON-NLS-1$ + CIRCLE_3.setStroke(stroke); + footprints.add(CIRCLE_3); + + CIRCLE_5 = new ProtractorFootprint("ProtractorFootprint.Circle5", 5); //$NON-NLS-1$ + CIRCLE_5.setStroke(stroke); + footprints.add(CIRCLE_5); + + stroke = new BasicStroke(2); + CIRCLE_3_BOLD = new ProtractorFootprint("ProtractorFootprint.Circle3Bold", 3); //$NON-NLS-1$ + CIRCLE_3_BOLD.setStroke(stroke); + footprints.add(CIRCLE_3_BOLD); + + CIRCLE_5_BOLD = new ProtractorFootprint("ProtractorFootprint.Circle5Bold", 5); //$NON-NLS-1$ + CIRCLE_5_BOLD.setStroke(stroke); + footprints.add(CIRCLE_5_BOLD); + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java b/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java index b02db3ad..f43d5cd9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java +++ b/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java @@ -1,946 +1,946 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.Point2D; - -import javax.swing.*; -import javax.swing.border.Border; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.controls.*; - -/** - * A RGBRegion measures RGB properties in a circular region - * of a video image. - * - * @author Douglas Brown - */ -public class RGBRegion extends TTrack { - - // static constants - protected static final int MAX_RADIUS = 100; - - // static fields - protected static int defaultRadius = 10; - - // instance fields - protected boolean fixedPosition = true; // region has same position at all times - protected boolean fixedRadius = true; // region has same radius at all times - protected JCheckBoxMenuItem fixedPositionItem, fixedRadiusItem; - protected JLabel radiusLabel; - protected IntegerField radiusField; - protected boolean firstTimeRadiusUnfixed = true; - protected ArrayList validSteps = new ArrayList(); - protected boolean dataHidden = false; - protected boolean loading; - protected TreeSet radiusKeyFrames = new TreeSet(); - - /** - * Constructs a RGBRegion. - */ - public RGBRegion() { - super(); - defaultColors = new Color[] {Color.magenta}; - // assign a default name - setName(TrackerRes.getString("RGBRegion.New.Name")); //$NON-NLS-1$ - // assign default plot variables - setProperty("yVarPlot0", "luma"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yMinPlot0", new Double(0)); //$NON-NLS-1$ - setProperty("yMaxPlot0", new Double(255)); //$NON-NLS-1$ - // assign default table variables: x, y and luma - setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar2", "5"); //$NON-NLS-1$ //$NON-NLS-2$ - // set up footprint choices and color - setFootprints(new Footprint[] - {PointShapeFootprint.getFootprint("Footprint.Circle"), //$NON-NLS-1$ - PointShapeFootprint.getFootprint("Footprint.BoldCircle")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("RGBRegion.Unmarked.Hint"); //$NON-NLS-1$ - // create toolbar components - radiusLabel = new JLabel(); - radiusField = new IntegerField(2); - radiusField.setMinValue(1); - // radius focus listener - final FocusListener radiusFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (radiusField.getBackground() == Color.yellow) { - setRadius(trackerPanel.getFrameNumber(), radiusField.getIntValue()); - } - } - }; - radiusField.addFocusListener(radiusFocusListener); - radiusField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - radiusFocusListener.focusLost(null); - radiusField.selectAll(); - radiusField.requestFocusInWindow(); - } - }); - fixedPositionItem = new JCheckBoxMenuItem(TrackerRes.getString("RGBRegion.MenuItem.Fixed")); //$NON-NLS-1$ - fixedPositionItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixedPosition(fixedPositionItem.isSelected()); - } - }); - fixedRadiusItem = new JCheckBoxMenuItem(TrackerRes.getString("RGBRegion.MenuItem.FixedRadius")); //$NON-NLS-1$ - fixedRadiusItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixedRadius(fixedRadiusItem.isSelected()); - } - }); - radiusField.setBorder(fieldBorder); - // position action - Action positionAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - NumberField field = (NumberField)e.getSource(); - if (field.getBackground() == Color.yellow) setPositionFromFields(); - field.selectAll(); - field.requestFocusInWindow(); - } - }; - // position focus listener - FocusListener positionFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - NumberField field = (NumberField)e.getSource(); - if (field.getBackground() == Color.yellow) setPositionFromFields(); - } - }; - // add action and focus listeners - xField.addActionListener(positionAction); - yField.addActionListener(positionAction); - xField.addFocusListener(positionFocusListener); - yField.addFocusListener(positionFocusListener); - } - - /** - * Sets the fixed position property. When it is fixed, it is in the same - * position at all times. - * - * @param fixed true to fix the position - */ - public void setFixedPosition(boolean fixed) { - if (fixedPosition == fixed) return; - if (steps.isEmpty()) { - fixedPosition = fixed; - return; - } - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - RGBStep keyStep = (RGBStep)getStep(n); - for (Step next: steps.array) { - if (next==null) continue; - RGBStep step = (RGBStep)next; - step.getPosition().setLocation(keyStep.getPosition()); - } - } - fixedPosition = fixed; - if (fixed) { - keyFrames.clear(); - keyFrames.add(0); - clearData(); - refreshData(data, trackerPanel); - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - if (!loading) { - Undo.postTrackEdit(this, control); - } - repaint(); - } - - /** - * Gets the fixed position property. - * - * @return true if image position is fixed - */ - public boolean isFixedPosition() { - return fixedPosition; - } - - /** - * Sets the fixed radius property. When fixed, it has the same - * radius at all times. - * - * @param fixed true to fix the radius - */ - public void setFixedRadius(boolean fixed) { - if (fixedRadius == fixed) return; - if (steps.isEmpty()) { - fixedRadius = fixed; - return; - } - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - RGBStep keyStep = (RGBStep)getStep(n); - for (Step next: steps.array) { - if (next==null) continue; - RGBStep step = (RGBStep)next; - step.setRadius(keyStep.radius); - } - } - fixedRadius = fixed; - if (fixed) { - radiusKeyFrames.clear(); - radiusKeyFrames.add(0); - clearData(); - refreshData(data, trackerPanel); - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - if (!loading) { - Undo.postTrackEdit(this, control); - } - repaint(); - } - - /** - * Gets the fixed radius property. - * - * @return true if radius is fixed - */ - public boolean isFixedRadius() { - return fixedRadius; - } - - /** - * Sets the radius of a step and posts an undoable edit - * - * @param n the frame number - * @param r the desired radius - */ - protected void setRadius(int n, int r) { - if (isLocked() || r == Integer.MIN_VALUE || trackerPanel == null) return; - r = Math.max(r, 0); - r = Math.min(r, MAX_RADIUS); - radiusField.setIntValue(r); - - RGBStep step = (RGBStep)getStep(n); // target step - RGBStep keyStep = step; // key step is target if radius not fixed - if (step!=null && step.radius != r) { - // deselect selected point to trigger possible undo, then reselect it - TPoint selection = trackerPanel.getSelectedPoint(); - trackerPanel.setSelectedPoint(null); - XMLControl state = new XMLControlElement(step); - - if (isFixedRadius()) { - keyStep = (RGBStep)steps.getStep(0); // key step is step 0 - clearData(); // all data is invalid - keyStep.setRadius(r); - refreshStep(step); - } - else { - radiusKeyFrames.add(n); // step is both target and key - step.setRadius(r); - step.dataValid = false; // only target step's data is invalid - } - Undo.postStepEdit(step, state); - trackerPanel.setSelectedPoint(selection); - refreshData(data, trackerPanel); - step.repaint(); - firePropertyChange("data", null, RGBRegion.this); // to views //$NON-NLS-1$ - } - } - - /** - * Gets the radius. - * - * @return the radius - */ - public int getRadius() { - if (isFixedRadius()) { - RGBStep step = (RGBStep)getStep(0); - if (step != null) return step.radius; - } - else if (trackerPanel != null && !fixedRadius) { - int n = trackerPanel.getFrameNumber(); - RGBStep step = (RGBStep)getStep(n); - if (step != null) return step.radius; - } - return defaultRadius; - } - - /** - * Overrides TTrack draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - if (isMarking && !(trackerPanel.getSelectedPoint() instanceof RGBStep.Position)) - return; - super.draw(panel, _g); - } - - /** - * Overrides TTrack findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step or motion vector that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - Interactive ia = super.findInteractive(panel, xpix, ypix); - if (ia != null) { - partName = TrackerRes.getString("RGBRegion.Position.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("RGBRegion.Position.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (getStep(trackerPanel.getFrameNumber())==null) { - hint = TrackerRes.getString("RGBRegion.Unmarked.Hint"); //$NON-NLS-1$ - } - else hint = TrackerRes.getString("RGBRegion.Hint"); //$NON-NLS-1$ - if (trackerPanel.getVideo() == null) { - hint += ", "+TrackerRes.getString("TTrack.ImportVideo.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - return ia; - } - - /** - * Overrides TTrack setTrailVisible method to keep trails hidden. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Gets the autoAdvance property. Overrides TTrack method. - * - * @return false - */ - public boolean isAutoAdvance() { - return !isFixedPosition(); - } - - /** - * Creates a new step. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - public Step createStep(int n, double x, double y) { - if (isLocked()) return null; - int frame = isFixedPosition()? 0: n; - RGBStep step = (RGBStep)steps.getStep(frame); - if (step==null) { // create new step 0 and autofill array - int r = (int)radiusField.getValue(); - step = new RGBStep(this, 0, x, y, r); - step.setFootprint(getFootprint()); - steps = new StepArray(step); - keyFrames.add(0); - radiusKeyFrames.add(0); - } - else { - XMLControl currentState = new XMLControlElement(this); - step.getPosition().setLocation(x, y); - keyFrames.add(n); - Undo.postTrackEdit(this, currentState); - } - support.firePropertyChange("step", null, n); //$NON-NLS-1$ - return getStep(n); - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - return null; - } - - /** - * Overrides TTrack getStep method to provide fixed behavior. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - RGBStep step = (RGBStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return RGBStep.getLength(); - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - this.setFixedPosition(false); - return super.autoMarkAt(n, x, y); - } - - /** - * Determines if any point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 1; - } - - /** - * Clears the data. - */ - protected void clearData() { - if (data == null) return; - // clear each dataset - for (int i = 0; i < 7; i++) { - Dataset next = data.getDataset(i); - next.clear(); - } - Step[] steps = getSteps(); - for (int i = 0; i < steps.length; i++) { - if (steps[i] == null) continue; - steps[i].dataVisible = false; - ((RGBStep)steps[i]).dataValid = false; - } - } - - /** - * Hides the data. - */ - protected void hideData() { - Step[] steps = getSteps(); - for (int i = 0; i < steps.length; i++) { - if (steps[i] == null) continue; - steps[i].dataVisible = false; - } - dataHidden = true; - } - - /** - * Refreshes the data. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - if (trackerPanel == null || data == null) return; - dataFrames.clear(); - // get valid step at current frameNumber - int frame = trackerPanel.getFrameNumber(); - Step step = getStep(frame); - if (step != null) { - ((RGBStep)step).getRGBData(trackerPanel); - } - // get the datasets - int count = 0; - Dataset x = data.getDataset(count++); - Dataset y = data.getDataset(count++); - Dataset r = data.getDataset(count++); - Dataset g = data.getDataset(count++); - Dataset b = data.getDataset(count++); - Dataset luma = data.getDataset(count++); - Dataset pixels = data.getDataset(count++); - Dataset stepNum = data.getDataset(count++); - Dataset frameNum = data.getDataset(count++); - // assign column names to the datasets - String time = "t"; //$NON-NLS-1$ - if (!x.getColumnName(0).equals(time)) { // not yet initialized - x.setXYColumnNames(time, "x"); //$NON-NLS-1$ - y.setXYColumnNames(time, "y"); //$NON-NLS-1$ - r.setXYColumnNames(time, "R"); //$NON-NLS-1$ - g.setXYColumnNames(time, "G"); //$NON-NLS-1$ - b.setXYColumnNames(time, "B"); //$NON-NLS-1$ - luma.setXYColumnNames(time, "luma"); //$NON-NLS-1$ - pixels.setXYColumnNames(time, "pixels"); //$NON-NLS-1$ - stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ - frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ - } - else for (int i = 0; i < count; i++) { - data.getDataset(i).clear(); - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < dataDescriptions.length; i++) { - dataDescriptions[i] = TrackerRes.getString("RGBRegion.Data.Description."+i); //$NON-NLS-1$ - } - // look thru steps and find valid ones (data valid and included in clip) - Step[] stepArray = getSteps(); - validSteps.clear(); - VideoPlayer player = trackerPanel.getPlayer(); - VideoClip clip = player.getVideoClip(); - for (int n = 0; n < stepArray.length; n++) { - RGBStep next = (RGBStep)stepArray[n]; - if (next == null || !next.dataValid - || next.getRGBData(trackerPanel) == null) - continue; - // get the frame number of the step - TPoint p = next.getPosition(); - int stepFrame = p.getFrameNumber(trackerPanel); - // step is valid if frame is included in the clip - if (clip.includesFrame(stepFrame)) { - validSteps.add(next); - } - else next.dataVisible = false; - } - RGBStep[] valid = validSteps.toArray(new RGBStep[0]); - int len = valid.length; - // get the valid data - double[][] validData = new double[10][len]; - for (int n = 0; n < len; n++) { - // get the rgb data for the step - double[] rgb = valid[n].getRGBData(trackerPanel); - // get the frame number of the step - TPoint p = valid[n].getPosition(); - int stepFrame = p.getFrameNumber(trackerPanel); - dataFrames.add(new Integer(stepFrame)); - // get the step number and time - int stepNumber = clip.frameToStep(stepFrame); - double t = player.getStepTime(stepNumber)/1000.0; - // get the world position for the step - Point2D pt = p.getWorldPosition(trackerPanel); - // put data in validData array - for (int j = 2; j < 7; j++) { - validData[j][n] = rgb[j-2]; - } - validData[0][n] = pt.getX(); - validData[1][n] = pt.getY(); - validData[7][n] = stepNumber; - validData[8][n] = stepFrame; - validData[9][n] = t; - } - // append the data to the data set - x.append(validData[9], validData[0]); - y.append(validData[9], validData[1]); - r.append(validData[9], validData[2]); - g.append(validData[9], validData[3]); - b.append(validData[9], validData[4]); - luma.append(validData[9], validData[5]); - pixels.append(validData[9], validData[6]); - stepNum.append(validData[9], validData[7]); - frameNum.append(validData[9], validData[8]); - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - fixedPositionItem.setText(TrackerRes.getString("RGBRegion.MenuItem.Fixed")); //$NON-NLS-1$ - fixedPositionItem.setSelected(isFixedPosition()); - fixedRadiusItem.setText(TrackerRes.getString("RGBRegion.MenuItem.FixedRadius")); //$NON-NLS-1$ - fixedRadiusItem.setSelected(isFixedRadius()); - menu.remove(deleteTrackItem); - if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) - menu.addSeparator(); - menu.add(fixedPositionItem); - menu.add(fixedRadiusItem); - // replace delete item - if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ - if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) - menu.addSeparator(); - menu.add(deleteTrackItem); - } - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - radiusLabel.setText(TrackerRes.getString("RGBRegion.Label.Radius")); //$NON-NLS-1$ - Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); - radiusLabel.setBorder(empty); - list.add(radiusLabel); - radiusField.setIntValue(getRadius()); - radiusField.setEnabled(!isLocked()); - list.add(radiusField); - return list; - } - - /** - * Overrides TTrack getToolbarPointComponents method. - * - * @param trackerPanel the tracker panel - * @param point the TPoint - * @return a list of components - */ - public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, - TPoint point) { - Step step = getStep(point, trackerPanel); - ArrayList list = super.getToolbarPointComponents(trackerPanel, point); - if (step == null) return list; - int n = step.getFrameNumber(); - n = trackerPanel.getPlayer().getVideoClip().frameToStep(n); - stepValueLabel.setText("" + n); //$NON-NLS-1$ - xField.setEnabled(!isLocked()); - yField.setEnabled(!isLocked()); - list.add(stepSeparator); - list.add(stepLabel); - list.add(stepValueLabel); - list.add(tValueLabel); - list.add(tSeparator); - list.add(xLabel); - list.add(xField); - list.add(xSeparator); - list.add(yLabel); - list.add(yField); - list.add(ySeparator); - return list; - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - Object[] objectsToSize = new Object[] - {radiusLabel}; - FontSizer.setFonts(objectsToSize, level); - } - - /** - * Responds to property change events. This listens for the following - * events: "stepnumber" & "image" from TrackerPanel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (trackerPanel != null) { - String name = e.getPropertyName(); - if (name.equals("stepnumber")) { //$NON-NLS-1$ - dataValid = false; - int n = trackerPanel.getFrameNumber(); - RGBStep step = (RGBStep)getStep(n); - if (step != null) radiusField.setIntValue(step.radius); - radiusField.setEnabled(!isLocked() && step != null); - support.firePropertyChange(e); // to views - } - else if (name.equals("image")) { //$NON-NLS-1$ - dataValid = false; - Video vid = trackerPanel.getVideo(); - if (vid == null) clearData(); // no video - else if (!vid.isVisible()) // video invisible - hideData(); - else if (!dataHidden && vid.isVisible()) // video filters - clearData(); - else dataHidden = false; - support.firePropertyChange(e); // to views - } - } - super.propertyChange(e); // handled by TTrack - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("RGBRegion.Name"); //$NON-NLS-1$ - } - -//__________________________ private methods ___________________________ - - /** - * Sets the position of the currently selected point based on the values - * in the x and y fields. - */ - private void setPositionFromFields() { - double xValue = xField.getValue(); - double yValue = yField.getValue(); - TPoint p = trackerPanel.getSelectedPoint(); - int n = trackerPanel.getFrameNumber(); - Step step = getStep(n); - if (step != null && p != null) { - ImageCoordSystem coords = trackerPanel.getCoords(); - double x = coords.worldToImageX(n, xValue, yValue); - double y = coords.worldToImageY(n, xValue, yValue); - p.setXY(x, y); - Point2D worldPt = p.getWorldPosition(trackerPanel); - xField.setValue(worldPt.getX()); - yField.setValue(worldPt.getY()); - } - } - - /** - * Refreshes a step by setting it equal to a keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(RGBStep step) { - if (step==null) - return; - // find key steps - int key = 0; - if (!isFixedPosition()) { - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - } - int radiusKey = 0; - if (!isFixedRadius()) { - for (int i: radiusKeyFrames) { - if (i<=step.n) - radiusKey = i; - } - } - // compare step with keySteps and update if needed - RGBStep positionKeyStep = (RGBStep)steps.getStep(key); - double x = positionKeyStep.getPosition().getX(); - double y = positionKeyStep.getPosition().getY(); - boolean differentPosition = - x!=step.getPosition().getX() - || y!=step.getPosition().getY(); - if (differentPosition) { - step.getPosition().setLocation(x, y); - step.erase(); - step.dataValid = false; - } - RGBStep radiusKeyStep = (RGBStep)steps.getStep(radiusKey); - int r = radiusKeyStep.radius; - if (r!=step.radius) { - step.setRadius(r); - step.erase(); - step.dataValid = false; - } - } - -//__________________________ static methods ___________________________ - - /** - * Returns the luma (perceived brightness) of a video RGB color. - * - * @param r red component - * @param g green component - * @param b blue component - * @return the video luma - */ - public static double getLuma(double r, double g, double b) { - // following code based on CCIR 601 specs - return 0.299*r + 0.587*g + 0.114*b; - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - XML.setLoader(FrameData.class, new FrameDataLoader()); - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - RGBRegion region = (RGBRegion) obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save fixed position - control.setValue("fixed", region.isFixedPosition()); //$NON-NLS-1$ - // save fixed radius - control.setValue("fixed_radius", region.isFixedRadius()); //$NON-NLS-1$ - // save step data, if any - if (!region.steps.isEmpty()) { - Step[] steps = region.getSteps(); - int count = region.isFixedPosition()? 1: steps.length; - FrameData[] data = new FrameData[count]; - for (int n = 0; n < count; n++) { - // save only position key frames - if (steps[n] == null || !region.keyFrames.contains(n)) continue; - data[n] = new FrameData((RGBStep)steps[n]); - } - control.setValue("framedata", data); //$NON-NLS-1$ - // save radius - count = region.isFixedRadius()? 1: steps.length; - Integer[] radii = new Integer[count]; - for (int n = 0; n < count; n++) { - // save only radius key frames - if (steps[n] == null || !region.radiusKeyFrames.contains(n)) continue; - radii[n] = ((RGBStep)steps[n]).radius; - } - control.setValue("radii", radii); //$NON-NLS-1$ - } - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - RGBRegion region = new RGBRegion(); - return region; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - RGBRegion region = (RGBRegion) obj; - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - boolean locked = region.isLocked(); - region.setLocked(false); - region.loading = true; - // load fixed position - region.fixedPosition = control.getBoolean("fixed"); //$NON-NLS-1$ - // load fixed radius - region.fixedRadius = control.getBoolean("fixed_radius"); //$NON-NLS-1$ - // load step data - region.keyFrames.clear(); - region.radiusKeyFrames.clear(); - Object dataObj = control.getObject("framedata"); //$NON-NLS-1$ - FrameData[] data = null; - if (dataObj instanceof FrameData) { // legacy - data = new FrameData[] {(FrameData)dataObj}; - } - else { // dataObj instanceof FrameData[] - data = (FrameData[])dataObj; - } - if (data!=null) { - for (int n = 0; n < data.length; n++) { - if (data[n] == null) continue; - RGBStep step = (RGBStep)region.createStep(n, data[n].x, data[n].y); - if (data[n].r != Integer.MIN_VALUE) { - step.radius = data[n].r; - region.radiusKeyFrames.add(n); // for legacy compatibility - } - } - } - Integer[] radii = (Integer[])control.getObject("radii"); //$NON-NLS-1$ - if (radii!=null) { - region.radiusKeyFrames.clear(); - for (int n = 0; n < radii.length; n++) { - if (radii[n] == null) continue; - RGBStep step = (RGBStep)region.steps.getStep(n); - step.radius = radii[n]; - region.radiusKeyFrames.add(n); - } - } - region.setLocked(locked); - region.loading = false; - region.repaint(); - return obj; - } - } - - /** - * Inner class containing the rgb data for a single frame number. - */ - private static class FrameData { - double x, y; - int r; - - FrameData() {/** empty block */} - - FrameData(RGBStep s) { - x = s.getPosition().getX(); - y = s.getPosition().getY(); - r = s.radius; - } - } - - /** - * A class to save and load a FrameData. - */ - private static class FrameDataLoader - implements XML.ObjectLoader { - - public void saveObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - control.setValue("x", data.x); //$NON-NLS-1$ - control.setValue("y", data.y); //$NON-NLS-1$ - control.setValue("r", data.r); //$NON-NLS-1$ - } - - public Object createObject(XMLControl control) { - return new FrameData(); - } - - public Object loadObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - data.x = control.getDouble("x"); //$NON-NLS-1$ - data.y = control.getDouble("y"); //$NON-NLS-1$ - data.r = control.getInt("r"); //$NON-NLS-1$ - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; + +import javax.swing.*; +import javax.swing.border.Border; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.controls.*; + +/** + * A RGBRegion measures RGB properties in a circular region + * of a video image. + * + * @author Douglas Brown + */ +public class RGBRegion extends TTrack { + + // static constants + protected static final int MAX_RADIUS = 100; + + // static fields + protected static int defaultRadius = 10; + + // instance fields + protected boolean fixedPosition = true; // region has same position at all times + protected boolean fixedRadius = true; // region has same radius at all times + protected JCheckBoxMenuItem fixedPositionItem, fixedRadiusItem; + protected JLabel radiusLabel; + protected IntegerField radiusField; + protected boolean firstTimeRadiusUnfixed = true; + protected ArrayList validSteps = new ArrayList(); + protected boolean dataHidden = false; + protected boolean loading; + protected TreeSet radiusKeyFrames = new TreeSet(); + + /** + * Constructs a RGBRegion. + */ + public RGBRegion() { + super(); + defaultColors = new Color[] {Color.magenta}; + // assign a default name + setName(TrackerRes.getString("RGBRegion.New.Name")); //$NON-NLS-1$ + // assign default plot variables + setProperty("yVarPlot0", "luma"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yMinPlot0", new Double(0)); //$NON-NLS-1$ + setProperty("yMaxPlot0", new Double(255)); //$NON-NLS-1$ + // assign default table variables: x, y and luma + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar2", "5"); //$NON-NLS-1$ //$NON-NLS-2$ + // set up footprint choices and color + setFootprints(new Footprint[] + {PointShapeFootprint.getFootprint("Footprint.Circle"), //$NON-NLS-1$ + PointShapeFootprint.getFootprint("Footprint.BoldCircle")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("RGBRegion.Unmarked.Hint"); //$NON-NLS-1$ + // create toolbar components + radiusLabel = new JLabel(); + radiusField = new IntegerField(2); + radiusField.setMinValue(1); + // radius focus listener + final FocusListener radiusFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (radiusField.getBackground() == Color.yellow) { + setRadius(trackerPanel.getFrameNumber(), radiusField.getIntValue()); + } + } + }; + radiusField.addFocusListener(radiusFocusListener); + radiusField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + radiusFocusListener.focusLost(null); + radiusField.selectAll(); + radiusField.requestFocusInWindow(); + } + }); + fixedPositionItem = new JCheckBoxMenuItem(TrackerRes.getString("RGBRegion.MenuItem.Fixed")); //$NON-NLS-1$ + fixedPositionItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixedPosition(fixedPositionItem.isSelected()); + } + }); + fixedRadiusItem = new JCheckBoxMenuItem(TrackerRes.getString("RGBRegion.MenuItem.FixedRadius")); //$NON-NLS-1$ + fixedRadiusItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixedRadius(fixedRadiusItem.isSelected()); + } + }); + radiusField.setBorder(fieldBorder); + // position action + Action positionAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + NumberField field = (NumberField)e.getSource(); + if (field.getBackground() == Color.yellow) setPositionFromFields(); + field.selectAll(); + field.requestFocusInWindow(); + } + }; + // position focus listener + FocusListener positionFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + NumberField field = (NumberField)e.getSource(); + if (field.getBackground() == Color.yellow) setPositionFromFields(); + } + }; + // add action and focus listeners + xField.addActionListener(positionAction); + yField.addActionListener(positionAction); + xField.addFocusListener(positionFocusListener); + yField.addFocusListener(positionFocusListener); + } + + /** + * Sets the fixed position property. When it is fixed, it is in the same + * position at all times. + * + * @param fixed true to fix the position + */ + public void setFixedPosition(boolean fixed) { + if (fixedPosition == fixed) return; + if (steps.isEmpty()) { + fixedPosition = fixed; + return; + } + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + RGBStep keyStep = (RGBStep)getStep(n); + for (Step next: steps.array) { + if (next==null) continue; + RGBStep step = (RGBStep)next; + step.getPosition().setLocation(keyStep.getPosition()); + } + } + fixedPosition = fixed; + if (fixed) { + keyFrames.clear(); + keyFrames.add(0); + clearData(); + refreshData(data, trackerPanel); + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + if (!loading) { + Undo.postTrackEdit(this, control); + } + repaint(); + } + + /** + * Gets the fixed position property. + * + * @return true if image position is fixed + */ + public boolean isFixedPosition() { + return fixedPosition; + } + + /** + * Sets the fixed radius property. When fixed, it has the same + * radius at all times. + * + * @param fixed true to fix the radius + */ + public void setFixedRadius(boolean fixed) { + if (fixedRadius == fixed) return; + if (steps.isEmpty()) { + fixedRadius = fixed; + return; + } + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + RGBStep keyStep = (RGBStep)getStep(n); + for (Step next: steps.array) { + if (next==null) continue; + RGBStep step = (RGBStep)next; + step.setRadius(keyStep.radius); + } + } + fixedRadius = fixed; + if (fixed) { + radiusKeyFrames.clear(); + radiusKeyFrames.add(0); + clearData(); + refreshData(data, trackerPanel); + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + if (!loading) { + Undo.postTrackEdit(this, control); + } + repaint(); + } + + /** + * Gets the fixed radius property. + * + * @return true if radius is fixed + */ + public boolean isFixedRadius() { + return fixedRadius; + } + + /** + * Sets the radius of a step and posts an undoable edit + * + * @param n the frame number + * @param r the desired radius + */ + protected void setRadius(int n, int r) { + if (isLocked() || r == Integer.MIN_VALUE || trackerPanel == null) return; + r = Math.max(r, 0); + r = Math.min(r, MAX_RADIUS); + radiusField.setIntValue(r); + + RGBStep step = (RGBStep)getStep(n); // target step + RGBStep keyStep = step; // key step is target if radius not fixed + if (step!=null && step.radius != r) { + // deselect selected point to trigger possible undo, then reselect it + TPoint selection = trackerPanel.getSelectedPoint(); + trackerPanel.setSelectedPoint(null); + XMLControl state = new XMLControlElement(step); + + if (isFixedRadius()) { + keyStep = (RGBStep)steps.getStep(0); // key step is step 0 + clearData(); // all data is invalid + keyStep.setRadius(r); + refreshStep(step); + } + else { + radiusKeyFrames.add(n); // step is both target and key + step.setRadius(r); + step.dataValid = false; // only target step's data is invalid + } + Undo.postStepEdit(step, state); + trackerPanel.setSelectedPoint(selection); + refreshData(data, trackerPanel); + step.repaint(); + firePropertyChange("data", null, RGBRegion.this); // to views //$NON-NLS-1$ + } + } + + /** + * Gets the radius. + * + * @return the radius + */ + public int getRadius() { + if (isFixedRadius()) { + RGBStep step = (RGBStep)getStep(0); + if (step != null) return step.radius; + } + else if (trackerPanel != null && !fixedRadius) { + int n = trackerPanel.getFrameNumber(); + RGBStep step = (RGBStep)getStep(n); + if (step != null) return step.radius; + } + return defaultRadius; + } + + /** + * Overrides TTrack draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + if (isMarking && !(trackerPanel.getSelectedPoint() instanceof RGBStep.Position)) + return; + super.draw(panel, _g); + } + + /** + * Overrides TTrack findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step or motion vector that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + Interactive ia = super.findInteractive(panel, xpix, ypix); + if (ia != null) { + partName = TrackerRes.getString("RGBRegion.Position.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("RGBRegion.Position.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (getStep(trackerPanel.getFrameNumber())==null) { + hint = TrackerRes.getString("RGBRegion.Unmarked.Hint"); //$NON-NLS-1$ + } + else hint = TrackerRes.getString("RGBRegion.Hint"); //$NON-NLS-1$ + if (trackerPanel.getVideo() == null) { + hint += ", "+TrackerRes.getString("TTrack.ImportVideo.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + return ia; + } + + /** + * Overrides TTrack setTrailVisible method to keep trails hidden. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Gets the autoAdvance property. Overrides TTrack method. + * + * @return false + */ + public boolean isAutoAdvance() { + return !isFixedPosition(); + } + + /** + * Creates a new step. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the step + */ + public Step createStep(int n, double x, double y) { + if (isLocked()) return null; + int frame = isFixedPosition()? 0: n; + RGBStep step = (RGBStep)steps.getStep(frame); + if (step==null) { // create new step 0 and autofill array + int r = (int)radiusField.getValue(); + step = new RGBStep(this, 0, x, y, r); + step.setFootprint(getFootprint()); + steps = new StepArray(step); + keyFrames.add(0); + radiusKeyFrames.add(0); + } + else { + XMLControl currentState = new XMLControlElement(this); + step.getPosition().setLocation(x, y); + keyFrames.add(n); + Undo.postTrackEdit(this, currentState); + } + support.firePropertyChange("step", null, n); //$NON-NLS-1$ + return getStep(n); + } + + /** + * Overrides TTrack deleteStep method to prevent deletion. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + return null; + } + + /** + * Overrides TTrack getStep method to provide fixed behavior. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + RGBStep step = (RGBStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return RGBStep.getLength(); + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + this.setFixedPosition(false); + return super.autoMarkAt(n, x, y); + } + + /** + * Determines if any point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 1; + } + + /** + * Clears the data. + */ + protected void clearData() { + if (data == null) return; + // clear each dataset + for (int i = 0; i < 7; i++) { + Dataset next = data.getDataset(i); + next.clear(); + } + Step[] steps = getSteps(); + for (int i = 0; i < steps.length; i++) { + if (steps[i] == null) continue; + steps[i].dataVisible = false; + ((RGBStep)steps[i]).dataValid = false; + } + } + + /** + * Hides the data. + */ + protected void hideData() { + Step[] steps = getSteps(); + for (int i = 0; i < steps.length; i++) { + if (steps[i] == null) continue; + steps[i].dataVisible = false; + } + dataHidden = true; + } + + /** + * Refreshes the data. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (trackerPanel == null || data == null) return; + dataFrames.clear(); + // get valid step at current frameNumber + int frame = trackerPanel.getFrameNumber(); + Step step = getStep(frame); + if (step != null) { + ((RGBStep)step).getRGBData(trackerPanel); + } + // get the datasets + int count = 0; + Dataset x = data.getDataset(count++); + Dataset y = data.getDataset(count++); + Dataset r = data.getDataset(count++); + Dataset g = data.getDataset(count++); + Dataset b = data.getDataset(count++); + Dataset luma = data.getDataset(count++); + Dataset pixels = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + // assign column names to the datasets + String time = "t"; //$NON-NLS-1$ + if (!x.getColumnName(0).equals(time)) { // not yet initialized + x.setXYColumnNames(time, "x"); //$NON-NLS-1$ + y.setXYColumnNames(time, "y"); //$NON-NLS-1$ + r.setXYColumnNames(time, "R"); //$NON-NLS-1$ + g.setXYColumnNames(time, "G"); //$NON-NLS-1$ + b.setXYColumnNames(time, "B"); //$NON-NLS-1$ + luma.setXYColumnNames(time, "luma"); //$NON-NLS-1$ + pixels.setXYColumnNames(time, "pixels"); //$NON-NLS-1$ + stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ + frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ + } + else for (int i = 0; i < count; i++) { + data.getDataset(i).clear(); + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < dataDescriptions.length; i++) { + dataDescriptions[i] = TrackerRes.getString("RGBRegion.Data.Description."+i); //$NON-NLS-1$ + } + // look thru steps and find valid ones (data valid and included in clip) + Step[] stepArray = getSteps(); + validSteps.clear(); + VideoPlayer player = trackerPanel.getPlayer(); + VideoClip clip = player.getVideoClip(); + for (int n = 0; n < stepArray.length; n++) { + RGBStep next = (RGBStep)stepArray[n]; + if (next == null || !next.dataValid + || next.getRGBData(trackerPanel) == null) + continue; + // get the frame number of the step + TPoint p = next.getPosition(); + int stepFrame = p.getFrameNumber(trackerPanel); + // step is valid if frame is included in the clip + if (clip.includesFrame(stepFrame)) { + validSteps.add(next); + } + else next.dataVisible = false; + } + RGBStep[] valid = validSteps.toArray(new RGBStep[0]); + int len = valid.length; + // get the valid data + double[][] validData = new double[10][len]; + for (int n = 0; n < len; n++) { + // get the rgb data for the step + double[] rgb = valid[n].getRGBData(trackerPanel); + // get the frame number of the step + TPoint p = valid[n].getPosition(); + int stepFrame = p.getFrameNumber(trackerPanel); + dataFrames.add(new Integer(stepFrame)); + // get the step number and time + int stepNumber = clip.frameToStep(stepFrame); + double t = player.getStepTime(stepNumber)/1000.0; + // get the world position for the step + Point2D pt = p.getWorldPosition(trackerPanel); + // put data in validData array + for (int j = 2; j < 7; j++) { + validData[j][n] = rgb[j-2]; + } + validData[0][n] = pt.getX(); + validData[1][n] = pt.getY(); + validData[7][n] = stepNumber; + validData[8][n] = stepFrame; + validData[9][n] = t; + } + // append the data to the data set + x.append(validData[9], validData[0]); + y.append(validData[9], validData[1]); + r.append(validData[9], validData[2]); + g.append(validData[9], validData[3]); + b.append(validData[9], validData[4]); + luma.append(validData[9], validData[5]); + pixels.append(validData[9], validData[6]); + stepNum.append(validData[9], validData[7]); + frameNum.append(validData[9], validData[8]); + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + fixedPositionItem.setText(TrackerRes.getString("RGBRegion.MenuItem.Fixed")); //$NON-NLS-1$ + fixedPositionItem.setSelected(isFixedPosition()); + fixedRadiusItem.setText(TrackerRes.getString("RGBRegion.MenuItem.FixedRadius")); //$NON-NLS-1$ + fixedRadiusItem.setSelected(isFixedRadius()); + menu.remove(deleteTrackItem); + if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) + menu.addSeparator(); + menu.add(fixedPositionItem); + menu.add(fixedRadiusItem); + // replace delete item + if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ + if (menu.getItemCount() > 0 && menu.getItem(menu.getItemCount()-1) != null) + menu.addSeparator(); + menu.add(deleteTrackItem); + } + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + radiusLabel.setText(TrackerRes.getString("RGBRegion.Label.Radius")); //$NON-NLS-1$ + Border empty = BorderFactory.createEmptyBorder(0, 4, 0, 2); + radiusLabel.setBorder(empty); + list.add(radiusLabel); + radiusField.setIntValue(getRadius()); + radiusField.setEnabled(!isLocked()); + list.add(radiusField); + return list; + } + + /** + * Overrides TTrack getToolbarPointComponents method. + * + * @param trackerPanel the tracker panel + * @param point the TPoint + * @return a list of components + */ + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + Step step = getStep(point, trackerPanel); + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + if (step == null) return list; + int n = step.getFrameNumber(); + n = trackerPanel.getPlayer().getVideoClip().frameToStep(n); + stepValueLabel.setText("" + n); //$NON-NLS-1$ + xField.setEnabled(!isLocked()); + yField.setEnabled(!isLocked()); + list.add(stepSeparator); + list.add(stepLabel); + list.add(stepValueLabel); + list.add(tValueLabel); + list.add(tSeparator); + list.add(xLabel); + list.add(xField); + list.add(xSeparator); + list.add(yLabel); + list.add(yField); + list.add(ySeparator); + return list; + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {radiusLabel}; + FontSizer.setFonts(objectsToSize, level); + } + + /** + * Responds to property change events. This listens for the following + * events: "stepnumber" & "image" from TrackerPanel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (trackerPanel != null) { + String name = e.getPropertyName(); + if (name.equals("stepnumber")) { //$NON-NLS-1$ + dataValid = false; + int n = trackerPanel.getFrameNumber(); + RGBStep step = (RGBStep)getStep(n); + if (step != null) radiusField.setIntValue(step.radius); + radiusField.setEnabled(!isLocked() && step != null); + support.firePropertyChange(e); // to views + } + else if (name.equals("image")) { //$NON-NLS-1$ + dataValid = false; + Video vid = trackerPanel.getVideo(); + if (vid == null) clearData(); // no video + else if (!vid.isVisible()) // video invisible + hideData(); + else if (!dataHidden && vid.isVisible()) // video filters + clearData(); + else dataHidden = false; + support.firePropertyChange(e); // to views + } + } + super.propertyChange(e); // handled by TTrack + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("RGBRegion.Name"); //$NON-NLS-1$ + } + +//__________________________ private methods ___________________________ + + /** + * Sets the position of the currently selected point based on the values + * in the x and y fields. + */ + private void setPositionFromFields() { + double xValue = xField.getValue(); + double yValue = yField.getValue(); + TPoint p = trackerPanel.getSelectedPoint(); + int n = trackerPanel.getFrameNumber(); + Step step = getStep(n); + if (step != null && p != null) { + ImageCoordSystem coords = trackerPanel.getCoords(); + double x = coords.worldToImageX(n, xValue, yValue); + double y = coords.worldToImageY(n, xValue, yValue); + p.setXY(x, y); + Point2D worldPt = p.getWorldPosition(trackerPanel); + xField.setValue(worldPt.getX()); + yField.setValue(worldPt.getY()); + } + } + + /** + * Refreshes a step by setting it equal to a keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(RGBStep step) { + if (step==null) + return; + // find key steps + int key = 0; + if (!isFixedPosition()) { + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + } + int radiusKey = 0; + if (!isFixedRadius()) { + for (int i: radiusKeyFrames) { + if (i<=step.n) + radiusKey = i; + } + } + // compare step with keySteps and update if needed + RGBStep positionKeyStep = (RGBStep)steps.getStep(key); + double x = positionKeyStep.getPosition().getX(); + double y = positionKeyStep.getPosition().getY(); + boolean differentPosition = + x!=step.getPosition().getX() + || y!=step.getPosition().getY(); + if (differentPosition) { + step.getPosition().setLocation(x, y); + step.erase(); + step.dataValid = false; + } + RGBStep radiusKeyStep = (RGBStep)steps.getStep(radiusKey); + int r = radiusKeyStep.radius; + if (r!=step.radius) { + step.setRadius(r); + step.erase(); + step.dataValid = false; + } + } + +//__________________________ static methods ___________________________ + + /** + * Returns the luma (perceived brightness) of a video RGB color. + * + * @param r red component + * @param g green component + * @param b blue component + * @return the video luma + */ + public static double getLuma(double r, double g, double b) { + // following code based on CCIR 601 specs + return 0.299*r + 0.587*g + 0.114*b; + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + XML.setLoader(FrameData.class, new FrameDataLoader()); + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + RGBRegion region = (RGBRegion) obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed position + control.setValue("fixed", region.isFixedPosition()); //$NON-NLS-1$ + // save fixed radius + control.setValue("fixed_radius", region.isFixedRadius()); //$NON-NLS-1$ + // save step data, if any + if (!region.steps.isEmpty()) { + Step[] steps = region.getSteps(); + int count = region.isFixedPosition()? 1: steps.length; + FrameData[] data = new FrameData[count]; + for (int n = 0; n < count; n++) { + // save only position key frames + if (steps[n] == null || !region.keyFrames.contains(n)) continue; + data[n] = new FrameData((RGBStep)steps[n]); + } + control.setValue("framedata", data); //$NON-NLS-1$ + // save radius + count = region.isFixedRadius()? 1: steps.length; + Integer[] radii = new Integer[count]; + for (int n = 0; n < count; n++) { + // save only radius key frames + if (steps[n] == null || !region.radiusKeyFrames.contains(n)) continue; + radii[n] = ((RGBStep)steps[n]).radius; + } + control.setValue("radii", radii); //$NON-NLS-1$ + } + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + RGBRegion region = new RGBRegion(); + return region; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + RGBRegion region = (RGBRegion) obj; + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + boolean locked = region.isLocked(); + region.setLocked(false); + region.loading = true; + // load fixed position + region.fixedPosition = control.getBoolean("fixed"); //$NON-NLS-1$ + // load fixed radius + region.fixedRadius = control.getBoolean("fixed_radius"); //$NON-NLS-1$ + // load step data + region.keyFrames.clear(); + region.radiusKeyFrames.clear(); + Object dataObj = control.getObject("framedata"); //$NON-NLS-1$ + FrameData[] data = null; + if (dataObj instanceof FrameData) { // legacy + data = new FrameData[] {(FrameData)dataObj}; + } + else { // dataObj instanceof FrameData[] + data = (FrameData[])dataObj; + } + if (data!=null) { + for (int n = 0; n < data.length; n++) { + if (data[n] == null) continue; + RGBStep step = (RGBStep)region.createStep(n, data[n].x, data[n].y); + if (data[n].r != Integer.MIN_VALUE) { + step.radius = data[n].r; + region.radiusKeyFrames.add(n); // for legacy compatibility + } + } + } + Integer[] radii = (Integer[])control.getObject("radii"); //$NON-NLS-1$ + if (radii!=null) { + region.radiusKeyFrames.clear(); + for (int n = 0; n < radii.length; n++) { + if (radii[n] == null) continue; + RGBStep step = (RGBStep)region.steps.getStep(n); + step.radius = radii[n]; + region.radiusKeyFrames.add(n); + } + } + region.setLocked(locked); + region.loading = false; + region.repaint(); + return obj; + } + } + + /** + * Inner class containing the rgb data for a single frame number. + */ + private static class FrameData { + double x, y; + int r; + + FrameData() {/** empty block */} + + FrameData(RGBStep s) { + x = s.getPosition().getX(); + y = s.getPosition().getY(); + r = s.radius; + } + } + + /** + * A class to save and load a FrameData. + */ + private static class FrameDataLoader + implements XML.ObjectLoader { + + public void saveObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + control.setValue("x", data.x); //$NON-NLS-1$ + control.setValue("y", data.y); //$NON-NLS-1$ + control.setValue("r", data.r); //$NON-NLS-1$ + } + + public Object createObject(XMLControl control) { + return new FrameData(); + } + + public Object loadObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + data.x = control.getDouble("x"); //$NON-NLS-1$ + data.y = control.getDouble("y"); //$NON-NLS-1$ + data.r = control.getInt("r"); //$NON-NLS-1$ + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java b/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java index 05c3e226..5516ab68 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java @@ -1,406 +1,406 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.*; -import java.awt.image.*; -import java.util.HashMap; -import java.util.Map; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; - -/** - * This is a step for RGB tracks. It is used for obtaining - * RGB data in a region of a video image. - * - * @author Douglas Brown - */ -public class RGBStep extends Step { - - // static fields - protected static GeneralPath crosshair; - - // instance fields - protected Position position; - protected RGBRegion rgbRegion; - protected int radius; - protected Map hitShapes = new HashMap(); - protected double[] rgbData = new double[5]; - protected boolean dataValid = false; - - static { - crosshair = new GeneralPath(); - crosshair.moveTo(0, -3); - crosshair.lineTo(0, 3); - crosshair.moveTo(-3, 0); - crosshair.lineTo(3, 0); - } - - /** - * Constructs a RGBStep with specified coordinates in image space. - * - * @param track the track - * @param n the frame number - * @param x the x coordinate - * @param y the y coordinate - * @param r the radius - */ - public RGBStep(RGBRegion track, int n, double x, double y, int r) { - super(track, n); - this.radius = r; - rgbRegion = track; - position = new Position(x, y); - position.setStepEditTrigger(true); - points = new TPoint[] {position}; - screenPoints = new Point[getLength()]; - } - - /** - * Gets the position TPoint. - * - * @return the position TPoint - */ - public TPoint getPosition() { - return position; - } - - /** - * Overrides Step findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position - * @param ypix the y pixel position - * @return the TPoint that is hit, or null - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - TrackerPanel trackerPanel = (TrackerPanel)panel; - setHitRectCenter(xpix, ypix); - Shape hitShape = hitShapes.get(trackerPanel); - if (hitShape != null && hitShape.intersects(hitRect)) return position; - return null; - } - - /** - * Overrides Step draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - // draw the mark - TrackerPanel trackerPanel = (TrackerPanel)panel; - Graphics2D g = (Graphics2D)_g; - Mark mark = getMark(trackerPanel); - if (mark != null) { - mark.draw(g, false); - } - } - - /** - * Overrides Step getMark method. - * - * @param trackerPanel the tracker panel - * @return the mark - */ - protected Mark getMark(TrackerPanel trackerPanel) { - Mark mark = marks.get(trackerPanel); - if (mark == null) { - transform = trackerPanel.getPixelTransform(); - if (!trackerPanel.isDrawingInImageSpace()) { - transform.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); - } - // make region of interest - Shape region = new Ellipse2D.Double( - position.getX()-radius, position.getY()-radius, - 2*radius, 2*radius); - final Shape rgn = transform.createTransformedShape(region); - // center of circle is crosshair or selectionShape - Point p = position.getScreenPosition(trackerPanel); - transform.setToTranslation(p.x, p.y); - final Shape square = position == trackerPanel.getSelectedPoint()? - transform.createTransformedShape(selectionShape): null; - final Shape cross = transform.createTransformedShape(crosshair); - mark = new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Paint gpaint = g.getPaint(); - g.setPaint(footprint.getColor()); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - if (square != null) g.fill(square); - else g.draw(cross); - g.setStroke(footprint.getStroke()); - g.draw(rgn); - g.setPaint(gpaint); - } - - public Rectangle getBounds(boolean highlighted) { - return rgn.getBounds(); - } - }; - marks.put(trackerPanel, mark); - // center is also the hit shape - hitShapes.put(trackerPanel, cross); - } - return mark; - } - - /** - * Overrides Step getBounds method. - * - * @param trackerPanel the tracker panel drawing the step - * @return the bounding rectangle - */ - public Rectangle getBounds(TrackerPanel trackerPanel) { - Rectangle bounds = getMark(trackerPanel).getBounds(false); - return bounds; - } - - /** - * Sets the radius. - * - * @param r the radius - */ - public void setRadius(int r) { - radius = r; - } - - /** - * Clones this Step. - * - * @return a clone of this step - */ - public Object clone() { - RGBStep step = (RGBStep)super.clone(); - if (step != null) { - step.hitShapes = new HashMap(); - step.points[0] = step.position = step.new Position( - position.getX(), position.getY()); - step.position.setStepEditTrigger(true); - step.rgbData = new double[5]; - step.dataValid = false; - } - return step; - } - - /** - * Returns a String describing this step. - * - * @return a descriptive string - */ - public String toString() { - return "RGBStep " + n //$NON-NLS-1$ - + " [" + format.format(position.x) //$NON-NLS-1$ - + ", " + format.format(position.y) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ - } - - /** - * Gets the RGB data. Return array is {R,G,B,luma,pixels} - * - * @param trackerPanel the tracker panel - * @return an integer array of data values - */ - public double[] getRGBData(TrackerPanel trackerPanel) { - Video vid = trackerPanel.getVideo(); - if (vid == null || !vid.isVisible()) return null; - if (!dataValid && trackerPanel.getFrameNumber() == n) { - BufferedImage image = vid.getImage(); - if (image != null - && image.getType() == BufferedImage.TYPE_INT_RGB) { - RGBStep step = rgbRegion.isFixedPosition()? - (RGBStep)rgbRegion.getStep(0): this; - TPoint pt = step.getPosition(); - Shape region = new Ellipse2D.Double( - pt.getX()-radius, pt.getY()-radius, - 2*radius, 2*radius); - int h = 2*radius + 1; - int w = h; - // locate starting pixel - int x0 = (int)pt.getX()-radius; - int y0 = (int)pt.getY()-radius; - Point2D centerPt = new Point2D.Double(); - try { - int[] pixels = new int[h*w]; - int n = 0, r = 0, g = 0, b = 0; - // fill pixels array with pixel data - image.getRaster().getDataElements(x0, y0, w, h, pixels); - // step thru pixels horizontally - for (int i = 0; i < w; i++) { - // step vertically - for (int j = 0; j < h; j++) { - // include pixel if center is inside region - centerPt.setLocation(x0+i+.5, y0+j+.5); - if (region.contains(centerPt)) { - int pixel = pixels[i + j*w]; - n++; // pixel count - r += (pixel >> 16) & 0xff; // red - g += (pixel >> 8) & 0xff; // green - b += (pixel) & 0xff; // blue - } - } - } - if (n == 0) return null; - double rMean = 1.0*r/n; - double gMean = 1.0*g/n; - double bMean = 1.0*b/n; - rgbData[0] = rMean; - rgbData[1] = gMean; - rgbData[2] = bMean; - rgbData[3] = RGBRegion.getLuma(rMean, gMean, bMean); - rgbData[4] = n; - dataValid = true; - } catch(ArrayIndexOutOfBoundsException ex) {return null;} - } - } - dataVisible = true; - return rgbData; - } - -//____________________ inner Position class ______________________ - - protected class Position extends TPoint { - - /** - * Constructs a Position with specified image coordinates. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public Position(double x, double y) { - super(x, y); - } - - /** - * Overrides TPoint setXY method. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public void setXY(double x, double y) { - if (track.isLocked()) return; - if (rgbRegion.isFixedPosition()) { - RGBStep step = (RGBStep)rgbRegion.steps.getStep(0); - step.getPosition().setLocation(x, y); // set location of step 0 - step.erase(); - rgbRegion.refreshStep(RGBStep.this); // set location of this step - rgbRegion.clearData(); // all data is invalid - } - else { - setLocation(x, y); - rgbRegion.keyFrames.add(n); - dataValid = false; // this step's data is invalid - } - repaint(); - track.support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ - } - - /** - * Overrides TPoint showCoordinates method. - * - * @param vidPanel the video panel - */ - public void showCoordinates(VideoPanel vidPanel) { - // put values into x and y fields - Point2D p = getWorldPosition(vidPanel); - track.xField.setValue(p.getX()); - track.yField.setValue(p.getY()); - super.showCoordinates(vidPanel); - } - - /** - * Overrides TPoint getFrameNumber method. - * - * @param vidPanel the video panel being drawn - * @return the frame number - */ - public int getFrameNumber(VideoPanel vidPanel) { - return n; - } - - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - RGBStep step = (RGBStep) obj; - control.setValue("x", step.position.x); //$NON-NLS-1$ - control.setValue("y", step.position.y); //$NON-NLS-1$ - control.setValue("radius", step.radius); //$NON-NLS-1$ - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - // this loader is not intended to be used to create new steps, - // but only for undo/redo step edits. - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - RGBStep step = (RGBStep) obj; - step.setRadius(control.getInt("radius")); //$NON-NLS-1$ - double x = control.getDouble("x"); //$NON-NLS-1$ - double y = control.getDouble("y"); //$NON-NLS-1$ - step.position.setXY(x, y); - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.*; +import java.awt.image.*; +import java.util.HashMap; +import java.util.Map; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; + +/** + * This is a step for RGB tracks. It is used for obtaining + * RGB data in a region of a video image. + * + * @author Douglas Brown + */ +public class RGBStep extends Step { + + // static fields + protected static GeneralPath crosshair; + + // instance fields + protected Position position; + protected RGBRegion rgbRegion; + protected int radius; + protected Map hitShapes = new HashMap(); + protected double[] rgbData = new double[5]; + protected boolean dataValid = false; + + static { + crosshair = new GeneralPath(); + crosshair.moveTo(0, -3); + crosshair.lineTo(0, 3); + crosshair.moveTo(-3, 0); + crosshair.lineTo(3, 0); + } + + /** + * Constructs a RGBStep with specified coordinates in image space. + * + * @param track the track + * @param n the frame number + * @param x the x coordinate + * @param y the y coordinate + * @param r the radius + */ + public RGBStep(RGBRegion track, int n, double x, double y, int r) { + super(track, n); + this.radius = r; + rgbRegion = track; + position = new Position(x, y); + position.setStepEditTrigger(true); + points = new TPoint[] {position}; + screenPoints = new Point[getLength()]; + } + + /** + * Gets the position TPoint. + * + * @return the position TPoint + */ + public TPoint getPosition() { + return position; + } + + /** + * Overrides Step findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position + * @param ypix the y pixel position + * @return the TPoint that is hit, or null + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + TrackerPanel trackerPanel = (TrackerPanel)panel; + setHitRectCenter(xpix, ypix); + Shape hitShape = hitShapes.get(trackerPanel); + if (hitShape != null && hitShape.intersects(hitRect)) return position; + return null; + } + + /** + * Overrides Step draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + // draw the mark + TrackerPanel trackerPanel = (TrackerPanel)panel; + Graphics2D g = (Graphics2D)_g; + Mark mark = getMark(trackerPanel); + if (mark != null) { + mark.draw(g, false); + } + } + + /** + * Overrides Step getMark method. + * + * @param trackerPanel the tracker panel + * @return the mark + */ + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + if (mark == null) { + transform = trackerPanel.getPixelTransform(); + if (!trackerPanel.isDrawingInImageSpace()) { + transform.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); + } + // make region of interest + Shape region = new Ellipse2D.Double( + position.getX()-radius, position.getY()-radius, + 2*radius, 2*radius); + final Shape rgn = transform.createTransformedShape(region); + // center of circle is crosshair or selectionShape + Point p = position.getScreenPosition(trackerPanel); + transform.setToTranslation(p.x, p.y); + final Shape square = position == trackerPanel.getSelectedPoint()? + transform.createTransformedShape(selectionShape): null; + final Shape cross = transform.createTransformedShape(crosshair); + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Paint gpaint = g.getPaint(); + g.setPaint(footprint.getColor()); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + if (square != null) g.fill(square); + else g.draw(cross); + g.setStroke(footprint.getStroke()); + g.draw(rgn); + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + return rgn.getBounds(); + } + }; + marks.put(trackerPanel, mark); + // center is also the hit shape + hitShapes.put(trackerPanel, cross); + } + return mark; + } + + /** + * Overrides Step getBounds method. + * + * @param trackerPanel the tracker panel drawing the step + * @return the bounding rectangle + */ + public Rectangle getBounds(TrackerPanel trackerPanel) { + Rectangle bounds = getMark(trackerPanel).getBounds(false); + return bounds; + } + + /** + * Sets the radius. + * + * @param r the radius + */ + public void setRadius(int r) { + radius = r; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + RGBStep step = (RGBStep)super.clone(); + if (step != null) { + step.hitShapes = new HashMap(); + step.points[0] = step.position = step.new Position( + position.getX(), position.getY()); + step.position.setStepEditTrigger(true); + step.rgbData = new double[5]; + step.dataValid = false; + } + return step; + } + + /** + * Returns a String describing this step. + * + * @return a descriptive string + */ + public String toString() { + return "RGBStep " + n //$NON-NLS-1$ + + " [" + format.format(position.x) //$NON-NLS-1$ + + ", " + format.format(position.y) + "]"; //$NON-NLS-1$ //$NON-NLS-2$ + } + + /** + * Gets the RGB data. Return array is {R,G,B,luma,pixels} + * + * @param trackerPanel the tracker panel + * @return an integer array of data values + */ + public double[] getRGBData(TrackerPanel trackerPanel) { + Video vid = trackerPanel.getVideo(); + if (vid == null || !vid.isVisible()) return null; + if (!dataValid && trackerPanel.getFrameNumber() == n) { + BufferedImage image = vid.getImage(); + if (image != null + && image.getType() == BufferedImage.TYPE_INT_RGB) { + RGBStep step = rgbRegion.isFixedPosition()? + (RGBStep)rgbRegion.getStep(0): this; + TPoint pt = step.getPosition(); + Shape region = new Ellipse2D.Double( + pt.getX()-radius, pt.getY()-radius, + 2*radius, 2*radius); + int h = 2*radius + 1; + int w = h; + // locate starting pixel + int x0 = (int)pt.getX()-radius; + int y0 = (int)pt.getY()-radius; + Point2D centerPt = new Point2D.Double(); + try { + int[] pixels = new int[h*w]; + int n = 0, r = 0, g = 0, b = 0; + // fill pixels array with pixel data + image.getRaster().getDataElements(x0, y0, w, h, pixels); + // step thru pixels horizontally + for (int i = 0; i < w; i++) { + // step vertically + for (int j = 0; j < h; j++) { + // include pixel if center is inside region + centerPt.setLocation(x0+i+.5, y0+j+.5); + if (region.contains(centerPt)) { + int pixel = pixels[i + j*w]; + n++; // pixel count + r += (pixel >> 16) & 0xff; // red + g += (pixel >> 8) & 0xff; // green + b += (pixel) & 0xff; // blue + } + } + } + if (n == 0) return null; + double rMean = 1.0*r/n; + double gMean = 1.0*g/n; + double bMean = 1.0*b/n; + rgbData[0] = rMean; + rgbData[1] = gMean; + rgbData[2] = bMean; + rgbData[3] = RGBRegion.getLuma(rMean, gMean, bMean); + rgbData[4] = n; + dataValid = true; + } catch(ArrayIndexOutOfBoundsException ex) {return null;} + } + } + dataVisible = true; + return rgbData; + } + +//____________________ inner Position class ______________________ + + protected class Position extends TPoint { + + /** + * Constructs a Position with specified image coordinates. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public Position(double x, double y) { + super(x, y); + } + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + if (track.isLocked()) return; + if (rgbRegion.isFixedPosition()) { + RGBStep step = (RGBStep)rgbRegion.steps.getStep(0); + step.getPosition().setLocation(x, y); // set location of step 0 + step.erase(); + rgbRegion.refreshStep(RGBStep.this); // set location of this step + rgbRegion.clearData(); // all data is invalid + } + else { + setLocation(x, y); + rgbRegion.keyFrames.add(n); + dataValid = false; // this step's data is invalid + } + repaint(); + track.support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ + } + + /** + * Overrides TPoint showCoordinates method. + * + * @param vidPanel the video panel + */ + public void showCoordinates(VideoPanel vidPanel) { + // put values into x and y fields + Point2D p = getWorldPosition(vidPanel); + track.xField.setValue(p.getX()); + track.yField.setValue(p.getY()); + super.showCoordinates(vidPanel); + } + + /** + * Overrides TPoint getFrameNumber method. + * + * @param vidPanel the video panel being drawn + * @return the frame number + */ + public int getFrameNumber(VideoPanel vidPanel) { + return n; + } + + } + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + RGBStep step = (RGBStep) obj; + control.setValue("x", step.position.x); //$NON-NLS-1$ + control.setValue("y", step.position.y); //$NON-NLS-1$ + control.setValue("radius", step.radius); //$NON-NLS-1$ + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + // this loader is not intended to be used to create new steps, + // but only for undo/redo step edits. + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + RGBStep step = (RGBStep) obj; + step.setRadius(control.getInt("radius")); //$NON-NLS-1$ + double x = control.getDouble("x"); //$NON-NLS-1$ + double y = control.getDouble("y"); //$NON-NLS-1$ + step.position.setXY(x, y); + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java b/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java index 2b8eb4c3..9acc65b3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java @@ -1,196 +1,196 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; - -import org.opensourcephysics.media.core.*; - -/** - * A ReferenceFrame is an image coordinate system with its origin - * determined by the position of a PointMass. - * - * @author Douglas Brown - */ - -public class ReferenceFrame extends ImageCoordSystem - implements PropertyChangeListener { - - // instance fields - private PointMass originTrack; - private ImageCoordSystem coords; // parent coords - private boolean lockEnabled = false; - private boolean originLocked; - - /** - * Constructs a ReferenceFrame with a default initial length. - * - * @param coords the image coordinate system providing angle and scale data - * @param originTrack the point mass providing origin data - */ - public ReferenceFrame(ImageCoordSystem coords, PointMass originTrack) { - super(coords.getLength()); - setFixedOrigin(false); - setFixedAngle(coords.isFixedAngle()); - setFixedScale(coords.isFixedScale()); - coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - originTrack.addPropertyChangeListener("step", this); //$NON-NLS-1$ - originTrack.addPropertyChangeListener("steps", this); //$NON-NLS-1$ - this.coords = coords; - this.originTrack = originTrack; - for (int n = 0; n < coords.getLength(); n++) { - setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); - setCosineSine(n, coords.getCosine(n), coords.getSine(n)); - } - setOrigins(); - lockEnabled = true; - } - - /** - * Overrides ImageCoordSystem setFixedOrigin method. Origin is never - * fixed for a reference frame. - * - * @param fixed ignored - * @param n the frame number - */ - public void setFixedOrigin(boolean fixed, int n) { - super.setFixedOrigin(false, n); - } - - /** - * Overrides setLocked method. - * - * @param locked true to lock the coordinate system - */ - public void setLocked(boolean locked) { - if (locked) { - originLocked = originTrack.isLocked(); - originTrack.setLocked(true); - } - else { - originTrack.setLocked(originLocked); - } - coords.setLocked(locked); - super.setLocked(locked); - } - - /** - * Overrides isLocked method. - * - * @return true if this is locked - */ - public boolean isLocked() { - return lockEnabled && coords.isLocked(); - } - - /** - * Responds to property change events. ReferenceFrame receives the - * following events: "step" and "mass" from PointMass (origin), and - * "transform" from ImageCoordSystem (angle and scale). - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("step") || name.equals("steps")) // from PointMass //$NON-NLS-1$ //$NON-NLS-2$ - setOrigins(); - else if (name.equals("transform")) { // from ImageCoordSystem //$NON-NLS-1$ - Integer integer = (Integer)e.getNewValue(); - if (integer != null) { - int n = integer.intValue(); - setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); - setCosineSine(n, coords.getCosine(n), coords.getSine(n)); - if (originTrack.isEmpty() && n == 0) setOrigins(); - } - else { - for (int n = 0; n < coords.getLength(); n++) { - setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); - setCosineSine(n, coords.getCosine(n), coords.getSine(n)); - } - if (originTrack.isEmpty()) setOrigins(); - } - } - } - - /** - * Gets the parent image coordinate system. The parent coords are returned - * after setting its angles and scales to match this. - * - * @return the parent image coordinate system - */ - public ImageCoordSystem getCoords() { - coords.removePropertyChangeListener("transform", this); //$NON-NLS-1$ - coords.setFixedAngle(isFixedAngle()); - coords.setFixedScale(isFixedScale()); - for (int n = 0; n < coords.getLength(); n++) { - coords.setScaleXY(n, getScaleX(n), getScaleY(n)); - coords.setCosineSine(n, getCosine(n), getSine(n)); - } - coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - return coords; - } - - /** - * Gets the origin track of this reference frame. - * - * @return the point mass supplying origin data - */ - public PointMass getOriginTrack() { - return originTrack; - } - - /** - * Sets the origins of the image coordinate system. - */ - protected void setOrigins() { - firePropChange = false; - // find starting origin position - double x = coords.getOriginX(0); // in case origin is empty - double y = coords.getOriginY(0); - for (int n = 0; n < coords.getLength(); n++) { - Step step = originTrack.getStep(n); - if (step != null) { - TPoint p = ((PositionStep)step).getPosition(); - x = p.getX(); - y = p.getY(); - break; - } - } - // set coord system origins - for (int n = 0; n < coords.getLength(); n++) { - Step step = originTrack.getStep(n); - if (step != null) { - TPoint p = ((PositionStep)step).getPosition(); - x = p.getX(); - y = p.getY(); - } - setOriginXY(n, x, y); - } - firePropChange = true; - // fire property change for overall updates - support.firePropertyChange("transform", null, null); //$NON-NLS-1$ - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; + +import org.opensourcephysics.media.core.*; + +/** + * A ReferenceFrame is an image coordinate system with its origin + * determined by the position of a PointMass. + * + * @author Douglas Brown + */ + +public class ReferenceFrame extends ImageCoordSystem + implements PropertyChangeListener { + + // instance fields + private PointMass originTrack; + private ImageCoordSystem coords; // parent coords + private boolean lockEnabled = false; + private boolean originLocked; + + /** + * Constructs a ReferenceFrame with a default initial length. + * + * @param coords the image coordinate system providing angle and scale data + * @param originTrack the point mass providing origin data + */ + public ReferenceFrame(ImageCoordSystem coords, PointMass originTrack) { + super(coords.getLength()); + setFixedOrigin(false); + setFixedAngle(coords.isFixedAngle()); + setFixedScale(coords.isFixedScale()); + coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + originTrack.addPropertyChangeListener("step", this); //$NON-NLS-1$ + originTrack.addPropertyChangeListener("steps", this); //$NON-NLS-1$ + this.coords = coords; + this.originTrack = originTrack; + for (int n = 0; n < coords.getLength(); n++) { + setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); + setCosineSine(n, coords.getCosine(n), coords.getSine(n)); + } + setOrigins(); + lockEnabled = true; + } + + /** + * Overrides ImageCoordSystem setFixedOrigin method. Origin is never + * fixed for a reference frame. + * + * @param fixed ignored + * @param n the frame number + */ + public void setFixedOrigin(boolean fixed, int n) { + super.setFixedOrigin(false, n); + } + + /** + * Overrides setLocked method. + * + * @param locked true to lock the coordinate system + */ + public void setLocked(boolean locked) { + if (locked) { + originLocked = originTrack.isLocked(); + originTrack.setLocked(true); + } + else { + originTrack.setLocked(originLocked); + } + coords.setLocked(locked); + super.setLocked(locked); + } + + /** + * Overrides isLocked method. + * + * @return true if this is locked + */ + public boolean isLocked() { + return lockEnabled && coords.isLocked(); + } + + /** + * Responds to property change events. ReferenceFrame receives the + * following events: "step" and "mass" from PointMass (origin), and + * "transform" from ImageCoordSystem (angle and scale). + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("step") || name.equals("steps")) // from PointMass //$NON-NLS-1$ //$NON-NLS-2$ + setOrigins(); + else if (name.equals("transform")) { // from ImageCoordSystem //$NON-NLS-1$ + Integer integer = (Integer)e.getNewValue(); + if (integer != null) { + int n = integer.intValue(); + setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); + setCosineSine(n, coords.getCosine(n), coords.getSine(n)); + if (originTrack.isEmpty() && n == 0) setOrigins(); + } + else { + for (int n = 0; n < coords.getLength(); n++) { + setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); + setCosineSine(n, coords.getCosine(n), coords.getSine(n)); + } + if (originTrack.isEmpty()) setOrigins(); + } + } + } + + /** + * Gets the parent image coordinate system. The parent coords are returned + * after setting its angles and scales to match this. + * + * @return the parent image coordinate system + */ + public ImageCoordSystem getCoords() { + coords.removePropertyChangeListener("transform", this); //$NON-NLS-1$ + coords.setFixedAngle(isFixedAngle()); + coords.setFixedScale(isFixedScale()); + for (int n = 0; n < coords.getLength(); n++) { + coords.setScaleXY(n, getScaleX(n), getScaleY(n)); + coords.setCosineSine(n, getCosine(n), getSine(n)); + } + coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + return coords; + } + + /** + * Gets the origin track of this reference frame. + * + * @return the point mass supplying origin data + */ + public PointMass getOriginTrack() { + return originTrack; + } + + /** + * Sets the origins of the image coordinate system. + */ + protected void setOrigins() { + firePropChange = false; + // find starting origin position + double x = coords.getOriginX(0); // in case origin is empty + double y = coords.getOriginY(0); + for (int n = 0; n < coords.getLength(); n++) { + Step step = originTrack.getStep(n); + if (step != null) { + TPoint p = ((PositionStep)step).getPosition(); + x = p.getX(); + y = p.getY(); + break; + } + } + // set coord system origins + for (int n = 0; n < coords.getLength(); n++) { + Step step = originTrack.getStep(n); + if (step != null) { + TPoint p = ((PositionStep)step).getPosition(); + x = p.getX(); + y = p.getY(); + } + setOriginXY(n, x, y); + } + firePropChange = true; + // fire property change for overall updates + support.firePropertyChange("transform", null, null); //$NON-NLS-1$ + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java b/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java index 0bb82e09..c4619f0f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java @@ -1,128 +1,128 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -/** - * This implements an algorithm for finding a second derivative. - * - * Derivation of the 5-point algorithm: - * 1. Find least-square fit of parabola y = a + b*x + c*x^2. - * 2. Use eqn 3-86 from Parratt's Probability and Experimental Errors in Science (1961) to find best fit parameters. - * 3. Use n = 5 so the values of x are -2 thru +2 (units of delta_t), y are corresponding positions. - * 4. Plug in to obtain c = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2])/14. - * 5. Use derivative expressions y' = b + 2cx and y'' = 2c, and scale y'' by dt^2. - * 6. Final result is accel[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2])/(7*dt^2). - * - * Other possible 5-point expressions (finite difference equations)--not used since more sensitive to noisy data(?): - * 1. accel[i] = (x[i+2] - 2*x[i] + x[i-2]) / (4*dt^2) - * 2. accel[i] = (-x[i+2] +16*x[i+1] - 30*x[i] +16*x[i-1] - x[i-2]) / (12*dt^2) - * - * @author Douglas Brown - */ -public class SecondDerivative implements Derivative { - - // instance fields - private int spill, start, step, count; - private double[] xDeriv, yDeriv = new double[0]; - private Object[] result = new Object[4]; - - /** - * Evaluates the derivative. - * - * Input data: - * data[0] = parameters (int[] {spill, start, stepsize, count}) - * data[1] = xData (double[]) - * data[2] = yData (double[]) - * data[3] = validData (boolean[]) - * - * Returned result: - * result[0] = null - * result[1] = null - * result[2] = xDeriv (double[]) (invalid values are NaN) - * result[3] = yDeriv (double[]) (invalid values are NaN) - * - * @param data the input data - * @return Object[] the result - */ - public Object[] evaluate(Object[] data) { - int[] params = (int[])data[0]; - spill = params[0]; - start = params[1]; - step = params[2]; - count = params[3]; - double[] x = (double[])data[1]; - double[] y = (double[])data[2]; - boolean[] valid = (boolean[])data[3]; - if (yDeriv.length != x.length) { - result[2] = xDeriv = new double[x.length]; - result[3] = yDeriv = new double[x.length]; - } - - // get upper and lower index checking limits - int lower = start; - int upper = Math.min(start + step*(count-1), x.length); - - // find a at each step index from lower to upper - outer: - for (int i = lower; i <= upper; i+=step) { - - // derivative at i will be valid only if all step positions - // between i-spill*step and i+spill*step are valid - for (int j = i - spill*step; j <= i + spill*step; j+=step) { - if (j < 0 || j >= valid.length || !valid[j]) - if (j < 0 || j >= valid.length || !valid[j]) { - if (i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +/** + * This implements an algorithm for finding a second derivative. + * + * Derivation of the 5-point algorithm: + * 1. Find least-square fit of parabola y = a + b*x + c*x^2. + * 2. Use eqn 3-86 from Parratt's Probability and Experimental Errors in Science (1961) to find best fit parameters. + * 3. Use n = 5 so the values of x are -2 thru +2 (units of delta_t), y are corresponding positions. + * 4. Plug in to obtain c = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2])/14. + * 5. Use derivative expressions y' = b + 2cx and y'' = 2c, and scale y'' by dt^2. + * 6. Final result is accel[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2])/(7*dt^2). + * + * Other possible 5-point expressions (finite difference equations)--not used since more sensitive to noisy data(?): + * 1. accel[i] = (x[i+2] - 2*x[i] + x[i-2]) / (4*dt^2) + * 2. accel[i] = (-x[i+2] +16*x[i+1] - 30*x[i] +16*x[i-1] - x[i-2]) / (12*dt^2) + * + * @author Douglas Brown + */ +public class SecondDerivative implements Derivative { + + // instance fields + private int spill, start, step, count; + private double[] xDeriv, yDeriv = new double[0]; + private Object[] result = new Object[4]; + + /** + * Evaluates the derivative. + * + * Input data: + * data[0] = parameters (int[] {spill, start, stepsize, count}) + * data[1] = xData (double[]) + * data[2] = yData (double[]) + * data[3] = validData (boolean[]) + * + * Returned result: + * result[0] = null + * result[1] = null + * result[2] = xDeriv (double[]) (invalid values are NaN) + * result[3] = yDeriv (double[]) (invalid values are NaN) + * + * @param data the input data + * @return Object[] the result + */ + public Object[] evaluate(Object[] data) { + int[] params = (int[])data[0]; + spill = params[0]; + start = params[1]; + step = params[2]; + count = params[3]; + double[] x = (double[])data[1]; + double[] y = (double[])data[2]; + boolean[] valid = (boolean[])data[3]; + if (yDeriv.length != x.length) { + result[2] = xDeriv = new double[x.length]; + result[3] = yDeriv = new double[x.length]; + } + + // get upper and lower index checking limits + int lower = start; + int upper = Math.min(start + step*(count-1), x.length); + + // find a at each step index from lower to upper + outer: + for (int i = lower; i <= upper; i+=step) { + + // derivative at i will be valid only if all step positions + // between i-spill*step and i+spill*step are valid + for (int j = i - spill*step; j <= i + spill*step; j+=step) { + if (j < 0 || j >= valid.length || !valid[j]) + if (j < 0 || j >= valid.length || !valid[j]) { + if (i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.*; -import javax.swing.*; - -/** - * This Icon centers and fills the shape specified in its constructor. - * - * @author Douglas Brown - */ -public class ShapeIcon implements Icon { - - // instance fields - private int w; - private int h; - private Shape shape; - private Shape decoration; - private Color color = Color.black; - private Color decoColor = Color.black; - private double offsetX; // centers the shape horizontally - private double offsetY; // centers the shape vertically - - /** - * Constructs a ShapeIcon. - * - * @param shape the shape to draw - * @param decoration a decorating shape to draw - * @param width width of the icon - * @param height height of the icon - */ - public ShapeIcon(Shape shape, Shape decoration, int width, int height) { - w = width; - h = height; - this.shape = shape; - this.decoration = decoration; - Rectangle rect = shape==null? new Rectangle(): shape.getBounds(); - if (decoration!=null) - rect = rect.union(decoration.getBounds()); - offsetX = w/2 - rect.width/2 - rect.x; - offsetY = h/2 - rect.height/2 - rect.y; - } - - /** - * Constructs a ShapeIcon. - * - * @param shape the shape to draw - * @param width width of the icon - * @param height height of the icon - */ - public ShapeIcon(Shape shape, int width, int height) { - this(shape, null, width, height); - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = color; - } - - /** - * Sets the colors. - * - * @param color the desired color - * @param decorationColor the desired decoration color - */ - public void setColor(Color color, Color decorationColor) { - this.color = color; - decoColor = decorationColor; - } - - /** - * Gets the icon width. - * - * @return the icon width - */ - public int getIconWidth() { - return w; - } - - /** - * Gets the icon height. - * - * @return the icon height - */ - public int getIconHeight() { - return h; - } - - /** - * Paints the icon. - * - * @param c the component on which it is painted - * @param _g the graphics context - * @param x the x coordinate of the icon - * @param y the y coordinate of the icon - */ - public void paintIcon(Component c, Graphics _g, int x, int y) { - Graphics2D g = (Graphics2D)_g; - AffineTransform at = AffineTransform.getTranslateInstance( - x + offsetX, y + offsetY); - - // save current graphics paint and clip - Paint gPaint = g.getPaint(); - Shape gClip = g.getClip(); - - // render shape(s) - g.setPaint(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.clipRect(x, y, w, h); - - // paint shape, if any - if (shape!=null) { - g.fill(at.createTransformedShape(shape)); - } - - // paint decoration, if any - if (decoration != null) { - g.setPaint(decoColor); - g.fill(at.createTransformedShape(decoration)); - } - // restore graphics paint and clip - g.setPaint(gPaint); - g.setClip(gClip); - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.*; +import javax.swing.*; + +/** + * This Icon centers and fills the shape specified in its constructor. + * + * @author Douglas Brown + */ +public class ShapeIcon implements Icon { + + // instance fields + private int w; + private int h; + private Shape shape; + private Shape decoration; + private Color color = Color.black; + private Color decoColor = Color.black; + private double offsetX; // centers the shape horizontally + private double offsetY; // centers the shape vertically + + /** + * Constructs a ShapeIcon. + * + * @param shape the shape to draw + * @param decoration a decorating shape to draw + * @param width width of the icon + * @param height height of the icon + */ + public ShapeIcon(Shape shape, Shape decoration, int width, int height) { + w = width; + h = height; + this.shape = shape; + this.decoration = decoration; + Rectangle rect = shape==null? new Rectangle(): shape.getBounds(); + if (decoration!=null) + rect = rect.union(decoration.getBounds()); + offsetX = w/2 - rect.width/2 - rect.x; + offsetY = h/2 - rect.height/2 - rect.y; + } + + /** + * Constructs a ShapeIcon. + * + * @param shape the shape to draw + * @param width width of the icon + * @param height height of the icon + */ + public ShapeIcon(Shape shape, int width, int height) { + this(shape, null, width, height); + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = color; + } + + /** + * Sets the colors. + * + * @param color the desired color + * @param decorationColor the desired decoration color + */ + public void setColor(Color color, Color decorationColor) { + this.color = color; + decoColor = decorationColor; + } + + /** + * Gets the icon width. + * + * @return the icon width + */ + public int getIconWidth() { + return w; + } + + /** + * Gets the icon height. + * + * @return the icon height + */ + public int getIconHeight() { + return h; + } + + /** + * Paints the icon. + * + * @param c the component on which it is painted + * @param _g the graphics context + * @param x the x coordinate of the icon + * @param y the y coordinate of the icon + */ + public void paintIcon(Component c, Graphics _g, int x, int y) { + Graphics2D g = (Graphics2D)_g; + AffineTransform at = AffineTransform.getTranslateInstance( + x + offsetX, y + offsetY); + + // save current graphics paint and clip + Paint gPaint = g.getPaint(); + Shape gClip = g.getClip(); + + // render shape(s) + g.setPaint(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.clipRect(x, y, w, h); + + // paint shape, if any + if (shape!=null) { + g.fill(at.createTransformedShape(shape)); + } + + // paint decoration, if any + if (decoration != null) { + g.setPaint(decoColor); + g.fill(at.createTransformedShape(decoration)); + } + // restore graphics paint and clip + g.setPaint(gPaint); + g.setClip(gClip); + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/SpectralLineFilter.java b/src/org/opensourcephysics/cabrillo/tracker/SpectralLineFilter.java index 453e4ff7..b70c7ed5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/SpectralLineFilter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/SpectralLineFilter.java @@ -1,344 +1,344 @@ -/* - * The org.opensourcephysics.media package defines the Open Source Physics - * media framework for working with video and other media. - * - * Copyright (c) 2004 Douglas Brown and Wolfgang Christian. - * - * This 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 software 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; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at http://www.gnu.org/copyleft/gpl.html - * - * For additional information and documentation on Open Source Physics, - * please see . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; - -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.*; -import java.awt.image.*; -import javax.swing.*; - -import org.opensourcephysics.controls.*; -import org.opensourcephysics.media.core.*; - -/** - * This is a Filter that draws gas spectral lines on the source image. - * - * @author Douglas Brown - * @version 1.0 - */ -public class SpectralLineFilter extends Filter - implements PropertyChangeListener { - - // static fields - private static Map filters - = new HashMap(); - - // instance fields - private BufferedImage source, output; - private int[] pixels; - private int w, h; - private Graphics2D g; -// private TrackerPanel trackerPanel; - protected TPoint end1, end2; - protected Line2D line = new Line2D.Double(); - protected Color color = Color.white; - protected BasicStroke stroke = new BasicStroke(); - protected Collection wavelengths = new ArrayList(); - private Inspector inspector; - - /** - * Constructs a SpectralLineFilter object. - */ - public SpectralLineFilter() { - end1 = new TPoint(); - end2 = new TPoint(); - setWavelengths(1); // Hydrogen by default - hasInspector = true; - } - - /** - * Sets the tracker panel whose coords determine where the lines are drawn. - * - * @param panel a tracker panel - */ - public void setTrackerPanel(TrackerPanel panel) { - if (vidPanel != null) - vidPanel.removePropertyChangeListener("transform", this); //$NON-NLS-1$ - vidPanel = panel; - vidPanel.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - getInspector().setVisible(true); - } - - /** - * Applies the filter to a source image and returns the result. - * - * @param sourceImage the source image - * @return the filtered image - */ - public BufferedImage getFilteredImage(BufferedImage sourceImage) { - if (!isEnabled()) return sourceImage; - if (sourceImage != source) initialize(sourceImage); - drawLines(); - return output; - } - - /** - * Implements abstract Filter method. - * - * @return the inspector - */ - public JDialog getInspector() { - if (inspector == null) inspector = new Inspector(); - if (inspector.isModal() && vidPanel != null) { - Frame f = JOptionPane.getFrameForComponent(vidPanel); - if (frame != f) { - frame = f; - inspector = new Inspector(); - } - } - return inspector; - } - - /** - * Responds to property change events. Implements PropertyChangeListener. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - // fires "image" property change event whenever the coords change - support.firePropertyChange("image", null, null); //$NON-NLS-1$ - } - - /** - * Gets the spectral line filter for the specified tracker panel. - * - * @param panel a tracker panel - * @return the filter - */ - public static SpectralLineFilter getFilter(TrackerPanel panel) { - SpectralLineFilter filter = filters.get(panel); - if (filter == null) { - filter = new SpectralLineFilter(); - filter.setTrackerPanel(panel); - filters.put(panel, filter); - } - return filter; - } - -//_____________________________ private methods _______________________ - - /** - * Initializes the image. - * - * @param image a new source image - */ - private void initialize(BufferedImage image) { - source = image; // assumes image is TYPE_INT_RGB - w = source.getWidth(); - h = source.getHeight(); - output = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); - g = output.createGraphics(); - g.setPaint(color); - pixels = new int[w * h]; - } - - /** - * Draws the lines on the image. - */ - private void drawLines() { - if (vidPanel == null) return; - source.getRaster().getDataElements(0, 0, w, h, pixels); - output.getRaster().setDataElements(0, 0, w, h, pixels); - int n = vidPanel.getFrameNumber(); - AffineTransform transform = vidPanel.getCoords().getToImageTransform(n); - Iterator it = wavelengths.iterator(); - while (it.hasNext()) { - double lambda = it.next().doubleValue(); - end1.setXY(lambda, -200); - transform.transform(end1, end1); - end2.setXY(lambda, 200); - transform.transform(end2, end2); - line.setLine(end1, end2); - Shape shape = stroke.createStrokedShape(line); - g.fill(shape); - } - } - - /** - * Sets the spectral line wavelengths for a specified element. - * - * @param element the atomic number of the element - */ - private void setWavelengths(int element) { - wavelengths.clear(); - switch(element) { - case 1: // Hydrogen - wavelengths.add(new Double(410.2)); - wavelengths.add(new Double(434.1)); - wavelengths.add(new Double(486.1)); - wavelengths.add(new Double(656.3)); - break; - case 2: // Helium - wavelengths.add(new Double(447.1)); - wavelengths.add(new Double(471.3)); - wavelengths.add(new Double(492.2)); - wavelengths.add(new Double(501.6)); - wavelengths.add(new Double(587.6)); - wavelengths.add(new Double(667.8)); - wavelengths.add(new Double(706)); - break; - case 10: // Neon - wavelengths.add(new Double(540.1)); - wavelengths.add(new Double(585.2)); - wavelengths.add(new Double(588.2)); - wavelengths.add(new Double(603.0)); - wavelengths.add(new Double(607.4)); - wavelengths.add(new Double(616.4)); - wavelengths.add(new Double(621.7)); - wavelengths.add(new Double(626.6)); - wavelengths.add(new Double(633.4)); - wavelengths.add(new Double(638.3)); - wavelengths.add(new Double(640.2)); - wavelengths.add(new Double(650.6)); - wavelengths.add(new Double(659.9)); - wavelengths.add(new Double(692.9)); - wavelengths.add(new Double(703.2)); - break; - case 80: // Mercury - wavelengths.add(new Double(435.8)); - wavelengths.add(new Double(546.1)); - wavelengths.add(new Double(577.0)); - wavelengths.add(new Double(579.1)); - wavelengths.add(new Double(404.7)); - wavelengths.add(new Double(407.8)); - wavelengths.add(new Double(491.6)); - break; - } - support.firePropertyChange("image", null, null); //$NON-NLS-1$ - } - - /** - * Inner Inspector class to control filter parameters - */ - private class Inspector extends JDialog { - - /** - * Constructs the Inspector. - */ - public Inspector() { - super(frame, !(frame instanceof org.opensourcephysics.display.OSPFrame)); - setTitle(TrackerRes.getString("SpectralLineFilter.Title")); //$NON-NLS-1$ - setResizable(false); - setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); - addComponentListener(new ComponentAdapter() { - public void componentShown(ComponentEvent e) { - SpectralLineFilter.this.setEnabled(true); - } - public void componentHidden(ComponentEvent e) { - SpectralLineFilter.this.setEnabled(false); - } - }); - createGUI(); - pack(); - } - - /** - * Creates the visible components. - */ - void createGUI() { - // create dropdown - final JComboBox dropdown = new JComboBox(); - Object item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.H"), 1); //$NON-NLS-1$ - dropdown.addItem(item); - item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.He"), 2); //$NON-NLS-1$ - dropdown.addItem(item); - item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.Ne"), 10); //$NON-NLS-1$ - dropdown.addItem(item); - item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.Hg"), 80); //$NON-NLS-1$ - dropdown.addItem(item); - dropdown.setSelectedIndex(0); - dropdown.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ChemicalElement element = (ChemicalElement)dropdown.getSelectedItem(); - setWavelengths(element.z); - } - }); - // add components to content pane - JPanel buttonbar = new JPanel(new FlowLayout()); - setContentPane(buttonbar); - buttonbar.add(dropdown); - } - - class ChemicalElement { - String name; - int z; - ChemicalElement(String element, int atomicNumber) { - name = element; - z = atomicNumber; - } - public String toString() { - return name; - } - } - } - - /** - * Returns an XML.ObjectLoader to save and load filter data. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load filter data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves data to an XMLControl. - * - * @param control the control to save to - * @param obj the filter to save - */ - public void saveObject(XMLControl control, Object obj) {/** not yet implemented */} - - /** - * Creates a new filter. - * - * @param control the control - * @return the new filter - */ - public Object createObject(XMLControl control) { - return new SpectralLineFilter(); - } - - /** - * Loads a filter with data from an XMLControl. - * - * @param control the control - * @param obj the filter - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - return obj; - } - } -} +/* + * The org.opensourcephysics.media package defines the Open Source Physics + * media framework for working with video and other media. + * + * Copyright (c) 2004 Douglas Brown and Wolfgang Christian. + * + * This 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 software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * For additional information and documentation on Open Source Physics, + * please see . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; + +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; +import java.awt.image.*; +import javax.swing.*; + +import org.opensourcephysics.controls.*; +import org.opensourcephysics.media.core.*; + +/** + * This is a Filter that draws gas spectral lines on the source image. + * + * @author Douglas Brown + * @version 1.0 + */ +public class SpectralLineFilter extends Filter + implements PropertyChangeListener { + + // static fields + private static Map filters + = new HashMap(); + + // instance fields + private BufferedImage source, output; + private int[] pixels; + private int w, h; + private Graphics2D g; +// private TrackerPanel trackerPanel; + protected TPoint end1, end2; + protected Line2D line = new Line2D.Double(); + protected Color color = Color.white; + protected BasicStroke stroke = new BasicStroke(); + protected Collection wavelengths = new ArrayList(); + private Inspector inspector; + + /** + * Constructs a SpectralLineFilter object. + */ + public SpectralLineFilter() { + end1 = new TPoint(); + end2 = new TPoint(); + setWavelengths(1); // Hydrogen by default + hasInspector = true; + } + + /** + * Sets the tracker panel whose coords determine where the lines are drawn. + * + * @param panel a tracker panel + */ + public void setTrackerPanel(TrackerPanel panel) { + if (vidPanel != null) + vidPanel.removePropertyChangeListener("transform", this); //$NON-NLS-1$ + vidPanel = panel; + vidPanel.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + getInspector().setVisible(true); + } + + /** + * Applies the filter to a source image and returns the result. + * + * @param sourceImage the source image + * @return the filtered image + */ + public BufferedImage getFilteredImage(BufferedImage sourceImage) { + if (!isEnabled()) return sourceImage; + if (sourceImage != source) initialize(sourceImage); + drawLines(); + return output; + } + + /** + * Implements abstract Filter method. + * + * @return the inspector + */ + public JDialog getInspector() { + if (inspector == null) inspector = new Inspector(); + if (inspector.isModal() && vidPanel != null) { + Frame f = JOptionPane.getFrameForComponent(vidPanel); + if (frame != f) { + frame = f; + inspector = new Inspector(); + } + } + return inspector; + } + + /** + * Responds to property change events. Implements PropertyChangeListener. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + // fires "image" property change event whenever the coords change + support.firePropertyChange("image", null, null); //$NON-NLS-1$ + } + + /** + * Gets the spectral line filter for the specified tracker panel. + * + * @param panel a tracker panel + * @return the filter + */ + public static SpectralLineFilter getFilter(TrackerPanel panel) { + SpectralLineFilter filter = filters.get(panel); + if (filter == null) { + filter = new SpectralLineFilter(); + filter.setTrackerPanel(panel); + filters.put(panel, filter); + } + return filter; + } + +//_____________________________ private methods _______________________ + + /** + * Initializes the image. + * + * @param image a new source image + */ + private void initialize(BufferedImage image) { + source = image; // assumes image is TYPE_INT_RGB + w = source.getWidth(); + h = source.getHeight(); + output = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); + g = output.createGraphics(); + g.setPaint(color); + pixels = new int[w * h]; + } + + /** + * Draws the lines on the image. + */ + private void drawLines() { + if (vidPanel == null) return; + source.getRaster().getDataElements(0, 0, w, h, pixels); + output.getRaster().setDataElements(0, 0, w, h, pixels); + int n = vidPanel.getFrameNumber(); + AffineTransform transform = vidPanel.getCoords().getToImageTransform(n); + Iterator it = wavelengths.iterator(); + while (it.hasNext()) { + double lambda = it.next().doubleValue(); + end1.setXY(lambda, -200); + transform.transform(end1, end1); + end2.setXY(lambda, 200); + transform.transform(end2, end2); + line.setLine(end1, end2); + Shape shape = stroke.createStrokedShape(line); + g.fill(shape); + } + } + + /** + * Sets the spectral line wavelengths for a specified element. + * + * @param element the atomic number of the element + */ + private void setWavelengths(int element) { + wavelengths.clear(); + switch(element) { + case 1: // Hydrogen + wavelengths.add(new Double(410.2)); + wavelengths.add(new Double(434.1)); + wavelengths.add(new Double(486.1)); + wavelengths.add(new Double(656.3)); + break; + case 2: // Helium + wavelengths.add(new Double(447.1)); + wavelengths.add(new Double(471.3)); + wavelengths.add(new Double(492.2)); + wavelengths.add(new Double(501.6)); + wavelengths.add(new Double(587.6)); + wavelengths.add(new Double(667.8)); + wavelengths.add(new Double(706)); + break; + case 10: // Neon + wavelengths.add(new Double(540.1)); + wavelengths.add(new Double(585.2)); + wavelengths.add(new Double(588.2)); + wavelengths.add(new Double(603.0)); + wavelengths.add(new Double(607.4)); + wavelengths.add(new Double(616.4)); + wavelengths.add(new Double(621.7)); + wavelengths.add(new Double(626.6)); + wavelengths.add(new Double(633.4)); + wavelengths.add(new Double(638.3)); + wavelengths.add(new Double(640.2)); + wavelengths.add(new Double(650.6)); + wavelengths.add(new Double(659.9)); + wavelengths.add(new Double(692.9)); + wavelengths.add(new Double(703.2)); + break; + case 80: // Mercury + wavelengths.add(new Double(435.8)); + wavelengths.add(new Double(546.1)); + wavelengths.add(new Double(577.0)); + wavelengths.add(new Double(579.1)); + wavelengths.add(new Double(404.7)); + wavelengths.add(new Double(407.8)); + wavelengths.add(new Double(491.6)); + break; + } + support.firePropertyChange("image", null, null); //$NON-NLS-1$ + } + + /** + * Inner Inspector class to control filter parameters + */ + private class Inspector extends JDialog { + + /** + * Constructs the Inspector. + */ + public Inspector() { + super(frame, !(frame instanceof org.opensourcephysics.display.OSPFrame)); + setTitle(TrackerRes.getString("SpectralLineFilter.Title")); //$NON-NLS-1$ + setResizable(false); + setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE); + addComponentListener(new ComponentAdapter() { + public void componentShown(ComponentEvent e) { + SpectralLineFilter.this.setEnabled(true); + } + public void componentHidden(ComponentEvent e) { + SpectralLineFilter.this.setEnabled(false); + } + }); + createGUI(); + pack(); + } + + /** + * Creates the visible components. + */ + void createGUI() { + // create dropdown + final JComboBox dropdown = new JComboBox(); + Object item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.H"), 1); //$NON-NLS-1$ + dropdown.addItem(item); + item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.He"), 2); //$NON-NLS-1$ + dropdown.addItem(item); + item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.Ne"), 10); //$NON-NLS-1$ + dropdown.addItem(item); + item = new ChemicalElement(TrackerRes.getString("SpectralLineFilter.Hg"), 80); //$NON-NLS-1$ + dropdown.addItem(item); + dropdown.setSelectedIndex(0); + dropdown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ChemicalElement element = (ChemicalElement)dropdown.getSelectedItem(); + setWavelengths(element.z); + } + }); + // add components to content pane + JPanel buttonbar = new JPanel(new FlowLayout()); + setContentPane(buttonbar); + buttonbar.add(dropdown); + } + + class ChemicalElement { + String name; + int z; + ChemicalElement(String element, int atomicNumber) { + name = element; + z = atomicNumber; + } + public String toString() { + return name; + } + } + } + + /** + * Returns an XML.ObjectLoader to save and load filter data. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load filter data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves data to an XMLControl. + * + * @param control the control to save to + * @param obj the filter to save + */ + public void saveObject(XMLControl control, Object obj) {/** not yet implemented */} + + /** + * Creates a new filter. + * + * @param control the control + * @return the new filter + */ + public Object createObject(XMLControl control) { + return new SpectralLineFilter(); + } + + /** + * Loads a filter with data from an XMLControl. + * + * @param control the control + * @param obj the filter + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + return obj; + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/StepSet.java b/src/org/opensourcephysics/cabrillo/tracker/StepSet.java index 0887edba..b955eaa5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/StepSet.java +++ b/src/org/opensourcephysics/cabrillo/tracker/StepSet.java @@ -1,189 +1,189 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.HashSet; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.controls.XMLControlElement; - -/** - * A StepSet is a HashSet of Steps that can be saved in an XMLControl. - * - * @author Douglas Brown - */ -public class StepSet extends HashSet { - - TrackerPanel trackerPanel; - boolean changed; - XMLControl undoControl; - - /** - * Constructs a StepSet. - * - * @param panel the TrackerPanel that draws the Steps - */ - public StepSet(TrackerPanel panel) { - trackerPanel = panel; - } - - /** - * Adds a step to this set. - * - * @param step the step to add - */ - @Override - public boolean add(Step step) { - if(!(step instanceof PositionStep)) return false; - boolean added = super.add(step); - if (added) setChanged(false); // triggers creation of new undo XMLControl - return added; - } - - /** - * Removes a step from this set. - * - * @param step the step to remove - */ - @Override - public boolean remove(Object step) { - if(!(step instanceof PositionStep)) return false; - boolean removed = super.remove(step); - if (removed) setChanged(false); // triggers creation of new undo XMLControl - return removed; - } - - /** - * Sets the changed property. When true, the steps in this set have been changed. - * The first time this is called on an "unchanged" set a new XMLControl is created - * that defines the Undo state for the set prior to changing. - * - * @param changed true if changed - */ - public void setChanged(boolean changed) { - // when changed for the first time, save state - if (changed && !this.changed) { - undoControl = new XMLControlElement(this); - } - this.changed = changed; - } - - /** - * Gets the changed property. When true, the steps in this set have been changed. - * - * @return true if changed - */ - public boolean isChanged() { - return changed; - } - - /** - * Gets the XMLControl that defines the Undo state for this set. - * - * @return the undo XMLControl - */ - public XMLControl getUndoControl() { - return undoControl; - } - - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - StepSet steps = (StepSet) obj; - // assemble array of String[3]: each element is {track name, frame number, xml step state} - String[][] stepsData = new String[steps.size()][3]; - int i = 0; - for (Step step: steps) { - String xml = new XMLControlElement(step).toXML(); - String[] data = {step.getTrack().getName(), String.valueOf(step.getFrameNumber()), xml}; - stepsData[i++] = data; - } - control.setValue("steps", stepsData); //$NON-NLS-1$ - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - // this loader is not intended to be used to create new steps, - // but only for undo/redo stepset edits. - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - StepSet steps = (StepSet) obj; - String[][] stepsData = (String[][])control.getObject("steps"); //$NON-NLS-1$ - TrackerPanel panel = steps.trackerPanel; - for (String[] next: stepsData) { - TTrack track = panel.getTrack(next[0]); - if (track!=null) { - int n = Integer.parseInt(next[1]); - Step step = track.getStep(n); - if (step!=null) { - String xml = next[2]; - if(xml.indexOf(XML.CDATA_PRE)!=-1) { - xml = xml.substring(xml.indexOf(XML.CDATA_PRE)+XML.CDATA_PRE.length(), xml.indexOf(XML.CDATA_POST)); - } - XMLControl stepControl = new XMLControlElement(xml); - stepControl.loadObject(step); - step.erase(); - } - } - } - return obj; - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.HashSet; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLControlElement; + +/** + * A StepSet is a HashSet of Steps that can be saved in an XMLControl. + * + * @author Douglas Brown + */ +public class StepSet extends HashSet { + + TrackerPanel trackerPanel; + boolean changed; + XMLControl undoControl; + + /** + * Constructs a StepSet. + * + * @param panel the TrackerPanel that draws the Steps + */ + public StepSet(TrackerPanel panel) { + trackerPanel = panel; + } + + /** + * Adds a step to this set. + * + * @param step the step to add + */ + @Override + public boolean add(Step step) { + if(!(step instanceof PositionStep)) return false; + boolean added = super.add(step); + if (added) setChanged(false); // triggers creation of new undo XMLControl + return added; + } + + /** + * Removes a step from this set. + * + * @param step the step to remove + */ + @Override + public boolean remove(Object step) { + if(!(step instanceof PositionStep)) return false; + boolean removed = super.remove(step); + if (removed) setChanged(false); // triggers creation of new undo XMLControl + return removed; + } + + /** + * Sets the changed property. When true, the steps in this set have been changed. + * The first time this is called on an "unchanged" set a new XMLControl is created + * that defines the Undo state for the set prior to changing. + * + * @param changed true if changed + */ + public void setChanged(boolean changed) { + // when changed for the first time, save state + if (changed && !this.changed) { + undoControl = new XMLControlElement(this); + } + this.changed = changed; + } + + /** + * Gets the changed property. When true, the steps in this set have been changed. + * + * @return true if changed + */ + public boolean isChanged() { + return changed; + } + + /** + * Gets the XMLControl that defines the Undo state for this set. + * + * @return the undo XMLControl + */ + public XMLControl getUndoControl() { + return undoControl; + } + + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + StepSet steps = (StepSet) obj; + // assemble array of String[3]: each element is {track name, frame number, xml step state} + String[][] stepsData = new String[steps.size()][3]; + int i = 0; + for (Step step: steps) { + String xml = new XMLControlElement(step).toXML(); + String[] data = {step.getTrack().getName(), String.valueOf(step.getFrameNumber()), xml}; + stepsData[i++] = data; + } + control.setValue("steps", stepsData); //$NON-NLS-1$ + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + // this loader is not intended to be used to create new steps, + // but only for undo/redo stepset edits. + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + StepSet steps = (StepSet) obj; + String[][] stepsData = (String[][])control.getObject("steps"); //$NON-NLS-1$ + TrackerPanel panel = steps.trackerPanel; + for (String[] next: stepsData) { + TTrack track = panel.getTrack(next[0]); + if (track!=null) { + int n = Integer.parseInt(next[1]); + Step step = track.getStep(n); + if (step!=null) { + String xml = next[2]; + if(xml.indexOf(XML.CDATA_PRE)!=-1) { + xml = xml.substring(xml.indexOf(XML.CDATA_PRE)+XML.CDATA_PRE.length(), xml.indexOf(XML.CDATA_POST)); + } + XMLControl stepControl = new XMLControlElement(xml); + stepControl.loadObject(step); + step.erase(); + } + } + } + return obj; + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TButton.java b/src/org/opensourcephysics/cabrillo/tracker/TButton.java index 421abfce..990fdc3a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TButton.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TButton.java @@ -1,222 +1,222 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.event.*; - -import javax.swing.*; - -import org.opensourcephysics.tools.FontSizer; - -/** - * A button based on VideoPlayer.PlayerButton that is used throughout Tracker. - * - * @author Douglas Brown - */ -public class TButton extends JButton { - - protected TTrack track; - private boolean hidePopup = false; - private JPopupMenu popup; - private Icon onIcon, offIcon; - - /** - * Constructs a TButton. - */ - public TButton() { - setOpaque(false); - setBorderPainted(false); - addMouseListener(new MouseAdapter() { - public void mouseEntered(MouseEvent e) { - setBorderPainted(true); - hidePopup = popup!=null && popup.isVisible(); - if (Tracker.showHints && track!=null && track.trackerPanel!=null) { - if (track.trackerPanel.getSelectedTrack() == track) - track.trackerPanel.setMessage(track.getMessage()); - else { - String s = track.getClass().getSimpleName()+" " //$NON-NLS-1$ - + track.getName() + " (" //$NON-NLS-1$ - + TrackerRes.getString("TTrack.Unselected.Hint")+")"; //$NON-NLS-1$ //$NON-NLS-2$ - track.trackerPanel.setMessage(s); - } - } - } - - public void mouseExited(MouseEvent e) { - setBorderPainted(false); - } - - public void mousePressed(MouseEvent e) { - if (track!=null && track.trackerPanel!=null - && track != track.trackerPanel.getSelectedTrack()) { - track.trackerPanel.setSelectedTrack(track); - track.trackerPanel.setSelectedPoint(null); - hidePopup = true; - } - } - - public void mouseClicked(MouseEvent e) { - popup = getPopup(); - if (popup!=null) { - if (e.getClickCount()==2) - hidePopup = false; - if (hidePopup) { - hidePopup = false; - popup.setVisible(false); - } - else { - hidePopup = true; - popup.show(TButton.this, 0, TButton.this.getHeight()); - } - } - } - }); - } - - /** - * Constructs an icon-only TButton with an AbstractAction. - * - * @param action the AbstractAction - */ - public TButton(AbstractAction action) { - this(); - addActionListener(action); - setIcon((Icon)action.getValue(Action.SMALL_ICON)); - } - - /** - * Constructs a TButton with a TTrack. - * - * @param track the track - */ - public TButton(TTrack track) { - this(); - setTrack(track); - } - - /** - * Constructs a TButton with an Icon. - * - * @param icon the icon - */ - public TButton(Icon icon) { - this(); - setIcon(icon); - } - - /** - * Constructs a TButton with icons for selected and unselected states. - * - * @param off the unselected state icon - * @param on the selected state icon - */ - public TButton(Icon off, Icon on) { - this(); - setIcons(off, on); - } - - /** - * Sets the icon. Overrides JButton method. - * - * @param icon the icon - */ - public void setIcon(Icon icon) { - super.setIcon(icon); - setSelectedIcon(icon); -// setRolloverSelectedIcon(icon); - } - - /** - * Sets the icons for selected and unselected states. - * - * @param off the unselected state icon - * @param on the selected state icon - */ - public void setIcons(Icon off, Icon on) { - onIcon = on; - offIcon = off; - setIcon(off); - } - - /** - * Sets the selected state. Overrides JButton method. - * - * @param selected true to select - */ - public void setSelected(boolean selected) { - super.setSelected(selected); - if (selected && onIcon !=null) { - setIcon(onIcon); - } - else if (!selected && offIcon !=null) { - setIcon(offIcon); - } - } - - /** - * Sets the track associated with this button. - * - * @param track the track - */ - public void setTrack(TTrack track) { - this.track = track; - if (track!=null) { - setIcon(track.getFootprint().getIcon(21, 16)); - setText(track.getName()); - setToolTipText(TrackerRes.getString("TButton.Track.ToolTip") //$NON-NLS-1$ - +" "+track.getName()); //$NON-NLS-1$ - } - else { - setIcon(null); - setText(" "); //$NON-NLS-1$ - setToolTipText(null); - } - } - - /** - * Gets the track associated with this button. - * @return the track - */ - public TTrack getTrack() { - return track; - } - - /** - * Gets a popup menu to display. If a track is associated with this button, - * the track menu is returned, but subclasses can override this method - * to return any popup menu. - * - * @return the popup menu, or null if none - */ - protected JPopupMenu getPopup() { - if (track!=null && track.trackerPanel!=null) { - JMenu trackMenu = track.getMenu(track.trackerPanel); - FontSizer.setFonts(trackMenu, FontSizer.getLevel()); - return trackMenu.getPopupMenu(); - } - return null; - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.event.*; + +import javax.swing.*; + +import org.opensourcephysics.tools.FontSizer; + +/** + * A button based on VideoPlayer.PlayerButton that is used throughout Tracker. + * + * @author Douglas Brown + */ +public class TButton extends JButton { + + protected TTrack track; + private boolean hidePopup = false; + private JPopupMenu popup; + private Icon onIcon, offIcon; + + /** + * Constructs a TButton. + */ + public TButton() { + setOpaque(false); + setBorderPainted(false); + addMouseListener(new MouseAdapter() { + public void mouseEntered(MouseEvent e) { + setBorderPainted(true); + hidePopup = popup!=null && popup.isVisible(); + if (Tracker.showHints && track!=null && track.trackerPanel!=null) { + if (track.trackerPanel.getSelectedTrack() == track) + track.trackerPanel.setMessage(track.getMessage()); + else { + String s = track.getClass().getSimpleName()+" " //$NON-NLS-1$ + + track.getName() + " (" //$NON-NLS-1$ + + TrackerRes.getString("TTrack.Unselected.Hint")+")"; //$NON-NLS-1$ //$NON-NLS-2$ + track.trackerPanel.setMessage(s); + } + } + } + + public void mouseExited(MouseEvent e) { + setBorderPainted(false); + } + + public void mousePressed(MouseEvent e) { + if (track!=null && track.trackerPanel!=null + && track != track.trackerPanel.getSelectedTrack()) { + track.trackerPanel.setSelectedTrack(track); + track.trackerPanel.setSelectedPoint(null); + hidePopup = true; + } + } + + public void mouseClicked(MouseEvent e) { + popup = getPopup(); + if (popup!=null) { + if (e.getClickCount()==2) + hidePopup = false; + if (hidePopup) { + hidePopup = false; + popup.setVisible(false); + } + else { + hidePopup = true; + popup.show(TButton.this, 0, TButton.this.getHeight()); + } + } + } + }); + } + + /** + * Constructs an icon-only TButton with an AbstractAction. + * + * @param action the AbstractAction + */ + public TButton(AbstractAction action) { + this(); + addActionListener(action); + setIcon((Icon)action.getValue(Action.SMALL_ICON)); + } + + /** + * Constructs a TButton with a TTrack. + * + * @param track the track + */ + public TButton(TTrack track) { + this(); + setTrack(track); + } + + /** + * Constructs a TButton with an Icon. + * + * @param icon the icon + */ + public TButton(Icon icon) { + this(); + setIcon(icon); + } + + /** + * Constructs a TButton with icons for selected and unselected states. + * + * @param off the unselected state icon + * @param on the selected state icon + */ + public TButton(Icon off, Icon on) { + this(); + setIcons(off, on); + } + + /** + * Sets the icon. Overrides JButton method. + * + * @param icon the icon + */ + public void setIcon(Icon icon) { + super.setIcon(icon); + setSelectedIcon(icon); +// setRolloverSelectedIcon(icon); + } + + /** + * Sets the icons for selected and unselected states. + * + * @param off the unselected state icon + * @param on the selected state icon + */ + public void setIcons(Icon off, Icon on) { + onIcon = on; + offIcon = off; + setIcon(off); + } + + /** + * Sets the selected state. Overrides JButton method. + * + * @param selected true to select + */ + public void setSelected(boolean selected) { + super.setSelected(selected); + if (selected && onIcon !=null) { + setIcon(onIcon); + } + else if (!selected && offIcon !=null) { + setIcon(offIcon); + } + } + + /** + * Sets the track associated with this button. + * + * @param track the track + */ + public void setTrack(TTrack track) { + this.track = track; + if (track!=null) { + setIcon(track.getFootprint().getIcon(21, 16)); + setText(track.getName()); + setToolTipText(TrackerRes.getString("TButton.Track.ToolTip") //$NON-NLS-1$ + +" "+track.getName()); //$NON-NLS-1$ + } + else { + setIcon(null); + setText(" "); //$NON-NLS-1$ + setToolTipText(null); + } + } + + /** + * Gets the track associated with this button. + * @return the track + */ + public TTrack getTrack() { + return track; + } + + /** + * Gets a popup menu to display. If a track is associated with this button, + * the track menu is returned, but subclasses can override this method + * to return any popup menu. + * + * @return the popup menu, or null if none + */ + protected JPopupMenu getPopup() { + if (track!=null && track.trackerPanel!=null) { + JMenu trackMenu = track.getMenu(track.trackerPanel); + FontSizer.setFonts(trackMenu, FontSizer.getLevel()); + return trackMenu.getPopupMenu(); + } + return null; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMat.java b/src/org/opensourcephysics/cabrillo/tracker/TMat.java index 9d1ff87c..57f3d440 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMat.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMat.java @@ -1,278 +1,278 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; - -import java.awt.*; -import java.awt.geom.*; -import java.awt.image.BufferedImage; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; - -/** - * This is a trackable rectangular background mat that draws itself on a tracker - * panel behind the video. - * - * @author Douglas Brown - */ -public class TMat implements Measurable, Trackable, PropertyChangeListener { - - // instance fields - protected Rectangle mat; - private Rectangle2D bounds; - private Paint paint = Color.white; - private boolean visible = true; - protected boolean isValidMeasure = false; - private TrackerPanel trackerPanel; - private ImageCoordSystem coords; - protected Rectangle drawingBounds; - - /** - * Creates a mat for the specified tracker panel - * - * @param panel the tracker panel - */ - public TMat(TrackerPanel panel) { - trackerPanel = panel; - trackerPanel.addPropertyChangeListener("coords", this); //$NON-NLS-1$ - coords = trackerPanel.getCoords(); - coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - mat = new Rectangle(); - trackerPanel.addDrawable(this); - refresh(); - } - - /** - * Draws the image mat on the panel. - * - * @param panel the drawing panel requesting the drawing - * @param g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics g) { - if (!(panel instanceof VideoPanel) || !isVisible()) return; - VideoPanel vidPanel = (VideoPanel) panel; - Graphics2D g2 = (Graphics2D)g; - // save graphics transform and paint - AffineTransform gat = g2.getTransform(); - Paint gpaint = g2.getPaint(); - // transform world to screen - g2.transform(vidPanel.getPixelTransform()); - // transform image to world if not drawing in image space - if (!vidPanel.isDrawingInImageSpace()) { - ImageCoordSystem coords = vidPanel.getCoords(); - int n = vidPanel.getFrameNumber(); - g2.transform(coords.getToWorldTransform(n)); - } - // draw the mat - g2.setPaint(paint); - g2.fill(mat); - // restore graphics transform and paint - g2.setTransform(gat); - g2.setPaint(gpaint); - // save drawing bounds for use when exporting videos - Shape asDrawn = vidPanel.getPixelTransform().createTransformedShape(mat); - Rectangle2D rect2D = asDrawn.getBounds2D(); - drawingBounds = new Rectangle((int)Math.round(rect2D.getMinX()), - (int)Math.round(rect2D.getMinY()),(int)rect2D.getWidth(),(int)rect2D.getHeight()); - } - - /** - * Gets the paint. - * - * @return the paint used to draw the mat - */ - public Paint getPaint() { - return paint; - } - - /** - * Sets the paint. - * - * @param paint the desired paint - */ - public void setPaint(Paint paint) { - this.paint = paint; - } - - /** - * Shows or hides this mat. - * - * @param visible true to show this mat. - */ - public void setVisible(boolean visible) { - this.visible = visible; - } - - /** - * Gets the visibility of this mat. - * - * @return true if this mat is visible - */ - public boolean isVisible() { -// boolean noVid = (trackerPanel.getVideo() == null || !trackerPanel.getVideo().isVisible()); -// return noVid && visible; - return visible; - } - - /** - * Gets the minimum x needed to draw this object. - * - * @return minimum x - */ - public double getXMin() { - if (!isValidMeasure) getWorldBounds(); - return bounds.getMinX(); - } - - /** - * Gets the maximum x needed to draw this object. - * - * @return maximum x - */ - public double getXMax() { - if (!isValidMeasure) getWorldBounds(); - return bounds.getMaxX(); - } - - /** - * Gets the minimum y needed to draw this object. - * - * @return minimum y - */ - public double getYMin() { - if (!isValidMeasure) getWorldBounds(); - return bounds.getMinY(); - } - - /** - * Gets the maximum y needed to draw this object. - * - * @return maximum y - */ - public double getYMax() { - if (!isValidMeasure) getWorldBounds(); - return bounds.getMaxY(); - } - - /** - * Reports whether information is available to set min/max values. - * - * @return true if min/max values are valid - */ - public boolean isMeasured() { - return isVisible(); - } - - /** - * Refreshes this mat. - */ - public void refresh() { - // remove and add coords "transform" listener - coords.removePropertyChangeListener("transform", this); //$NON-NLS-1$ - coords = trackerPanel.getCoords(); - coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - mat.width = (int) trackerPanel.getImageWidth(); - mat.height = (int) trackerPanel.getImageHeight(); - int w = (int)TrackerPanel.getDefaultImageWidth(); - int h = (int)TrackerPanel.getDefaultImageHeight(); - Video video = trackerPanel.getVideo(); - if (video != null) { - if (video instanceof ImageVideo - && video.getFilterStack().isEmpty()) { - Dimension dim = ((ImageVideo)video).getSize(); - w = dim.width; - h = dim.height; - } - else { - BufferedImage vidImage = video.getImage(); - if (vidImage != null) { - w = vidImage.getWidth(); - h = vidImage.getHeight(); - } - } - } - mat.x = Math.min((w - mat.width)/2, 0); - mat.y = Math.min((h - mat.height)/2, 0); - isValidMeasure = false; - trackerPanel.scale(); - } - - /** - * Gets the x offset of this mat relative to the image origin - * - * @return x offset - */ - public double getXOffset() { - return mat.x; - } - - /** - * Gets the y offset of this mat relative to the image origin - * - * @return y offset - */ - public double getYOffset() { - return mat.y; - } - - /** - * Responds to property change events. TMat listens for the following - * events: "transform" from the tracker panel's image coordinate system - * and "coords" from the tracker panel - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("transform")) { //$NON-NLS-1$ - isValidMeasure = false; - } - else if (e.getPropertyName().equals("coords")) { //$NON-NLS-1$ - refresh(); - } - } - - //_______________________________ private methods _________________________ - - /** - * Gets the world bounds of the mat. - */ - private void getWorldBounds() { - ImageCoordSystem coords = trackerPanel.getCoords(); - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - int stepCount = clip.getStepCount(); - // initialize bounds - AffineTransform at = coords.getToWorldTransform(clip.stepToFrame(0)); - bounds = at.createTransformedShape(mat).getBounds2D(); - // combine bounds from every step - for (int n = 0; n < stepCount; n++) { - at = coords.getToWorldTransform(clip.stepToFrame(n)); - bounds.add(at.createTransformedShape(mat).getBounds2D()); - } - isValidMeasure = true; - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; + +import java.awt.*; +import java.awt.geom.*; +import java.awt.image.BufferedImage; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; + +/** + * This is a trackable rectangular background mat that draws itself on a tracker + * panel behind the video. + * + * @author Douglas Brown + */ +public class TMat implements Measurable, Trackable, PropertyChangeListener { + + // instance fields + protected Rectangle mat; + private Rectangle2D bounds; + private Paint paint = Color.white; + private boolean visible = true; + protected boolean isValidMeasure = false; + private TrackerPanel trackerPanel; + private ImageCoordSystem coords; + protected Rectangle drawingBounds; + + /** + * Creates a mat for the specified tracker panel + * + * @param panel the tracker panel + */ + public TMat(TrackerPanel panel) { + trackerPanel = panel; + trackerPanel.addPropertyChangeListener("coords", this); //$NON-NLS-1$ + coords = trackerPanel.getCoords(); + coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + mat = new Rectangle(); + trackerPanel.addDrawable(this); + refresh(); + } + + /** + * Draws the image mat on the panel. + * + * @param panel the drawing panel requesting the drawing + * @param g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics g) { + if (!(panel instanceof VideoPanel) || !isVisible()) return; + VideoPanel vidPanel = (VideoPanel) panel; + Graphics2D g2 = (Graphics2D)g; + // save graphics transform and paint + AffineTransform gat = g2.getTransform(); + Paint gpaint = g2.getPaint(); + // transform world to screen + g2.transform(vidPanel.getPixelTransform()); + // transform image to world if not drawing in image space + if (!vidPanel.isDrawingInImageSpace()) { + ImageCoordSystem coords = vidPanel.getCoords(); + int n = vidPanel.getFrameNumber(); + g2.transform(coords.getToWorldTransform(n)); + } + // draw the mat + g2.setPaint(paint); + g2.fill(mat); + // restore graphics transform and paint + g2.setTransform(gat); + g2.setPaint(gpaint); + // save drawing bounds for use when exporting videos + Shape asDrawn = vidPanel.getPixelTransform().createTransformedShape(mat); + Rectangle2D rect2D = asDrawn.getBounds2D(); + drawingBounds = new Rectangle((int)Math.round(rect2D.getMinX()), + (int)Math.round(rect2D.getMinY()),(int)rect2D.getWidth(),(int)rect2D.getHeight()); + } + + /** + * Gets the paint. + * + * @return the paint used to draw the mat + */ + public Paint getPaint() { + return paint; + } + + /** + * Sets the paint. + * + * @param paint the desired paint + */ + public void setPaint(Paint paint) { + this.paint = paint; + } + + /** + * Shows or hides this mat. + * + * @param visible true to show this mat. + */ + public void setVisible(boolean visible) { + this.visible = visible; + } + + /** + * Gets the visibility of this mat. + * + * @return true if this mat is visible + */ + public boolean isVisible() { +// boolean noVid = (trackerPanel.getVideo() == null || !trackerPanel.getVideo().isVisible()); +// return noVid && visible; + return visible; + } + + /** + * Gets the minimum x needed to draw this object. + * + * @return minimum x + */ + public double getXMin() { + if (!isValidMeasure) getWorldBounds(); + return bounds.getMinX(); + } + + /** + * Gets the maximum x needed to draw this object. + * + * @return maximum x + */ + public double getXMax() { + if (!isValidMeasure) getWorldBounds(); + return bounds.getMaxX(); + } + + /** + * Gets the minimum y needed to draw this object. + * + * @return minimum y + */ + public double getYMin() { + if (!isValidMeasure) getWorldBounds(); + return bounds.getMinY(); + } + + /** + * Gets the maximum y needed to draw this object. + * + * @return maximum y + */ + public double getYMax() { + if (!isValidMeasure) getWorldBounds(); + return bounds.getMaxY(); + } + + /** + * Reports whether information is available to set min/max values. + * + * @return true if min/max values are valid + */ + public boolean isMeasured() { + return isVisible(); + } + + /** + * Refreshes this mat. + */ + public void refresh() { + // remove and add coords "transform" listener + coords.removePropertyChangeListener("transform", this); //$NON-NLS-1$ + coords = trackerPanel.getCoords(); + coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + mat.width = (int) trackerPanel.getImageWidth(); + mat.height = (int) trackerPanel.getImageHeight(); + int w = (int)TrackerPanel.getDefaultImageWidth(); + int h = (int)TrackerPanel.getDefaultImageHeight(); + Video video = trackerPanel.getVideo(); + if (video != null) { + if (video instanceof ImageVideo + && video.getFilterStack().isEmpty()) { + Dimension dim = ((ImageVideo)video).getSize(); + w = dim.width; + h = dim.height; + } + else { + BufferedImage vidImage = video.getImage(); + if (vidImage != null) { + w = vidImage.getWidth(); + h = vidImage.getHeight(); + } + } + } + mat.x = Math.min((w - mat.width)/2, 0); + mat.y = Math.min((h - mat.height)/2, 0); + isValidMeasure = false; + trackerPanel.scale(); + } + + /** + * Gets the x offset of this mat relative to the image origin + * + * @return x offset + */ + public double getXOffset() { + return mat.x; + } + + /** + * Gets the y offset of this mat relative to the image origin + * + * @return y offset + */ + public double getYOffset() { + return mat.y; + } + + /** + * Responds to property change events. TMat listens for the following + * events: "transform" from the tracker panel's image coordinate system + * and "coords" from the tracker panel + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("transform")) { //$NON-NLS-1$ + isValidMeasure = false; + } + else if (e.getPropertyName().equals("coords")) { //$NON-NLS-1$ + refresh(); + } + } + + //_______________________________ private methods _________________________ + + /** + * Gets the world bounds of the mat. + */ + private void getWorldBounds() { + ImageCoordSystem coords = trackerPanel.getCoords(); + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + int stepCount = clip.getStepCount(); + // initialize bounds + AffineTransform at = coords.getToWorldTransform(clip.stepToFrame(0)); + bounds = at.createTransformedShape(mat).getBounds2D(); + // combine bounds from every step + for (int n = 0; n < stepCount; n++) { + at = coords.getToWorldTransform(clip.stepToFrame(n)); + bounds.add(at.createTransformedShape(mat).getBounds2D()); + } + isValidMeasure = true; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TRegion.java b/src/org/opensourcephysics/cabrillo/tracker/TRegion.java index 4f3f5c12..e1f8f71d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TRegion.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TRegion.java @@ -1,261 +1,261 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.image.*; - -import org.opensourcephysics.media.core.TPoint; - -/** - * This is a region determined by inside and outside pixel values. - * - * @author Douglas Brown - */ -public class TRegion extends Polygon { - - // instance fields - private float brightLimit = 0.5f; - private int width, height; // image dimensions - private int w=100, h=100; // scan area dimensions - private int[] pixels; // image pixels as integers - private float[] hsb = new float[3]; - private int x0, y0; - - /** - * Constructs a region starting from a specified image pixel position. - * - * @param image the image - * @param x0 the starting x position - * @param y0 the starting y position - * - */ - public TRegion(BufferedImage image, int x0, int y0) { - width = image.getWidth(); - height = image.getHeight(); - pixels = new int[width * height]; - image.getRaster().getDataElements(0, 0, width, height, pixels); - this.x0 = x0; - this.y0 = y0; - findEdge(); - } - - /** - * Gets the center point of the region. - * @return the center - */ - public TPoint getCenter() { - if (npoints == 0) return null; - double x = this.getBounds2D().getCenterX(); - double y = this.getBounds2D().getCenterY(); - return new TPoint(x, y); - } - - /** - * Finds and traces the edge that defines the inside/outside of the region. - */ - public void findEdge() { - // find edge starting point - boolean foundEdge = false, foundInside = false, moveUp = false; - int x = x0; - int y = y0; - int rightLimit = Math.min(width, x0+w/2); - int leftLimit = Math.max(0, x0-w/2); - int topLimit = Math.max(0, y0-h/2); - int bottomLimit = Math.min(height, y0+h/2); - // scanning left to right, move up/down line by line until an inside pixel is found - int n = 1; - while (!foundInside) { - if (y <= topLimit || y >= bottomLimit) break; // stop scanning - if (isInside(x, y)) { - foundInside = true; - } - if (!foundInside) { - if (x < rightLimit) x++; // continue scanning line - else { - if (moveUp) { - y = y0-n; // move up to next line - moveUp = false; - } - else { - y = y0+n; // move down to next line - moveUp = true; - n++; - } - x = leftLimit; - } - } - } - // move left to find an outside pixel, then move back inside by one pixel - while (foundInside && x >= leftLimit) { - x--; - if (!isInside(x, y)) { - x++; - foundEdge = true; - break; - } - } - // trace the edge - if (foundEdge) { - reset(); - traceEdge(x, y, 'U'); - } - } - - private boolean isInside(int x, int y) { - // get the specified pixel rgb data - int pixel = pixels[y * w + x]; - int r = (pixel >> 16) & 0xff; // red - int g = (pixel >> 8) & 0xff; // green - int b = (pixel) & 0xff; // blue - // convert to hsb - Color.RGBtoHSB(r, g, b, hsb); - if (hsb[2] >= brightLimit) - return true; - return false; - } - - /** - * Traces the edge of a region starting from the point (x, y). - * This defines the points (not pixels) that define the edge using the following - * 16-entry lookup table, and sets the vertices of the polygon to those points. - * - * Index 1234* Code Result - * 0 0000 X Should never happen - * 1 000X R Go Right - * 2 00X0 D Go Down - * 3 00XX R Go Right - * 4 0X00 U Go Up - * 5 0X0X U Go Up - * 6 0XX0 u Go up or down depending on current direction - * 7 0XXX U Go up - * 8 X000 L Go left - * 9 X00X l Go left or right depending on current direction - * 10 X0X0 D Go down - * 11 X0XX R Go right - * 12 XX00 L Go left - * 13 XX0X L Go left - * 14 XXX0 D Go down - * 15 XXXX X Should never happen - * - * *1 = upper-left, 2 = upper-right, 3 = lower-left, 4 = lower-right pixel, - * *X = pixel is outside, 0 = pixel is inside - * - * To understand this code, the distinction between points and pixels must be clear. - * A point lies at the intersection of the boundaries of a block of four pixels. - * Below is a magnified view of a block of four pixels (each pixel is filled with - * characters) and the point (the + sign) that lies between them:* - * - * ******** ******** - * ******** ******** - * ******** ******** - * ******** ******** - * + - * ******** ******** - * ******** ******** - * ******** ******** - * ******** ******** - * - * For every point there is an upper-left, upper-right, lower-left, and lower-right - * diagonally adjacent pixel. - * - * @param x the x-component of the point - * @param y the y-component of the point - * @param startingDirection the direction to move looking for an outside pixel - * - */ - private void traceEdge(int x, int y, char startingDirection) { - char[] table = new char[] { - 'X', 'R', 'D', 'R', 'U', 'U', 'u', 'U', - 'L', 'l', 'D', 'R', 'L', 'L', 'D', 'X'}; - char direction = startingDirection; - int hloc = x; - int vloc = y; - boolean UL = isInside(hloc - 1, vloc - 1); - boolean UR = isInside(hloc, vloc - 1); - boolean LL = isInside(hloc - 1, vloc); - boolean LR = isInside(hloc, vloc); - this.addPoint(hloc, vloc); // starting edge point - do { - int index = 0; - if (LR) - index |= 1; - if (LL) - index |= 2; - if (UR) - index |= 4; - if (UL) - index |= 8; - char newDirection = table[index]; - if (newDirection == 'u') { - if (direction == 'R') - newDirection = 'U'; - else - newDirection = 'D'; - } - if (newDirection == 'l') { - if (direction == 'U') - newDirection = 'L'; - else - newDirection = 'R'; - } - switch (newDirection) { - case 'U': - vloc--; - LL = UL; - LR = UR; - UL = isInside(hloc - 1, vloc - 1); - UR = isInside(hloc, vloc - 1); - break; - case 'D': - vloc++; - UL = LL; - UR = LR; - LL = isInside(hloc - 1, vloc); - LR = isInside(hloc, vloc); - break; - case 'L': - hloc--; - UR = UL; - LR = LL; - UL = isInside(hloc - 1, vloc - 1); - LL = isInside(hloc - 1, vloc); - break; - case 'R': - hloc++; - UL = UR; - LL = LR; - UR = isInside(hloc, vloc - 1); - LR = isInside(hloc, vloc); - break; - } - this.addPoint(hloc, vloc); - direction = newDirection; - } - while (direction != 'X' - &&!(hloc == x && vloc == y && direction == startingDirection)); - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.image.*; + +import org.opensourcephysics.media.core.TPoint; + +/** + * This is a region determined by inside and outside pixel values. + * + * @author Douglas Brown + */ +public class TRegion extends Polygon { + + // instance fields + private float brightLimit = 0.5f; + private int width, height; // image dimensions + private int w=100, h=100; // scan area dimensions + private int[] pixels; // image pixels as integers + private float[] hsb = new float[3]; + private int x0, y0; + + /** + * Constructs a region starting from a specified image pixel position. + * + * @param image the image + * @param x0 the starting x position + * @param y0 the starting y position + * + */ + public TRegion(BufferedImage image, int x0, int y0) { + width = image.getWidth(); + height = image.getHeight(); + pixels = new int[width * height]; + image.getRaster().getDataElements(0, 0, width, height, pixels); + this.x0 = x0; + this.y0 = y0; + findEdge(); + } + + /** + * Gets the center point of the region. + * @return the center + */ + public TPoint getCenter() { + if (npoints == 0) return null; + double x = this.getBounds2D().getCenterX(); + double y = this.getBounds2D().getCenterY(); + return new TPoint(x, y); + } + + /** + * Finds and traces the edge that defines the inside/outside of the region. + */ + public void findEdge() { + // find edge starting point + boolean foundEdge = false, foundInside = false, moveUp = false; + int x = x0; + int y = y0; + int rightLimit = Math.min(width, x0+w/2); + int leftLimit = Math.max(0, x0-w/2); + int topLimit = Math.max(0, y0-h/2); + int bottomLimit = Math.min(height, y0+h/2); + // scanning left to right, move up/down line by line until an inside pixel is found + int n = 1; + while (!foundInside) { + if (y <= topLimit || y >= bottomLimit) break; // stop scanning + if (isInside(x, y)) { + foundInside = true; + } + if (!foundInside) { + if (x < rightLimit) x++; // continue scanning line + else { + if (moveUp) { + y = y0-n; // move up to next line + moveUp = false; + } + else { + y = y0+n; // move down to next line + moveUp = true; + n++; + } + x = leftLimit; + } + } + } + // move left to find an outside pixel, then move back inside by one pixel + while (foundInside && x >= leftLimit) { + x--; + if (!isInside(x, y)) { + x++; + foundEdge = true; + break; + } + } + // trace the edge + if (foundEdge) { + reset(); + traceEdge(x, y, 'U'); + } + } + + private boolean isInside(int x, int y) { + // get the specified pixel rgb data + int pixel = pixels[y * w + x]; + int r = (pixel >> 16) & 0xff; // red + int g = (pixel >> 8) & 0xff; // green + int b = (pixel) & 0xff; // blue + // convert to hsb + Color.RGBtoHSB(r, g, b, hsb); + if (hsb[2] >= brightLimit) + return true; + return false; + } + + /** + * Traces the edge of a region starting from the point (x, y). + * This defines the points (not pixels) that define the edge using the following + * 16-entry lookup table, and sets the vertices of the polygon to those points. + * + * Index 1234* Code Result + * 0 0000 X Should never happen + * 1 000X R Go Right + * 2 00X0 D Go Down + * 3 00XX R Go Right + * 4 0X00 U Go Up + * 5 0X0X U Go Up + * 6 0XX0 u Go up or down depending on current direction + * 7 0XXX U Go up + * 8 X000 L Go left + * 9 X00X l Go left or right depending on current direction + * 10 X0X0 D Go down + * 11 X0XX R Go right + * 12 XX00 L Go left + * 13 XX0X L Go left + * 14 XXX0 D Go down + * 15 XXXX X Should never happen + * + * *1 = upper-left, 2 = upper-right, 3 = lower-left, 4 = lower-right pixel, + * *X = pixel is outside, 0 = pixel is inside + * + * To understand this code, the distinction between points and pixels must be clear. + * A point lies at the intersection of the boundaries of a block of four pixels. + * Below is a magnified view of a block of four pixels (each pixel is filled with + * characters) and the point (the + sign) that lies between them:* + * + * ******** ******** + * ******** ******** + * ******** ******** + * ******** ******** + * + + * ******** ******** + * ******** ******** + * ******** ******** + * ******** ******** + * + * For every point there is an upper-left, upper-right, lower-left, and lower-right + * diagonally adjacent pixel. + * + * @param x the x-component of the point + * @param y the y-component of the point + * @param startingDirection the direction to move looking for an outside pixel + * + */ + private void traceEdge(int x, int y, char startingDirection) { + char[] table = new char[] { + 'X', 'R', 'D', 'R', 'U', 'U', 'u', 'U', + 'L', 'l', 'D', 'R', 'L', 'L', 'D', 'X'}; + char direction = startingDirection; + int hloc = x; + int vloc = y; + boolean UL = isInside(hloc - 1, vloc - 1); + boolean UR = isInside(hloc, vloc - 1); + boolean LL = isInside(hloc - 1, vloc); + boolean LR = isInside(hloc, vloc); + this.addPoint(hloc, vloc); // starting edge point + do { + int index = 0; + if (LR) + index |= 1; + if (LL) + index |= 2; + if (UR) + index |= 4; + if (UL) + index |= 8; + char newDirection = table[index]; + if (newDirection == 'u') { + if (direction == 'R') + newDirection = 'U'; + else + newDirection = 'D'; + } + if (newDirection == 'l') { + if (direction == 'U') + newDirection = 'L'; + else + newDirection = 'R'; + } + switch (newDirection) { + case 'U': + vloc--; + LL = UL; + LR = UR; + UL = isInside(hloc - 1, vloc - 1); + UR = isInside(hloc, vloc - 1); + break; + case 'D': + vloc++; + UL = LL; + UR = LR; + LL = isInside(hloc - 1, vloc); + LR = isInside(hloc, vloc); + break; + case 'L': + hloc--; + UR = UL; + LR = LL; + UL = isInside(hloc - 1, vloc - 1); + LL = isInside(hloc - 1, vloc); + break; + case 'R': + hloc++; + UL = UR; + LL = LR; + UR = isInside(hloc, vloc - 1); + LR = isInside(hloc, vloc); + break; + } + this.addPoint(hloc, vloc); + direction = newDirection; + } + while (direction != 'X' + &&!(hloc == x && vloc == y && direction == startingDirection)); + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TView.java b/src/org/opensourcephysics/cabrillo/tracker/TView.java index 5e082006..b0dda22f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TView.java @@ -1,91 +1,91 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Component; -import java.beans.*; -import java.util.*; - -import javax.swing.*; - -/** - * This is a view of a tracker panel that can be added to a TViewChooser. - * Classes that implement TView must descend from JComponent. - * - * @author Douglas Brown - */ -public interface TView extends PropertyChangeListener { - - /** - * Initializes the view - */ - public void init(); - - /** - * Refreshes the view - */ - public void refresh(); - - /** - * Cleans up the view - */ - public void cleanup(); - - /** - * Gets the TrackerPanel containing the track data - * - * @return the tracker panel containing the data to be viewed - */ - public TrackerPanel getTrackerPanel(); - - /** - * Gets the name of the view - * - * @return the name of the view - */ - public String getViewName(); - - /** - * Gets the icon for this view - * - * @return the icon for the view - */ - public Icon getViewIcon(); - - /** - * Gets the toolbar components for this view - * - * @return an ArrayList of components to be added to a toolbar - */ - public ArrayList getToolBarComponents(); - - /** - * Returns true if this view is in a custom state. - * - * @return true if in a custom state, false if in the default state - */ - public boolean isCustomState(); - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Component; +import java.beans.*; +import java.util.*; + +import javax.swing.*; + +/** + * This is a view of a tracker panel that can be added to a TViewChooser. + * Classes that implement TView must descend from JComponent. + * + * @author Douglas Brown + */ +public interface TView extends PropertyChangeListener { + + /** + * Initializes the view + */ + public void init(); + + /** + * Refreshes the view + */ + public void refresh(); + + /** + * Cleans up the view + */ + public void cleanup(); + + /** + * Gets the TrackerPanel containing the track data + * + * @return the tracker panel containing the data to be viewed + */ + public TrackerPanel getTrackerPanel(); + + /** + * Gets the name of the view + * + * @return the name of the view + */ + public String getViewName(); + + /** + * Gets the icon for this view + * + * @return the icon for the view + */ + public Icon getViewIcon(); + + /** + * Gets the toolbar components for this view + * + * @return an ArrayList of components to be added to a toolbar + */ + public ArrayList getToolBarComponents(); + + /** + * Returns true if this view is in a custom state. + * + * @return true if in a custom state, false if in the default state + */ + public boolean isCustomState(); + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java b/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java index 48dc7170..8b77f900 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java @@ -1,543 +1,543 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.Border; - -import org.opensourcephysics.controls.*; -import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.tools.FontSizer; - -/** - * This is a panel with a toolbar for selecting and controlling TViews. - * - * @author Douglas Brown - */ -public class TViewChooser extends JPanel implements PropertyChangeListener { - - // static fields - protected static Icon minIcon, maxIcon, restoreIcon; - - static { - maxIcon = new ImageIcon( - Tracker.class.getResource("resources/images/maximize.gif")); //$NON-NLS-1$ - restoreIcon = new ImageIcon( - Tracker.class.getResource("resources/images/restore.gif")); //$NON-NLS-1$ - - } - - // instance fields - protected TrackerPanel trackerPanel; - protected ArrayList views = new ArrayList(); - protected TView selectedView; - protected JPanel viewPanel; - protected JToolBar toolbar; - protected JButton chooserButton; - protected Component toolbarFiller = Box.createHorizontalGlue(); - protected JButton maximizeButton; - protected JPopupMenu popup = new JPopupMenu(); - protected int[] dividerLocs = new int[4]; - protected int dividerSize; - protected boolean maximized; - - /** - * Constructs a TViewChooser. - * - * @param panel the tracker panel being viewed - */ - public TViewChooser(TrackerPanel panel) { - super(new BorderLayout()); - trackerPanel = panel; - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - // viewPanel - viewPanel = new JPanel(new CardLayout()); - viewPanel.setBorder(BorderFactory.createEtchedBorder()); - add(viewPanel, BorderLayout.CENTER); - // toolbar - toolbar = new JToolBar(); - toolbar.setFloatable(false); - toolbar.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - toolbar.requestFocusInWindow(); - if (e.getClickCount()==2) { - maximizeButton.doClick(0); - } - if (OSPRuntime.isPopupTrigger(e)) { - final TView view = getSelectedView(); - if (view==null) return; - JPopupMenu popup = new JPopupMenu(); - JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (view instanceof PageTView) { - trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ - } - else if (view instanceof TableTView) { - trackerPanel.getTFrame().showHelp("datatable", 0); //$NON-NLS-1$ - } - else if (view instanceof PlotTView) { - trackerPanel.getTFrame().showHelp("plot", 0); //$NON-NLS-1$ - } - else if (view instanceof WorldTView) { - trackerPanel.getTFrame().showHelp("GUI", 0); //$NON-NLS-1$ - } - } - }); - popup.add(helpItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(toolbar, e.getX(), e.getY()); - } - } - }); - toolbar.setBorder(BorderFactory.createEtchedBorder()); - add(toolbar, BorderLayout.NORTH); - // chooser button - chooserButton = new TButton() { - protected JPopupMenu getPopup() { - // inner popup menu listener class - ActionListener listener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - // select the named view - String name = e.getActionCommand(); - setSelectedView(getView(name)); - } - }; - // add view items to popup - popup.removeAll(); - JMenuItem item; - Iterator it = getViews().iterator(); - while (it.hasNext()) { - TView view = it.next(); - String name = view.getViewName(); - item = new JMenuItem(name, view.getViewIcon()); - item.setActionCommand(name); - item.addActionListener(listener); - popup.add(item); - } - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - }; - // maximize buttons - Border empty = BorderFactory.createEmptyBorder(7, 3, 7, 3); - Border etched = BorderFactory.createEtchedBorder(); - maximizeButton = new TButton(maxIcon, restoreIcon); - maximizeButton.setBorder(BorderFactory.createCompoundBorder(etched, empty)); - maximizeButton.setToolTipText(TrackerRes.getString("TViewChooser.Maximize.Tooltip")); //$NON-NLS-1$ - maximizeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (!maximized) { - maximize(); - } - else restore(); - maximizeButton.setSelected(maximized); - maximizeButton.setToolTipText(maximized? - TrackerRes.getString("TViewChooser.Restore.Tooltip"): //$NON-NLS-1$ - TrackerRes.getString("TViewChooser.Maximize.Tooltip")); //$NON-NLS-1$ - } - }); - createDefaultViews(); - refresh(); - } - - /** - * gets the TrackerPanel containing the tracks - * - * @return the tracker panel - */ - public Dimension getMinimumSize() { - return new Dimension(0, 0); - } - - /** - * gets the TrackerPanel containing the tracks - * - * @return the tracker panel - */ - public TrackerPanel getTrackerPanel() { - return trackerPanel; - } - - /** - * Adds a view of the tracker panel - * - * @param view the view being added - */ - public void addView(TView view) { - if (view == null || view.getTrackerPanel() != trackerPanel) return; - if (getView(view.getClass()) != null) return; - views.add(view); - view.cleanup(); - refreshViewPanel(); - } - - /** - * Adds a view of the tracker panel at a specified index - * - * @param index the list index desired - * @param view the view being added - */ - public void addView(int index, TView view) { - if (view.getTrackerPanel() != trackerPanel) return; - if (getView(view.getClass()) != null) return; - views.add(index, view); - view.cleanup(); - refreshViewPanel(); - } - - /** - * Removes a view from this chooser - * - * @param view the view requesting to be removed - */ - public void removeView(TView view) { - views.remove(view); - if (view == selectedView) selectedView = null; - refreshViewPanel(); - } - - /** - * Gets a list of the available views. - * - * @return the list of views - */ - public Collection getViews() { - return views; - } - - /** - * Gets the view with the specified name. May return null. - * - * @param viewName the name of the view - * @return the view - */ - public TView getView(String viewName) { - Iterator it = getViews().iterator(); - while (it.hasNext()) { - TView view = it.next(); - if (view.getViewName().equals(viewName)) return view; - } - return null; - } - - /** - * Gets a collection of views castable to the specified class or interface. - * - * @param type the class - * @return a collection of views - */ - public Collection getViews(Class type) { - Collection list = new ArrayList(); - for (TView view: list) { - if (type.isInstance(view)) list.add(view); - } - return list; - } - - /** - * Gets the view of the specified class. May return null. - * - * @param c the view class - * @return the view - */ - public TView getView(Class c) { - for (TView view: getViews()) { - if (view.getClass() == c) return view; - } - return null; - } - - /** - * Gets the selected view - * - * @return the selected view - */ - public TView getSelectedView() { - return selectedView; - } - - /** - * Selects the specified view - * - * @param view the view to select - */ - public void setSelectedView(TView view) { - if (view == null || selectedView==view) return; - if (!getViews().contains(view)) { - addView(view); - } - trackerPanel.changed = true; - TTrack selectedTrack = null; - // clean up previously selected view - if (selectedView != null) { - selectedView.cleanup(); - ((JComponent)selectedView).removePropertyChangeListener("trackview", this); //$NON-NLS-1$ - if (selectedView instanceof TrackChooserTView) { - selectedTrack = ((TrackChooserTView)selectedView).getSelectedTrack(); - } - } - selectedView = view; - // initialize and refresh newly selected view - selectedView.init(); - ((JComponent)selectedView).addPropertyChangeListener("trackview", this); //$NON-NLS-1$ - if (selectedView instanceof TrackChooserTView) { - ((TrackChooserTView)selectedView).setSelectedTrack(selectedTrack); - } - selectedView.refresh(); - // put icon in button - chooserButton.setIcon(selectedView.getViewIcon()); - // show the view on the viewPanel - CardLayout cl = (CardLayout) (viewPanel.getLayout()); - cl.show(viewPanel, selectedView.getViewName()); - repaint(); - // refresh the toolbar - refreshToolbar(); - } - - /** - * Responds to property change events. ViewChooser listens for the following - * property names: "track" from trackerPanel - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ - if (selectedView != null) { - selectedView.propertyChange(e); - refreshToolbar(); - } - } - else if (name.equals("trackview")) { // trackview has changed //$NON-NLS-1$ - refreshToolbar(); - } - } - - /** - * Refreshes this chooser and its views. - */ - public void refresh() { - chooserButton.setToolTipText(TrackerRes.getString("TViewChooser.Button.Choose.Tooltip")); //$NON-NLS-1$ - for (TView view: getViews()) - view.refresh(); - } - - /** - * Refreshes the popup menus of the views. - */ - public void refreshMenus() { - for (TView view: getViews()) - if (view instanceof TrackChooserTView) { - TrackChooserTView chooser = (TrackChooserTView)view; - chooser.refreshMenus(); - } - } - - /** - * Maximizes this chooser and its views. - */ - public void maximize() { - if (maximized) return; - TFrame frame = trackerPanel.getTFrame(); - MainTView mainView = frame.getMainView(trackerPanel); - boolean mainViewHasPlayer = false; - for (Component next: mainView.getComponents()) { - mainViewHasPlayer = mainViewHasPlayer || next==mainView.getPlayerBar(); - } - if (mainViewHasPlayer) { - JToolBar toolbar = mainView.getPlayerBar(); - add(toolbar, BorderLayout.SOUTH); - toolbar.setFloatable(false); - } - // save divider locations and size - for (int j=0; j0) - dividerSize=pane.getDividerSize(); - pane.setDividerSize(0); - } - maximized = true; - Container[] views = frame.getViews(trackerPanel); - for (int i = 0; i list = selectedView.getToolBarComponents(); - if (list != null) { - for (Component c: list) { - toolbar.add(c); - } - } - toolbar.add(toolbarFiller); - toolbar.add(maximizeButton); - FontSizer.setFonts(toolbar, FontSizer.getLevel()); - toolbar.repaint(); - } - - /** - * Refreshes the viewPanel. - */ - private void refreshViewPanel() { - viewPanel.removeAll(); - Iterator it = getViews().iterator(); - while (it.hasNext()) { - TView view = it.next(); - String name = view.getViewName(); - viewPanel.add((JComponent)view, name); - } - // reselect selected view, if any - if (selectedView != null && getViews().contains(selectedView)) - setSelectedView(selectedView); - // otherwise select the first view in the list - else { - it = getViews().iterator(); - if (it.hasNext()) { - setSelectedView(it.next()); - } - } - } - - /** - * Returns an XML.ObjectLoader to save and load object data. - * - * @return the XML.ObjectLoader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load object data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the TrackerPanel object to save - */ - public void saveObject(XMLControl control, Object obj) { - TViewChooser chooser = (TViewChooser)obj; - // save the selected view - control.setValue("selected_view", chooser.selectedView); //$NON-NLS-1$ - } - - /** - * Creates an object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return null; - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - TViewChooser chooser = (TViewChooser)obj; - TView view = (TView)control.getObject("selected_view"); //$NON-NLS-1$ - if (view != null) { - chooser.setSelectedView(view); - } - return obj; - } - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.Border; + +import org.opensourcephysics.controls.*; +import org.opensourcephysics.display.OSPRuntime; +import org.opensourcephysics.tools.FontSizer; + +/** + * This is a panel with a toolbar for selecting and controlling TViews. + * + * @author Douglas Brown + */ +public class TViewChooser extends JPanel implements PropertyChangeListener { + + // static fields + protected static Icon minIcon, maxIcon, restoreIcon; + + static { + maxIcon = new ImageIcon( + Tracker.class.getResource("resources/images/maximize.gif")); //$NON-NLS-1$ + restoreIcon = new ImageIcon( + Tracker.class.getResource("resources/images/restore.gif")); //$NON-NLS-1$ + + } + + // instance fields + protected TrackerPanel trackerPanel; + protected ArrayList views = new ArrayList(); + protected TView selectedView; + protected JPanel viewPanel; + protected JToolBar toolbar; + protected JButton chooserButton; + protected Component toolbarFiller = Box.createHorizontalGlue(); + protected JButton maximizeButton; + protected JPopupMenu popup = new JPopupMenu(); + protected int[] dividerLocs = new int[4]; + protected int dividerSize; + protected boolean maximized; + + /** + * Constructs a TViewChooser. + * + * @param panel the tracker panel being viewed + */ + public TViewChooser(TrackerPanel panel) { + super(new BorderLayout()); + trackerPanel = panel; + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + // viewPanel + viewPanel = new JPanel(new CardLayout()); + viewPanel.setBorder(BorderFactory.createEtchedBorder()); + add(viewPanel, BorderLayout.CENTER); + // toolbar + toolbar = new JToolBar(); + toolbar.setFloatable(false); + toolbar.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + toolbar.requestFocusInWindow(); + if (e.getClickCount()==2) { + maximizeButton.doClick(0); + } + if (OSPRuntime.isPopupTrigger(e)) { + final TView view = getSelectedView(); + if (view==null) return; + JPopupMenu popup = new JPopupMenu(); + JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (view instanceof PageTView) { + trackerPanel.getTFrame().showHelp("textview", 0); //$NON-NLS-1$ + } + else if (view instanceof TableTView) { + trackerPanel.getTFrame().showHelp("datatable", 0); //$NON-NLS-1$ + } + else if (view instanceof PlotTView) { + trackerPanel.getTFrame().showHelp("plot", 0); //$NON-NLS-1$ + } + else if (view instanceof WorldTView) { + trackerPanel.getTFrame().showHelp("GUI", 0); //$NON-NLS-1$ + } + } + }); + popup.add(helpItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(toolbar, e.getX(), e.getY()); + } + } + }); + toolbar.setBorder(BorderFactory.createEtchedBorder()); + add(toolbar, BorderLayout.NORTH); + // chooser button + chooserButton = new TButton() { + protected JPopupMenu getPopup() { + // inner popup menu listener class + ActionListener listener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + // select the named view + String name = e.getActionCommand(); + setSelectedView(getView(name)); + } + }; + // add view items to popup + popup.removeAll(); + JMenuItem item; + Iterator it = getViews().iterator(); + while (it.hasNext()) { + TView view = it.next(); + String name = view.getViewName(); + item = new JMenuItem(name, view.getViewIcon()); + item.setActionCommand(name); + item.addActionListener(listener); + popup.add(item); + } + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + }; + // maximize buttons + Border empty = BorderFactory.createEmptyBorder(7, 3, 7, 3); + Border etched = BorderFactory.createEtchedBorder(); + maximizeButton = new TButton(maxIcon, restoreIcon); + maximizeButton.setBorder(BorderFactory.createCompoundBorder(etched, empty)); + maximizeButton.setToolTipText(TrackerRes.getString("TViewChooser.Maximize.Tooltip")); //$NON-NLS-1$ + maximizeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (!maximized) { + maximize(); + } + else restore(); + maximizeButton.setSelected(maximized); + maximizeButton.setToolTipText(maximized? + TrackerRes.getString("TViewChooser.Restore.Tooltip"): //$NON-NLS-1$ + TrackerRes.getString("TViewChooser.Maximize.Tooltip")); //$NON-NLS-1$ + } + }); + createDefaultViews(); + refresh(); + } + + /** + * gets the TrackerPanel containing the tracks + * + * @return the tracker panel + */ + public Dimension getMinimumSize() { + return new Dimension(0, 0); + } + + /** + * gets the TrackerPanel containing the tracks + * + * @return the tracker panel + */ + public TrackerPanel getTrackerPanel() { + return trackerPanel; + } + + /** + * Adds a view of the tracker panel + * + * @param view the view being added + */ + public void addView(TView view) { + if (view == null || view.getTrackerPanel() != trackerPanel) return; + if (getView(view.getClass()) != null) return; + views.add(view); + view.cleanup(); + refreshViewPanel(); + } + + /** + * Adds a view of the tracker panel at a specified index + * + * @param index the list index desired + * @param view the view being added + */ + public void addView(int index, TView view) { + if (view.getTrackerPanel() != trackerPanel) return; + if (getView(view.getClass()) != null) return; + views.add(index, view); + view.cleanup(); + refreshViewPanel(); + } + + /** + * Removes a view from this chooser + * + * @param view the view requesting to be removed + */ + public void removeView(TView view) { + views.remove(view); + if (view == selectedView) selectedView = null; + refreshViewPanel(); + } + + /** + * Gets a list of the available views. + * + * @return the list of views + */ + public Collection getViews() { + return views; + } + + /** + * Gets the view with the specified name. May return null. + * + * @param viewName the name of the view + * @return the view + */ + public TView getView(String viewName) { + Iterator it = getViews().iterator(); + while (it.hasNext()) { + TView view = it.next(); + if (view.getViewName().equals(viewName)) return view; + } + return null; + } + + /** + * Gets a collection of views castable to the specified class or interface. + * + * @param type the class + * @return a collection of views + */ + public Collection getViews(Class type) { + Collection list = new ArrayList(); + for (TView view: list) { + if (type.isInstance(view)) list.add(view); + } + return list; + } + + /** + * Gets the view of the specified class. May return null. + * + * @param c the view class + * @return the view + */ + public TView getView(Class c) { + for (TView view: getViews()) { + if (view.getClass() == c) return view; + } + return null; + } + + /** + * Gets the selected view + * + * @return the selected view + */ + public TView getSelectedView() { + return selectedView; + } + + /** + * Selects the specified view + * + * @param view the view to select + */ + public void setSelectedView(TView view) { + if (view == null || selectedView==view) return; + if (!getViews().contains(view)) { + addView(view); + } + trackerPanel.changed = true; + TTrack selectedTrack = null; + // clean up previously selected view + if (selectedView != null) { + selectedView.cleanup(); + ((JComponent)selectedView).removePropertyChangeListener("trackview", this); //$NON-NLS-1$ + if (selectedView instanceof TrackChooserTView) { + selectedTrack = ((TrackChooserTView)selectedView).getSelectedTrack(); + } + } + selectedView = view; + // initialize and refresh newly selected view + selectedView.init(); + ((JComponent)selectedView).addPropertyChangeListener("trackview", this); //$NON-NLS-1$ + if (selectedView instanceof TrackChooserTView) { + ((TrackChooserTView)selectedView).setSelectedTrack(selectedTrack); + } + selectedView.refresh(); + // put icon in button + chooserButton.setIcon(selectedView.getViewIcon()); + // show the view on the viewPanel + CardLayout cl = (CardLayout) (viewPanel.getLayout()); + cl.show(viewPanel, selectedView.getViewName()); + repaint(); + // refresh the toolbar + refreshToolbar(); + } + + /** + * Responds to property change events. ViewChooser listens for the following + * property names: "track" from trackerPanel + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ + if (selectedView != null) { + selectedView.propertyChange(e); + refreshToolbar(); + } + } + else if (name.equals("trackview")) { // trackview has changed //$NON-NLS-1$ + refreshToolbar(); + } + } + + /** + * Refreshes this chooser and its views. + */ + public void refresh() { + chooserButton.setToolTipText(TrackerRes.getString("TViewChooser.Button.Choose.Tooltip")); //$NON-NLS-1$ + for (TView view: getViews()) + view.refresh(); + } + + /** + * Refreshes the popup menus of the views. + */ + public void refreshMenus() { + for (TView view: getViews()) + if (view instanceof TrackChooserTView) { + TrackChooserTView chooser = (TrackChooserTView)view; + chooser.refreshMenus(); + } + } + + /** + * Maximizes this chooser and its views. + */ + public void maximize() { + if (maximized) return; + TFrame frame = trackerPanel.getTFrame(); + MainTView mainView = frame.getMainView(trackerPanel); + boolean mainViewHasPlayer = false; + for (Component next: mainView.getComponents()) { + mainViewHasPlayer = mainViewHasPlayer || next==mainView.getPlayerBar(); + } + if (mainViewHasPlayer) { + JToolBar toolbar = mainView.getPlayerBar(); + add(toolbar, BorderLayout.SOUTH); + toolbar.setFloatable(false); + } + // save divider locations and size + for (int j=0; j0) + dividerSize=pane.getDividerSize(); + pane.setDividerSize(0); + } + maximized = true; + Container[] views = frame.getViews(trackerPanel); + for (int i = 0; i list = selectedView.getToolBarComponents(); + if (list != null) { + for (Component c: list) { + toolbar.add(c); + } + } + toolbar.add(toolbarFiller); + toolbar.add(maximizeButton); + FontSizer.setFonts(toolbar, FontSizer.getLevel()); + toolbar.repaint(); + } + + /** + * Refreshes the viewPanel. + */ + private void refreshViewPanel() { + viewPanel.removeAll(); + Iterator it = getViews().iterator(); + while (it.hasNext()) { + TView view = it.next(); + String name = view.getViewName(); + viewPanel.add((JComponent)view, name); + } + // reselect selected view, if any + if (selectedView != null && getViews().contains(selectedView)) + setSelectedView(selectedView); + // otherwise select the first view in the list + else { + it = getViews().iterator(); + if (it.hasNext()) { + setSelectedView(it.next()); + } + } + } + + /** + * Returns an XML.ObjectLoader to save and load object data. + * + * @return the XML.ObjectLoader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load object data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the TrackerPanel object to save + */ + public void saveObject(XMLControl control, Object obj) { + TViewChooser chooser = (TViewChooser)obj; + // save the selected view + control.setValue("selected_view", chooser.selectedView); //$NON-NLS-1$ + } + + /** + * Creates an object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return null; + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + TViewChooser chooser = (TViewChooser)obj; + TView view = (TView)control.getObject("selected_view"); //$NON-NLS-1$ + if (view != null) { + chooser.setSelectedView(view); + } + return obj; + } + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TableTView.java b/src/org/opensourcephysics/cabrillo/tracker/TableTView.java index 6fce3784..55d54646 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TableTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TableTView.java @@ -1,482 +1,482 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.util.*; - -import javax.swing.*; -import javax.swing.table.TableColumnModel; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.tools.FontSizer; - -/** - * This displays plot track views selected from a dropdown list. - * - * @author Douglas Brown - */ -public class TableTView extends TrackChooserTView { - - // instance fields - protected Icon icon; - protected JDialog columnsDialog; - protected JLabel trackLabel; - protected JButton defineButton, closeButton, textColumnButton; - protected JPanel buttonPanel; - protected boolean dialogVisible; - - /** - * Constructs a TableTView for the specified tracker panel. - * - * @param panel the tracker panel - */ - public TableTView(TrackerPanel panel) { - super(panel); - icon = new ImageIcon( - Tracker.class.getResource("resources/images/datatable.gif")); //$NON-NLS-1$ - getColumnsDialog(); - } - - /** - * Gets the name of the view - * - * @return the name of the view - */ - public String getViewName() { - return TrackerRes.getString("TFrame.View.Table"); //$NON-NLS-1$ - } - - /** - * Gets the icon for this view - * - * @return the icon for this view - */ - public Icon getViewIcon() { - return icon; - } - - /** - * Creates a view for the specified track - * - * @param track the track to be viewed - * @return the view of the track - */ - protected TrackView createTrackView(TTrack track) { - TableTrackView trackView = new TableTrackView(track, trackerPanel, this); - FontSizer.setFonts(trackView, FontSizer.getLevel()); - return trackView; - } - - /** - * Overrides TrackChooserTView method. - * - * @param track the track to be selected - */ - public void setSelectedTrack(TTrack track) { - if (track == null) { - noDataLabel.setText(TrackerRes.getString("TableTView.Label.NoData")); //$NON-NLS-1$ - } - super.setSelectedTrack(track); - // refresh or close the columns dialog - if (columnsDialog == null || !columnsDialog.isVisible()) return; - else if (getSelectedTrack() == null) columnsDialog.setVisible(false); - else showColumnsDialog(getSelectedTrack()); - } - - /** - * Refreshes the dropdown list and track views. - */ - public void refresh() { - super.refresh(); - if (columnsDialog == null) return; - FontSizer.setFonts(columnsDialog, FontSizer.getLevel()); - closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - defineButton.setText(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ - defineButton.setToolTipText(TrackerRes.getString("Button.Define.Tooltip")); //$NON-NLS-1$ - columnsDialog.setTitle(TrackerRes.getString("TableTView.Dialog.TableColumns.Title")); //$NON-NLS-1$ - textColumnButton.setText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ - textColumnButton.setToolTipText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Tooltip")); //$NON-NLS-1$ - } - - /** - * Displays the dialog box for selecting data columns. - * - * @param track the track - */ - protected void showColumnsDialog(TTrack track) { - if (getColumnsDialog() == null) return; - // refresh dialog - refreshColumnsDialog(track); - Point p0 = new Frame().getLocation(); - if (columnsDialog.getLocation().x == p0.x) { - // center dialog on the screen - Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); - int x = (dim.width - columnsDialog.getBounds().width) / 2; - int y = (dim.height - columnsDialog.getBounds().height) / 2; - columnsDialog.setLocation(x, y); - } - if (!columnsDialog.isVisible()) columnsDialog.setVisible(true); - } - - /** - * Displays the dialog box for selecting data columns. - * - * @param track the track - */ - protected void refreshColumnsDialog(TTrack track) { - if (getColumnsDialog()==null) return; - Container contentPane = columnsDialog.getContentPane(); - contentPane.removeAll(); - trackLabel.setIcon(track.getFootprint().getIcon(21, 16)); - trackLabel.setText(track.getName()); - contentPane.add(trackLabel); - TableTrackView trackView = (TableTrackView)getTrackView(track); - trackView.refreshColumnCheckboxes(); - contentPane.add(trackView.columnsScroller); - contentPane.add(buttonPanel); - FontSizer.setFonts(contentPane, FontSizer.getLevel()); - contentPane.setPreferredSize(null); - Dimension dim = contentPane.getPreferredSize(); - dim.height = Math.min(dim.height, 300); - contentPane.setPreferredSize(dim); - columnsDialog.pack(); - textColumnButton.setEnabled(!track.isLocked()); - columnsDialog.repaint(); - } - - /** - * Responds to property change events. This listens for - * events "tab" from TFrame and "function" from FunctionTool. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (e.getNewValue() == trackerPanel && this.isVisible()) { - if (columnsDialog != null) columnsDialog.setVisible(dialogVisible); - } - else { - boolean vis = dialogVisible; - if (columnsDialog != null) columnsDialog.setVisible(false); - dialogVisible = vis; - } - } - else if (e.getPropertyName().equals("function")) { //$NON-NLS-1$ - super.propertyChange(e); - TTrack track = getSelectedTrack(); - if (track!=null && columnsDialog!=null) { - refreshColumnsDialog(track); - JViewport port = ((TableTrackView)getTrackView(track)). - columnsScroller.getViewport(); - Dimension dim = port.getViewSize(); - int offset = port.getExtentSize().height; - port.setViewPosition(new Point(0, dim.height-offset)); - } - } - else super.propertyChange(e); - } - - private JDialog getColumnsDialog() { - TFrame frame = trackerPanel.getTFrame(); - if (columnsDialog == null && frame != null) { - columnsDialog = new JDialog(frame, false) { - public void setVisible(boolean vis) { - super.setVisible(vis); - dialogVisible = vis; - } - }; - columnsDialog.setTitle(TrackerRes.getString("TableTView.Dialog.TableColumns.Title")); //$NON-NLS-1$ - columnsDialog.setResizable(false); - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - JPanel contentPane = new JPanel(); - contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); - columnsDialog.setContentPane(contentPane); - // create close button - closeButton = new JButton(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - columnsDialog.setVisible(false); - } - }); - // create data function tool action - ActionListener dataFunctionListener = new ActionListener() { - public void actionPerformed(ActionEvent e) { - TTrack track = getSelectedTrack(); - if (track != null) { - trackerPanel.getDataBuilder().setSelectedPanel(track.getName()); - trackerPanel.getDataBuilder().setVisible(true); - } - } - }; - // create define button - defineButton = new JButton(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ - defineButton.addActionListener(dataFunctionListener); - defineButton.setToolTipText(TrackerRes.getString("Button.Define.Tooltip")); //$NON-NLS-1$ - // create text column button - textColumnButton = new JButton(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ - textColumnButton.setToolTipText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Tooltip")); //$NON-NLS-1$ - textColumnButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // show popup menu - JPopupMenu popup = new JPopupMenu(); - TableTrackView trackView = (TableTrackView)getTrackView(getSelectedTrack()); - trackView.getPopup(); // refreshes menu items - popup.add(trackView.createTextColumnItem); - if (trackView.deleteTextColumnMenu.getMenuComponentCount()>0) { - popup.add(trackView.deleteTextColumnMenu); - popup.add(trackView.renameTextColumnMenu); - } - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(textColumnButton, 0, textColumnButton.getHeight()); - } - }); - - buttonPanel = new JPanel(); - buttonPanel.add(defineButton); - buttonPanel.add(textColumnButton); - buttonPanel.add(closeButton); - // create track label - trackLabel = new JLabel(); - trackLabel.setBorder(BorderFactory.createEmptyBorder(7, 0, 6, 0)); - trackLabel.setAlignmentX(Component.CENTER_ALIGNMENT); - } - return columnsDialog; - } - - /** - * Returns an XML.ObjectLoader to save and load object data. - * - * @return the XML.ObjectLoader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load object data. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves object data. - * - * @param control the control to save to - * @param obj the TrackerPanel object to save - */ - public void saveObject(XMLControl control, Object obj) { - TableTView view = (TableTView)obj; - TTrack track = view.getSelectedTrack(); - if (track != null) { // contains at least one track - control.setValue("selected_track", track.getName()); //$NON-NLS-1$ - // save customized tables - ArrayList customized = new ArrayList(); - Map views = view.trackViews; - for (TTrack next: views.keySet()) { - if (views.get(next).isCustomState()) - customized.add(next); - } - if (!customized.isEmpty()) { - ArrayList formattedColumns = new ArrayList(); - String[][] data = new String[customized.size()][]; - Iterator it = customized.iterator(); - int i = -1; - while (it.hasNext()) { - i++; - track = it.next(); - TableTrackView trackView = (TableTrackView)view.getTrackView(track); - String[] columns = trackView.getOrderedVisibleColumns(); - data[i] = new String[columns.length+1]; - System.arraycopy(columns, 0, data[i], 1, columns.length); - data[i][0] = track.getName(); - String[][] formats = trackView.getColumnFormats(); - if (formats.length>0) { - String[][] withName = new String[formats.length][3]; - for (int j=0; j views = view.trackViews; - for (TTrack track: views.keySet()) { - TableTrackView trackView = (TableTrackView)view.getTrackView(track); - if (trackView == null) continue; - for (int i = 0; i < data.length; i++) { - String[] columns = data[i]; - if (!columns[0].equals(track.getName())) continue; - trackView.refresh = false; // prevents refreshes - // start by unchecking all checkboxes - for (int j = 0; j < trackView.checkBoxes.length; j++) { - trackView.checkBoxes[j].setSelected(false); - // check for text columns--not managed by the track DatasetManager - int n = trackView.data.getDatasets().size(); - if (j>=n) { - String name = track.getTextColumnNames().get(j-n); - trackView.textColumnsVisible.remove(name); - } - } - // then select checkboxes specified in track_columns - for (int j = 1; j < columns.length; j++) { - if (columns[j].equals("theta") && track instanceof PointMass) //$NON-NLS-1$ - columns[j] = "\u03b8"+"r"; //$NON-NLS-1$ //$NON-NLS-2$ - else if (columns[j].equals("theta")) //$NON-NLS-1$ - columns[j] = "\u03b8"; //$NON-NLS-1$ - else if (columns[j].equals("theta_v")) //$NON-NLS-1$ - columns[j] = "\u03b8"+"v"; //$NON-NLS-1$ //$NON-NLS-2$ - else if (columns[j].equals("theta_a")) //$NON-NLS-1$ - columns[j] = "\u03b8"+"a"; //$NON-NLS-1$ //$NON-NLS-2$ - else if (columns[j].equals("theta_p")) //$NON-NLS-1$ - columns[j] = "\u03b8"+"p"; //$NON-NLS-1$ //$NON-NLS-2$ - else if (columns[j].equals("n") && track instanceof PointMass) //$NON-NLS-1$ - columns[j] = "step"; //$NON-NLS-1$ - else if (columns[j].equals("KE")) //$NON-NLS-1$ - columns[j] = "K"; //$NON-NLS-1$ - else if (columns[j].equals("x-comp")) //$NON-NLS-1$ - columns[j] = "x"; //$NON-NLS-1$ - else if (columns[j].equals("y-comp")) //$NON-NLS-1$ - columns[j] = "y"; //$NON-NLS-1$ - else if (columns[j].equals("x_tail")) //$NON-NLS-1$ - columns[j] = "xtail"; //$NON-NLS-1$ - else if (columns[j].equals("y_tail")) //$NON-NLS-1$ - columns[j] = "ytail"; //$NON-NLS-1$ - trackView.setVisible(columns[j], true); - } - // move columns so the table column order matches the saved track_columns order - // get list of checked boxes--doesn't include independent variable - String[] checkedBoxes = trackView.getVisibleColumns(); - // expand to include independent variable - String[] visibleColumns = new String[checkedBoxes.length+1]; - visibleColumns[0] = track.getDataName(0); - System.arraycopy(checkedBoxes, 0, visibleColumns, 1, checkedBoxes.length); - // create desiredOrder from track_columns array by omitting track name - String[] desiredOrder = new String[columns.length-1]; - System.arraycopy(columns, 1, desiredOrder, 0, desiredOrder.length); - // convert desiredOrder names to desiredIndexes - final int[] desiredIndexes = new int[desiredOrder.length]; - for (int k=0; k views = view.trackViews; - for (TTrack track: views.keySet()) { - TableTrackView trackView = (TableTrackView)view.getTrackView(track); - if (trackView == null) continue; - for (int i = 0; i < formats.length; i++) { - String[][] patterns = formats[i]; - if (!patterns[0][0].equals(track.getName())) continue; - trackView.refresh = false; // prevents refreshes - for (int j = 0; j < patterns.length; j++) { - trackView.dataTable.setFormatPattern(patterns[j][1], patterns[j][2]); - } - trackView.refresh = true; - } - } - } - TTrack track = view.getTrack(control.getString("selected_track")); //$NON-NLS-1$ - if (track != null) { - view.setSelectedTrack(track); - // code below for legacy files?? - TableTrackView trackView = (TableTrackView)view.getTrackView(track); - String[] columns = (String[])control.getObject("visible_columns"); //$NON-NLS-1$ - if (columns != null) { - trackView.refresh = false; // prevents refreshes - for (int i = 0; i < trackView.checkBoxes.length; i++) { - trackView.checkBoxes[i].setSelected(false); - } - for (int i = 0; i < columns.length; i++) { - trackView.setVisible(columns[i], true); - } - trackView.refresh = true; - trackView.refresh(view.trackerPanel.getFrameNumber()); - } - } - return obj; - } - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.util.*; + +import javax.swing.*; +import javax.swing.table.TableColumnModel; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.tools.FontSizer; + +/** + * This displays plot track views selected from a dropdown list. + * + * @author Douglas Brown + */ +public class TableTView extends TrackChooserTView { + + // instance fields + protected Icon icon; + protected JDialog columnsDialog; + protected JLabel trackLabel; + protected JButton defineButton, closeButton, textColumnButton; + protected JPanel buttonPanel; + protected boolean dialogVisible; + + /** + * Constructs a TableTView for the specified tracker panel. + * + * @param panel the tracker panel + */ + public TableTView(TrackerPanel panel) { + super(panel); + icon = new ImageIcon( + Tracker.class.getResource("resources/images/datatable.gif")); //$NON-NLS-1$ + getColumnsDialog(); + } + + /** + * Gets the name of the view + * + * @return the name of the view + */ + public String getViewName() { + return TrackerRes.getString("TFrame.View.Table"); //$NON-NLS-1$ + } + + /** + * Gets the icon for this view + * + * @return the icon for this view + */ + public Icon getViewIcon() { + return icon; + } + + /** + * Creates a view for the specified track + * + * @param track the track to be viewed + * @return the view of the track + */ + protected TrackView createTrackView(TTrack track) { + TableTrackView trackView = new TableTrackView(track, trackerPanel, this); + FontSizer.setFonts(trackView, FontSizer.getLevel()); + return trackView; + } + + /** + * Overrides TrackChooserTView method. + * + * @param track the track to be selected + */ + public void setSelectedTrack(TTrack track) { + if (track == null) { + noDataLabel.setText(TrackerRes.getString("TableTView.Label.NoData")); //$NON-NLS-1$ + } + super.setSelectedTrack(track); + // refresh or close the columns dialog + if (columnsDialog == null || !columnsDialog.isVisible()) return; + else if (getSelectedTrack() == null) columnsDialog.setVisible(false); + else showColumnsDialog(getSelectedTrack()); + } + + /** + * Refreshes the dropdown list and track views. + */ + public void refresh() { + super.refresh(); + if (columnsDialog == null) return; + FontSizer.setFonts(columnsDialog, FontSizer.getLevel()); + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + defineButton.setText(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ + defineButton.setToolTipText(TrackerRes.getString("Button.Define.Tooltip")); //$NON-NLS-1$ + columnsDialog.setTitle(TrackerRes.getString("TableTView.Dialog.TableColumns.Title")); //$NON-NLS-1$ + textColumnButton.setText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ + textColumnButton.setToolTipText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Tooltip")); //$NON-NLS-1$ + } + + /** + * Displays the dialog box for selecting data columns. + * + * @param track the track + */ + protected void showColumnsDialog(TTrack track) { + if (getColumnsDialog() == null) return; + // refresh dialog + refreshColumnsDialog(track); + Point p0 = new Frame().getLocation(); + if (columnsDialog.getLocation().x == p0.x) { + // center dialog on the screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - columnsDialog.getBounds().width) / 2; + int y = (dim.height - columnsDialog.getBounds().height) / 2; + columnsDialog.setLocation(x, y); + } + if (!columnsDialog.isVisible()) columnsDialog.setVisible(true); + } + + /** + * Displays the dialog box for selecting data columns. + * + * @param track the track + */ + protected void refreshColumnsDialog(TTrack track) { + if (getColumnsDialog()==null) return; + Container contentPane = columnsDialog.getContentPane(); + contentPane.removeAll(); + trackLabel.setIcon(track.getFootprint().getIcon(21, 16)); + trackLabel.setText(track.getName()); + contentPane.add(trackLabel); + TableTrackView trackView = (TableTrackView)getTrackView(track); + trackView.refreshColumnCheckboxes(); + contentPane.add(trackView.columnsScroller); + contentPane.add(buttonPanel); + FontSizer.setFonts(contentPane, FontSizer.getLevel()); + contentPane.setPreferredSize(null); + Dimension dim = contentPane.getPreferredSize(); + dim.height = Math.min(dim.height, 300); + contentPane.setPreferredSize(dim); + columnsDialog.pack(); + textColumnButton.setEnabled(!track.isLocked()); + columnsDialog.repaint(); + } + + /** + * Responds to property change events. This listens for + * events "tab" from TFrame and "function" from FunctionTool. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (e.getNewValue() == trackerPanel && this.isVisible()) { + if (columnsDialog != null) columnsDialog.setVisible(dialogVisible); + } + else { + boolean vis = dialogVisible; + if (columnsDialog != null) columnsDialog.setVisible(false); + dialogVisible = vis; + } + } + else if (e.getPropertyName().equals("function")) { //$NON-NLS-1$ + super.propertyChange(e); + TTrack track = getSelectedTrack(); + if (track!=null && columnsDialog!=null) { + refreshColumnsDialog(track); + JViewport port = ((TableTrackView)getTrackView(track)). + columnsScroller.getViewport(); + Dimension dim = port.getViewSize(); + int offset = port.getExtentSize().height; + port.setViewPosition(new Point(0, dim.height-offset)); + } + } + else super.propertyChange(e); + } + + private JDialog getColumnsDialog() { + TFrame frame = trackerPanel.getTFrame(); + if (columnsDialog == null && frame != null) { + columnsDialog = new JDialog(frame, false) { + public void setVisible(boolean vis) { + super.setVisible(vis); + dialogVisible = vis; + } + }; + columnsDialog.setTitle(TrackerRes.getString("TableTView.Dialog.TableColumns.Title")); //$NON-NLS-1$ + columnsDialog.setResizable(false); + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + JPanel contentPane = new JPanel(); + contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.PAGE_AXIS)); + columnsDialog.setContentPane(contentPane); + // create close button + closeButton = new JButton(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + columnsDialog.setVisible(false); + } + }); + // create data function tool action + ActionListener dataFunctionListener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + TTrack track = getSelectedTrack(); + if (track != null) { + trackerPanel.getDataBuilder().setSelectedPanel(track.getName()); + trackerPanel.getDataBuilder().setVisible(true); + } + } + }; + // create define button + defineButton = new JButton(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ + defineButton.addActionListener(dataFunctionListener); + defineButton.setToolTipText(TrackerRes.getString("Button.Define.Tooltip")); //$NON-NLS-1$ + // create text column button + textColumnButton = new JButton(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ + textColumnButton.setToolTipText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Tooltip")); //$NON-NLS-1$ + textColumnButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // show popup menu + JPopupMenu popup = new JPopupMenu(); + TableTrackView trackView = (TableTrackView)getTrackView(getSelectedTrack()); + trackView.getPopup(); // refreshes menu items + popup.add(trackView.createTextColumnItem); + if (trackView.deleteTextColumnMenu.getMenuComponentCount()>0) { + popup.add(trackView.deleteTextColumnMenu); + popup.add(trackView.renameTextColumnMenu); + } + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(textColumnButton, 0, textColumnButton.getHeight()); + } + }); + + buttonPanel = new JPanel(); + buttonPanel.add(defineButton); + buttonPanel.add(textColumnButton); + buttonPanel.add(closeButton); + // create track label + trackLabel = new JLabel(); + trackLabel.setBorder(BorderFactory.createEmptyBorder(7, 0, 6, 0)); + trackLabel.setAlignmentX(Component.CENTER_ALIGNMENT); + } + return columnsDialog; + } + + /** + * Returns an XML.ObjectLoader to save and load object data. + * + * @return the XML.ObjectLoader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load object data. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves object data. + * + * @param control the control to save to + * @param obj the TrackerPanel object to save + */ + public void saveObject(XMLControl control, Object obj) { + TableTView view = (TableTView)obj; + TTrack track = view.getSelectedTrack(); + if (track != null) { // contains at least one track + control.setValue("selected_track", track.getName()); //$NON-NLS-1$ + // save customized tables + ArrayList customized = new ArrayList(); + Map views = view.trackViews; + for (TTrack next: views.keySet()) { + if (views.get(next).isCustomState()) + customized.add(next); + } + if (!customized.isEmpty()) { + ArrayList formattedColumns = new ArrayList(); + String[][] data = new String[customized.size()][]; + Iterator it = customized.iterator(); + int i = -1; + while (it.hasNext()) { + i++; + track = it.next(); + TableTrackView trackView = (TableTrackView)view.getTrackView(track); + String[] columns = trackView.getOrderedVisibleColumns(); + data[i] = new String[columns.length+1]; + System.arraycopy(columns, 0, data[i], 1, columns.length); + data[i][0] = track.getName(); + String[][] formats = trackView.getColumnFormats(); + if (formats.length>0) { + String[][] withName = new String[formats.length][3]; + for (int j=0; j views = view.trackViews; + for (TTrack track: views.keySet()) { + TableTrackView trackView = (TableTrackView)view.getTrackView(track); + if (trackView == null) continue; + for (int i = 0; i < data.length; i++) { + String[] columns = data[i]; + if (!columns[0].equals(track.getName())) continue; + trackView.refresh = false; // prevents refreshes + // start by unchecking all checkboxes + for (int j = 0; j < trackView.checkBoxes.length; j++) { + trackView.checkBoxes[j].setSelected(false); + // check for text columns--not managed by the track DatasetManager + int n = trackView.data.getDatasets().size(); + if (j>=n) { + String name = track.getTextColumnNames().get(j-n); + trackView.textColumnsVisible.remove(name); + } + } + // then select checkboxes specified in track_columns + for (int j = 1; j < columns.length; j++) { + if (columns[j].equals("theta") && track instanceof PointMass) //$NON-NLS-1$ + columns[j] = "\u03b8"+"r"; //$NON-NLS-1$ //$NON-NLS-2$ + else if (columns[j].equals("theta")) //$NON-NLS-1$ + columns[j] = "\u03b8"; //$NON-NLS-1$ + else if (columns[j].equals("theta_v")) //$NON-NLS-1$ + columns[j] = "\u03b8"+"v"; //$NON-NLS-1$ //$NON-NLS-2$ + else if (columns[j].equals("theta_a")) //$NON-NLS-1$ + columns[j] = "\u03b8"+"a"; //$NON-NLS-1$ //$NON-NLS-2$ + else if (columns[j].equals("theta_p")) //$NON-NLS-1$ + columns[j] = "\u03b8"+"p"; //$NON-NLS-1$ //$NON-NLS-2$ + else if (columns[j].equals("n") && track instanceof PointMass) //$NON-NLS-1$ + columns[j] = "step"; //$NON-NLS-1$ + else if (columns[j].equals("KE")) //$NON-NLS-1$ + columns[j] = "K"; //$NON-NLS-1$ + else if (columns[j].equals("x-comp")) //$NON-NLS-1$ + columns[j] = "x"; //$NON-NLS-1$ + else if (columns[j].equals("y-comp")) //$NON-NLS-1$ + columns[j] = "y"; //$NON-NLS-1$ + else if (columns[j].equals("x_tail")) //$NON-NLS-1$ + columns[j] = "xtail"; //$NON-NLS-1$ + else if (columns[j].equals("y_tail")) //$NON-NLS-1$ + columns[j] = "ytail"; //$NON-NLS-1$ + trackView.setVisible(columns[j], true); + } + // move columns so the table column order matches the saved track_columns order + // get list of checked boxes--doesn't include independent variable + String[] checkedBoxes = trackView.getVisibleColumns(); + // expand to include independent variable + String[] visibleColumns = new String[checkedBoxes.length+1]; + visibleColumns[0] = track.getDataName(0); + System.arraycopy(checkedBoxes, 0, visibleColumns, 1, checkedBoxes.length); + // create desiredOrder from track_columns array by omitting track name + String[] desiredOrder = new String[columns.length-1]; + System.arraycopy(columns, 1, desiredOrder, 0, desiredOrder.length); + // convert desiredOrder names to desiredIndexes + final int[] desiredIndexes = new int[desiredOrder.length]; + for (int k=0; k views = view.trackViews; + for (TTrack track: views.keySet()) { + TableTrackView trackView = (TableTrackView)view.getTrackView(track); + if (trackView == null) continue; + for (int i = 0; i < formats.length; i++) { + String[][] patterns = formats[i]; + if (!patterns[0][0].equals(track.getName())) continue; + trackView.refresh = false; // prevents refreshes + for (int j = 0; j < patterns.length; j++) { + trackView.dataTable.setFormatPattern(patterns[j][1], patterns[j][2]); + } + trackView.refresh = true; + } + } + } + TTrack track = view.getTrack(control.getString("selected_track")); //$NON-NLS-1$ + if (track != null) { + view.setSelectedTrack(track); + // code below for legacy files?? + TableTrackView trackView = (TableTrackView)view.getTrackView(track); + String[] columns = (String[])control.getObject("visible_columns"); //$NON-NLS-1$ + if (columns != null) { + trackView.refresh = false; // prevents refreshes + for (int i = 0; i < trackView.checkBoxes.length; i++) { + trackView.checkBoxes[i].setSelected(false); + } + for (int i = 0; i < columns.length; i++) { + trackView.setVisible(columns[i], true); + } + trackView.refresh = true; + trackView.refresh(view.trackerPanel.getFrameNumber()); + } + } + return obj; + } + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java b/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java index 9ebd60d3..0977cda1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java @@ -1,1561 +1,1561 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.lang.reflect.Constructor; -import java.rmi.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableCellEditor; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableColumnModel; - -import org.opensourcephysics.controls.*; -import org.opensourcephysics.display.*; -import org.opensourcephysics.display.DataTable.NumberFormatDialog; -import org.opensourcephysics.media.core.VideoClip; -import org.opensourcephysics.tools.*; - -/** - * This displays a table view of a track on a TrackerPanel. - * - * @author Douglas Brown - * @author John Welch - */ -public class TableTrackView extends TrackView { - - // static fields - static final String DEFINED_AS = ": "; //$NON-NLS-1$ - - // instance fields - protected TableTView parentView; - protected DataTable dataTable; - protected JButton columnsButton; - protected JPopupMenu popup; - protected JPanel columnsPanel; - protected JScrollPane columnsScroller; - protected DatasetManager data; - protected DatasetManager tableData; - protected JCheckBox[] checkBoxes; - protected JMenuItem formatDialogItem; - protected JMenu copyDataMenu; - protected JMenuItem copyDataRawItem, copyDataFormattedItem; - protected JMenu setDelimiterMenu; - ButtonGroup delimiterButtonGroup = new ButtonGroup(); - protected JMenuItem addDelimiterItem, removeDelimiterItem; - protected JMenuItem copyImageItem, snapshotItem, printItem, helpItem; - protected JMenuItem dataToolItem, dataBuilderItem, deleteDataFunctionItem; - protected JMenuItem createTextColumnItem; - protected JMenu textColumnMenu, deleteTextColumnMenu, renameTextColumnMenu; - protected String xVar, yVar; - protected boolean refresh = true; - protected boolean highlightVisible = true; - protected int highlightRow; // highlighted table row, or -1 - protected int leadCol; - protected Font font = new JTextField().getFont(); - protected TreeSet selectedIndepVarValues // used when sorting - = new TreeSet(); - protected Map degreeRenderers - = new HashMap(); - protected TextColumnTableModel textColumnModel; - protected TextColumnEditor textColumnEditor; - protected Set textColumnsVisible = new TreeSet(); - protected ArrayList textColumnNames = new ArrayList(); - - /** - * Constructs a TrackTableView of the specified track on the specified tracker panel. - * - * @param track the track - * @param panel the tracker panel - * @param view the TableTView that will display this - */ - public TableTrackView(TTrack track, TrackerPanel panel, TableTView view) { - super(track, panel); - parentView = view; - track.addPropertyChangeListener("text_column", this); //$NON-NLS-1$ - textColumnNames.addAll(track.getTextColumnNames()); - // create the DataTable - textColumnEditor = new TextColumnEditor(); - dataTable = new DataTable() { - public void refreshTable() { - // save selected rows and columns - int[] rows = getSelectedRows(); - int[] cols = getSelectedColumns(); - // refresh table - super.refreshTable(); - // restore selected rows and columns - for (int i = 0; i < rows.length; i++) { - if (rows[i] < getRowCount()) - addRowSelectionInterval(rows[i], rows[i]); - } - for (int i = 0; i < cols.length; i++) { - if (cols[i] < getColumnCount()) - addColumnSelectionInterval(cols[i], cols[i]); - } - } - public TableCellEditor getCellEditor(int row, int column) { - // only text columns are editable, so always return textColumnEditor - return textColumnEditor; - } - public boolean isCellEditable(int row, int col) { - // true only for text (String) columns - int i = dataTable.convertColumnIndexToModel(col); - return dataTable.getModel().getColumnClass(i).equals(String.class); - } - - }; - - data = track.getData(trackerPanel); - tableData = new DatasetManager(); - tableData.setXPointsLinked(true); - dataTable.add(tableData); - textColumnModel = new TextColumnTableModel(); - dataTable.add(textColumnModel); - setViewportView(dataTable); - dataTable.setPreferredScrollableViewportSize(new Dimension(160, 200)); - addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - dataTable.clearSelection(); - } - public void mouseEntered(MouseEvent e) { - dataTable.requestFocusInWindow(); - } - }); - dataTable.addMouseListener(new MouseAdapter() { - public void mouseEntered(MouseEvent e) { - dataTable.requestFocusInWindow(); - } - }); - // add key listener to start editing text column cells with space key - dataTable.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if(e.getKeyCode()==KeyEvent.VK_SPACE) { - int row = dataTable.getSelectedRow(); - int col = dataTable.getSelectedColumn(); - dataTable.editCellAt(row, col); - textColumnEditor.field.selectAll(); - Runnable runner = new Runnable() { - public synchronized void run() { - textColumnEditor.field.requestFocusInWindow(); - } - }; - SwingUtilities.invokeLater(runner); - } - } - - }); - - ListSelectionModel selectionModel = dataTable.getSelectionModel(); - selectionModel.addListSelectionListener(new ListSelectionListener() { - public void valueChanged(ListSelectionEvent e) { - selectedIndepVarValues.clear(); - int[] rows = dataTable.getSelectedRows(); // selected view rows - for(int i = 0; i datasets = data.getDatasets(); - dataTable.setUnits(datasets.get(0).getXColumnName(), "", track.getDataDescription(0)); //$NON-NLS-1$ - int count = datasets.size(); - for (int i = 0; i < count; i++) { - if (checkBoxes[i].isSelected()) { - Dataset in = datasets.get(i); - String xTitle = in.getXColumnName(); - String yTitle = in.getYColumnName(); - boolean yIsAngle = yTitle.startsWith(Tracker.THETA) - || yTitle.startsWith(Tracker.OMEGA) - || yTitle.startsWith(Tracker.ALPHA); - boolean degrees = trackerPanel.getTFrame()!=null - && !trackerPanel.getTFrame().anglesInRadians; - Dataset local = tableData.getDataset(colCount++); - double[] yPoints = in.getYPoints(); - String tooltip = track.getDataDescription(i+1)+" "; //$NON-NLS-1$ - String units = ""; //$NON-NLS-1$ - if (yIsAngle) { // angle columns - if (yTitle.startsWith(Tracker.THETA)) { - if (degrees) { - units = Tracker.DEGREES; - tooltip += TrackerRes.getString("TableTrackView.Degrees.Tooltip"); //$NON-NLS-1$ - } - else { - tooltip += TrackerRes.getString("TableTrackView.Radians.Tooltip"); //$NON-NLS-1$ - } - } - else if (yTitle.startsWith(Tracker.OMEGA)) { - if (degrees) { - tooltip += TrackerRes.getString("TableTrackView.DegreesPerSecond.Tooltip"); //$NON-NLS-1$ - } - else { - tooltip += TrackerRes.getString("TableTrackView.RadiansPerSecond.Tooltip"); //$NON-NLS-1$ - } - } - else if (yTitle.startsWith(Tracker.ALPHA)) { - if (degrees) { - tooltip += TrackerRes.getString("TableTrackView.DegreesPerSecondSquared.Tooltip"); //$NON-NLS-1$ - } - else { - tooltip += TrackerRes.getString("TableTrackView.RadiansPerSecondSquared.Tooltip"); //$NON-NLS-1$ - } - } - TableCellRenderer precisionRenderer = dataTable.getPrecisionRenderer(yTitle); - if (degrees) { - // convert values from radians to degrees - for (int k = 0; k getToolBarComponents() { - return toolbarComponents; - } - - /** - * Gets the view button - * - * @return the view button - */ - public JButton getViewButton() { - return columnsButton; - } - - /** - * Returns true if this trackview is in a custom state. - * - * @return true if in a custom state, false if in the default state - */ - public boolean isCustomState() { - // check displayed data columns--default is columns 0 and 1 only - int n = checkBoxes.length; - for (int i = 0; i < n; i++) { - boolean selected = checkBoxes[i].isSelected(); - boolean shouldBe = i < 2; - if ((shouldBe && !selected) || (!shouldBe && selected)) return true; - } - // check for formatting--default is no formatting - if (dataTable.getFormattedColumnNames().length>0) - return true; - // check for reordered columns - TableColumnModel model = dataTable.getColumnModel(); - int count = model.getColumnCount(); - if (count==0) return true; // should never happen... - int index = model.getColumn(0).getModelIndex(); - for (int i=1; itrue to show the dataset column in the table - */ - public void setVisible(int index, boolean visible) { - if (index < checkBoxes.length) { - checkBoxes[index].setSelected(visible); - } - int n = data.getDatasets().size(); - if (index>=n) { - String name = track.getTextColumnNames().get(index-n); - textColumnsVisible.add(name); - } - refresh(trackerPanel.getFrameNumber()); - } - - /** - * Sets the visibility of a data or text column specified by name - * - * @param name the name of the column - * @param visible true to show the column in the table - */ - public void setVisible(String name, boolean visible) { - for (int i = 0; i < checkBoxes.length; i++) { - String s = checkBoxes[i].getActionCommand(); - if (s.equals(name) || TeXParser.removeSubscripting(s).equals(name)) { - setVisible(i, visible); - break; - } - } - } - - /** - * Sets the highlighted point. - * - * @param frameNumber the frame number - */ - protected void setHighlighted(int frameNumber) { - // assume no highlights - highlightRow = -1; - if (!highlightVisible) return; - Step[] steps = track.getSteps(); - int row = -1; - VideoClip clip = null; - if (track.trackerPanel != null) { - clip = track.trackerPanel.getPlayer().getVideoClip(); - } - // look for row to highlight - for (int i = 0; i < steps.length; i++) { - if (steps[i] != null - && steps[i].dataVisible - && clip != null - && clip.includesFrame(steps[i].getFrameNumber())) { - row++; - if (steps[i].getFrameNumber() == frameNumber) { - if (row >= dataTable.getRowCount()) return; - highlightRow = row; - break; - } - } - } - // select highlighted row, or clear selection if none found - Runnable runner = new Runnable() { - public synchronized void run() { - if (highlightRow >= dataTable.getRowCount() || highlightRow < 0) { - dataTable.clearSelection(); - return; - } - try { - dataTable.setRowSelectionInterval(highlightRow, highlightRow); - } catch (Exception e) { - // occasionally throws exception during loading! - } - int cols = dataTable.getColumnCount(); - dataTable.setColumnSelectionInterval(0, cols-1); - } - }; - if(SwingUtilities.isEventDispatchThread()) runner.run(); - else SwingUtilities.invokeLater(runner); - - } - - /** - * Gets an array of visible column names. - * - * @return the visible columns - */ - String[] getVisibleColumns() { - ArrayList list = new ArrayList(); - for (int i = 0; i < checkBoxes.length; i++) { - if (checkBoxes[i].isSelected()) { - String var = checkBoxes[i].getText(); - int n = var.indexOf(DEFINED_AS); - if (n > -1) var = var.substring(0, n); - list.add(var); - } - } - return list.toArray(new String[0]); - } - - /** - * Returns the visible column names in the order displayed in the table. - * Used for saving/loading xml. - * - * @return the visible columns in order - */ - String[] getOrderedVisibleColumns() { - // get array of column model indexes in table order - TableColumnModel model = dataTable.getColumnModel(); - Integer[] modelIndexes = new Integer[model.getColumnCount()]; - for (int i=0; i=modelIndexes.length || modelIndexes[i]>=columnNames.length) - continue; - ordered[i] = columnNames[modelIndexes[i]]; - } - return ordered; - } - - /** - * Gets an array of column names and formats. Used for saving/loading xml - * - * @return String[][] each element is {colName, format} - */ - String[][] getColumnFormats() { - String[] colNames = dataTable.getFormattedColumnNames(); - String[][] colFormats = new String[colNames.length][2]; - for (int i = 0; i type = Class.forName("org.opensourcephysics.frames.ImageFrame"); //$NON-NLS-1$ - Constructor[] constructors = type.getConstructors(); - for(int i = 0; i[] parameters = constructors[i].getParameterTypes(); - if(parameters.length==1 && parameters[0]==MeasuredImage.class) { - frame = (OSPFrame) constructors[i].newInstance(new Object[] {mi}); - break; - } - } - } catch (Exception ex) { - ex.printStackTrace(); - } - if (frame==null) return; - - frame.setTitle(DisplayRes.getString("Snapshot.Title")); //$NON-NLS-1$ - frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - frame.setKeepHidden(false); - FontSizer.setFonts(frame, FontSizer.getLevel()); - frame.pack(); - frame.setVisible(true); - } - - @Override - public void setFont(Font font) { - super.setFont(font); - if (dataTable!=null) { - dataTable.setRowHeight(font.getSize()+4); - dataTable.getTableHeader().setFont(font); - } - } - - /** - * Gets the TViewChooser that owns (displays) this view. - * @return the TViewChooser - */ - protected TViewChooser getOwner() { - // find TViewChooser with this view and copy that - TFrame frame = trackerPanel.getTFrame(); - Container[] views = frame.getViews(trackerPanel); - for (int i = 0; i < views.length; i++) { - if (views[i] instanceof TViewChooser) { - TViewChooser chooser = (TViewChooser)views[i]; - if (chooser.getSelectedView() instanceof TableTView) { - TableTView tableView = (TableTView)chooser.getSelectedView(); - TrackView view = tableView.getTrackView(tableView.getSelectedTrack()); - if (view.equals(TableTrackView.this)) { - return chooser; - } - } - } - } - return null; - } - - /** - * Gets the independent variable value at a view row. - * - * @param row the table row - * @return the value - */ - protected double getIndepVarValueAtRow(int row) { - int col = dataTable.convertColumnIndexToView(0); - Double val = null; - try { - val = (Double)dataTable.getValueAt(row, col); - } catch (Exception e) {} - return val==null? Double.NaN: val; - } - - /** - * Gets the view row at which an independent variable value is found. - * - * @param indepVarValue the value - * @return the view row - */ - protected int getRowFromIndepVarValue(double indepVarValue) { - int col = dataTable.convertColumnIndexToView(0); - for(int i = 0; i-1) { - dataTable.addRowSelectionInterval(row, row); - } - } - } - - /** - * Creates the GUI. - */ - protected void createGUI() { - columnsPanel = new JPanel(); - columnsPanel.setBackground(Color.WHITE); - columnsPanel.setLayout(new GridLayout(0, 4)); - columnsScroller = new JScrollPane(columnsPanel); - javax.swing.border.Border empty = BorderFactory.createEmptyBorder(0, 3, 0, 2); - javax.swing.border.Border etched = BorderFactory.createEtchedBorder(); - columnsScroller.setBorder(BorderFactory.createCompoundBorder(empty, etched)); - // button to open column selection dialog box - columnsButton = new TButton() { - // override getMaximumSize method so has same height as chooser button - public Dimension getMaximumSize() { - Dimension dim = super.getMaximumSize(); - Dimension min = getMinimumSize(); - Container c = getParent(); - while (c!=null) { - if (c instanceof TViewChooser) { - int h = ((TViewChooser)c).chooserButton.getHeight(); - dim.height = Math.max(h, min.height); - break; - } - c = c.getParent(); - } - return dim; - } - }; - columnsButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - parentView.showColumnsDialog(getTrack()); - } - }); - // create column list - refreshColumnCheckboxes(); - // create popup and add menu items - popup = new JPopupMenu(); - - deleteDataFunctionItem = new JMenuItem(); - deleteDataFunctionItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - int index = Integer.parseInt(e.getActionCommand()); - FunctionTool tool = trackerPanel.getDataBuilder(); - FunctionPanel panel = tool.getPanel(track.getName()); - Dataset dataset = data.getDataset(index); - // next line posts undo edit to FunctionPanel - panel.getFunctionEditor().removeObject(dataset, true); - } - }); - - formatDialogItem = new JMenuItem(); - formatDialogItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - String[] cols = getDataColumnNames(); - int[] selected = dataTable.getSelectedColumns(); - String[] selectedNames = new String[selected.length]; - for (int i=0; i datasets = data.getDatasets(); - // always include linked independent variable first - Dataset next = datasets.get(0); - XMLControlElement control = new XMLControlElement(next); - next = toSend.getDataset(colCount++); - control.loadObject(next, true, true); - next.setYColumnVisible(false); - next.setConnected(false); - next.setMarkerShape(Dataset.NO_MARKER); - for (int i = 0; i < checkBoxes.length; i++) { - if (checkBoxes[i].isSelected()) { - if (i>=datasets.size()) { - next = track.convertTextToDataColumn(checkBoxes[i].getActionCommand()); - if (next==null) continue; - } - else next = datasets.get(i); - control = new XMLControlElement(next); - next = toSend.getDataset(colCount++); - control.loadObject(next, true, true); - next.setMarkerColor(track.getColor()); - next.setConnected(true); - next.setXColumnVisible(false); - } - } - DataTool tool = DataTool.getTool(); - tool.setUseChooser(false); - tool.setSaveChangesOnClose(false); - DataRefreshTool refresher = DataRefreshTool.getTool(data); - try { - tool.send(new LocalJob(toSend), refresher); - tool.setVisible(true); - } - catch (RemoteException ex) {ex.printStackTrace();} - } - }); - // add print item - printItem = new JMenuItem(); - printItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // find TViewChooser that owns this view and print it - TViewChooser chooser = getOwner(); - if (chooser != null) { - new TrackerIO.ComponentImage(chooser).print(); - } - } - }); - // add help item last - helpItem = new JMenuItem(); - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.showHelp("datatable", 0); //$NON-NLS-1$ - } - } - }); - dataTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - dataTable.getTableHeader().setToolTipText(TrackerRes.getString("TableTrackView.Header.Tooltip")); //$NON-NLS-1$ - dataTable.getTableHeader().addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - java.awt.Point mousePt = e.getPoint(); - int col = dataTable.columnAtPoint(mousePt); - if (OSPRuntime.isPopupTrigger(e)) { - if (dataTable.getRowCount()>0 && dataTable.getSelectedRowCount()==0) { - dataTable.setColumnSelectionInterval(col, col); - dataTable.setRowSelectionInterval(0, dataTable.getRowCount()-1); - } - deleteDataFunctionItem.setActionCommand(""); //$NON-NLS-1$ - // set action command of delete item if data function column selected - String colName = dataTable.getColumnName(col); - int index = data.getDatasetIndex(colName); - if (index>-1) { - Dataset dataset = data.getDataset(index); - if (dataset instanceof DataFunction) { - deleteDataFunctionItem.setActionCommand(String.valueOf(index)); - String s = TrackerRes.getString("TableTrackView.MenuItem.DeleteDataFunction"); //$NON-NLS-1$ - deleteDataFunctionItem.setText(s+" \""+colName+"\""); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - getPopup().show(dataTable.getTableHeader(), e.getX(), e.getY()+8); - } - else { - // double-click: select column and all rows - if(e.getClickCount()==2) { - dataTable.setRowSelectionInterval(0, dataTable.getRowCount()-1); // all rows - dataTable.setColumnSelectionInterval(col, col); - leadCol = col; - // sort by independent variable - dataTable.sort(0); - } - // control-click: add/remove columns to selection - else if (e.isControlDown()) { - if(dataTable.isColumnSelected(col)) { - dataTable.removeColumnSelectionInterval(col, col); - } - else { - dataTable.addColumnSelectionInterval(col, col); - if(dataTable.getSelectedColumns().length==1) { - leadCol = col; - } - } - } - // shift-click: extend selection - else if(e.isShiftDown() && dataTable.getSelectedRows().length>0) { - if(leadCol-1) { - Dataset dataset = data.getDataset(index); - if (dataset instanceof DataFunction) { - deleteDataFunctionItem.setActionCommand(String.valueOf(index)); - String s = TrackerRes.getString("TableTrackView.MenuItem.DeleteDataFunction"); //$NON-NLS-1$ - deleteDataFunctionItem.setText(s+" \""+colName+"\""); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - getPopup().show(TableTrackView.this, e.getX()-10, e.getY()); - } - } - }); - // override the datatable CTRL-C behavior - InputMap im = dataTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); - KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK); - Action newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - TrackerIO.copyTable(dataTable, false, track.getName()); // copy raw data - } - }; - ActionMap am = dataTable.getActionMap(); - am.put(im.get(k), newAction); - // override the pageUp and pageDown behaviors - k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - trackerPanel.getPlayer().back(); - } - }; - am.put(im.get(k), newAction); - k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, KeyEvent.SHIFT_DOWN_MASK); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - int n = trackerPanel.getPlayer().getStepNumber()-5; - trackerPanel.getPlayer().setStepNumber(n); - } - }; - am.put(im.get(k), newAction); - k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - trackerPanel.getPlayer().step(); - } - }; - am.put(im.get(k), newAction); - k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, KeyEvent.SHIFT_DOWN_MASK); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - int n = trackerPanel.getPlayer().getStepNumber()+5; - trackerPanel.getPlayer().setStepNumber(n); - } - }; - am.put(im.get(k), newAction); - k = KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - trackerPanel.getPlayer().setStepNumber(0); - } - }; - am.put(im.get(k), newAction); - k = KeyStroke.getKeyStroke(KeyEvent.VK_END, 0); - newAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (!trackerPanel.getPlayer().isEnabled()) return; - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); - } - }; - am.put(im.get(k), newAction); - } - - protected JPopupMenu getPopup() { - formatDialogItem.setText(ToolsRes.getString("DataToolTable.Popup.MenuItem.NumberFormat")); //$NON-NLS-1$ - copyImageItem.setText(TrackerRes.getString("TMenuBar.Menu.CopyImage")); //$NON-NLS-1$ - snapshotItem.setText(DisplayRes.getString("DisplayPanel.Snapshot_menu_item")); //$NON-NLS-1$ - printItem.setText(TrackerRes.getString("TActions.Action.Print")); //$NON-NLS-1$ - helpItem.setText(TrackerRes.getString("Tracker.Popup.MenuItem.Help")); //$NON-NLS-1$ - createTextColumnItem.setText(TrackerRes.getString("TableTrackView.Action.CreateTextColumn.Text")); //$NON-NLS-1$ - textColumnMenu.setText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ - deleteTextColumnMenu.setText(TrackerRes.getString("TableTrackView.Action.DeleteTextColumn.Text")); //$NON-NLS-1$ - renameTextColumnMenu.setText(TrackerRes.getString("TableTrackView.Action.RenameTextColumn.Text")); //$NON-NLS-1$ - dataBuilderItem.setText(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ - dataToolItem.setText(TrackerRes.getString("TableTrackView.Popup.MenuItem.Analyze")); //$NON-NLS-1$ - refreshCopyDataMenu(copyDataMenu); - popup.removeAll(); - if (!"".equals(deleteDataFunctionItem.getActionCommand())) { //$NON-NLS-1$ - popup.add(deleteDataFunctionItem); - popup.addSeparator(); - } - popup.add(formatDialogItem); - if (track!=null && track.trackerPanel!=null - && track.trackerPanel.isEnabled("edit.copyData")) { //$NON-NLS-1$ - popup.addSeparator(); - popup.add(copyDataMenu); - } - popup.addSeparator(); - // textColumnMenu - textColumnMenu.removeAll(); - popup.add(textColumnMenu); - textColumnMenu.add(createTextColumnItem); - if (track.getTextColumnNames().size()>0) { - deleteTextColumnMenu.removeAll(); - textColumnMenu.add(deleteTextColumnMenu); - for (String next: track.getTextColumnNames()) { - JMenuItem item = new JMenuItem(next); - deleteTextColumnMenu.add(item); - item.setActionCommand(next); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - track.removeTextColumn(e.getActionCommand()); - } - }); - } - renameTextColumnMenu.removeAll(); - textColumnMenu.add(renameTextColumnMenu); - for (String next: track.getTextColumnNames()) { - JMenuItem item = new JMenuItem(next); - renameTextColumnMenu.add(item); - item.setActionCommand(next); - item.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - String prev = e.getActionCommand(); - String name = getUniqueColumnName(prev, false); - if (name!=null && !name.equals("") && !name.equals(prev)) { //$NON-NLS-1$ - // name has changed - track.renameTextColumn(prev, name); - } - } - }); - } - } - textColumnMenu.setEnabled(!track.isLocked()); - - if (track!=null && track.trackerPanel!=null - && track.trackerPanel.isEnabled("edit.copyImage")) { //$NON-NLS-1$ - popup.addSeparator(); - popup.add(copyImageItem); - popup.add(snapshotItem); - } - if (track!=null && track.trackerPanel!=null - && (track.trackerPanel.isEnabled("data.builder") //$NON-NLS-1$ - || track.trackerPanel.isEnabled("data.tool"))) { //$NON-NLS-1$ - popup.addSeparator(); - if (track.trackerPanel.isEnabled("data.builder")) //$NON-NLS-1$ - popup.add(dataBuilderItem); - if (track.trackerPanel.isEnabled("data.tool")) //$NON-NLS-1$ - popup.add(dataToolItem); - } - if (track!=null && track.trackerPanel!=null - && track.trackerPanel.isEnabled("file.print")) { //$NON-NLS-1$ - popup.addSeparator(); - popup.add(printItem); - } - popup.addSeparator(); - popup.add(helpItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - return popup; - } - - /** - * Gets a unique new name for a text column. - * - * @param previous the previous name (may be null) - * @return the new name - */ - protected String getUniqueColumnName(String previous, boolean tryAgain) { - if (previous==null) previous = ""; //$NON-NLS-1$ - Object input = null; - if (tryAgain) { - input = JOptionPane.showInputDialog(track.trackerPanel.getTFrame(), - TrackerRes.getString("TableTrackView.Dialog.NameColumn.TryAgain")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("TableTrackView.Dialog.NameColumn.Message"), //$NON-NLS-1$ - TrackerRes.getString("TableTrackView.Dialog.NameColumn.Title"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE, null, null, previous); - } - else { - input = JOptionPane.showInputDialog(track.trackerPanel.getTFrame(), - TrackerRes.getString("TableTrackView.Dialog.NameColumn.Message"), //$NON-NLS-1$ - TrackerRes.getString("TableTrackView.Dialog.NameColumn.Title"), //$NON-NLS-1$ - JOptionPane.QUESTION_MESSAGE, null, null, previous); - } - if(input==null) { - return null; - } - String name = ((String)input).trim(); - if (name.equals(previous)) return name; - // check name for uniqueness - boolean unique = true; - for (String next: getDataColumnNames()) { - if (next.equals(name)) { - unique = false; - break; - } - } - if (unique) { - for (String next: track.getTextColumnNames()) { - if (next.equals(name)) { - unique = false; - break; - } - } - } - if (!unique) return getUniqueColumnName(previous, true); - return name; - } - - /** - * Refreshes a menu with appropriate copy data items for this view. - * - * @param menu the menu to refresh - * @return the refreshed menu - */ - protected JMenu refreshCopyDataMenu(JMenu menu) { - menu.removeAll(); - menu.add(copyDataRawItem); - menu.add(copyDataFormattedItem); - menu.addSeparator(); - menu.add(setDelimiterMenu); - if (dataTable.getSelectedRowCount()==0) - menu.setText(TrackerRes.getString("TableTrackView.Action.CopyData")); //$NON-NLS-1$ - else - menu.setText(TrackerRes.getString("TableTrackView.MenuItem.CopySelectedData")); //$NON-NLS-1$ - copyDataRawItem.setText(TrackerRes.getString("TableTrackView.MenuItem.Unformatted")); //$NON-NLS-1$ - copyDataFormattedItem.setText(TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ - setDelimiterMenu.setText(TrackerRes.getString("TableTrackView.Menu.SetDelimiter")); //$NON-NLS-1$ - addDelimiterItem.setText(TrackerRes.getString("TableTrackView.MenuItem.AddDelimiter")); //$NON-NLS-1$ - removeDelimiterItem.setText(TrackerRes.getString("TableTrackView.MenuItem.RemoveDelimiter")); //$NON-NLS-1$ - // refresh delimiter menu - setDelimiterMenu.removeAll(); - String delimiter = TrackerIO.getDelimiter(); - // remove all custom delimiter items from button group - Enumeration en = delimiterButtonGroup.getElements(); - for (; en.hasMoreElements();) { - JMenuItem item = (JMenuItem)en.nextElement(); - String delim = item.getActionCommand(); - if (!TrackerIO.delimiters.containsValue(delim)) - delimiterButtonGroup.remove(item); - } - // add all button group items to menu - en = delimiterButtonGroup.getElements(); - for (; en.hasMoreElements();) { - JMenuItem item = (JMenuItem)en.nextElement(); - setDelimiterMenu.add(item); - if (delimiter.equals(item.getActionCommand())) - item.setSelected(true); - } - // add new custom delimiter items - boolean hasCustom = !TrackerIO.customDelimiters.isEmpty(); - if (hasCustom) { - setDelimiterMenu.addSeparator(); - for (String key: TrackerIO.customDelimiters.keySet()) { - JMenuItem item = new JRadioButtonMenuItem(key); - item.setActionCommand(TrackerIO.customDelimiters.get(key)); - item.addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent e) { - TrackerIO.setDelimiter(e.getActionCommand()); - } - }); - delimiterButtonGroup.add(item); - setDelimiterMenu.add(item); - if (delimiter.equals(item.getActionCommand())) - item.setSelected(true); - } - } - setDelimiterMenu.addSeparator(); - setDelimiterMenu.add(addDelimiterItem); - if (hasCustom) - setDelimiterMenu.add(removeDelimiterItem); - return menu; - } - - /** - * Gets an array of all column names. - * - * @return the column names - */ - protected String[] getDataColumnNames() { - ArrayList names = new ArrayList(); - // first add independent variable - Dataset dataset = data.getDataset(0); - String name = dataset.getXColumnName(); - names.add(name); - // then add other variables - ArrayList dataOrder = track.getPreferredDataOrder(); - ArrayList added = new ArrayList(); - // first add in preferred order - for (int i = 0; i < dataOrder.size(); i++) { - dataset = data.getDataset(dataOrder.get(i)); - name = dataset.getYColumnName(); - names.add(name); - added.add(dataOrder.get(i)); - } - // then add any that were missed - for (int i = 0; i names = new ArrayList(); - if (prev != null) { - for (int i = 0; i < prev.length; i++) { - if (prev[i].isSelected()) names.add(prev[i].getText()); - } - } - checkBoxes = new JCheckBox[datasetCount+textColumnCount]; - // data column checkboxes - for (int i = 0; i < datasetCount; i++) { - Dataset dataset = data.getDataset(i); - String name = dataset.getYColumnName(); - String s = TeXParser.removeSubscripting(name); - checkBoxes[i] = new JCheckBox(s); - boolean selected = names.contains(s) - || (prev != null && datasetCount >= prev.length-textColumnCount - && i < prev.length-textColumnCount && prev[i].isSelected()); - checkBoxes[i].setBackground(Color.white); - checkBoxes[i].setFont(font); - checkBoxes[i].setSelected(selected); - checkBoxes[i].setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 0)); - checkBoxes[i].setActionCommand(name); - checkBoxes[i].setToolTipText(track.getDataDescription(i+1)); - checkBoxes[i].addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (refresh) refresh(trackerPanel.getFrameNumber()); - trackerPanel.changed = true; - } - }); - checkBoxes[i].setOpaque(false); - } - // text column checkboxes - for (int i = datasetCount; i < datasetCount+textColumnCount; i++) { - String name = track.getTextColumnNames().get(i-datasetCount); - String s = TeXParser.removeSubscripting(name); - checkBoxes[i] = new JCheckBox(s); - checkBoxes[i].setBackground(Color.white); - checkBoxes[i].setFont(font); - checkBoxes[i].setSelected(textColumnsVisible.contains(name)); - checkBoxes[i].setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 0)); - checkBoxes[i].setActionCommand(name); - checkBoxes[i].addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - JCheckBox item = (JCheckBox)e.getSource(); - if (item.isSelected()) { - textColumnsVisible.add(e.getActionCommand()); - } - else { - textColumnsVisible.remove(e.getActionCommand()); - } - if (refresh) refresh(trackerPanel.getFrameNumber()); - trackerPanel.changed = true; - } - }); - checkBoxes[i].setOpaque(false); - } - columnsPanel.removeAll(); - ArrayList dataOrder = track.getPreferredDataOrder(); - ArrayList added = new ArrayList(); - // first add in preferred order - for (int i = 0; i < dataOrder.size(); i++) { - columnsPanel.add(checkBoxes[dataOrder.get(i)]); - added.add(checkBoxes[dataOrder.get(i)]); - } - // then add any that were missed - for (int j = 0; j-1) { - double frame = data.getDataset(index).getYPoints()[row]; - return track.getTextColumnEntry(columnName, (int)frame); - } - // if no frame numbers defined (eg line profile), use row number - return track.getTextColumnEntry(columnName, row); - } - - /** - * Sets the value at the given cell. - * - * @param value the value - * @param row the row index - * @param col the column index - */ - public void setValueAt(Object value, int row, int col) { - String columnName = getColumnName(col); - // convert row to frame number - DatasetManager data = track.getData(track.trackerPanel); - int index = data.getDatasetIndex("frame"); //$NON-NLS-1$ - if (index>-1) { - double frame = data.getDataset(index).getYPoints()[row]; - if (track.setTextColumnEntry(columnName, (int)frame, (String)value)) { - trackerPanel.changed = true; - } - return; - } - // if no frame numbers defined (eg line profile), use row number - if (track.setTextColumnEntry(columnName, row, (String)value)) { - trackerPanel.changed = true; - } - } - - - public boolean isCellEditable(int row, int col) { - return !track.isLocked(); - } - - public Class getColumnClass(int col) { - return String.class; - } - - } - - /** - * A cell editor for textColumn cells. - */ - class TextColumnEditor extends AbstractCellEditor implements TableCellEditor { - Color defaultEditingColor; - JPanel panel = new JPanel(new BorderLayout()); - JTextField field = new JTextField(); - - // Constructor. - TextColumnEditor() { - defaultEditingColor = field.getSelectionColor(); - panel.add(field, BorderLayout.CENTER); - panel.setOpaque(false); - field.setBorder(BorderFactory.createEmptyBorder(0, 1, 1, 0)); - field.addKeyListener(new KeyAdapter() { - public void keyPressed(KeyEvent e) { - if(e.getKeyCode()==KeyEvent.VK_ENTER) { - stopCellEditing(); - } else if(field.isEnabled()) { - field.setBackground(Color.yellow); - } - } - - }); - field.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { - // request focus immediately to keep it - field.requestFocusInWindow(); - } - }); - } - - // Gets the component to be displayed while editing. - public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { - field.setBackground(Color.white); - field.setSelectionColor(defaultEditingColor); - field.setEditable(true); - if (value==null) value = ""; //$NON-NLS-1$ - field.setText(value.toString()); - return panel; - } - - // Determines when editing starts. - public boolean isCellEditable(EventObject e) { - if(e==null || e instanceof MouseEvent) { - return !track.isLocked(); - } - return false; - } - - // Called when editing is completed. - public Object getCellEditorValue() { - dataTable.requestFocusInWindow(); - if(field.getBackground()!=Color.white) { - field.setBackground(Color.white); - } - return field.getText(); - } - - } - - - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.lang.reflect.Constructor; +import java.rmi.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumnModel; + +import org.opensourcephysics.controls.*; +import org.opensourcephysics.display.*; +import org.opensourcephysics.display.DataTable.NumberFormatDialog; +import org.opensourcephysics.media.core.VideoClip; +import org.opensourcephysics.tools.*; + +/** + * This displays a table view of a track on a TrackerPanel. + * + * @author Douglas Brown + * @author John Welch + */ +public class TableTrackView extends TrackView { + + // static fields + static final String DEFINED_AS = ": "; //$NON-NLS-1$ + + // instance fields + protected TableTView parentView; + protected DataTable dataTable; + protected JButton columnsButton; + protected JPopupMenu popup; + protected JPanel columnsPanel; + protected JScrollPane columnsScroller; + protected DatasetManager data; + protected DatasetManager tableData; + protected JCheckBox[] checkBoxes; + protected JMenuItem formatDialogItem; + protected JMenu copyDataMenu; + protected JMenuItem copyDataRawItem, copyDataFormattedItem; + protected JMenu setDelimiterMenu; + ButtonGroup delimiterButtonGroup = new ButtonGroup(); + protected JMenuItem addDelimiterItem, removeDelimiterItem; + protected JMenuItem copyImageItem, snapshotItem, printItem, helpItem; + protected JMenuItem dataToolItem, dataBuilderItem, deleteDataFunctionItem; + protected JMenuItem createTextColumnItem; + protected JMenu textColumnMenu, deleteTextColumnMenu, renameTextColumnMenu; + protected String xVar, yVar; + protected boolean refresh = true; + protected boolean highlightVisible = true; + protected int highlightRow; // highlighted table row, or -1 + protected int leadCol; + protected Font font = new JTextField().getFont(); + protected TreeSet selectedIndepVarValues // used when sorting + = new TreeSet(); + protected Map degreeRenderers + = new HashMap(); + protected TextColumnTableModel textColumnModel; + protected TextColumnEditor textColumnEditor; + protected Set textColumnsVisible = new TreeSet(); + protected ArrayList textColumnNames = new ArrayList(); + + /** + * Constructs a TrackTableView of the specified track on the specified tracker panel. + * + * @param track the track + * @param panel the tracker panel + * @param view the TableTView that will display this + */ + public TableTrackView(TTrack track, TrackerPanel panel, TableTView view) { + super(track, panel); + parentView = view; + track.addPropertyChangeListener("text_column", this); //$NON-NLS-1$ + textColumnNames.addAll(track.getTextColumnNames()); + // create the DataTable + textColumnEditor = new TextColumnEditor(); + dataTable = new DataTable() { + public void refreshTable() { + // save selected rows and columns + int[] rows = getSelectedRows(); + int[] cols = getSelectedColumns(); + // refresh table + super.refreshTable(); + // restore selected rows and columns + for (int i = 0; i < rows.length; i++) { + if (rows[i] < getRowCount()) + addRowSelectionInterval(rows[i], rows[i]); + } + for (int i = 0; i < cols.length; i++) { + if (cols[i] < getColumnCount()) + addColumnSelectionInterval(cols[i], cols[i]); + } + } + public TableCellEditor getCellEditor(int row, int column) { + // only text columns are editable, so always return textColumnEditor + return textColumnEditor; + } + public boolean isCellEditable(int row, int col) { + // true only for text (String) columns + int i = dataTable.convertColumnIndexToModel(col); + return dataTable.getModel().getColumnClass(i).equals(String.class); + } + + }; + + data = track.getData(trackerPanel); + tableData = new DatasetManager(); + tableData.setXPointsLinked(true); + dataTable.add(tableData); + textColumnModel = new TextColumnTableModel(); + dataTable.add(textColumnModel); + setViewportView(dataTable); + dataTable.setPreferredScrollableViewportSize(new Dimension(160, 200)); + addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + dataTable.clearSelection(); + } + public void mouseEntered(MouseEvent e) { + dataTable.requestFocusInWindow(); + } + }); + dataTable.addMouseListener(new MouseAdapter() { + public void mouseEntered(MouseEvent e) { + dataTable.requestFocusInWindow(); + } + }); + // add key listener to start editing text column cells with space key + dataTable.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if(e.getKeyCode()==KeyEvent.VK_SPACE) { + int row = dataTable.getSelectedRow(); + int col = dataTable.getSelectedColumn(); + dataTable.editCellAt(row, col); + textColumnEditor.field.selectAll(); + Runnable runner = new Runnable() { + public synchronized void run() { + textColumnEditor.field.requestFocusInWindow(); + } + }; + SwingUtilities.invokeLater(runner); + } + } + + }); + + ListSelectionModel selectionModel = dataTable.getSelectionModel(); + selectionModel.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { + selectedIndepVarValues.clear(); + int[] rows = dataTable.getSelectedRows(); // selected view rows + for(int i = 0; i datasets = data.getDatasets(); + dataTable.setUnits(datasets.get(0).getXColumnName(), "", track.getDataDescription(0)); //$NON-NLS-1$ + int count = datasets.size(); + for (int i = 0; i < count; i++) { + if (checkBoxes[i].isSelected()) { + Dataset in = datasets.get(i); + String xTitle = in.getXColumnName(); + String yTitle = in.getYColumnName(); + boolean yIsAngle = yTitle.startsWith(Tracker.THETA) + || yTitle.startsWith(Tracker.OMEGA) + || yTitle.startsWith(Tracker.ALPHA); + boolean degrees = trackerPanel.getTFrame()!=null + && !trackerPanel.getTFrame().anglesInRadians; + Dataset local = tableData.getDataset(colCount++); + double[] yPoints = in.getYPoints(); + String tooltip = track.getDataDescription(i+1)+" "; //$NON-NLS-1$ + String units = ""; //$NON-NLS-1$ + if (yIsAngle) { // angle columns + if (yTitle.startsWith(Tracker.THETA)) { + if (degrees) { + units = Tracker.DEGREES; + tooltip += TrackerRes.getString("TableTrackView.Degrees.Tooltip"); //$NON-NLS-1$ + } + else { + tooltip += TrackerRes.getString("TableTrackView.Radians.Tooltip"); //$NON-NLS-1$ + } + } + else if (yTitle.startsWith(Tracker.OMEGA)) { + if (degrees) { + tooltip += TrackerRes.getString("TableTrackView.DegreesPerSecond.Tooltip"); //$NON-NLS-1$ + } + else { + tooltip += TrackerRes.getString("TableTrackView.RadiansPerSecond.Tooltip"); //$NON-NLS-1$ + } + } + else if (yTitle.startsWith(Tracker.ALPHA)) { + if (degrees) { + tooltip += TrackerRes.getString("TableTrackView.DegreesPerSecondSquared.Tooltip"); //$NON-NLS-1$ + } + else { + tooltip += TrackerRes.getString("TableTrackView.RadiansPerSecondSquared.Tooltip"); //$NON-NLS-1$ + } + } + TableCellRenderer precisionRenderer = dataTable.getPrecisionRenderer(yTitle); + if (degrees) { + // convert values from radians to degrees + for (int k = 0; k getToolBarComponents() { + return toolbarComponents; + } + + /** + * Gets the view button + * + * @return the view button + */ + public JButton getViewButton() { + return columnsButton; + } + + /** + * Returns true if this trackview is in a custom state. + * + * @return true if in a custom state, false if in the default state + */ + public boolean isCustomState() { + // check displayed data columns--default is columns 0 and 1 only + int n = checkBoxes.length; + for (int i = 0; i < n; i++) { + boolean selected = checkBoxes[i].isSelected(); + boolean shouldBe = i < 2; + if ((shouldBe && !selected) || (!shouldBe && selected)) return true; + } + // check for formatting--default is no formatting + if (dataTable.getFormattedColumnNames().length>0) + return true; + // check for reordered columns + TableColumnModel model = dataTable.getColumnModel(); + int count = model.getColumnCount(); + if (count==0) return true; // should never happen... + int index = model.getColumn(0).getModelIndex(); + for (int i=1; itrue to show the dataset column in the table + */ + public void setVisible(int index, boolean visible) { + if (index < checkBoxes.length) { + checkBoxes[index].setSelected(visible); + } + int n = data.getDatasets().size(); + if (index>=n) { + String name = track.getTextColumnNames().get(index-n); + textColumnsVisible.add(name); + } + refresh(trackerPanel.getFrameNumber()); + } + + /** + * Sets the visibility of a data or text column specified by name + * + * @param name the name of the column + * @param visible true to show the column in the table + */ + public void setVisible(String name, boolean visible) { + for (int i = 0; i < checkBoxes.length; i++) { + String s = checkBoxes[i].getActionCommand(); + if (s.equals(name) || TeXParser.removeSubscripting(s).equals(name)) { + setVisible(i, visible); + break; + } + } + } + + /** + * Sets the highlighted point. + * + * @param frameNumber the frame number + */ + protected void setHighlighted(int frameNumber) { + // assume no highlights + highlightRow = -1; + if (!highlightVisible) return; + Step[] steps = track.getSteps(); + int row = -1; + VideoClip clip = null; + if (track.trackerPanel != null) { + clip = track.trackerPanel.getPlayer().getVideoClip(); + } + // look for row to highlight + for (int i = 0; i < steps.length; i++) { + if (steps[i] != null + && steps[i].dataVisible + && clip != null + && clip.includesFrame(steps[i].getFrameNumber())) { + row++; + if (steps[i].getFrameNumber() == frameNumber) { + if (row >= dataTable.getRowCount()) return; + highlightRow = row; + break; + } + } + } + // select highlighted row, or clear selection if none found + Runnable runner = new Runnable() { + public synchronized void run() { + if (highlightRow >= dataTable.getRowCount() || highlightRow < 0) { + dataTable.clearSelection(); + return; + } + try { + dataTable.setRowSelectionInterval(highlightRow, highlightRow); + } catch (Exception e) { + // occasionally throws exception during loading! + } + int cols = dataTable.getColumnCount(); + dataTable.setColumnSelectionInterval(0, cols-1); + } + }; + if(SwingUtilities.isEventDispatchThread()) runner.run(); + else SwingUtilities.invokeLater(runner); + + } + + /** + * Gets an array of visible column names. + * + * @return the visible columns + */ + String[] getVisibleColumns() { + ArrayList list = new ArrayList(); + for (int i = 0; i < checkBoxes.length; i++) { + if (checkBoxes[i].isSelected()) { + String var = checkBoxes[i].getText(); + int n = var.indexOf(DEFINED_AS); + if (n > -1) var = var.substring(0, n); + list.add(var); + } + } + return list.toArray(new String[0]); + } + + /** + * Returns the visible column names in the order displayed in the table. + * Used for saving/loading xml. + * + * @return the visible columns in order + */ + String[] getOrderedVisibleColumns() { + // get array of column model indexes in table order + TableColumnModel model = dataTable.getColumnModel(); + Integer[] modelIndexes = new Integer[model.getColumnCount()]; + for (int i=0; i=modelIndexes.length || modelIndexes[i]>=columnNames.length) + continue; + ordered[i] = columnNames[modelIndexes[i]]; + } + return ordered; + } + + /** + * Gets an array of column names and formats. Used for saving/loading xml + * + * @return String[][] each element is {colName, format} + */ + String[][] getColumnFormats() { + String[] colNames = dataTable.getFormattedColumnNames(); + String[][] colFormats = new String[colNames.length][2]; + for (int i = 0; i type = Class.forName("org.opensourcephysics.frames.ImageFrame"); //$NON-NLS-1$ + Constructor[] constructors = type.getConstructors(); + for(int i = 0; i[] parameters = constructors[i].getParameterTypes(); + if(parameters.length==1 && parameters[0]==MeasuredImage.class) { + frame = (OSPFrame) constructors[i].newInstance(new Object[] {mi}); + break; + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } + if (frame==null) return; + + frame.setTitle(DisplayRes.getString("Snapshot.Title")); //$NON-NLS-1$ + frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + frame.setKeepHidden(false); + FontSizer.setFonts(frame, FontSizer.getLevel()); + frame.pack(); + frame.setVisible(true); + } + + @Override + public void setFont(Font font) { + super.setFont(font); + if (dataTable!=null) { + dataTable.setRowHeight(font.getSize()+4); + dataTable.getTableHeader().setFont(font); + } + } + + /** + * Gets the TViewChooser that owns (displays) this view. + * @return the TViewChooser + */ + protected TViewChooser getOwner() { + // find TViewChooser with this view and copy that + TFrame frame = trackerPanel.getTFrame(); + Container[] views = frame.getViews(trackerPanel); + for (int i = 0; i < views.length; i++) { + if (views[i] instanceof TViewChooser) { + TViewChooser chooser = (TViewChooser)views[i]; + if (chooser.getSelectedView() instanceof TableTView) { + TableTView tableView = (TableTView)chooser.getSelectedView(); + TrackView view = tableView.getTrackView(tableView.getSelectedTrack()); + if (view.equals(TableTrackView.this)) { + return chooser; + } + } + } + } + return null; + } + + /** + * Gets the independent variable value at a view row. + * + * @param row the table row + * @return the value + */ + protected double getIndepVarValueAtRow(int row) { + int col = dataTable.convertColumnIndexToView(0); + Double val = null; + try { + val = (Double)dataTable.getValueAt(row, col); + } catch (Exception e) {} + return val==null? Double.NaN: val; + } + + /** + * Gets the view row at which an independent variable value is found. + * + * @param indepVarValue the value + * @return the view row + */ + protected int getRowFromIndepVarValue(double indepVarValue) { + int col = dataTable.convertColumnIndexToView(0); + for(int i = 0; i-1) { + dataTable.addRowSelectionInterval(row, row); + } + } + } + + /** + * Creates the GUI. + */ + protected void createGUI() { + columnsPanel = new JPanel(); + columnsPanel.setBackground(Color.WHITE); + columnsPanel.setLayout(new GridLayout(0, 4)); + columnsScroller = new JScrollPane(columnsPanel); + javax.swing.border.Border empty = BorderFactory.createEmptyBorder(0, 3, 0, 2); + javax.swing.border.Border etched = BorderFactory.createEtchedBorder(); + columnsScroller.setBorder(BorderFactory.createCompoundBorder(empty, etched)); + // button to open column selection dialog box + columnsButton = new TButton() { + // override getMaximumSize method so has same height as chooser button + public Dimension getMaximumSize() { + Dimension dim = super.getMaximumSize(); + Dimension min = getMinimumSize(); + Container c = getParent(); + while (c!=null) { + if (c instanceof TViewChooser) { + int h = ((TViewChooser)c).chooserButton.getHeight(); + dim.height = Math.max(h, min.height); + break; + } + c = c.getParent(); + } + return dim; + } + }; + columnsButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + parentView.showColumnsDialog(getTrack()); + } + }); + // create column list + refreshColumnCheckboxes(); + // create popup and add menu items + popup = new JPopupMenu(); + + deleteDataFunctionItem = new JMenuItem(); + deleteDataFunctionItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int index = Integer.parseInt(e.getActionCommand()); + FunctionTool tool = trackerPanel.getDataBuilder(); + FunctionPanel panel = tool.getPanel(track.getName()); + Dataset dataset = data.getDataset(index); + // next line posts undo edit to FunctionPanel + panel.getFunctionEditor().removeObject(dataset, true); + } + }); + + formatDialogItem = new JMenuItem(); + formatDialogItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String[] cols = getDataColumnNames(); + int[] selected = dataTable.getSelectedColumns(); + String[] selectedNames = new String[selected.length]; + for (int i=0; i datasets = data.getDatasets(); + // always include linked independent variable first + Dataset next = datasets.get(0); + XMLControlElement control = new XMLControlElement(next); + next = toSend.getDataset(colCount++); + control.loadObject(next, true, true); + next.setYColumnVisible(false); + next.setConnected(false); + next.setMarkerShape(Dataset.NO_MARKER); + for (int i = 0; i < checkBoxes.length; i++) { + if (checkBoxes[i].isSelected()) { + if (i>=datasets.size()) { + next = track.convertTextToDataColumn(checkBoxes[i].getActionCommand()); + if (next==null) continue; + } + else next = datasets.get(i); + control = new XMLControlElement(next); + next = toSend.getDataset(colCount++); + control.loadObject(next, true, true); + next.setMarkerColor(track.getColor()); + next.setConnected(true); + next.setXColumnVisible(false); + } + } + DataTool tool = DataTool.getTool(); + tool.setUseChooser(false); + tool.setSaveChangesOnClose(false); + DataRefreshTool refresher = DataRefreshTool.getTool(data); + try { + tool.send(new LocalJob(toSend), refresher); + tool.setVisible(true); + } + catch (RemoteException ex) {ex.printStackTrace();} + } + }); + // add print item + printItem = new JMenuItem(); + printItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // find TViewChooser that owns this view and print it + TViewChooser chooser = getOwner(); + if (chooser != null) { + new TrackerIO.ComponentImage(chooser).print(); + } + } + }); + // add help item last + helpItem = new JMenuItem(); + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.showHelp("datatable", 0); //$NON-NLS-1$ + } + } + }); + dataTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + dataTable.getTableHeader().setToolTipText(TrackerRes.getString("TableTrackView.Header.Tooltip")); //$NON-NLS-1$ + dataTable.getTableHeader().addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + java.awt.Point mousePt = e.getPoint(); + int col = dataTable.columnAtPoint(mousePt); + if (OSPRuntime.isPopupTrigger(e)) { + if (dataTable.getRowCount()>0 && dataTable.getSelectedRowCount()==0) { + dataTable.setColumnSelectionInterval(col, col); + dataTable.setRowSelectionInterval(0, dataTable.getRowCount()-1); + } + deleteDataFunctionItem.setActionCommand(""); //$NON-NLS-1$ + // set action command of delete item if data function column selected + String colName = dataTable.getColumnName(col); + int index = data.getDatasetIndex(colName); + if (index>-1) { + Dataset dataset = data.getDataset(index); + if (dataset instanceof DataFunction) { + deleteDataFunctionItem.setActionCommand(String.valueOf(index)); + String s = TrackerRes.getString("TableTrackView.MenuItem.DeleteDataFunction"); //$NON-NLS-1$ + deleteDataFunctionItem.setText(s+" \""+colName+"\""); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + getPopup().show(dataTable.getTableHeader(), e.getX(), e.getY()+8); + } + else { + // double-click: select column and all rows + if(e.getClickCount()==2) { + dataTable.setRowSelectionInterval(0, dataTable.getRowCount()-1); // all rows + dataTable.setColumnSelectionInterval(col, col); + leadCol = col; + // sort by independent variable + dataTable.sort(0); + } + // control-click: add/remove columns to selection + else if (e.isControlDown()) { + if(dataTable.isColumnSelected(col)) { + dataTable.removeColumnSelectionInterval(col, col); + } + else { + dataTable.addColumnSelectionInterval(col, col); + if(dataTable.getSelectedColumns().length==1) { + leadCol = col; + } + } + } + // shift-click: extend selection + else if(e.isShiftDown() && dataTable.getSelectedRows().length>0) { + if(leadCol-1) { + Dataset dataset = data.getDataset(index); + if (dataset instanceof DataFunction) { + deleteDataFunctionItem.setActionCommand(String.valueOf(index)); + String s = TrackerRes.getString("TableTrackView.MenuItem.DeleteDataFunction"); //$NON-NLS-1$ + deleteDataFunctionItem.setText(s+" \""+colName+"\""); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + getPopup().show(TableTrackView.this, e.getX()-10, e.getY()); + } + } + }); + // override the datatable CTRL-C behavior + InputMap im = dataTable.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); + KeyStroke k = KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK); + Action newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + TrackerIO.copyTable(dataTable, false, track.getName()); // copy raw data + } + }; + ActionMap am = dataTable.getActionMap(); + am.put(im.get(k), newAction); + // override the pageUp and pageDown behaviors + k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, 0); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + trackerPanel.getPlayer().back(); + } + }; + am.put(im.get(k), newAction); + k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_UP, KeyEvent.SHIFT_DOWN_MASK); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + int n = trackerPanel.getPlayer().getStepNumber()-5; + trackerPanel.getPlayer().setStepNumber(n); + } + }; + am.put(im.get(k), newAction); + k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, 0); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + trackerPanel.getPlayer().step(); + } + }; + am.put(im.get(k), newAction); + k = KeyStroke.getKeyStroke(KeyEvent.VK_PAGE_DOWN, KeyEvent.SHIFT_DOWN_MASK); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + int n = trackerPanel.getPlayer().getStepNumber()+5; + trackerPanel.getPlayer().setStepNumber(n); + } + }; + am.put(im.get(k), newAction); + k = KeyStroke.getKeyStroke(KeyEvent.VK_HOME, 0); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + trackerPanel.getPlayer().setStepNumber(0); + } + }; + am.put(im.get(k), newAction); + k = KeyStroke.getKeyStroke(KeyEvent.VK_END, 0); + newAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (!trackerPanel.getPlayer().isEnabled()) return; + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + trackerPanel.getPlayer().setStepNumber(clip.getStepCount()-1); + } + }; + am.put(im.get(k), newAction); + } + + protected JPopupMenu getPopup() { + formatDialogItem.setText(ToolsRes.getString("DataToolTable.Popup.MenuItem.NumberFormat")); //$NON-NLS-1$ + copyImageItem.setText(TrackerRes.getString("TMenuBar.Menu.CopyImage")); //$NON-NLS-1$ + snapshotItem.setText(DisplayRes.getString("DisplayPanel.Snapshot_menu_item")); //$NON-NLS-1$ + printItem.setText(TrackerRes.getString("TActions.Action.Print")); //$NON-NLS-1$ + helpItem.setText(TrackerRes.getString("Tracker.Popup.MenuItem.Help")); //$NON-NLS-1$ + createTextColumnItem.setText(TrackerRes.getString("TableTrackView.Action.CreateTextColumn.Text")); //$NON-NLS-1$ + textColumnMenu.setText(TrackerRes.getString("TableTrackView.Menu.TextColumn.Text")); //$NON-NLS-1$ + deleteTextColumnMenu.setText(TrackerRes.getString("TableTrackView.Action.DeleteTextColumn.Text")); //$NON-NLS-1$ + renameTextColumnMenu.setText(TrackerRes.getString("TableTrackView.Action.RenameTextColumn.Text")); //$NON-NLS-1$ + dataBuilderItem.setText(TrackerRes.getString("TView.Menuitem.Define")); //$NON-NLS-1$ + dataToolItem.setText(TrackerRes.getString("TableTrackView.Popup.MenuItem.Analyze")); //$NON-NLS-1$ + refreshCopyDataMenu(copyDataMenu); + popup.removeAll(); + if (!"".equals(deleteDataFunctionItem.getActionCommand())) { //$NON-NLS-1$ + popup.add(deleteDataFunctionItem); + popup.addSeparator(); + } + popup.add(formatDialogItem); + if (track!=null && track.trackerPanel!=null + && track.trackerPanel.isEnabled("edit.copyData")) { //$NON-NLS-1$ + popup.addSeparator(); + popup.add(copyDataMenu); + } + popup.addSeparator(); + // textColumnMenu + textColumnMenu.removeAll(); + popup.add(textColumnMenu); + textColumnMenu.add(createTextColumnItem); + if (track.getTextColumnNames().size()>0) { + deleteTextColumnMenu.removeAll(); + textColumnMenu.add(deleteTextColumnMenu); + for (String next: track.getTextColumnNames()) { + JMenuItem item = new JMenuItem(next); + deleteTextColumnMenu.add(item); + item.setActionCommand(next); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + track.removeTextColumn(e.getActionCommand()); + } + }); + } + renameTextColumnMenu.removeAll(); + textColumnMenu.add(renameTextColumnMenu); + for (String next: track.getTextColumnNames()) { + JMenuItem item = new JMenuItem(next); + renameTextColumnMenu.add(item); + item.setActionCommand(next); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String prev = e.getActionCommand(); + String name = getUniqueColumnName(prev, false); + if (name!=null && !name.equals("") && !name.equals(prev)) { //$NON-NLS-1$ + // name has changed + track.renameTextColumn(prev, name); + } + } + }); + } + } + textColumnMenu.setEnabled(!track.isLocked()); + + if (track!=null && track.trackerPanel!=null + && track.trackerPanel.isEnabled("edit.copyImage")) { //$NON-NLS-1$ + popup.addSeparator(); + popup.add(copyImageItem); + popup.add(snapshotItem); + } + if (track!=null && track.trackerPanel!=null + && (track.trackerPanel.isEnabled("data.builder") //$NON-NLS-1$ + || track.trackerPanel.isEnabled("data.tool"))) { //$NON-NLS-1$ + popup.addSeparator(); + if (track.trackerPanel.isEnabled("data.builder")) //$NON-NLS-1$ + popup.add(dataBuilderItem); + if (track.trackerPanel.isEnabled("data.tool")) //$NON-NLS-1$ + popup.add(dataToolItem); + } + if (track!=null && track.trackerPanel!=null + && track.trackerPanel.isEnabled("file.print")) { //$NON-NLS-1$ + popup.addSeparator(); + popup.add(printItem); + } + popup.addSeparator(); + popup.add(helpItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + return popup; + } + + /** + * Gets a unique new name for a text column. + * + * @param previous the previous name (may be null) + * @return the new name + */ + protected String getUniqueColumnName(String previous, boolean tryAgain) { + if (previous==null) previous = ""; //$NON-NLS-1$ + Object input = null; + if (tryAgain) { + input = JOptionPane.showInputDialog(track.trackerPanel.getTFrame(), + TrackerRes.getString("TableTrackView.Dialog.NameColumn.TryAgain")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("TableTrackView.Dialog.NameColumn.Message"), //$NON-NLS-1$ + TrackerRes.getString("TableTrackView.Dialog.NameColumn.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE, null, null, previous); + } + else { + input = JOptionPane.showInputDialog(track.trackerPanel.getTFrame(), + TrackerRes.getString("TableTrackView.Dialog.NameColumn.Message"), //$NON-NLS-1$ + TrackerRes.getString("TableTrackView.Dialog.NameColumn.Title"), //$NON-NLS-1$ + JOptionPane.QUESTION_MESSAGE, null, null, previous); + } + if(input==null) { + return null; + } + String name = ((String)input).trim(); + if (name.equals(previous)) return name; + // check name for uniqueness + boolean unique = true; + for (String next: getDataColumnNames()) { + if (next.equals(name)) { + unique = false; + break; + } + } + if (unique) { + for (String next: track.getTextColumnNames()) { + if (next.equals(name)) { + unique = false; + break; + } + } + } + if (!unique) return getUniqueColumnName(previous, true); + return name; + } + + /** + * Refreshes a menu with appropriate copy data items for this view. + * + * @param menu the menu to refresh + * @return the refreshed menu + */ + protected JMenu refreshCopyDataMenu(JMenu menu) { + menu.removeAll(); + menu.add(copyDataRawItem); + menu.add(copyDataFormattedItem); + menu.addSeparator(); + menu.add(setDelimiterMenu); + if (dataTable.getSelectedRowCount()==0) + menu.setText(TrackerRes.getString("TableTrackView.Action.CopyData")); //$NON-NLS-1$ + else + menu.setText(TrackerRes.getString("TableTrackView.MenuItem.CopySelectedData")); //$NON-NLS-1$ + copyDataRawItem.setText(TrackerRes.getString("TableTrackView.MenuItem.Unformatted")); //$NON-NLS-1$ + copyDataFormattedItem.setText(TrackerRes.getString("TableTrackView.MenuItem.Formatted")); //$NON-NLS-1$ + setDelimiterMenu.setText(TrackerRes.getString("TableTrackView.Menu.SetDelimiter")); //$NON-NLS-1$ + addDelimiterItem.setText(TrackerRes.getString("TableTrackView.MenuItem.AddDelimiter")); //$NON-NLS-1$ + removeDelimiterItem.setText(TrackerRes.getString("TableTrackView.MenuItem.RemoveDelimiter")); //$NON-NLS-1$ + // refresh delimiter menu + setDelimiterMenu.removeAll(); + String delimiter = TrackerIO.getDelimiter(); + // remove all custom delimiter items from button group + Enumeration en = delimiterButtonGroup.getElements(); + for (; en.hasMoreElements();) { + JMenuItem item = (JMenuItem)en.nextElement(); + String delim = item.getActionCommand(); + if (!TrackerIO.delimiters.containsValue(delim)) + delimiterButtonGroup.remove(item); + } + // add all button group items to menu + en = delimiterButtonGroup.getElements(); + for (; en.hasMoreElements();) { + JMenuItem item = (JMenuItem)en.nextElement(); + setDelimiterMenu.add(item); + if (delimiter.equals(item.getActionCommand())) + item.setSelected(true); + } + // add new custom delimiter items + boolean hasCustom = !TrackerIO.customDelimiters.isEmpty(); + if (hasCustom) { + setDelimiterMenu.addSeparator(); + for (String key: TrackerIO.customDelimiters.keySet()) { + JMenuItem item = new JRadioButtonMenuItem(key); + item.setActionCommand(TrackerIO.customDelimiters.get(key)); + item.addActionListener(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + TrackerIO.setDelimiter(e.getActionCommand()); + } + }); + delimiterButtonGroup.add(item); + setDelimiterMenu.add(item); + if (delimiter.equals(item.getActionCommand())) + item.setSelected(true); + } + } + setDelimiterMenu.addSeparator(); + setDelimiterMenu.add(addDelimiterItem); + if (hasCustom) + setDelimiterMenu.add(removeDelimiterItem); + return menu; + } + + /** + * Gets an array of all column names. + * + * @return the column names + */ + protected String[] getDataColumnNames() { + ArrayList names = new ArrayList(); + // first add independent variable + Dataset dataset = data.getDataset(0); + String name = dataset.getXColumnName(); + names.add(name); + // then add other variables + ArrayList dataOrder = track.getPreferredDataOrder(); + ArrayList added = new ArrayList(); + // first add in preferred order + for (int i = 0; i < dataOrder.size(); i++) { + dataset = data.getDataset(dataOrder.get(i)); + name = dataset.getYColumnName(); + names.add(name); + added.add(dataOrder.get(i)); + } + // then add any that were missed + for (int i = 0; i names = new ArrayList(); + if (prev != null) { + for (int i = 0; i < prev.length; i++) { + if (prev[i].isSelected()) names.add(prev[i].getText()); + } + } + checkBoxes = new JCheckBox[datasetCount+textColumnCount]; + // data column checkboxes + for (int i = 0; i < datasetCount; i++) { + Dataset dataset = data.getDataset(i); + String name = dataset.getYColumnName(); + String s = TeXParser.removeSubscripting(name); + checkBoxes[i] = new JCheckBox(s); + boolean selected = names.contains(s) + || (prev != null && datasetCount >= prev.length-textColumnCount + && i < prev.length-textColumnCount && prev[i].isSelected()); + checkBoxes[i].setBackground(Color.white); + checkBoxes[i].setFont(font); + checkBoxes[i].setSelected(selected); + checkBoxes[i].setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 0)); + checkBoxes[i].setActionCommand(name); + checkBoxes[i].setToolTipText(track.getDataDescription(i+1)); + checkBoxes[i].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (refresh) refresh(trackerPanel.getFrameNumber()); + trackerPanel.changed = true; + } + }); + checkBoxes[i].setOpaque(false); + } + // text column checkboxes + for (int i = datasetCount; i < datasetCount+textColumnCount; i++) { + String name = track.getTextColumnNames().get(i-datasetCount); + String s = TeXParser.removeSubscripting(name); + checkBoxes[i] = new JCheckBox(s); + checkBoxes[i].setBackground(Color.white); + checkBoxes[i].setFont(font); + checkBoxes[i].setSelected(textColumnsVisible.contains(name)); + checkBoxes[i].setBorder(BorderFactory.createEmptyBorder(1, 5, 1, 0)); + checkBoxes[i].setActionCommand(name); + checkBoxes[i].addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + JCheckBox item = (JCheckBox)e.getSource(); + if (item.isSelected()) { + textColumnsVisible.add(e.getActionCommand()); + } + else { + textColumnsVisible.remove(e.getActionCommand()); + } + if (refresh) refresh(trackerPanel.getFrameNumber()); + trackerPanel.changed = true; + } + }); + checkBoxes[i].setOpaque(false); + } + columnsPanel.removeAll(); + ArrayList dataOrder = track.getPreferredDataOrder(); + ArrayList added = new ArrayList(); + // first add in preferred order + for (int i = 0; i < dataOrder.size(); i++) { + columnsPanel.add(checkBoxes[dataOrder.get(i)]); + added.add(checkBoxes[dataOrder.get(i)]); + } + // then add any that were missed + for (int j = 0; j-1) { + double frame = data.getDataset(index).getYPoints()[row]; + return track.getTextColumnEntry(columnName, (int)frame); + } + // if no frame numbers defined (eg line profile), use row number + return track.getTextColumnEntry(columnName, row); + } + + /** + * Sets the value at the given cell. + * + * @param value the value + * @param row the row index + * @param col the column index + */ + public void setValueAt(Object value, int row, int col) { + String columnName = getColumnName(col); + // convert row to frame number + DatasetManager data = track.getData(track.trackerPanel); + int index = data.getDatasetIndex("frame"); //$NON-NLS-1$ + if (index>-1) { + double frame = data.getDataset(index).getYPoints()[row]; + if (track.setTextColumnEntry(columnName, (int)frame, (String)value)) { + trackerPanel.changed = true; + } + return; + } + // if no frame numbers defined (eg line profile), use row number + if (track.setTextColumnEntry(columnName, row, (String)value)) { + trackerPanel.changed = true; + } + } + + + public boolean isCellEditable(int row, int col) { + return !track.isLocked(); + } + + public Class getColumnClass(int col) { + return String.class; + } + + } + + /** + * A cell editor for textColumn cells. + */ + class TextColumnEditor extends AbstractCellEditor implements TableCellEditor { + Color defaultEditingColor; + JPanel panel = new JPanel(new BorderLayout()); + JTextField field = new JTextField(); + + // Constructor. + TextColumnEditor() { + defaultEditingColor = field.getSelectionColor(); + panel.add(field, BorderLayout.CENTER); + panel.setOpaque(false); + field.setBorder(BorderFactory.createEmptyBorder(0, 1, 1, 0)); + field.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent e) { + if(e.getKeyCode()==KeyEvent.VK_ENTER) { + stopCellEditing(); + } else if(field.isEnabled()) { + field.setBackground(Color.yellow); + } + } + + }); + field.addFocusListener(new FocusAdapter() { + public void focusLost(FocusEvent e) { + // request focus immediately to keep it + field.requestFocusInWindow(); + } + }); + } + + // Gets the component to be displayed while editing. + public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { + field.setBackground(Color.white); + field.setSelectionColor(defaultEditingColor); + field.setEditable(true); + if (value==null) value = ""; //$NON-NLS-1$ + field.setText(value.toString()); + return panel; + } + + // Determines when editing starts. + public boolean isCellEditable(EventObject e) { + if(e==null || e instanceof MouseEvent) { + return !track.isLocked(); + } + return false; + } + + // Called when editing is completed. + public Object getCellEditorValue() { + dataTable.requestFocusInWindow(); + if(field.getBackground()!=Color.white) { + field.setBackground(Color.white); + } + return field.getText(); + } + + } + + + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java b/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java index e1abed4a..eef60783 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java @@ -1,1173 +1,1173 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.text.*; -import java.util.ArrayList; -import java.util.TreeSet; -import java.awt.*; -import java.awt.event.*; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; -import javax.swing.border.Border; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * A TapeMeasure measures and displays its world length and its angle relative - * to the positive x-axis. It is used to set the scale and angle of an - * ImageCoordSystem. - * - * @author Douglas Brown - */ -public class TapeMeasure extends TTrack { - - // static constants - protected static final double MIN_LENGTH = 1.0E-30; - @SuppressWarnings("javadoc") - public static final float[] BROKEN_LINE = new float[] {10, 1}; - - // instance fields - protected boolean fixedPosition = true, fixedLength = true; - protected JCheckBoxMenuItem fixedPositionItem, fixedLengthItem; - protected boolean editing = false; - protected final NumberField inputField; - protected JPanel inputPanel; - protected JPanel glassPanel; - protected NumberFormat format; - protected MouseListener editListener; - protected boolean readOnly; - protected boolean stickMode; - protected boolean isStepChangingScale; - protected boolean notYetShown = true; - protected Footprint[] tapeFootprints, stickFootprints; - protected TreeSet lengthKeyFrames = new TreeSet(); // applies to sticks only - protected JMenuItem attachmentItem; - - /** - * Constructs a TapeMeasure. - */ - public TapeMeasure() { - // assign a default name - setName(TrackerRes.getString("TapeMeasure.New.Name")); //$NON-NLS-1$ - defaultColors = new Color[] {new Color(204, 0, 0)}; - - // assign default plot variables - setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot0", "length"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot1", Tracker.THETA); //$NON-NLS-1$ - - // assign default table variables: length and angle - setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - - // set up footprint choices and color - tapeFootprints = new Footprint[] - {LineFootprint.getFootprint("Footprint.DoubleArrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.BoldDoubleArrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.Line"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.BoldLine")}; //$NON-NLS-1$ - stickFootprints = new Footprint[] - {LineFootprint.getFootprint("Footprint.BoldDoubleTarget"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.DoubleTarget")}; //$NON-NLS-1$ - setColor(defaultColors[0]); - setViewable(false); - setStickMode(false); // sets up footprints - setReadOnly(false); // sets up dashed array - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("TapeMeasure.Hint"); //$NON-NLS-1$ - // create input field and panel - inputField = new NumberField(9); - inputField.setBorder(null); - format = inputField.getFormat(); - inputPanel = new JPanel(null); - inputPanel.setOpaque(false); - inputPanel.add(inputField); - // eliminate minimum of magField - magField.setMinValue(Double.NaN); - keyFrames.add(0); - lengthKeyFrames.add(0); - // add inputField action listener to exit editing mode - inputField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - TapeStep tape = ((TapeStep)getStep(n)); - setEditing(false, tape); - } - } - }); - // add inputField focus listener - inputField.addFocusListener(new FocusAdapter() { - public void focusGained(FocusEvent e) { - inputField.selectAll(); - } - public void focusLost(FocusEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - TapeStep tape = ((TapeStep)getStep(n)); - setEditing(false, tape); - } - } - }); - // add mouse listener to toggle editing mode - editListener = new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (editing) { - int n = trackerPanel.getFrameNumber(); - TapeStep tape = (TapeStep)getStep(n); - setEditing(false, tape); - } - } - public void mouseClicked(MouseEvent e) { - if (isLocked()) return; - int n = trackerPanel.getFrameNumber(); - TapeStep step = (TapeStep)getStep(n); - Rectangle bounds = step.layoutBounds.get(trackerPanel); - if (bounds != null && - bounds.contains(e.getPoint())) { - setEditing(true, step); - } - } - }; - fixedPositionItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedPositionItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixedPosition(fixedPositionItem.isSelected()); - } - }); - fixedLengthItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.FixedLength")); //$NON-NLS-1$ - fixedLengthItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixedLength(fixedLengthItem.isSelected()); - } - }); - final FocusListener magFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (magField.getBackground() == Color.yellow) { - int n = trackerPanel.getFrameNumber(); - // if not fixed, add frame number to key frames - if (!isFixedPosition()) - keyFrames.add(n); - TapeStep step = (TapeStep)getStep(n); - // replace with key frame step - step = getKeyStep(step); - step.setTapeLength(magField.getValue()); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - }; - magField.addFocusListener(magFocusListener); - magField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - magFocusListener.focusLost(null); - magField.requestFocusInWindow(); - } - }); - final FocusListener angleFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (angleField.getBackground() == Color.yellow) { - int n = trackerPanel.getFrameNumber(); - // if not fixed, add frame number to key frames - if (!isFixedPosition()) - keyFrames.add(n); - TapeStep step = (TapeStep)getStep(n); - // replace with key frame step - step = getKeyStep(step); - step.setTapeAngle(angleField.getValue()); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - if (!isReadOnly()) - trackerPanel.getAxes().setVisible(true); - } - } - }; - angleField.addFocusListener(angleFocusListener); - angleField.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - angleFocusListener.focusLost(null); - angleField.requestFocusInWindow(); - } - }); - } - - /** - * Sets the fixed position property. When it is fixed, it's ends are in the same - * position at all times. - * - * @param fixed true to fix the position - */ - public void setFixedPosition(boolean fixed) { - if (fixedPosition == fixed) return; - XMLControl control = new XMLControlElement(this); - boolean hasSteps = false; - if (trackerPanel != null) { - int n = trackerPanel.getFrameNumber(); - trackerPanel.changed = true; - TapeStep keyStep = (TapeStep)getStep(n); - for (int i = 0; i < steps.length; i++) { - TapeStep step = (TapeStep)steps.getStep(i); - if (step==null) continue; - step.getEnd1().setLocation(keyStep.getEnd1()); - step.getEnd2().setLocation(keyStep.getEnd2()); - hasSteps = true; - } - trackerPanel.repaint(); - } - if (fixed) { - keyFrames.clear(); - keyFrames.add(0); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - erase(); - } - fixedPosition = fixed; - if (hasSteps) - Undo.postTrackEdit(this, control); - } - - /** - * Gets the fixed position property. - * - * @return true if position is fixed - */ - public boolean isFixedPosition() { - return fixedPosition; - } - - /** - * Sets the fixed length property. When it is fixed, it has the same - * world length at all times. Applies to sticks only. - * - * @param fixed true to fix the length - */ - public void setFixedLength(boolean fixed) { - if (fixedLength == fixed) return; - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - int n = trackerPanel.getFrameNumber(); - trackerPanel.changed = true; - TapeStep keyStep = (TapeStep)getStep(n); - for (int i = 0; i < steps.length; i++) { - TapeStep step = (TapeStep)steps.getStep(i); - step.worldLength = keyStep.worldLength; - } - trackerPanel.repaint(); - } - if (fixed) { - lengthKeyFrames.clear(); - lengthKeyFrames.add(0); - } - fixedLength = fixed; - Undo.postTrackEdit(this, control); - } - - /** - * Gets the fixed length property. - * - * @return true if length is fixed - */ - public boolean isFixedLength() { - return fixedLength; - } - - /** - * Sets the readOnly property. When true, the scale and angle are not settable. - * - * @param readOnly true to prevent editing - */ - public void setReadOnly(boolean readOnly) { - this.readOnly = readOnly; - for (Footprint footprint: getFootprints()) { - if (footprint instanceof DoubleArrowFootprint) { - DoubleArrowFootprint line = (DoubleArrowFootprint)footprint; - line.setSolidHead(isReadOnly()? false: true); - } - } - } - - /** - * Gets the ReadOnly property. - * - * @return true if read-only - */ - public boolean isReadOnly() { - return readOnly; - } - - /** - * Sets the stickMode property. When true, the 'stick" has constant world length - * and the scale changes when you drag the mouse. When false, the "tape" stretches - * without changing the scale when you drag the mouse. - * - * @param stick true for stick mode, false for tape mode - */ - public void setStickMode(boolean stick) { - stickMode = stick; - Color color = getColor(); - // set footprints and update world lengths - if (isStickMode()) { - setFootprints(stickFootprints); - } - else { - setFootprints(tapeFootprints); - } - defaultFootprint = getFootprint(); - setColor(color); - // set tip edit triggers - for (Step step: getSteps()) { - if (step!=null) { - TapeStep tapeStep = (TapeStep)step; - tapeStep.end1.setCoordsEditTrigger(isStickMode()); - tapeStep.end2.setCoordsEditTrigger(isStickMode()); - } - } - repaint(); - } - - /** - * Gets the stickMode property. - * - * @return true if in stick mode - */ - public boolean isStickMode() { - return stickMode; - } - - /** - * Overrides TTrack method. - * - * @param locked true to lock this - */ - public void setLocked(boolean locked) { - super.setLocked(locked); - boolean enabled = isFieldsEnabled(); - magField.setEnabled(enabled); - angleField.setEnabled(enabled); - } - - /** - * Responds to property change events. Overrides TTrack method. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (isStickMode() && name.equals("transform") && !isStepChangingScale) { //$NON-NLS-1$ - // stretch or squeeze stick to keep constant world length - int n = trackerPanel.getFrameNumber(); - TapeStep step = (TapeStep)getStep(n); - step.adjustTipsToLength(); - if (!isFixedPosition()) { - keyFrames.add(n); - } - } - if (name.equals("adjusting") && e.getSource() instanceof TrackerPanel) { //$NON-NLS-1$ - refreshDataLater = (Boolean)e.getNewValue(); - if (!refreshDataLater) { // stopped adjusting - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - if (name.equals("stepnumber")) { //$NON-NLS-1$ - if (trackerPanel.getSelectedTrack() == this) { - TapeStep step = (TapeStep)getStep(trackerPanel.getFrameNumber()); - step.getTapeLength(!isStickMode()); - boolean enabled = isFieldsEnabled(); - magField.setEnabled(enabled); - angleField.setEnabled(enabled); - } - } - else if (name.equals("locked")) { //$NON-NLS-1$ - boolean enabled = isFieldsEnabled(); - magField.setEnabled(enabled); - angleField.setEnabled(enabled); - } - else if (isStickMode() && name.equals("fixed_scale") && e.getNewValue()==Boolean.FALSE) { //$NON-NLS-1$ - setFixedPosition(false); - } - else super.propertyChange(e); - } - - /** - * Overrides TTrack setVisible method to change notYetShown flag. - * - * @param visible true to show this track - */ - public void setVisible(boolean visible) { - super.setVisible(visible); - if (visible) notYetShown = false; - } - - /** - * Overrides TTrack setTrailVisible method to keep trails hidden. - * - * @param visible ignored - */ - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Overrides TTrack isLocked method. - * - * @return true if this is locked - */ - public boolean isLocked() { - boolean locked = super.isLocked(); - if (!readOnly && trackerPanel != null - && !(trackerPanel.getSelectedPoint() instanceof TapeStep.Handle)) { - locked = locked || trackerPanel.getCoords().isLocked(); - } - return locked; - } - - /** - * Implements createStep but only mimics step creation since - * steps are created automatically by the autofill StepArray. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - public Step createStep(int n, double x, double y) { - TapeStep step = (TapeStep)getStep(n); - TPoint[] pts = step.getPoints(); - TPoint p = trackerPanel==null? null: trackerPanel.getSelectedPoint(); - if (p==null) { - p = step.getEnd1(); - if (trackerPanel!=null) - trackerPanel.setSelectedPoint(p); - } - if (p==pts[0] || p==pts[1]) { - p.setLocation(x, y); - keyFrames.add(n); - step.worldLength = step.getTapeLength(true); - } - return step; - } - - /** - * Mimics step creation by setting end positions of an existing step. - * - * @param n the frame number - * @param x1 the x coordinate of end1 in image space - * @param y1 the y coordinate of end1 in image space - * @param x2 the x coordinate of end2 in image space - * @param y2 the y coordinate of end2 in image space - * @return the step - */ - public Step createStep(int n, double x1, double y1, double x2, double y2) { - TapeStep step = (TapeStep)steps.getStep(n); - if (step==null) { - step = new TapeStep(this, n, x1, y1, x2, y2); - step.worldLength = step.getTapeLength(true); - step.setFootprint(getFootprint()); - steps = new StepArray(step); // autofill - } - else { - step.getEnd1().setLocation(x1, y1); - step.getEnd2().setLocation(x2, y2); - } - keyFrames.add(n); - return step; - } - - /** - * Used by autoTracker to mark a step at a match target position. - * - * @param n the frame number - * @param x the x target coordinate in image space - * @param y the y target coordinate in image space - * @return the TPoint that was automarked - */ - public TPoint autoMarkAt(int n, double x, double y) { - TapeStep step = (TapeStep)getStep(n); - int index = getTargetIndex(); - ImageCoordSystem coords = trackerPanel.getCoords(); - coords.setFixedScale(false); - this.setFixedPosition(false); - TPoint p = step.getPoints()[index]; - p.setAdjusting(true); - p.setXY(x, y); - p.setAdjusting(false); - return p; - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - public Step deleteStep(int n) { - return null; - } - - /** - * Overrides TTrack getStep method to provide fixedTape behavior. - * - * @param n the frame number - * @return the step - */ - public Step getStep(int n) { - TapeStep step = (TapeStep)steps.getStep(n); - refreshStep(step); - return step; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return TapeStep.getLength(); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 2; - } - - /** - * Formats the specified length value. - * - * @param length the length value to format - * @return the formatted length string - */ - public String getFormattedLength(double length) { - inputField.setFormatFor(length); - return format.format(length); - } - - /** - * Reports whether or not this is viewable. - * - * @return true if this track is viewable - */ - public boolean isViewable() { - return isReadOnly() && !isStickMode(); - } - - /** - * Determines if at least one point in this track is autotrackable. - * - * @return true if autotrackable - */ - protected boolean isAutoTrackable() { - return true; - } - - /** - * Determines if the given point index is autotrackable. - * - * @param pointIndex the points[] index - * @return true if autotrackable - */ - protected boolean isAutoTrackable(int pointIndex) { - return pointIndex<2; - } - - /** - * Returns a description of a target point with a given index. - * - * @param pointIndex the index - * @return the description - */ - protected String getTargetDescription(int pointIndex) { - String s = TrackerRes.getString("Calibration.Point.Name"); //$NON-NLS-1$ - return s+" "+(pointIndex+1); //$NON-NLS-1$ - } - - /** - * Returns a menu with items that control this track. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - // assemble the menu - JMenu menu = super.getMenu(trackerPanel); - - lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); - - // remove end items and last separator - menu.remove(deleteTrackItem); - menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); - - // add items - fixedPositionItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedPositionItem.setSelected(isFixedPosition()); - boolean canBeFixed = !isStickMode() || trackerPanel.getCoords().isFixedScale(); - boolean notAttached = attachments==null || (attachments[0]==null && attachments[1]==null); - fixedPositionItem.setEnabled(canBeFixed && notAttached); - menu.add(fixedPositionItem); -// if (isStickMode()) { -// fixedLengthItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.FixedLength")); //$NON-NLS-1$ -// fixedLengthItem.setSelected(isFixedLength()); -// menu.add(fixedLengthItem); -// } - - // add an attachment dialog item - attachmentItem = new JMenuItem(TrackerRes.getString("MeasuringTool.MenuItem.Attach")); //$NON-NLS-1$ - attachmentItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - ImageCoordSystem coords = TapeMeasure.this.trackerPanel.getCoords(); - if (TapeMeasure.this.isStickMode() && coords.isFixedScale()) { - int result = JOptionPane.showConfirmDialog(TapeMeasure.this.trackerPanel.getTFrame(), - TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Message1") + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Message2"), //$NON-NLS-1$ - TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Title"), //$NON-NLS-1$ - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE); - if (result!=JOptionPane.YES_OPTION) return; - } - coords.setFixedScale(false); - AttachmentDialog control = TapeMeasure.this.trackerPanel.getAttachmentDialog(TapeMeasure.this); - control.setVisible(true); - } - }); - - menu.addSeparator(); - menu.add(attachmentItem); - - menu.addSeparator(); - menu.add(deleteTrackItem); - return menu; - } - - /** - * Returns a list of point-related toolbar components. - * - * @param trackerPanel the tracker panel - * @return a list of components - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - magLabel.setText(TrackerRes.getString("TapeMeasure.Label.Length")); //$NON-NLS-1$ - magField.setToolTipText(TrackerRes.getString("TapeMeasure.Field.Magnitude.Tooltip")); //$NON-NLS-1$ - list.add(stepSeparator); - list.add(magLabel); - list.add(magField); - angleLabel.setText(TrackerRes.getString("TapeMeasure.Label.TapeAngle")); //$NON-NLS-1$ - angleField.setToolTipText(TrackerRes.getString("TapeMeasure.Field.TapeAngle.Tooltip")); //$NON-NLS-1$ - list.add(magSeparator); - list.add(angleLabel); - list.add(angleField); - boolean enabled = isFieldsEnabled(); - magField.setEnabled(enabled); - angleField.setEnabled(enabled); - return list; - } - - /** - * Implements findInteractive method. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step or motion vector that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || !isVisible()) - return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - int n = trackerPanel.getFrameNumber(); - TapeStep step = (TapeStep)getStep(n); - TPoint[] pts = step.points; - if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { - TPoint p = trackerPanel.getSelectedPoint(); - Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia == null) { - if (p==pts[0] || p==pts[1]) { - partName = TrackerRes.getString("TapeMeasure.End.Name"); //$NON-NLS-1$ - if (isStickMode() && !isReadOnly()) - hint = TrackerRes.getString("CalibrationStick.End.Hint"); //$NON-NLS-1$ - else - hint = TrackerRes.getString("TapeMeasure.End.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (!isReadOnly()) - hint = TrackerRes.getString("CalibrationTapeMeasure.Hint"); //$NON-NLS-1$ - else - hint = TrackerRes.getString("TapeMeasure.Hint"); //$NON-NLS-1$ - } - return null; - } - else if (ia instanceof TapeStep.Tip) { - partName = TrackerRes.getString("TapeMeasure.End.Name"); //$NON-NLS-1$ - if (isStickMode() && !isReadOnly()) - hint = TrackerRes.getString("CalibrationStick.End.Hint"); //$NON-NLS-1$ - else - hint = TrackerRes.getString("TapeMeasure.End.Hint"); //$NON-NLS-1$ - } - else if (ia instanceof TapeStep.Handle) { - partName = TrackerRes.getString("TapeMeasure.Handle.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("TapeMeasure.Handle.Hint"); //$NON-NLS-1$ - } - else if (ia == this) { - partName = TrackerRes.getString("TapeMeasure.Readout.Magnitude.Name"); //$NON-NLS-1$ - if (!isReadOnly()) - hint = TrackerRes.getString("CalibrationTapeMeasure.Readout.Magnitude.Hint"); //$NON-NLS-1$ - else - hint = TrackerRes.getString("TapeMeasure.Readout.Magnitude.Hint"); //$NON-NLS-1$ - trackerPanel.setMessage(getMessage()); - } - return ia; - } - return null; - } - - /** - * Refreshes the data. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - if (refreshDataLater || trackerPanel == null || data == null) return; - dataFrames.clear(); - // get the datasets - int count = 0; - Dataset length = data.getDataset(count++); - Dataset angle = data.getDataset(count++); - Dataset stepNum = data.getDataset(count++); - Dataset frameNum = data.getDataset(count++); - // assign column names to the datasets - String time = "t"; //$NON-NLS-1$ - if (!length.getColumnName(0).equals(time)) { // not yet initialized - length.setXYColumnNames(time, "length"); //$NON-NLS-1$ - angle.setXYColumnNames(time, Tracker.THETA); - stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ - frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ - } - else for (int i = 0; i < count; i++) { - data.getDataset(i).clear(); - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < dataDescriptions.length; i++) { - dataDescriptions[i] = TrackerRes.getString("TapeMeasure.Data.Description."+i); //$NON-NLS-1$ - } - // look thru steps and get data for those included in clip - VideoPlayer player = trackerPanel.getPlayer(); - VideoClip clip = player.getVideoClip(); - int len = clip.getStepCount(); - double[][] validData = new double[data.getDatasets().size()+1][len]; - for (int n = 0; n < len; n++) { - int frame = clip.stepToFrame(n); - TapeStep next = (TapeStep)getStep(frame); - if (next==null) continue; - next.dataVisible = true; - // get the step number and time - double t = player.getStepTime(n)/1000.0; - validData[0][n] = t; - validData[1][n] = next.getTapeLength(true); - validData[2][n] = next.getTapeAngle(); - validData[3][n] = n; - validData[4][n] = frame; - dataFrames.add(frame); - } - // append the data to the data set - length.append(validData[0], validData[1]); - angle.append(validData[0], validData[2]); - stepNum.append(validData[0], validData[3]); - frameNum.append(validData[0], validData[4]); - } - - /** - * Remarks all steps on the specified panel. - * Overrides TTrack method. - * - * @param trackerPanel the tracker panel - */ - public void remark(TrackerPanel trackerPanel) { - super.remark(trackerPanel); - displayState(); - } - - /** - * Overrides Object toString method. - * - * @return the name of this track - */ - public String toString() { - return TrackerRes.getString("TapeMeasure.Name"); //$NON-NLS-1$ - } - -//__________________________ protected and private methods _______________________ - - /** - * Overrides TTrack setTrackerPanel method. - * - * @param panel the TrackerPanel - */ - protected void setTrackerPanel(TrackerPanel panel) { - if (trackerPanel != null) { - trackerPanel.removeMouseListener(editListener); - trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - super.setTrackerPanel(panel); - if (trackerPanel != null) { - trackerPanel.addMouseListener(editListener); -// trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - boolean canBeFixed = !isStickMode() || trackerPanel.getCoords().isFixedScale(); - setFixedPosition(isFixedPosition() && canBeFixed); - } - - /** - * Refreshes world lengths at all steps based on current ends and scale. - */ - protected void refreshWorldLengths() { - for (int i=0; i < getSteps().length; i++) { - TapeStep step = (TapeStep)getSteps()[i]; - if (step!=null) { - refreshStep(step); - step.worldLength = step.getTapeLength(true); - } - } - } - - /** - * Refreshes a step by setting it equal to the previous keyframe step. - * - * @param step the step to refresh - */ - protected void refreshStep(TapeStep step) { - if (step==null) return; - int positionKey = 0, lengthKey = 0; - for (int i: keyFrames) { - if (i<=step.n) - positionKey = i; - } - for (int i: lengthKeyFrames) { - if (i<=step.n) - lengthKey = i; - } - // compare step with keyStep - boolean different = false; - boolean changed = false; - // check position - TapeStep keyStep = (TapeStep)steps.getStep(isFixedPosition()? 0: positionKey); - different = keyStep.getEnd1().getX()!=step.getEnd1().getX() - || keyStep.getEnd1().getY()!=step.getEnd1().getY() - || keyStep.getEnd2().getX()!=step.getEnd2().getX() - || keyStep.getEnd2().getY()!=step.getEnd2().getY(); - if (different) { - step.getEnd1().setLocation(keyStep.getEnd1()); - step.getEnd2().setLocation(keyStep.getEnd2()); - changed = true; - } - - // check length only if in stick mode - if (isStickMode()) { - keyStep = (TapeStep)steps.getStep(isFixedLength()? 0: lengthKey); - different = keyStep.worldLength!=step.worldLength; - if (different) { - step.worldLength = keyStep.worldLength; - changed = true; - } - } - // erase step if changed - if (changed) { - step.erase(); - } - } - - /** - * Sets the editing flag. - * - * @param edit true to edit the scale - * @param target the tape step that handles the edit process - */ - private void setEditing(boolean edit, TapeStep target) { - editing = edit; - if ((readOnly || isStickMode()) && !editing) { - // if not fixed, add target frame to key frames - if (!isFixedPosition()) - keyFrames.add(target.n); - // replace target with key frame step - target = getKeyStep(target); - } - final TapeStep step = target; - Runnable runner = new Runnable() { - public void run() { - if (editing) { - trackerPanel.setSelectedTrack(TapeMeasure.this); - inputField.setForeground(footprint.getColor()); - Rectangle bounds = step.layoutBounds.get(trackerPanel); - bounds.grow(3, 3); - bounds.setLocation(bounds.x+1, bounds.y); - for (Component c: trackerPanel.getComponents()) { - if (c == trackerPanel.noData) { - bounds.setLocation(bounds.x, bounds.y-c.getHeight()); - } - } - inputField.setBounds(bounds); - glassPanel = trackerPanel.getGlassPanel(); - trackerPanel.remove(glassPanel); - trackerPanel.add(inputPanel, BorderLayout.CENTER); - Border space = BorderFactory.createEmptyBorder(0, 1, 1, 0); - Color color = getFootprint().getColor(); - Border line = BorderFactory.createLineBorder(color); - inputField.setBorder(BorderFactory.createCompoundBorder(line, space)); - inputField.setValue(step.getTapeLength(!isStickMode())); - trackerPanel.revalidate(); - trackerPanel.repaint(); - inputField.requestFocus(); - } - else { // end editing - step.drawLayoutBounds = false; - step.setTapeLength(inputField.getValue()); - inputField.setSigFigs(4); - trackerPanel.add(glassPanel, BorderLayout.CENTER); - trackerPanel.remove(inputPanel); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - trackerPanel.revalidate(); - trackerPanel.repaint(); - } - } - }; - EventQueue.invokeLater(runner); - } - - /** - * Returns the key step for a given step. The key step defines the positions of the tape ends. - * @param step the step - * @return the key step - */ - private TapeStep getKeyStep(TapeStep step) { - int key = 0; - if (!this.isFixedPosition()) { - for (int i: keyFrames) { - if (i<=step.n) - key = i; - } - } - return (TapeStep)getStep(key); - } - - /** - * Displays the world coordinates of the currently selected step. - */ - private void displayState() { - int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); - TapeStep step = (TapeStep)getStep(n); - if (step!=null) { - step.getTapeLength(!isStickMode()); - } - } - - /** - * Determines if the input fields are enabled. - * - * @return true if enabled - */ - protected boolean isFieldsEnabled() { - // false if this tape is locked - if (isLocked()) return false; - // false if this tape is for calibration and coords are locked - if (!isReadOnly() && trackerPanel!=null && trackerPanel.getCoords().isLocked()) return false; - // false if both ends are attached to point masses - int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); - TapeStep step = (TapeStep)getStep(n); - if (step!=null && step.end1.isAttached() && step.end2.isAttached()) return false; - return true; - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - XML.setLoader(FrameData.class, new FrameDataLoader()); - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - TapeMeasure tape = (TapeMeasure)obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save fixed position and length - control.setValue("fixedtape", tape.isFixedPosition()); //$NON-NLS-1$ - control.setValue("fixedlength", tape.isFixedLength()); //$NON-NLS-1$ - // save readOnly - control.setValue("readonly", tape.isReadOnly()); //$NON-NLS-1$ - // save stick mode - control.setValue("stickmode", tape.isStickMode()); //$NON-NLS-1$ - // save step positions - Step[] steps = tape.getSteps(); - int count = tape.isFixedPosition()? 1: steps.length; - FrameData[] data = new FrameData[count]; - for (int n = 0; n < count; n++) { - // save only position key frames - if (steps[n] == null || !tape.keyFrames.contains(n)) continue; - data[n] = new FrameData((TapeStep)steps[n]); - } - control.setValue("framedata", data); //$NON-NLS-1$ - // save step world lengths - count = tape.isFixedLength()? 1: steps.length; - Double[] lengths = new Double[count]; - for (int n = 0; n < count; n++) { - // save only length key frames - if (steps[n] == null || !tape.lengthKeyFrames.contains(n)) continue; - lengths[n] = ((TapeStep)steps[n]).worldLength; - } - control.setValue("worldlengths", lengths); //$NON-NLS-1$ - } - - /** - * Creates a new object. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control){ - return new TapeMeasure(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - TapeMeasure tape = (TapeMeasure)obj; - tape.notYetShown = false; - boolean locked = tape.isLocked(); - tape.setLocked(false); - // load stickMode to set up footprint choices - tape.setStickMode(control.getBoolean("stickmode")); //$NON-NLS-1$ - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - // load position data - tape.keyFrames.clear(); - FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ - if (data!=null) { - for (int n = 0; n < data.length; n++) { - if (data[n] == null) continue; - tape.createStep(n, data[n].data[0], data[n].data[1], data[n].data[2], data[n].data[3]); - } - } - // load world lengths - tape.lengthKeyFrames.clear(); - Double[] lengths = (Double[])control.getObject("worldlengths"); //$NON-NLS-1$ - if (lengths!=null) { - for (int n = 0; n < lengths.length; n++) { - if (lengths[n] == null) continue; - TapeStep step = (TapeStep)tape.steps.getStep(n); - step.worldLength = lengths[n]; - tape.lengthKeyFrames.add(n); - } - } - // load fixed position - tape.fixedPosition = control.getBoolean("fixedtape"); //$NON-NLS-1$ - // load fixed length - if (control.getPropertyNames().contains("fixedlength")) //$NON-NLS-1$ - tape.fixedLength = control.getBoolean("fixedlength"); //$NON-NLS-1$ - // load readOnly - tape.setReadOnly(control.getBoolean("readonly")); //$NON-NLS-1$ - tape.setLocked(locked); - tape.displayState(); - return obj; - } - } - - /** - * Inner class containing the tape data for a single frame number. - * This is here only to read legacy xml files. - */ - private static class FrameData { - double[] data = new double[4]; - - FrameData() {} - FrameData(TapeStep step) { - data[0] = step.getEnd1().x; - data[1] = step.getEnd1().y; - data[2] = step.getEnd2().x; - data[3] = step.getEnd2().y; - } - } - - /** - * A class to save and load a FrameData. - */ - private static class FrameDataLoader - implements XML.ObjectLoader { - - public void saveObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - control.setValue("x1", data.data[0]); //$NON-NLS-1$ - control.setValue("y1", data.data[1]); //$NON-NLS-1$ - control.setValue("x2", data.data[2]); //$NON-NLS-1$ - control.setValue("y2", data.data[3]); //$NON-NLS-1$ - } - - public Object createObject(XMLControl control) { - return new FrameData(); - } - - public Object loadObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - if (control.getPropertyNames().contains("x1")) { //$NON-NLS-1$ - data.data[0] = control.getDouble("x1"); //$NON-NLS-1$ - data.data[1] = control.getDouble("y1"); //$NON-NLS-1$ - data.data[2] = control.getDouble("x2"); //$NON-NLS-1$ - data.data[3] = control.getDouble("y2"); //$NON-NLS-1$ - } - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.text.*; +import java.util.ArrayList; +import java.util.TreeSet; +import java.awt.*; +import java.awt.event.*; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.border.Border; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * A TapeMeasure measures and displays its world length and its angle relative + * to the positive x-axis. It is used to set the scale and angle of an + * ImageCoordSystem. + * + * @author Douglas Brown + */ +public class TapeMeasure extends TTrack { + + // static constants + protected static final double MIN_LENGTH = 1.0E-30; + @SuppressWarnings("javadoc") + public static final float[] BROKEN_LINE = new float[] {10, 1}; + + // instance fields + protected boolean fixedPosition = true, fixedLength = true; + protected JCheckBoxMenuItem fixedPositionItem, fixedLengthItem; + protected boolean editing = false; + protected final NumberField inputField; + protected JPanel inputPanel; + protected JPanel glassPanel; + protected NumberFormat format; + protected MouseListener editListener; + protected boolean readOnly; + protected boolean stickMode; + protected boolean isStepChangingScale; + protected boolean notYetShown = true; + protected Footprint[] tapeFootprints, stickFootprints; + protected TreeSet lengthKeyFrames = new TreeSet(); // applies to sticks only + protected JMenuItem attachmentItem; + + /** + * Constructs a TapeMeasure. + */ + public TapeMeasure() { + // assign a default name + setName(TrackerRes.getString("TapeMeasure.New.Name")); //$NON-NLS-1$ + defaultColors = new Color[] {new Color(204, 0, 0)}; + + // assign default plot variables + setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot0", "length"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot1", Tracker.THETA); //$NON-NLS-1$ + + // assign default table variables: length and angle + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + + // set up footprint choices and color + tapeFootprints = new Footprint[] + {LineFootprint.getFootprint("Footprint.DoubleArrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.BoldDoubleArrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.Line"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.BoldLine")}; //$NON-NLS-1$ + stickFootprints = new Footprint[] + {LineFootprint.getFootprint("Footprint.BoldDoubleTarget"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.DoubleTarget")}; //$NON-NLS-1$ + setColor(defaultColors[0]); + setViewable(false); + setStickMode(false); // sets up footprints + setReadOnly(false); // sets up dashed array + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("TapeMeasure.Hint"); //$NON-NLS-1$ + // create input field and panel + inputField = new NumberField(9); + inputField.setBorder(null); + format = inputField.getFormat(); + inputPanel = new JPanel(null); + inputPanel.setOpaque(false); + inputPanel.add(inputField); + // eliminate minimum of magField + magField.setMinValue(Double.NaN); + keyFrames.add(0); + lengthKeyFrames.add(0); + // add inputField action listener to exit editing mode + inputField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + TapeStep tape = ((TapeStep)getStep(n)); + setEditing(false, tape); + } + } + }); + // add inputField focus listener + inputField.addFocusListener(new FocusAdapter() { + public void focusGained(FocusEvent e) { + inputField.selectAll(); + } + public void focusLost(FocusEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + TapeStep tape = ((TapeStep)getStep(n)); + setEditing(false, tape); + } + } + }); + // add mouse listener to toggle editing mode + editListener = new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (editing) { + int n = trackerPanel.getFrameNumber(); + TapeStep tape = (TapeStep)getStep(n); + setEditing(false, tape); + } + } + public void mouseClicked(MouseEvent e) { + if (isLocked()) return; + int n = trackerPanel.getFrameNumber(); + TapeStep step = (TapeStep)getStep(n); + Rectangle bounds = step.layoutBounds.get(trackerPanel); + if (bounds != null && + bounds.contains(e.getPoint())) { + setEditing(true, step); + } + } + }; + fixedPositionItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedPositionItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixedPosition(fixedPositionItem.isSelected()); + } + }); + fixedLengthItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.FixedLength")); //$NON-NLS-1$ + fixedLengthItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixedLength(fixedLengthItem.isSelected()); + } + }); + final FocusListener magFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (magField.getBackground() == Color.yellow) { + int n = trackerPanel.getFrameNumber(); + // if not fixed, add frame number to key frames + if (!isFixedPosition()) + keyFrames.add(n); + TapeStep step = (TapeStep)getStep(n); + // replace with key frame step + step = getKeyStep(step); + step.setTapeLength(magField.getValue()); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + } + }; + magField.addFocusListener(magFocusListener); + magField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + magFocusListener.focusLost(null); + magField.requestFocusInWindow(); + } + }); + final FocusListener angleFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (angleField.getBackground() == Color.yellow) { + int n = trackerPanel.getFrameNumber(); + // if not fixed, add frame number to key frames + if (!isFixedPosition()) + keyFrames.add(n); + TapeStep step = (TapeStep)getStep(n); + // replace with key frame step + step = getKeyStep(step); + step.setTapeAngle(angleField.getValue()); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + if (!isReadOnly()) + trackerPanel.getAxes().setVisible(true); + } + } + }; + angleField.addFocusListener(angleFocusListener); + angleField.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + angleFocusListener.focusLost(null); + angleField.requestFocusInWindow(); + } + }); + } + + /** + * Sets the fixed position property. When it is fixed, it's ends are in the same + * position at all times. + * + * @param fixed true to fix the position + */ + public void setFixedPosition(boolean fixed) { + if (fixedPosition == fixed) return; + XMLControl control = new XMLControlElement(this); + boolean hasSteps = false; + if (trackerPanel != null) { + int n = trackerPanel.getFrameNumber(); + trackerPanel.changed = true; + TapeStep keyStep = (TapeStep)getStep(n); + for (int i = 0; i < steps.length; i++) { + TapeStep step = (TapeStep)steps.getStep(i); + if (step==null) continue; + step.getEnd1().setLocation(keyStep.getEnd1()); + step.getEnd2().setLocation(keyStep.getEnd2()); + hasSteps = true; + } + trackerPanel.repaint(); + } + if (fixed) { + keyFrames.clear(); + keyFrames.add(0); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + erase(); + } + fixedPosition = fixed; + if (hasSteps) + Undo.postTrackEdit(this, control); + } + + /** + * Gets the fixed position property. + * + * @return true if position is fixed + */ + public boolean isFixedPosition() { + return fixedPosition; + } + + /** + * Sets the fixed length property. When it is fixed, it has the same + * world length at all times. Applies to sticks only. + * + * @param fixed true to fix the length + */ + public void setFixedLength(boolean fixed) { + if (fixedLength == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + int n = trackerPanel.getFrameNumber(); + trackerPanel.changed = true; + TapeStep keyStep = (TapeStep)getStep(n); + for (int i = 0; i < steps.length; i++) { + TapeStep step = (TapeStep)steps.getStep(i); + step.worldLength = keyStep.worldLength; + } + trackerPanel.repaint(); + } + if (fixed) { + lengthKeyFrames.clear(); + lengthKeyFrames.add(0); + } + fixedLength = fixed; + Undo.postTrackEdit(this, control); + } + + /** + * Gets the fixed length property. + * + * @return true if length is fixed + */ + public boolean isFixedLength() { + return fixedLength; + } + + /** + * Sets the readOnly property. When true, the scale and angle are not settable. + * + * @param readOnly true to prevent editing + */ + public void setReadOnly(boolean readOnly) { + this.readOnly = readOnly; + for (Footprint footprint: getFootprints()) { + if (footprint instanceof DoubleArrowFootprint) { + DoubleArrowFootprint line = (DoubleArrowFootprint)footprint; + line.setSolidHead(isReadOnly()? false: true); + } + } + } + + /** + * Gets the ReadOnly property. + * + * @return true if read-only + */ + public boolean isReadOnly() { + return readOnly; + } + + /** + * Sets the stickMode property. When true, the 'stick" has constant world length + * and the scale changes when you drag the mouse. When false, the "tape" stretches + * without changing the scale when you drag the mouse. + * + * @param stick true for stick mode, false for tape mode + */ + public void setStickMode(boolean stick) { + stickMode = stick; + Color color = getColor(); + // set footprints and update world lengths + if (isStickMode()) { + setFootprints(stickFootprints); + } + else { + setFootprints(tapeFootprints); + } + defaultFootprint = getFootprint(); + setColor(color); + // set tip edit triggers + for (Step step: getSteps()) { + if (step!=null) { + TapeStep tapeStep = (TapeStep)step; + tapeStep.end1.setCoordsEditTrigger(isStickMode()); + tapeStep.end2.setCoordsEditTrigger(isStickMode()); + } + } + repaint(); + } + + /** + * Gets the stickMode property. + * + * @return true if in stick mode + */ + public boolean isStickMode() { + return stickMode; + } + + /** + * Overrides TTrack method. + * + * @param locked true to lock this + */ + public void setLocked(boolean locked) { + super.setLocked(locked); + boolean enabled = isFieldsEnabled(); + magField.setEnabled(enabled); + angleField.setEnabled(enabled); + } + + /** + * Responds to property change events. Overrides TTrack method. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (isStickMode() && name.equals("transform") && !isStepChangingScale) { //$NON-NLS-1$ + // stretch or squeeze stick to keep constant world length + int n = trackerPanel.getFrameNumber(); + TapeStep step = (TapeStep)getStep(n); + step.adjustTipsToLength(); + if (!isFixedPosition()) { + keyFrames.add(n); + } + } + if (name.equals("adjusting") && e.getSource() instanceof TrackerPanel) { //$NON-NLS-1$ + refreshDataLater = (Boolean)e.getNewValue(); + if (!refreshDataLater) { // stopped adjusting + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + } + if (name.equals("stepnumber")) { //$NON-NLS-1$ + if (trackerPanel.getSelectedTrack() == this) { + TapeStep step = (TapeStep)getStep(trackerPanel.getFrameNumber()); + step.getTapeLength(!isStickMode()); + boolean enabled = isFieldsEnabled(); + magField.setEnabled(enabled); + angleField.setEnabled(enabled); + } + } + else if (name.equals("locked")) { //$NON-NLS-1$ + boolean enabled = isFieldsEnabled(); + magField.setEnabled(enabled); + angleField.setEnabled(enabled); + } + else if (isStickMode() && name.equals("fixed_scale") && e.getNewValue()==Boolean.FALSE) { //$NON-NLS-1$ + setFixedPosition(false); + } + else super.propertyChange(e); + } + + /** + * Overrides TTrack setVisible method to change notYetShown flag. + * + * @param visible true to show this track + */ + public void setVisible(boolean visible) { + super.setVisible(visible); + if (visible) notYetShown = false; + } + + /** + * Overrides TTrack setTrailVisible method to keep trails hidden. + * + * @param visible ignored + */ + public void setTrailVisible(boolean visible) {/** empty block */} + + /** + * Overrides TTrack isLocked method. + * + * @return true if this is locked + */ + public boolean isLocked() { + boolean locked = super.isLocked(); + if (!readOnly && trackerPanel != null + && !(trackerPanel.getSelectedPoint() instanceof TapeStep.Handle)) { + locked = locked || trackerPanel.getCoords().isLocked(); + } + return locked; + } + + /** + * Implements createStep but only mimics step creation since + * steps are created automatically by the autofill StepArray. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the step + */ + public Step createStep(int n, double x, double y) { + TapeStep step = (TapeStep)getStep(n); + TPoint[] pts = step.getPoints(); + TPoint p = trackerPanel==null? null: trackerPanel.getSelectedPoint(); + if (p==null) { + p = step.getEnd1(); + if (trackerPanel!=null) + trackerPanel.setSelectedPoint(p); + } + if (p==pts[0] || p==pts[1]) { + p.setLocation(x, y); + keyFrames.add(n); + step.worldLength = step.getTapeLength(true); + } + return step; + } + + /** + * Mimics step creation by setting end positions of an existing step. + * + * @param n the frame number + * @param x1 the x coordinate of end1 in image space + * @param y1 the y coordinate of end1 in image space + * @param x2 the x coordinate of end2 in image space + * @param y2 the y coordinate of end2 in image space + * @return the step + */ + public Step createStep(int n, double x1, double y1, double x2, double y2) { + TapeStep step = (TapeStep)steps.getStep(n); + if (step==null) { + step = new TapeStep(this, n, x1, y1, x2, y2); + step.worldLength = step.getTapeLength(true); + step.setFootprint(getFootprint()); + steps = new StepArray(step); // autofill + } + else { + step.getEnd1().setLocation(x1, y1); + step.getEnd2().setLocation(x2, y2); + } + keyFrames.add(n); + return step; + } + + /** + * Used by autoTracker to mark a step at a match target position. + * + * @param n the frame number + * @param x the x target coordinate in image space + * @param y the y target coordinate in image space + * @return the TPoint that was automarked + */ + public TPoint autoMarkAt(int n, double x, double y) { + TapeStep step = (TapeStep)getStep(n); + int index = getTargetIndex(); + ImageCoordSystem coords = trackerPanel.getCoords(); + coords.setFixedScale(false); + this.setFixedPosition(false); + TPoint p = step.getPoints()[index]; + p.setAdjusting(true); + p.setXY(x, y); + p.setAdjusting(false); + return p; + } + + /** + * Overrides TTrack deleteStep method to prevent deletion. + * + * @param n the frame number + * @return the deleted step + */ + public Step deleteStep(int n) { + return null; + } + + /** + * Overrides TTrack getStep method to provide fixedTape behavior. + * + * @param n the frame number + * @return the step + */ + public Step getStep(int n) { + TapeStep step = (TapeStep)steps.getStep(n); + refreshStep(step); + return step; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return TapeStep.getLength(); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 2; + } + + /** + * Formats the specified length value. + * + * @param length the length value to format + * @return the formatted length string + */ + public String getFormattedLength(double length) { + inputField.setFormatFor(length); + return format.format(length); + } + + /** + * Reports whether or not this is viewable. + * + * @return true if this track is viewable + */ + public boolean isViewable() { + return isReadOnly() && !isStickMode(); + } + + /** + * Determines if at least one point in this track is autotrackable. + * + * @return true if autotrackable + */ + protected boolean isAutoTrackable() { + return true; + } + + /** + * Determines if the given point index is autotrackable. + * + * @param pointIndex the points[] index + * @return true if autotrackable + */ + protected boolean isAutoTrackable(int pointIndex) { + return pointIndex<2; + } + + /** + * Returns a description of a target point with a given index. + * + * @param pointIndex the index + * @return the description + */ + protected String getTargetDescription(int pointIndex) { + String s = TrackerRes.getString("Calibration.Point.Name"); //$NON-NLS-1$ + return s+" "+(pointIndex+1); //$NON-NLS-1$ + } + + /** + * Returns a menu with items that control this track. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + // assemble the menu + JMenu menu = super.getMenu(trackerPanel); + + lockedItem.setEnabled(!trackerPanel.getCoords().isLocked()); + + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + + // add items + fixedPositionItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedPositionItem.setSelected(isFixedPosition()); + boolean canBeFixed = !isStickMode() || trackerPanel.getCoords().isFixedScale(); + boolean notAttached = attachments==null || (attachments[0]==null && attachments[1]==null); + fixedPositionItem.setEnabled(canBeFixed && notAttached); + menu.add(fixedPositionItem); +// if (isStickMode()) { +// fixedLengthItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.FixedLength")); //$NON-NLS-1$ +// fixedLengthItem.setSelected(isFixedLength()); +// menu.add(fixedLengthItem); +// } + + // add an attachment dialog item + attachmentItem = new JMenuItem(TrackerRes.getString("MeasuringTool.MenuItem.Attach")); //$NON-NLS-1$ + attachmentItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ImageCoordSystem coords = TapeMeasure.this.trackerPanel.getCoords(); + if (TapeMeasure.this.isStickMode() && coords.isFixedScale()) { + int result = JOptionPane.showConfirmDialog(TapeMeasure.this.trackerPanel.getTFrame(), + TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Message1") + "\n" + //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Message2"), //$NON-NLS-1$ + TrackerRes.getString("TapeMeasure.Alert.UnfixScale.Title"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, + JOptionPane.QUESTION_MESSAGE); + if (result!=JOptionPane.YES_OPTION) return; + } + coords.setFixedScale(false); + AttachmentDialog control = TapeMeasure.this.trackerPanel.getAttachmentDialog(TapeMeasure.this); + control.setVisible(true); + } + }); + + menu.addSeparator(); + menu.add(attachmentItem); + + menu.addSeparator(); + menu.add(deleteTrackItem); + return menu; + } + + /** + * Returns a list of point-related toolbar components. + * + * @param trackerPanel the tracker panel + * @return a list of components + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + magLabel.setText(TrackerRes.getString("TapeMeasure.Label.Length")); //$NON-NLS-1$ + magField.setToolTipText(TrackerRes.getString("TapeMeasure.Field.Magnitude.Tooltip")); //$NON-NLS-1$ + list.add(stepSeparator); + list.add(magLabel); + list.add(magField); + angleLabel.setText(TrackerRes.getString("TapeMeasure.Label.TapeAngle")); //$NON-NLS-1$ + angleField.setToolTipText(TrackerRes.getString("TapeMeasure.Field.TapeAngle.Tooltip")); //$NON-NLS-1$ + list.add(magSeparator); + list.add(angleLabel); + list.add(angleField); + boolean enabled = isFieldsEnabled(); + magField.setEnabled(enabled); + angleField.setEnabled(enabled); + return list; + } + + /** + * Implements findInteractive method. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step or motion vector that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || !isVisible()) + return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + int n = trackerPanel.getFrameNumber(); + TapeStep step = (TapeStep)getStep(n); + TPoint[] pts = step.points; + if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { + TPoint p = trackerPanel.getSelectedPoint(); + Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + if (p==pts[0] || p==pts[1]) { + partName = TrackerRes.getString("TapeMeasure.End.Name"); //$NON-NLS-1$ + if (isStickMode() && !isReadOnly()) + hint = TrackerRes.getString("CalibrationStick.End.Hint"); //$NON-NLS-1$ + else + hint = TrackerRes.getString("TapeMeasure.End.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (!isReadOnly()) + hint = TrackerRes.getString("CalibrationTapeMeasure.Hint"); //$NON-NLS-1$ + else + hint = TrackerRes.getString("TapeMeasure.Hint"); //$NON-NLS-1$ + } + return null; + } + else if (ia instanceof TapeStep.Tip) { + partName = TrackerRes.getString("TapeMeasure.End.Name"); //$NON-NLS-1$ + if (isStickMode() && !isReadOnly()) + hint = TrackerRes.getString("CalibrationStick.End.Hint"); //$NON-NLS-1$ + else + hint = TrackerRes.getString("TapeMeasure.End.Hint"); //$NON-NLS-1$ + } + else if (ia instanceof TapeStep.Handle) { + partName = TrackerRes.getString("TapeMeasure.Handle.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("TapeMeasure.Handle.Hint"); //$NON-NLS-1$ + } + else if (ia == this) { + partName = TrackerRes.getString("TapeMeasure.Readout.Magnitude.Name"); //$NON-NLS-1$ + if (!isReadOnly()) + hint = TrackerRes.getString("CalibrationTapeMeasure.Readout.Magnitude.Hint"); //$NON-NLS-1$ + else + hint = TrackerRes.getString("TapeMeasure.Readout.Magnitude.Hint"); //$NON-NLS-1$ + trackerPanel.setMessage(getMessage()); + } + return ia; + } + return null; + } + + /** + * Refreshes the data. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (refreshDataLater || trackerPanel == null || data == null) return; + dataFrames.clear(); + // get the datasets + int count = 0; + Dataset length = data.getDataset(count++); + Dataset angle = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + // assign column names to the datasets + String time = "t"; //$NON-NLS-1$ + if (!length.getColumnName(0).equals(time)) { // not yet initialized + length.setXYColumnNames(time, "length"); //$NON-NLS-1$ + angle.setXYColumnNames(time, Tracker.THETA); + stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ + frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ + } + else for (int i = 0; i < count; i++) { + data.getDataset(i).clear(); + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < dataDescriptions.length; i++) { + dataDescriptions[i] = TrackerRes.getString("TapeMeasure.Data.Description."+i); //$NON-NLS-1$ + } + // look thru steps and get data for those included in clip + VideoPlayer player = trackerPanel.getPlayer(); + VideoClip clip = player.getVideoClip(); + int len = clip.getStepCount(); + double[][] validData = new double[data.getDatasets().size()+1][len]; + for (int n = 0; n < len; n++) { + int frame = clip.stepToFrame(n); + TapeStep next = (TapeStep)getStep(frame); + if (next==null) continue; + next.dataVisible = true; + // get the step number and time + double t = player.getStepTime(n)/1000.0; + validData[0][n] = t; + validData[1][n] = next.getTapeLength(true); + validData[2][n] = next.getTapeAngle(); + validData[3][n] = n; + validData[4][n] = frame; + dataFrames.add(frame); + } + // append the data to the data set + length.append(validData[0], validData[1]); + angle.append(validData[0], validData[2]); + stepNum.append(validData[0], validData[3]); + frameNum.append(validData[0], validData[4]); + } + + /** + * Remarks all steps on the specified panel. + * Overrides TTrack method. + * + * @param trackerPanel the tracker panel + */ + public void remark(TrackerPanel trackerPanel) { + super.remark(trackerPanel); + displayState(); + } + + /** + * Overrides Object toString method. + * + * @return the name of this track + */ + public String toString() { + return TrackerRes.getString("TapeMeasure.Name"); //$NON-NLS-1$ + } + +//__________________________ protected and private methods _______________________ + + /** + * Overrides TTrack setTrackerPanel method. + * + * @param panel the TrackerPanel + */ + protected void setTrackerPanel(TrackerPanel panel) { + if (trackerPanel != null) { + trackerPanel.removeMouseListener(editListener); + trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + super.setTrackerPanel(panel); + if (trackerPanel != null) { + trackerPanel.addMouseListener(editListener); +// trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + boolean canBeFixed = !isStickMode() || trackerPanel.getCoords().isFixedScale(); + setFixedPosition(isFixedPosition() && canBeFixed); + } + + /** + * Refreshes world lengths at all steps based on current ends and scale. + */ + protected void refreshWorldLengths() { + for (int i=0; i < getSteps().length; i++) { + TapeStep step = (TapeStep)getSteps()[i]; + if (step!=null) { + refreshStep(step); + step.worldLength = step.getTapeLength(true); + } + } + } + + /** + * Refreshes a step by setting it equal to the previous keyframe step. + * + * @param step the step to refresh + */ + protected void refreshStep(TapeStep step) { + if (step==null) return; + int positionKey = 0, lengthKey = 0; + for (int i: keyFrames) { + if (i<=step.n) + positionKey = i; + } + for (int i: lengthKeyFrames) { + if (i<=step.n) + lengthKey = i; + } + // compare step with keyStep + boolean different = false; + boolean changed = false; + // check position + TapeStep keyStep = (TapeStep)steps.getStep(isFixedPosition()? 0: positionKey); + different = keyStep.getEnd1().getX()!=step.getEnd1().getX() + || keyStep.getEnd1().getY()!=step.getEnd1().getY() + || keyStep.getEnd2().getX()!=step.getEnd2().getX() + || keyStep.getEnd2().getY()!=step.getEnd2().getY(); + if (different) { + step.getEnd1().setLocation(keyStep.getEnd1()); + step.getEnd2().setLocation(keyStep.getEnd2()); + changed = true; + } + + // check length only if in stick mode + if (isStickMode()) { + keyStep = (TapeStep)steps.getStep(isFixedLength()? 0: lengthKey); + different = keyStep.worldLength!=step.worldLength; + if (different) { + step.worldLength = keyStep.worldLength; + changed = true; + } + } + // erase step if changed + if (changed) { + step.erase(); + } + } + + /** + * Sets the editing flag. + * + * @param edit true to edit the scale + * @param target the tape step that handles the edit process + */ + private void setEditing(boolean edit, TapeStep target) { + editing = edit; + if ((readOnly || isStickMode()) && !editing) { + // if not fixed, add target frame to key frames + if (!isFixedPosition()) + keyFrames.add(target.n); + // replace target with key frame step + target = getKeyStep(target); + } + final TapeStep step = target; + Runnable runner = new Runnable() { + public void run() { + if (editing) { + trackerPanel.setSelectedTrack(TapeMeasure.this); + inputField.setForeground(footprint.getColor()); + Rectangle bounds = step.layoutBounds.get(trackerPanel); + bounds.grow(3, 3); + bounds.setLocation(bounds.x+1, bounds.y); + for (Component c: trackerPanel.getComponents()) { + if (c == trackerPanel.noData) { + bounds.setLocation(bounds.x, bounds.y-c.getHeight()); + } + } + inputField.setBounds(bounds); + glassPanel = trackerPanel.getGlassPanel(); + trackerPanel.remove(glassPanel); + trackerPanel.add(inputPanel, BorderLayout.CENTER); + Border space = BorderFactory.createEmptyBorder(0, 1, 1, 0); + Color color = getFootprint().getColor(); + Border line = BorderFactory.createLineBorder(color); + inputField.setBorder(BorderFactory.createCompoundBorder(line, space)); + inputField.setValue(step.getTapeLength(!isStickMode())); + trackerPanel.revalidate(); + trackerPanel.repaint(); + inputField.requestFocus(); + } + else { // end editing + step.drawLayoutBounds = false; + step.setTapeLength(inputField.getValue()); + inputField.setSigFigs(4); + trackerPanel.add(glassPanel, BorderLayout.CENTER); + trackerPanel.remove(inputPanel); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + trackerPanel.revalidate(); + trackerPanel.repaint(); + } + } + }; + EventQueue.invokeLater(runner); + } + + /** + * Returns the key step for a given step. The key step defines the positions of the tape ends. + * @param step the step + * @return the key step + */ + private TapeStep getKeyStep(TapeStep step) { + int key = 0; + if (!this.isFixedPosition()) { + for (int i: keyFrames) { + if (i<=step.n) + key = i; + } + } + return (TapeStep)getStep(key); + } + + /** + * Displays the world coordinates of the currently selected step. + */ + private void displayState() { + int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); + TapeStep step = (TapeStep)getStep(n); + if (step!=null) { + step.getTapeLength(!isStickMode()); + } + } + + /** + * Determines if the input fields are enabled. + * + * @return true if enabled + */ + protected boolean isFieldsEnabled() { + // false if this tape is locked + if (isLocked()) return false; + // false if this tape is for calibration and coords are locked + if (!isReadOnly() && trackerPanel!=null && trackerPanel.getCoords().isLocked()) return false; + // false if both ends are attached to point masses + int n = trackerPanel==null? 0: trackerPanel.getFrameNumber(); + TapeStep step = (TapeStep)getStep(n); + if (step!=null && step.end1.isAttached() && step.end2.isAttached()) return false; + return true; + } + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + XML.setLoader(FrameData.class, new FrameDataLoader()); + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + TapeMeasure tape = (TapeMeasure)obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed position and length + control.setValue("fixedtape", tape.isFixedPosition()); //$NON-NLS-1$ + control.setValue("fixedlength", tape.isFixedLength()); //$NON-NLS-1$ + // save readOnly + control.setValue("readonly", tape.isReadOnly()); //$NON-NLS-1$ + // save stick mode + control.setValue("stickmode", tape.isStickMode()); //$NON-NLS-1$ + // save step positions + Step[] steps = tape.getSteps(); + int count = tape.isFixedPosition()? 1: steps.length; + FrameData[] data = new FrameData[count]; + for (int n = 0; n < count; n++) { + // save only position key frames + if (steps[n] == null || !tape.keyFrames.contains(n)) continue; + data[n] = new FrameData((TapeStep)steps[n]); + } + control.setValue("framedata", data); //$NON-NLS-1$ + // save step world lengths + count = tape.isFixedLength()? 1: steps.length; + Double[] lengths = new Double[count]; + for (int n = 0; n < count; n++) { + // save only length key frames + if (steps[n] == null || !tape.lengthKeyFrames.contains(n)) continue; + lengths[n] = ((TapeStep)steps[n]).worldLength; + } + control.setValue("worldlengths", lengths); //$NON-NLS-1$ + } + + /** + * Creates a new object. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control){ + return new TapeMeasure(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + TapeMeasure tape = (TapeMeasure)obj; + tape.notYetShown = false; + boolean locked = tape.isLocked(); + tape.setLocked(false); + // load stickMode to set up footprint choices + tape.setStickMode(control.getBoolean("stickmode")); //$NON-NLS-1$ + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + // load position data + tape.keyFrames.clear(); + FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ + if (data!=null) { + for (int n = 0; n < data.length; n++) { + if (data[n] == null) continue; + tape.createStep(n, data[n].data[0], data[n].data[1], data[n].data[2], data[n].data[3]); + } + } + // load world lengths + tape.lengthKeyFrames.clear(); + Double[] lengths = (Double[])control.getObject("worldlengths"); //$NON-NLS-1$ + if (lengths!=null) { + for (int n = 0; n < lengths.length; n++) { + if (lengths[n] == null) continue; + TapeStep step = (TapeStep)tape.steps.getStep(n); + step.worldLength = lengths[n]; + tape.lengthKeyFrames.add(n); + } + } + // load fixed position + tape.fixedPosition = control.getBoolean("fixedtape"); //$NON-NLS-1$ + // load fixed length + if (control.getPropertyNames().contains("fixedlength")) //$NON-NLS-1$ + tape.fixedLength = control.getBoolean("fixedlength"); //$NON-NLS-1$ + // load readOnly + tape.setReadOnly(control.getBoolean("readonly")); //$NON-NLS-1$ + tape.setLocked(locked); + tape.displayState(); + return obj; + } + } + + /** + * Inner class containing the tape data for a single frame number. + * This is here only to read legacy xml files. + */ + private static class FrameData { + double[] data = new double[4]; + + FrameData() {} + FrameData(TapeStep step) { + data[0] = step.getEnd1().x; + data[1] = step.getEnd1().y; + data[2] = step.getEnd2().x; + data[3] = step.getEnd2().y; + } + } + + /** + * A class to save and load a FrameData. + */ + private static class FrameDataLoader + implements XML.ObjectLoader { + + public void saveObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + control.setValue("x1", data.data[0]); //$NON-NLS-1$ + control.setValue("y1", data.data[1]); //$NON-NLS-1$ + control.setValue("x2", data.data[2]); //$NON-NLS-1$ + control.setValue("y2", data.data[3]); //$NON-NLS-1$ + } + + public Object createObject(XMLControl control) { + return new FrameData(); + } + + public Object loadObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + if (control.getPropertyNames().contains("x1")) { //$NON-NLS-1$ + data.data[0] = control.getDouble("x1"); //$NON-NLS-1$ + data.data[1] = control.getDouble("y1"); //$NON-NLS-1$ + data.data[2] = control.getDouble("x2"); //$NON-NLS-1$ + data.data[3] = control.getDouble("y2"); //$NON-NLS-1$ + } + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java index e1cf9d99..cdf64bec 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java @@ -1,513 +1,513 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.AffineTransform; -import java.awt.image.BufferedImage; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; - -import javax.swing.*; -import javax.swing.border.*; -import javax.swing.filechooser.FileFilter; -import javax.swing.text.JTextComponent; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.media.core.VideoFileFilter; -import org.opensourcephysics.media.core.VideoIO; -import org.opensourcephysics.media.core.VideoType; -import org.opensourcephysics.tools.FontSizer; - -import java.io.File; - -/** - * A dialog for saving thumbnail images of a TrackerPanel. - * - * @author Douglas Brown - */ -public class ThumbnailDialog extends JDialog { - - protected static ThumbnailDialog thumbnailDialog; // singleton - protected static String[] viewNames = new String[] {"WholeFrame", "MainView", "VideoOnly"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - protected static String[] formatNames = new String[] {"png", "jpg"}; //$NON-NLS-1$ //$NON-NLS-2$ - protected static Dimension defaultSize = new Dimension(320, 240); - protected static VideoFileFilter[] fileFilters = new VideoFileFilter[formatNames.length]; - protected static PropertyChangeListener fileChooserListener; - protected static JTextComponent chooserField; - protected static boolean settingsOnly; - - // instance fields - protected TrackerPanel trackerPanel; - protected JButton saveAsButton, closeButton; - protected JComponent sizePanel, viewPanel, formatPanel; - protected JComboBox formatDropdown, viewDropdown, sizeDropdown; - protected DefaultComboBoxModel formatModel, viewModel; - protected AffineTransform transform = new AffineTransform(); - protected BufferedImage sizedImage; - protected HashMap sizes; - protected Dimension fullSize = new Dimension(), thumbSize; - protected boolean isRefreshing; - protected String savedFilePath; - protected JPanel buttonbar; - - /** - * Returns the singleton ThumbnailDialog for a specified TrackerPanel. - * - * @param panel the TrackerPanel - * @param withSaveButton true to include the "Save As" button - * @return the ThumbnailDialog - */ - public static ThumbnailDialog getDialog(TrackerPanel panel, boolean withSaveButton) { - // create singleton if it does not yet exist - if (thumbnailDialog==null) { - thumbnailDialog = new ThumbnailDialog(panel); - fileChooserListener = new PropertyChangeListener() { - public void propertyChange(PropertyChangeEvent e) { - if (chooserField!=null) { - VideoFileFilter filter = (VideoFileFilter)e.getNewValue(); - final String ext = filter.getDefaultExtension(); - Runnable runner = new Runnable() { - public void run() { - String name = XML.stripExtension(chooserField.getText())+"."+ext; //$NON-NLS-1$ - chooserField.setText(name); - } - }; - SwingUtilities.invokeLater(runner); - } - } - }; - // set up file filters - for (int i=0; i(); - sizePanel = Box.createVerticalBox(); - sizeDropdown = new JComboBox(); - sizePanel.add(sizeDropdown); - - // view panel - viewPanel = Box.createVerticalBox(); - viewModel = new DefaultComboBoxModel(); - viewDropdown = new JComboBox(viewModel); - viewPanel.add(viewDropdown); - viewDropdown.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if (e.getStateChange()==ItemEvent.SELECTED) { - if (!isRefreshing) - refreshSizeDropdown(); - } - } - }); - - // format panel - formatPanel = Box.createVerticalBox(); - formatModel = new DefaultComboBoxModel(); - formatDropdown = new JComboBox(formatModel); - formatPanel.add(formatDropdown); - - // assemble - settingsPanel.add(upper); - settingsPanel.add(lower); - upper.add(viewPanel); - lower.add(sizePanel); - lower.add(formatPanel); - - // buttons - saveAsButton = new JButton(); - saveAsButton.setForeground(new Color(0, 0, 102)); - saveAsButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - saveThumbnail(null); - } - }); - closeButton = new JButton(); - closeButton.setForeground(new Color(0, 0, 102)); - closeButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - firePropertyChange("accepted", null, null); //$NON-NLS-1$ - } - }); - // buttonbar - buttonbar = new JPanel(); - contentPane.add(buttonbar, BorderLayout.SOUTH); - buttonbar.add(saveAsButton); - buttonbar.add(closeButton); - } - - /** - * Refreshes the visible components of this dialog. - */ - protected void refreshGUI() { - // refresh strings - String resource = settingsOnly? "ThumbnailDialog.Settings.Title": "ThumbnailDialog.Title"; //$NON-NLS-1$ //$NON-NLS-2$ - String title = TrackerRes.getString(resource); - setTitle(title); - - // subpanel titled borders - title = TrackerRes.getString("ExportVideoDialog.Subtitle.Size"); //$NON-NLS-1$ - Border space = BorderFactory.createEmptyBorder(0, 4, 6, 4); - Border titled = BorderFactory.createTitledBorder(title); - int fontLevel = FontSizer.getLevel(); - FontSizer.setFonts(titled, fontLevel); - sizePanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - title = TrackerRes.getString("ThumbnailDialog.Subtitle.Image"); //$NON-NLS-1$ - titled = BorderFactory.createTitledBorder(title); - FontSizer.setFonts(titled, fontLevel); - viewPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - title = TrackerRes.getString("ExportVideoDialog.Subtitle.Format"); //$NON-NLS-1$ - titled = BorderFactory.createTitledBorder(title); - FontSizer.setFonts(titled, fontLevel); - formatPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); - - // buttons - saveAsButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ - if (settingsOnly) { - buttonbar.remove(saveAsButton); - closeButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - } - else { - buttonbar.add(saveAsButton, 0); - closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ - } - // dropdowns - isRefreshing = true; - int index = formatDropdown.getSelectedIndex(); - index = Math.max(index, 0); - formatModel.removeAllElements(); - for (int i=0; i< formatNames.length; i++) { - String format = TrackerRes.getString("ThumbnailDialog.Format."+formatNames[i].toUpperCase()); //$NON-NLS-1$ - formatModel.addElement(format); - } - formatDropdown.setSelectedIndex(index); - int lastIndex = trackerPanel.getVideo()==null? viewNames.length-2: viewNames.length-1; - index = Math.min(viewDropdown.getSelectedIndex(), lastIndex); - index = Math.max(index, 0); - viewModel.removeAllElements(); - for (int i=0; i<=lastIndex; i++) { - String view = TrackerRes.getString("ThumbnailDialog.View."+viewNames[i]); //$NON-NLS-1$ - viewModel.addElement(view); - } - viewDropdown.setSelectedIndex(index); - isRefreshing = false; - refreshSizeDropdown(); - - pack(); - } - - /** - * Refreshes the size dropdown. - */ - private void refreshSizeDropdown() { - isRefreshing = true; - Object selectedItem = sizeDropdown.getSelectedItem(); - sizeDropdown.removeAllItems(); - sizes.clear(); - switch(viewDropdown.getSelectedIndex()) { - case 1: // video and graphics - Rectangle bounds = trackerPanel.getMat().mat; - fullSize.setSize(bounds.getWidth(), bounds.getHeight()); - thumbSize = getFullThumbnailSize(fullSize); - break; - case 2: // video only - BufferedImage image = trackerPanel.getVideo().getImage(); - fullSize.setSize(image.getWidth(), image.getHeight()); - thumbSize = getFullThumbnailSize(fullSize); - break; - default: // entire frame - fullSize.setSize(trackerPanel.getTFrame().getSize()); - thumbSize = getFullThumbnailSize(fullSize); - } - // add full-size item - if (isAcceptedDimension(fullSize.width, fullSize.height)) { - String s = fullSize.width+"x"+fullSize.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, fullSize); - } - // add half-size item - Dimension dim = new Dimension(fullSize.width/2, fullSize.height/2); - if (dim.width>thumbSize.width && dim.height>thumbSize.height - && isAcceptedDimension(dim.width, dim.height)) { - String s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - // add "full-thumb-size" item and make it the default - String s = thumbSize.width+"x"+thumbSize.height; //$NON-NLS-1$ - Object defaultItem = s; - sizeDropdown.addItem(s); - sizes.put(s, thumbSize); - - // add additional sizes if acceptable - double[] factor = new double[] {0.75, 0.5, 0.375, 0.25}; - for (int i=0; i=80 || h>=60) return true; - return false; - } - - /** - * Gets an image of a specified size from the TrackerPanel. - * The view dropdown determines which component is rendered. - * - * @param size the size - * @return a BufferedImage - */ - private BufferedImage getThumbnailImage(Dimension size) { - BufferedImage rawImage; - switch(viewDropdown.getSelectedIndex()) { - case 1: // video and graphics - rawImage = trackerPanel.renderMat(); - break; - case 2: // video only - rawImage = trackerPanel.getVideo().getImage(); - break; - default: // entire frame - TFrame frame = trackerPanel.getTFrame(); - rawImage = (BufferedImage)frame.createImage(fullSize.width, fullSize.height); - Graphics2D g2 = rawImage.createGraphics(); - frame.paint(g2); - g2.dispose(); - } - return getResizedImage(rawImage, size); - } - - /** - * Resizes a source image and returns the resized image. - * - * @param source the source image - * @param size the desired size - * @return a BufferedImage - */ - private BufferedImage getResizedImage(BufferedImage source, Dimension size) { - if (size.width==source.getWidth() && size.height==source.getHeight()) - return source; - if (sizedImage==null - || sizedImage.getWidth()!=size.width - || sizedImage.getHeight()!=size.height) { - sizedImage = new BufferedImage(size.width, size.height, source.getType()); - } - Graphics2D g2 = sizedImage.createGraphics(); -// g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(source, 0, 0, size.width, size.height, - 0, 0, source.getWidth(), source.getHeight(), null); - g2.dispose(); - return sizedImage; - } - - private static JTextComponent getTextComponent(Container c, String toMatch) { - Component[] comps = c.getComponents(); - for(int i = 0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +import javax.swing.*; +import javax.swing.border.*; +import javax.swing.filechooser.FileFilter; +import javax.swing.text.JTextComponent; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.media.core.VideoFileFilter; +import org.opensourcephysics.media.core.VideoIO; +import org.opensourcephysics.media.core.VideoType; +import org.opensourcephysics.tools.FontSizer; + +import java.io.File; + +/** + * A dialog for saving thumbnail images of a TrackerPanel. + * + * @author Douglas Brown + */ +public class ThumbnailDialog extends JDialog { + + protected static ThumbnailDialog thumbnailDialog; // singleton + protected static String[] viewNames = new String[] {"WholeFrame", "MainView", "VideoOnly"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + protected static String[] formatNames = new String[] {"png", "jpg"}; //$NON-NLS-1$ //$NON-NLS-2$ + protected static Dimension defaultSize = new Dimension(320, 240); + protected static VideoFileFilter[] fileFilters = new VideoFileFilter[formatNames.length]; + protected static PropertyChangeListener fileChooserListener; + protected static JTextComponent chooserField; + protected static boolean settingsOnly; + + // instance fields + protected TrackerPanel trackerPanel; + protected JButton saveAsButton, closeButton; + protected JComponent sizePanel, viewPanel, formatPanel; + protected JComboBox formatDropdown, viewDropdown, sizeDropdown; + protected DefaultComboBoxModel formatModel, viewModel; + protected AffineTransform transform = new AffineTransform(); + protected BufferedImage sizedImage; + protected HashMap sizes; + protected Dimension fullSize = new Dimension(), thumbSize; + protected boolean isRefreshing; + protected String savedFilePath; + protected JPanel buttonbar; + + /** + * Returns the singleton ThumbnailDialog for a specified TrackerPanel. + * + * @param panel the TrackerPanel + * @param withSaveButton true to include the "Save As" button + * @return the ThumbnailDialog + */ + public static ThumbnailDialog getDialog(TrackerPanel panel, boolean withSaveButton) { + // create singleton if it does not yet exist + if (thumbnailDialog==null) { + thumbnailDialog = new ThumbnailDialog(panel); + fileChooserListener = new PropertyChangeListener() { + public void propertyChange(PropertyChangeEvent e) { + if (chooserField!=null) { + VideoFileFilter filter = (VideoFileFilter)e.getNewValue(); + final String ext = filter.getDefaultExtension(); + Runnable runner = new Runnable() { + public void run() { + String name = XML.stripExtension(chooserField.getText())+"."+ext; //$NON-NLS-1$ + chooserField.setText(name); + } + }; + SwingUtilities.invokeLater(runner); + } + } + }; + // set up file filters + for (int i=0; i(); + sizePanel = Box.createVerticalBox(); + sizeDropdown = new JComboBox(); + sizePanel.add(sizeDropdown); + + // view panel + viewPanel = Box.createVerticalBox(); + viewModel = new DefaultComboBoxModel(); + viewDropdown = new JComboBox(viewModel); + viewPanel.add(viewDropdown); + viewDropdown.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + if (e.getStateChange()==ItemEvent.SELECTED) { + if (!isRefreshing) + refreshSizeDropdown(); + } + } + }); + + // format panel + formatPanel = Box.createVerticalBox(); + formatModel = new DefaultComboBoxModel(); + formatDropdown = new JComboBox(formatModel); + formatPanel.add(formatDropdown); + + // assemble + settingsPanel.add(upper); + settingsPanel.add(lower); + upper.add(viewPanel); + lower.add(sizePanel); + lower.add(formatPanel); + + // buttons + saveAsButton = new JButton(); + saveAsButton.setForeground(new Color(0, 0, 102)); + saveAsButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + saveThumbnail(null); + } + }); + closeButton = new JButton(); + closeButton.setForeground(new Color(0, 0, 102)); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + firePropertyChange("accepted", null, null); //$NON-NLS-1$ + } + }); + // buttonbar + buttonbar = new JPanel(); + contentPane.add(buttonbar, BorderLayout.SOUTH); + buttonbar.add(saveAsButton); + buttonbar.add(closeButton); + } + + /** + * Refreshes the visible components of this dialog. + */ + protected void refreshGUI() { + // refresh strings + String resource = settingsOnly? "ThumbnailDialog.Settings.Title": "ThumbnailDialog.Title"; //$NON-NLS-1$ //$NON-NLS-2$ + String title = TrackerRes.getString(resource); + setTitle(title); + + // subpanel titled borders + title = TrackerRes.getString("ExportVideoDialog.Subtitle.Size"); //$NON-NLS-1$ + Border space = BorderFactory.createEmptyBorder(0, 4, 6, 4); + Border titled = BorderFactory.createTitledBorder(title); + int fontLevel = FontSizer.getLevel(); + FontSizer.setFonts(titled, fontLevel); + sizePanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + title = TrackerRes.getString("ThumbnailDialog.Subtitle.Image"); //$NON-NLS-1$ + titled = BorderFactory.createTitledBorder(title); + FontSizer.setFonts(titled, fontLevel); + viewPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + title = TrackerRes.getString("ExportVideoDialog.Subtitle.Format"); //$NON-NLS-1$ + titled = BorderFactory.createTitledBorder(title); + FontSizer.setFonts(titled, fontLevel); + formatPanel.setBorder(BorderFactory.createCompoundBorder(titled, space)); + + // buttons + saveAsButton.setText(TrackerRes.getString("ExportVideoDialog.Button.SaveAs")); //$NON-NLS-1$ + if (settingsOnly) { + buttonbar.remove(saveAsButton); + closeButton.setText(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + } + else { + buttonbar.add(saveAsButton, 0); + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + } + // dropdowns + isRefreshing = true; + int index = formatDropdown.getSelectedIndex(); + index = Math.max(index, 0); + formatModel.removeAllElements(); + for (int i=0; i< formatNames.length; i++) { + String format = TrackerRes.getString("ThumbnailDialog.Format."+formatNames[i].toUpperCase()); //$NON-NLS-1$ + formatModel.addElement(format); + } + formatDropdown.setSelectedIndex(index); + int lastIndex = trackerPanel.getVideo()==null? viewNames.length-2: viewNames.length-1; + index = Math.min(viewDropdown.getSelectedIndex(), lastIndex); + index = Math.max(index, 0); + viewModel.removeAllElements(); + for (int i=0; i<=lastIndex; i++) { + String view = TrackerRes.getString("ThumbnailDialog.View."+viewNames[i]); //$NON-NLS-1$ + viewModel.addElement(view); + } + viewDropdown.setSelectedIndex(index); + isRefreshing = false; + refreshSizeDropdown(); + + pack(); + } + + /** + * Refreshes the size dropdown. + */ + private void refreshSizeDropdown() { + isRefreshing = true; + Object selectedItem = sizeDropdown.getSelectedItem(); + sizeDropdown.removeAllItems(); + sizes.clear(); + switch(viewDropdown.getSelectedIndex()) { + case 1: // video and graphics + Rectangle bounds = trackerPanel.getMat().mat; + fullSize.setSize(bounds.getWidth(), bounds.getHeight()); + thumbSize = getFullThumbnailSize(fullSize); + break; + case 2: // video only + BufferedImage image = trackerPanel.getVideo().getImage(); + fullSize.setSize(image.getWidth(), image.getHeight()); + thumbSize = getFullThumbnailSize(fullSize); + break; + default: // entire frame + fullSize.setSize(trackerPanel.getTFrame().getSize()); + thumbSize = getFullThumbnailSize(fullSize); + } + // add full-size item + if (isAcceptedDimension(fullSize.width, fullSize.height)) { + String s = fullSize.width+"x"+fullSize.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, fullSize); + } + // add half-size item + Dimension dim = new Dimension(fullSize.width/2, fullSize.height/2); + if (dim.width>thumbSize.width && dim.height>thumbSize.height + && isAcceptedDimension(dim.width, dim.height)) { + String s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + // add "full-thumb-size" item and make it the default + String s = thumbSize.width+"x"+thumbSize.height; //$NON-NLS-1$ + Object defaultItem = s; + sizeDropdown.addItem(s); + sizes.put(s, thumbSize); + + // add additional sizes if acceptable + double[] factor = new double[] {0.75, 0.5, 0.375, 0.25}; + for (int i=0; i=80 || h>=60) return true; + return false; + } + + /** + * Gets an image of a specified size from the TrackerPanel. + * The view dropdown determines which component is rendered. + * + * @param size the size + * @return a BufferedImage + */ + private BufferedImage getThumbnailImage(Dimension size) { + BufferedImage rawImage; + switch(viewDropdown.getSelectedIndex()) { + case 1: // video and graphics + rawImage = trackerPanel.renderMat(); + break; + case 2: // video only + rawImage = trackerPanel.getVideo().getImage(); + break; + default: // entire frame + TFrame frame = trackerPanel.getTFrame(); + rawImage = (BufferedImage)frame.createImage(fullSize.width, fullSize.height); + Graphics2D g2 = rawImage.createGraphics(); + frame.paint(g2); + g2.dispose(); + } + return getResizedImage(rawImage, size); + } + + /** + * Resizes a source image and returns the resized image. + * + * @param source the source image + * @param size the desired size + * @return a BufferedImage + */ + private BufferedImage getResizedImage(BufferedImage source, Dimension size) { + if (size.width==source.getWidth() && size.height==source.getHeight()) + return source; + if (sizedImage==null + || sizedImage.getWidth()!=size.width + || sizedImage.getHeight()!=size.height) { + sizedImage = new BufferedImage(size.width, size.height, source.getType()); + } + Graphics2D g2 = sizedImage.createGraphics(); +// g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); + g2.drawImage(source, 0, 0, size.width, size.height, + 0, 0, source.getWidth(), source.getHeight(), null); + g2.dispose(); + return sizedImage; + } + + private static JTextComponent getTextComponent(Container c, String toMatch) { + Component[] comps = c.getComponents(); + for(int i = 0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; - -import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.media.core.ImageCoordSystem; -import org.opensourcephysics.tools.FontSizer; - -/** - * This displays track views selected from a dropdown list. This is an abstract - * class and cannot be instantiated directly. - * - * @author Douglas Brown - */ -public abstract class TrackChooserTView extends JPanel implements TView { - - // instance fields - protected TrackerPanel trackerPanel; - protected Map trackViews = new HashMap(); // maps track to its trackView - protected Map tracks = new HashMap(); // maps dropdown items to track - protected JComboBox dropdown; - protected ArrayList toolbarComponents = new ArrayList(); - protected boolean refreshing; - protected TTrack selectedTrack; - protected JPanel noData; - protected JLabel noDataLabel; - - /** - * Constructs a TrackChooserView for the specified tracker panel. - * - * @param panel the tracker panel - */ - protected TrackChooserTView(TrackerPanel panel) { - super(new CardLayout()); - trackerPanel = panel; - init(); - setBackground(panel.getBackground()); - // create combobox with custom renderer for tracks - dropdown = new JComboBox() { - // override getMaximumSize method so has same height as chooser button - public Dimension getMaximumSize() { - Dimension dim = super.getMaximumSize(); - Dimension preferred = getPreferredSize(); - dim.width = preferred.width; - Dimension min = getMinimumSize(); - Container c = getParent().getParent(); - if (c instanceof TViewChooser) { - int h = ((TViewChooser)c).chooserButton.getHeight(); - dim.height = Math.max(h, min.height); - } - return dim; - } - }; - dropdown.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 1)); - toolbarComponents.add(dropdown); - // custom cell renderer for dropdown items - TrackRenderer renderer= new TrackRenderer(); - dropdown.setRenderer(renderer); - // add ActionListener to select a track and display its trackview - dropdown.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (refreshing) return; - // show the trackView for the selected track - Object item = dropdown.getSelectedItem(); - TTrack track = tracks.get(item); -// if (track==selectedTrack) return; - String name = (String)((Object[])item)[1]; - if (track != null) { - trackerPanel.changed = true; - TrackView trackView = getTrackView(track); - // remove step propertyChangeListener from prev selected track - TTrack prevTrack = selectedTrack; - TrackView prevView = null; - if (prevTrack != null) { - prevView = getTrackView(prevTrack); - prevTrack.removePropertyChangeListener("step", prevView); //$NON-NLS-1$ - prevTrack.removePropertyChangeListener("steps", prevView); //$NON-NLS-1$ - if (prevView instanceof PlotTrackView) { - PlotTrackView plotView = (PlotTrackView)prevView; - TrackPlottingPanel plot = plotView.plots[0]; - for (TTrack guest: plot.guests) { - guest.removePropertyChangeListener("step", prevView); //$NON-NLS-1$ - guest.removePropertyChangeListener("steps", prevView); //$NON-NLS-1$ - } - } - } - // add step propertyChangeListener to new track - track.addPropertyChangeListener("step", trackView); //$NON-NLS-1$ - track.addPropertyChangeListener("steps", trackView); //$NON-NLS-1$ - if (trackView instanceof PlotTrackView) { - PlotTrackView plotView = (PlotTrackView)trackView; - TrackPlottingPanel plot = plotView.plots[0]; - for (TTrack guest: plot.guests) { - guest.addPropertyChangeListener("step", trackView); //$NON-NLS-1$ - guest.addPropertyChangeListener("steps", trackView); //$NON-NLS-1$ - } - } - selectedTrack = track; - Step step = trackerPanel.getSelectedStep(); - if (step != null && step.getTrack() == track) - trackView.refresh(step.getFrameNumber()); - else - trackView.refresh(trackerPanel.getFrameNumber()); - CardLayout layout = (CardLayout)getLayout(); - layout.show(TrackChooserTView.this, name); - repaint(); - firePropertyChange("trackview", trackView, prevView); //$NON-NLS-1$ - // inform track views - PropertyChangeEvent event = - new PropertyChangeEvent(this, "track", null, track); //$NON-NLS-1$ - Iterator it = trackViews.keySet().iterator(); - while (it.hasNext()) { - TTrack nextTrack = it.next(); - TrackView next = trackViews.get(nextTrack); - next.propertyChange(event); - } - } - } - }); - // create the noData panel - noData = new JPanel(); - noDataLabel = new JLabel(); - Font font = new JTextField().getFont(); - noDataLabel.setFont(font); - noData.add(noDataLabel); - noData.setBackground(getBackground()); - noData.addMouseListener(new MouseAdapter() { - public void mousePressed(MouseEvent e) { - if (OSPRuntime.isPopupTrigger(e)) { - JPopupMenu popup = new JPopupMenu(); - JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ - helpItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - if (TrackChooserTView.this instanceof TableTView) { - trackerPanel.getTFrame().showHelp("datatable", 0); //$NON-NLS-1$ - } - else { - trackerPanel.getTFrame().showHelp("plot", 0); //$NON-NLS-1$ - } - } - }); - popup.add(helpItem); - FontSizer.setFonts(popup, FontSizer.getLevel()); - popup.show(noData, e.getX(), e.getY()); - } - } - }); - } - - /** - * Refreshes the dropdown list and track views. - */ - public void refresh() { - Tracker.logTime(getClass().getSimpleName()+hashCode()+" refresh"); //$NON-NLS-1$ - refreshing = true; - // get previously selected track - TTrack selectedTrack = getSelectedTrack(); - TTrack defaultTrack = null; - // get views and rebuild for all tracks on trackerPanel - Map newViews = new HashMap(); - removeAll(); // removes views from card layout - tracks.clear(); - dropdown.removeAllItems(); - for (TTrack track: trackerPanel.getTracks()) { - // include only viewable tracks - if (!track.isViewable()) continue; - if (defaultTrack == null) { - defaultTrack = track; - } - TrackView trackView = getTrackView(track); - if (trackView == null) trackView = createTrackView(track); - trackView.refreshGUI(); - newViews.put(track, trackView); - Object item = new Object[] {trackView.getIcon(), track.getName()}; - dropdown.addItem(item); - add(trackView, track.getName()); - tracks.put(item, track); - } - validate(); - trackViews = newViews; - // select previously selected track, if any - refreshing = false; - if (selectedTrack != null && getTrackView(selectedTrack) != null) { - setSelectedTrack(selectedTrack); - } - else setSelectedTrack(defaultTrack); - dropdown.setToolTipText(TrackerRes.getString("TrackChooserTView.DropDown.Tooltip")); //$NON-NLS-1$ - } - - /** - * Refreshes the configuration. - */ - protected void refreshMenus() { - } - - /** - * Initializes this view - */ - public void init() { - cleanup(); - // add this listener to tracker panel - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("transform", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("image", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("data", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("radian_angles", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("function", this); //$NON-NLS-1$ - // add this listener to tracks - for (TTrack track: trackerPanel.getTracks()) { - track.addPropertyChangeListener("name", this); //$NON-NLS-1$ - track.addPropertyChangeListener("color", this); //$NON-NLS-1$ - track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.addPropertyChangeListener("data", this); //$NON-NLS-1$ - } - } - - /** - * Cleans up this view - */ - public void cleanup() { - // remove this listener from tracker panel - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("transform", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("image", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("data", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("radian_angles", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("function", this); //$NON-NLS-1$ - // remove this listener from tracks - for (TTrack track: trackerPanel.getTracks()) { - track.removePropertyChangeListener("name", this); //$NON-NLS-1$ - track.removePropertyChangeListener("color", this); //$NON-NLS-1$ - track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.removePropertyChangeListener("data", this); //$NON-NLS-1$ - } - } - - /** - * Gets the tracker panel containing the tracks - * - * @return the tracker panel - */ - public TrackerPanel getTrackerPanel() { - return trackerPanel; - } - - /** - * Gets the selected track - * - * @return the track - */ - public TTrack getSelectedTrack() { - return selectedTrack; - } - - /** - * Sets the selected track - * - * @param track the track to be selected - */ - public void setSelectedTrack(TTrack track) { - if (track == null) { - add(noData, "noData"); //$NON-NLS-1$ - selectedTrack = null; - return; - } - if (!track.isViewable() || !trackerPanel.containsTrack(track)) return; - if (track==selectedTrack - && tracks.get(dropdown.getSelectedItem())==track) return; - Iterator it = tracks.keySet().iterator(); - while (it.hasNext()) { - Object item = it.next(); - if (tracks.get(item) == track) { - // be sure listeners are registered once only - track.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - track.removePropertyChangeListener("image", this); //$NON-NLS-1$ - track.removePropertyChangeListener("name", this); //$NON-NLS-1$ - track.removePropertyChangeListener("color", this); //$NON-NLS-1$ - track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.removePropertyChangeListener("data", this); //$NON-NLS-1$ - track.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - track.addPropertyChangeListener("image", this); //$NON-NLS-1$ - track.addPropertyChangeListener("name", this); //$NON-NLS-1$ - track.addPropertyChangeListener("color", this); //$NON-NLS-1$ - track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.addPropertyChangeListener("data", this); //$NON-NLS-1$ - // select the track dropdown item - dropdown.setSelectedItem(item); - break; - } - } - } - - /** - * Gets the track view for the specified track - * - * @param track the track to be viewed - * @return the track view - */ - public TrackView getTrackView(TTrack track) { - return trackViews.get(track); - } - - /** - * Gets the name of the view - * - * @return the name of this view - */ - public abstract String getViewName(); - - /** - * Gets the toolbar components - * - * @return an ArrayList of components to be added to a toolbar - */ - public ArrayList getToolBarComponents() { - toolbarComponents.clear(); - TrackView trackView = getTrackView(getSelectedTrack()); - if (trackView != null) { - toolbarComponents.add(trackView.getViewButton()); - } - if (dropdown.getItemCount() > 0) { - toolbarComponents.add(dropdown); - } - if (trackView != null) { - toolbarComponents.addAll(trackView.getToolBarComponents()); - } - return toolbarComponents; - } - - /** - * Returns true if this view is in a custom state. - * - * @return true if in a custom state, false if in the default state - */ - public boolean isCustomState() { - if (tracks.size()>1) { - // custom state if selected track is not the first in trackerPanel - for (TTrack track: trackerPanel.getUserTracks()) { - if (!track.isViewable()) continue; - if (track!=selectedTrack) return true; - break; - } - } - for (Iterator it = trackViews.keySet().iterator(); it.hasNext();) { - TrackView view = trackViews.get(it.next()); - if (view.isCustomState()) return true; - } - return false; - } - - /** - * Responds to property change events. This receives the following - * events: "track", "transform" from trackerPanel; "name", "color", footprint" - * and "data" from selected track. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ - TTrack track = (TTrack)e.getOldValue(); - if (track != null) { - track.removePropertyChangeListener("name", this); //$NON-NLS-1$ - track.removePropertyChangeListener("color", this); //$NON-NLS-1$ - track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.removePropertyChangeListener("data", this); //$NON-NLS-1$ - TrackView view = trackViews.get(track); - if (view != null) view.dispose(); - } - refresh(); - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) frame.repaint(); - // select a newly added track - track = (TTrack)e.getNewValue(); - if (track != null) setSelectedTrack(track); - } - else if (name.equals("transform")) { // coords have changed //$NON-NLS-1$ - TTrack track = getSelectedTrack(); - if (track != null && getTrackView(track) != null) { - // if track is a particle model, ignore if coords are adjusting - if (track instanceof ParticleModel) { - ImageCoordSystem coords = trackerPanel.getCoords(); - if (coords.isAdjusting()) return; - } - TrackView trackView = getTrackView(track); - trackView.refresh(trackerPanel.getFrameNumber()); - } - } - else if (name.equals("data")) { // data has changed //$NON-NLS-1$ - TTrack track = getSelectedTrack(); - if (track != null && getTrackView(track) != null) { - TrackView trackView = getTrackView(track); - trackView.refresh(trackerPanel.getFrameNumber()); - } - } - else if (name.equals("function") // DataFunction has changed //$NON-NLS-1$ - || name.equals("radian_angles")) { // angle units have changed //$NON-NLS-1$ - // refresh views of all tracks - for (TTrack track: trackerPanel.getTracks()) { - if (getTrackView(track) != null) { - TrackView trackView = getTrackView(track); - trackView.refreshGUI(); - trackView.refresh(trackerPanel.getFrameNumber()); - } - } - } - else if (name.equals("stepnumber") || //$NON-NLS-1$ - name.equals("image")) { // video image has changed //$NON-NLS-1$ - TTrack track = getSelectedTrack(); - if (track != null && getTrackView(track) != null) { - TrackView trackView = getTrackView(track); - trackView.refresh(trackerPanel.getFrameNumber()); - } - } - else if (name.equals("color") || //$NON-NLS-1$ - name.equals("name") || //$NON-NLS-1$ - name.equals("footprint")) { //$NON-NLS-1$ - // track property has changed - refresh(); - } - } - - /** - * Creates a view for the specified track - * - * @param track the track to be viewed - * @return the track view - */ - protected abstract TrackView createTrackView(TTrack track); - - /** - * Gets a track with the specified name - * - * @param name the name of the track - * @return the track - */ - protected TTrack getTrack(String name) { - for (TTrack track: trackerPanel.getTracks()) { - if (track.getName().equals(name)) return track; - } - return null; - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; + +import org.opensourcephysics.display.OSPRuntime; +import org.opensourcephysics.media.core.ImageCoordSystem; +import org.opensourcephysics.tools.FontSizer; + +/** + * This displays track views selected from a dropdown list. This is an abstract + * class and cannot be instantiated directly. + * + * @author Douglas Brown + */ +public abstract class TrackChooserTView extends JPanel implements TView { + + // instance fields + protected TrackerPanel trackerPanel; + protected Map trackViews = new HashMap(); // maps track to its trackView + protected Map tracks = new HashMap(); // maps dropdown items to track + protected JComboBox dropdown; + protected ArrayList toolbarComponents = new ArrayList(); + protected boolean refreshing; + protected TTrack selectedTrack; + protected JPanel noData; + protected JLabel noDataLabel; + + /** + * Constructs a TrackChooserView for the specified tracker panel. + * + * @param panel the tracker panel + */ + protected TrackChooserTView(TrackerPanel panel) { + super(new CardLayout()); + trackerPanel = panel; + init(); + setBackground(panel.getBackground()); + // create combobox with custom renderer for tracks + dropdown = new JComboBox() { + // override getMaximumSize method so has same height as chooser button + public Dimension getMaximumSize() { + Dimension dim = super.getMaximumSize(); + Dimension preferred = getPreferredSize(); + dim.width = preferred.width; + Dimension min = getMinimumSize(); + Container c = getParent().getParent(); + if (c instanceof TViewChooser) { + int h = ((TViewChooser)c).chooserButton.getHeight(); + dim.height = Math.max(h, min.height); + } + return dim; + } + }; + dropdown.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 1)); + toolbarComponents.add(dropdown); + // custom cell renderer for dropdown items + TrackRenderer renderer= new TrackRenderer(); + dropdown.setRenderer(renderer); + // add ActionListener to select a track and display its trackview + dropdown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (refreshing) return; + // show the trackView for the selected track + Object item = dropdown.getSelectedItem(); + TTrack track = tracks.get(item); +// if (track==selectedTrack) return; + String name = (String)((Object[])item)[1]; + if (track != null) { + trackerPanel.changed = true; + TrackView trackView = getTrackView(track); + // remove step propertyChangeListener from prev selected track + TTrack prevTrack = selectedTrack; + TrackView prevView = null; + if (prevTrack != null) { + prevView = getTrackView(prevTrack); + prevTrack.removePropertyChangeListener("step", prevView); //$NON-NLS-1$ + prevTrack.removePropertyChangeListener("steps", prevView); //$NON-NLS-1$ + if (prevView instanceof PlotTrackView) { + PlotTrackView plotView = (PlotTrackView)prevView; + TrackPlottingPanel plot = plotView.plots[0]; + for (TTrack guest: plot.guests) { + guest.removePropertyChangeListener("step", prevView); //$NON-NLS-1$ + guest.removePropertyChangeListener("steps", prevView); //$NON-NLS-1$ + } + } + } + // add step propertyChangeListener to new track + track.addPropertyChangeListener("step", trackView); //$NON-NLS-1$ + track.addPropertyChangeListener("steps", trackView); //$NON-NLS-1$ + if (trackView instanceof PlotTrackView) { + PlotTrackView plotView = (PlotTrackView)trackView; + TrackPlottingPanel plot = plotView.plots[0]; + for (TTrack guest: plot.guests) { + guest.addPropertyChangeListener("step", trackView); //$NON-NLS-1$ + guest.addPropertyChangeListener("steps", trackView); //$NON-NLS-1$ + } + } + selectedTrack = track; + Step step = trackerPanel.getSelectedStep(); + if (step != null && step.getTrack() == track) + trackView.refresh(step.getFrameNumber()); + else + trackView.refresh(trackerPanel.getFrameNumber()); + CardLayout layout = (CardLayout)getLayout(); + layout.show(TrackChooserTView.this, name); + repaint(); + firePropertyChange("trackview", trackView, prevView); //$NON-NLS-1$ + // inform track views + PropertyChangeEvent event = + new PropertyChangeEvent(this, "track", null, track); //$NON-NLS-1$ + Iterator it = trackViews.keySet().iterator(); + while (it.hasNext()) { + TTrack nextTrack = it.next(); + TrackView next = trackViews.get(nextTrack); + next.propertyChange(event); + } + } + } + }); + // create the noData panel + noData = new JPanel(); + noDataLabel = new JLabel(); + Font font = new JTextField().getFont(); + noDataLabel.setFont(font); + noData.add(noDataLabel); + noData.setBackground(getBackground()); + noData.addMouseListener(new MouseAdapter() { + public void mousePressed(MouseEvent e) { + if (OSPRuntime.isPopupTrigger(e)) { + JPopupMenu popup = new JPopupMenu(); + JMenuItem helpItem = new JMenuItem(TrackerRes.getString("Dialog.Button.Help")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ + helpItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (TrackChooserTView.this instanceof TableTView) { + trackerPanel.getTFrame().showHelp("datatable", 0); //$NON-NLS-1$ + } + else { + trackerPanel.getTFrame().showHelp("plot", 0); //$NON-NLS-1$ + } + } + }); + popup.add(helpItem); + FontSizer.setFonts(popup, FontSizer.getLevel()); + popup.show(noData, e.getX(), e.getY()); + } + } + }); + } + + /** + * Refreshes the dropdown list and track views. + */ + public void refresh() { + Tracker.logTime(getClass().getSimpleName()+hashCode()+" refresh"); //$NON-NLS-1$ + refreshing = true; + // get previously selected track + TTrack selectedTrack = getSelectedTrack(); + TTrack defaultTrack = null; + // get views and rebuild for all tracks on trackerPanel + Map newViews = new HashMap(); + removeAll(); // removes views from card layout + tracks.clear(); + dropdown.removeAllItems(); + for (TTrack track: trackerPanel.getTracks()) { + // include only viewable tracks + if (!track.isViewable()) continue; + if (defaultTrack == null) { + defaultTrack = track; + } + TrackView trackView = getTrackView(track); + if (trackView == null) trackView = createTrackView(track); + trackView.refreshGUI(); + newViews.put(track, trackView); + Object item = new Object[] {trackView.getIcon(), track.getName()}; + dropdown.addItem(item); + add(trackView, track.getName()); + tracks.put(item, track); + } + validate(); + trackViews = newViews; + // select previously selected track, if any + refreshing = false; + if (selectedTrack != null && getTrackView(selectedTrack) != null) { + setSelectedTrack(selectedTrack); + } + else setSelectedTrack(defaultTrack); + dropdown.setToolTipText(TrackerRes.getString("TrackChooserTView.DropDown.Tooltip")); //$NON-NLS-1$ + } + + /** + * Refreshes the configuration. + */ + protected void refreshMenus() { + } + + /** + * Initializes this view + */ + public void init() { + cleanup(); + // add this listener to tracker panel + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("transform", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("image", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("data", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("radian_angles", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("function", this); //$NON-NLS-1$ + // add this listener to tracks + for (TTrack track: trackerPanel.getTracks()) { + track.addPropertyChangeListener("name", this); //$NON-NLS-1$ + track.addPropertyChangeListener("color", this); //$NON-NLS-1$ + track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.addPropertyChangeListener("data", this); //$NON-NLS-1$ + } + } + + /** + * Cleans up this view + */ + public void cleanup() { + // remove this listener from tracker panel + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("transform", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("image", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("data", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("radian_angles", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("function", this); //$NON-NLS-1$ + // remove this listener from tracks + for (TTrack track: trackerPanel.getTracks()) { + track.removePropertyChangeListener("name", this); //$NON-NLS-1$ + track.removePropertyChangeListener("color", this); //$NON-NLS-1$ + track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.removePropertyChangeListener("data", this); //$NON-NLS-1$ + } + } + + /** + * Gets the tracker panel containing the tracks + * + * @return the tracker panel + */ + public TrackerPanel getTrackerPanel() { + return trackerPanel; + } + + /** + * Gets the selected track + * + * @return the track + */ + public TTrack getSelectedTrack() { + return selectedTrack; + } + + /** + * Sets the selected track + * + * @param track the track to be selected + */ + public void setSelectedTrack(TTrack track) { + if (track == null) { + add(noData, "noData"); //$NON-NLS-1$ + selectedTrack = null; + return; + } + if (!track.isViewable() || !trackerPanel.containsTrack(track)) return; + if (track==selectedTrack + && tracks.get(dropdown.getSelectedItem())==track) return; + Iterator it = tracks.keySet().iterator(); + while (it.hasNext()) { + Object item = it.next(); + if (tracks.get(item) == track) { + // be sure listeners are registered once only + track.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + track.removePropertyChangeListener("image", this); //$NON-NLS-1$ + track.removePropertyChangeListener("name", this); //$NON-NLS-1$ + track.removePropertyChangeListener("color", this); //$NON-NLS-1$ + track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.removePropertyChangeListener("data", this); //$NON-NLS-1$ + track.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + track.addPropertyChangeListener("image", this); //$NON-NLS-1$ + track.addPropertyChangeListener("name", this); //$NON-NLS-1$ + track.addPropertyChangeListener("color", this); //$NON-NLS-1$ + track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.addPropertyChangeListener("data", this); //$NON-NLS-1$ + // select the track dropdown item + dropdown.setSelectedItem(item); + break; + } + } + } + + /** + * Gets the track view for the specified track + * + * @param track the track to be viewed + * @return the track view + */ + public TrackView getTrackView(TTrack track) { + return trackViews.get(track); + } + + /** + * Gets the name of the view + * + * @return the name of this view + */ + public abstract String getViewName(); + + /** + * Gets the toolbar components + * + * @return an ArrayList of components to be added to a toolbar + */ + public ArrayList getToolBarComponents() { + toolbarComponents.clear(); + TrackView trackView = getTrackView(getSelectedTrack()); + if (trackView != null) { + toolbarComponents.add(trackView.getViewButton()); + } + if (dropdown.getItemCount() > 0) { + toolbarComponents.add(dropdown); + } + if (trackView != null) { + toolbarComponents.addAll(trackView.getToolBarComponents()); + } + return toolbarComponents; + } + + /** + * Returns true if this view is in a custom state. + * + * @return true if in a custom state, false if in the default state + */ + public boolean isCustomState() { + if (tracks.size()>1) { + // custom state if selected track is not the first in trackerPanel + for (TTrack track: trackerPanel.getUserTracks()) { + if (!track.isViewable()) continue; + if (track!=selectedTrack) return true; + break; + } + } + for (Iterator it = trackViews.keySet().iterator(); it.hasNext();) { + TrackView view = trackViews.get(it.next()); + if (view.isCustomState()) return true; + } + return false; + } + + /** + * Responds to property change events. This receives the following + * events: "track", "transform" from trackerPanel; "name", "color", footprint" + * and "data" from selected track. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("track")) { // track has been added or removed //$NON-NLS-1$ + TTrack track = (TTrack)e.getOldValue(); + if (track != null) { + track.removePropertyChangeListener("name", this); //$NON-NLS-1$ + track.removePropertyChangeListener("color", this); //$NON-NLS-1$ + track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.removePropertyChangeListener("data", this); //$NON-NLS-1$ + TrackView view = trackViews.get(track); + if (view != null) view.dispose(); + } + refresh(); + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) frame.repaint(); + // select a newly added track + track = (TTrack)e.getNewValue(); + if (track != null) setSelectedTrack(track); + } + else if (name.equals("transform")) { // coords have changed //$NON-NLS-1$ + TTrack track = getSelectedTrack(); + if (track != null && getTrackView(track) != null) { + // if track is a particle model, ignore if coords are adjusting + if (track instanceof ParticleModel) { + ImageCoordSystem coords = trackerPanel.getCoords(); + if (coords.isAdjusting()) return; + } + TrackView trackView = getTrackView(track); + trackView.refresh(trackerPanel.getFrameNumber()); + } + } + else if (name.equals("data")) { // data has changed //$NON-NLS-1$ + TTrack track = getSelectedTrack(); + if (track != null && getTrackView(track) != null) { + TrackView trackView = getTrackView(track); + trackView.refresh(trackerPanel.getFrameNumber()); + } + } + else if (name.equals("function") // DataFunction has changed //$NON-NLS-1$ + || name.equals("radian_angles")) { // angle units have changed //$NON-NLS-1$ + // refresh views of all tracks + for (TTrack track: trackerPanel.getTracks()) { + if (getTrackView(track) != null) { + TrackView trackView = getTrackView(track); + trackView.refreshGUI(); + trackView.refresh(trackerPanel.getFrameNumber()); + } + } + } + else if (name.equals("stepnumber") || //$NON-NLS-1$ + name.equals("image")) { // video image has changed //$NON-NLS-1$ + TTrack track = getSelectedTrack(); + if (track != null && getTrackView(track) != null) { + TrackView trackView = getTrackView(track); + trackView.refresh(trackerPanel.getFrameNumber()); + } + } + else if (name.equals("color") || //$NON-NLS-1$ + name.equals("name") || //$NON-NLS-1$ + name.equals("footprint")) { //$NON-NLS-1$ + // track property has changed + refresh(); + } + } + + /** + * Creates a view for the specified track + * + * @param track the track to be viewed + * @return the track view + */ + protected abstract TrackView createTrackView(TTrack track); + + /** + * Gets a track with the specified name + * + * @param name the name of the track + * @return the track + */ + protected TTrack getTrack(String name) { + for (TTrack track: trackerPanel.getTracks()) { + if (track.getName().equals(name)) return track; + } + return null; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java b/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java index 58c66613..d0d3caf9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java @@ -1,234 +1,234 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -import javax.swing.*; - -import org.opensourcephysics.tools.FontSizer; - -/** - * This is a dialog containing buttons for all user tracks. - * - * @author Douglas Brown - */ -public class TrackControl extends JDialog - implements PropertyChangeListener { - - // static fields - protected static Map controls = new HashMap(); - - // instance fields - protected JPopupMenu popup; - protected TrackerPanel trackerPanel; - protected JPanel trackBarPanel; - protected JToolBar[] trackBars = new JToolBar[0]; - protected boolean positioned = false; - protected int trackCount; - protected boolean isVisible; - protected KeyListener shiftKeyListener; - - /** - * Gets the track control for the specified tracker panel. - * - * @param panel the tracker panel to control - * @return the track control - */ - public static synchronized TrackControl getControl(TrackerPanel panel) { - TrackControl control = controls.get(panel); - if (control == null) { - control = new TrackControl(panel); - controls.put(panel, control); - panel.trackControl = control; - } - return control; - } - - /** - * Private constructor. - * - * @param panel the tracker panel to control - */ - private TrackControl(final TrackerPanel panel) { - super(panel.getTFrame(), false); - // create GUI - trackBarPanel = new JPanel(); - setContentPane(trackBarPanel); - shiftKeyListener = new KeyAdapter() { - // transfers focus to trackerPanel for marking - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_SHIFT) { - trackerPanel.requestFocus(); - trackerPanel.requestFocusInWindow(); - } - } - }; - setResizable(false); - pack(); - popup = new JPopupMenu(); - trackerPanel = panel; - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("mass", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - trackerPanel.addPropertyChangeListener("data", this); //$NON-NLS-1$ - } - - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width = Math.max(150, dim.width); - return dim; - } - - public void setVisible(boolean vis) { - TFrame frame = trackerPanel.getTFrame(); - if (!positioned && vis) { - if (frame.isVisible()) { - MainTView view = frame.getMainView(trackerPanel); - Point p = view.getLocationOnScreen(); - setLocation(p.x, p.y); - positioned = true; - } - else return; - } - if (vis && trackCount==0 && !isEmpty()) - refresh(); - super.setVisible(vis); - isVisible = vis; - TToolBar toolbar = TToolBar.getToolbar(trackerPanel); - toolbar.trackControlButton.setSelected(vis); - } - - /** - * Responds to property change events from TrackerPanel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - refresh(); - } - - /** - * Disposes of this dialog. - */ - public void dispose() { - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("mass", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - trackerPanel.removePropertyChangeListener("data", this); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - super.dispose(); - } - - /** - * Return true if this has no track buttons. - * - * @return true if empty - */ - public boolean isEmpty() { - if (trackCount>0) return false; - ArrayList tracks = trackerPanel.getUserTracks(); - return tracks.isEmpty(); - } - - /** - * Refreshes buttons and vectors. - */ - protected void refresh() { - setTitle(TrackerRes.getString("TrackControl.Name")); //$NON-NLS-1$ - int perbar = 4; - ArrayList tracks = trackerPanel.getUserTracks(); - for (int i = 0; i < trackBars.length; i++) { - trackBars[i].removeAll(); - } - int barCount = (tracks.size()+perbar-1)/perbar; - trackBarPanel.removeAll(); - trackBarPanel.setLayout(new GridLayout(barCount, 1)); - if (barCount > trackBars.length) { - JToolBar[] newBars = new JToolBar[barCount]; - System.arraycopy(trackBars, 0, newBars, 0, trackBars.length); - for (int i = trackBars.length; i < barCount; i++) { - newBars[i] = new JToolBar(); - newBars[i].setFloatable(false); - } - trackBars = newBars; - } - for (int i = 0; i < barCount; i++) { - trackBarPanel.add(trackBars[i]); - } - // add listeners to all tracks and count the mass tracks - trackCount = 0; - TTrack track = null; - Iterator it = tracks.iterator(); - while (it.hasNext()) { - int barIndex = trackCount/perbar; - track = it.next(); - // listen to tracks for property changes that affect icon or name - track.removePropertyChangeListener("name", this); //$NON-NLS-1$ - track.addPropertyChangeListener("name", this); //$NON-NLS-1$ - track.removePropertyChangeListener("color", this); //$NON-NLS-1$ - track.addPropertyChangeListener("color", this); //$NON-NLS-1$ - track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - // make the track buttons - TButton button = new TButton(track); - button.addKeyListener(shiftKeyListener); - trackBars[barIndex].add(button); - trackCount++; - } - FontSizer.setFonts(this, FontSizer.getLevel()); - pack(); - repaint(); - if (trackCount==0) - setVisible(false); - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; + +import javax.swing.*; + +import org.opensourcephysics.tools.FontSizer; + +/** + * This is a dialog containing buttons for all user tracks. + * + * @author Douglas Brown + */ +public class TrackControl extends JDialog + implements PropertyChangeListener { + + // static fields + protected static Map controls = new HashMap(); + + // instance fields + protected JPopupMenu popup; + protected TrackerPanel trackerPanel; + protected JPanel trackBarPanel; + protected JToolBar[] trackBars = new JToolBar[0]; + protected boolean positioned = false; + protected int trackCount; + protected boolean isVisible; + protected KeyListener shiftKeyListener; + + /** + * Gets the track control for the specified tracker panel. + * + * @param panel the tracker panel to control + * @return the track control + */ + public static synchronized TrackControl getControl(TrackerPanel panel) { + TrackControl control = controls.get(panel); + if (control == null) { + control = new TrackControl(panel); + controls.put(panel, control); + panel.trackControl = control; + } + return control; + } + + /** + * Private constructor. + * + * @param panel the tracker panel to control + */ + private TrackControl(final TrackerPanel panel) { + super(panel.getTFrame(), false); + // create GUI + trackBarPanel = new JPanel(); + setContentPane(trackBarPanel); + shiftKeyListener = new KeyAdapter() { + // transfers focus to trackerPanel for marking + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_SHIFT) { + trackerPanel.requestFocus(); + trackerPanel.requestFocusInWindow(); + } + } + }; + setResizable(false); + pack(); + popup = new JPopupMenu(); + trackerPanel = panel; + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("mass", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + trackerPanel.addPropertyChangeListener("data", this); //$NON-NLS-1$ + } + + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.width = Math.max(150, dim.width); + return dim; + } + + public void setVisible(boolean vis) { + TFrame frame = trackerPanel.getTFrame(); + if (!positioned && vis) { + if (frame.isVisible()) { + MainTView view = frame.getMainView(trackerPanel); + Point p = view.getLocationOnScreen(); + setLocation(p.x, p.y); + positioned = true; + } + else return; + } + if (vis && trackCount==0 && !isEmpty()) + refresh(); + super.setVisible(vis); + isVisible = vis; + TToolBar toolbar = TToolBar.getToolbar(trackerPanel); + toolbar.trackControlButton.setSelected(vis); + } + + /** + * Responds to property change events from TrackerPanel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + refresh(); + } + + /** + * Disposes of this dialog. + */ + public void dispose() { + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("mass", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + trackerPanel.removePropertyChangeListener("data", this); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.dispose(); + } + + /** + * Return true if this has no track buttons. + * + * @return true if empty + */ + public boolean isEmpty() { + if (trackCount>0) return false; + ArrayList tracks = trackerPanel.getUserTracks(); + return tracks.isEmpty(); + } + + /** + * Refreshes buttons and vectors. + */ + protected void refresh() { + setTitle(TrackerRes.getString("TrackControl.Name")); //$NON-NLS-1$ + int perbar = 4; + ArrayList tracks = trackerPanel.getUserTracks(); + for (int i = 0; i < trackBars.length; i++) { + trackBars[i].removeAll(); + } + int barCount = (tracks.size()+perbar-1)/perbar; + trackBarPanel.removeAll(); + trackBarPanel.setLayout(new GridLayout(barCount, 1)); + if (barCount > trackBars.length) { + JToolBar[] newBars = new JToolBar[barCount]; + System.arraycopy(trackBars, 0, newBars, 0, trackBars.length); + for (int i = trackBars.length; i < barCount; i++) { + newBars[i] = new JToolBar(); + newBars[i].setFloatable(false); + } + trackBars = newBars; + } + for (int i = 0; i < barCount; i++) { + trackBarPanel.add(trackBars[i]); + } + // add listeners to all tracks and count the mass tracks + trackCount = 0; + TTrack track = null; + Iterator it = tracks.iterator(); + while (it.hasNext()) { + int barIndex = trackCount/perbar; + track = it.next(); + // listen to tracks for property changes that affect icon or name + track.removePropertyChangeListener("name", this); //$NON-NLS-1$ + track.addPropertyChangeListener("name", this); //$NON-NLS-1$ + track.removePropertyChangeListener("color", this); //$NON-NLS-1$ + track.addPropertyChangeListener("color", this); //$NON-NLS-1$ + track.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + track.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + // make the track buttons + TButton button = new TButton(track); + button.addKeyListener(shiftKeyListener); + trackBars[barIndex].add(button); + trackCount++; + } + FontSizer.setFonts(this, FontSizer.getLevel()); + pack(); + repaint(); + if (trackCount==0) + setVisible(false); + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java b/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java index 9ad931be..3e1ed6ee 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java @@ -1,64 +1,64 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import javax.swing.*; - -/** - * A custom renderer to show track name and icon in dropdown list items - * - * @author Douglas Brown - */ -public class TrackRenderer extends JLabel implements ListCellRenderer { - - TrackRenderer() { - setOpaque(true); - setHorizontalAlignment(LEFT); - setVerticalAlignment(CENTER); - setBorder(BorderFactory.createEmptyBorder(1, 4, 1, 0)); - } - - public Component getListCellRendererComponent(JList list, - Object value, - int index, - boolean isSelected, - boolean cellHasFocus) { - if (isSelected) { - setBackground(list.getSelectionBackground()); - setForeground(list.getSelectionForeground()); - } else { - setBackground(list.getBackground()); - setForeground(list.getForeground()); - } - if (value != null) { - Object[] array = (Object[])value; - setText((String)array[1]); - setIcon((Icon)array[0]); - } - return this; - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import javax.swing.*; + +/** + * A custom renderer to show track name and icon in dropdown list items + * + * @author Douglas Brown + */ +public class TrackRenderer extends JLabel implements ListCellRenderer { + + TrackRenderer() { + setOpaque(true); + setHorizontalAlignment(LEFT); + setVerticalAlignment(CENTER); + setBorder(BorderFactory.createEmptyBorder(1, 4, 1, 0)); + } + + public Component getListCellRendererComponent(JList list, + Object value, + int index, + boolean isSelected, + boolean cellHasFocus) { + if (isSelected) { + setBackground(list.getSelectionBackground()); + setForeground(list.getSelectionForeground()); + } else { + setBackground(list.getBackground()); + setForeground(list.getForeground()); + } + if (value != null) { + Object[] array = (Object[])value; + setText((String)array[1]); + setIcon((Icon)array[0]); + } + return this; + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackView.java b/src/org/opensourcephysics/cabrillo/tracker/TrackView.java index 1b30fe11..18373209 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackView.java @@ -1,116 +1,116 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.Component; -import java.beans.*; -import java.util.*; - -import javax.swing.*; - -/** - * This displays a view of a single track on a TrackerPanel. - * - * @author Douglas Brown - */ -public abstract class TrackView extends JScrollPane - implements PropertyChangeListener { - - // instance fields - protected TTrack track; - protected TrackerPanel trackerPanel; - protected ArrayList toolbarComponents = new ArrayList(); - - // constructor - protected TrackView(TTrack track, TrackerPanel panel) { - this.track = track; - trackerPanel = panel; - trackerPanel.addPropertyChangeListener("selectedpoint", this); //$NON-NLS-1$ - } - - abstract void refresh(int stepNumber); - - abstract void refreshGUI(); - - abstract void dispose(); - - abstract boolean isCustomState(); - - abstract JButton getViewButton(); - - public String getName() { - if (track==null) return null; - return track.getName(); - } - - Icon getIcon() { - if (track==null) return null; - return track.getFootprint().getIcon(21, 16); - } - - TTrack getTrack() { - return track; - } - - /** - * Gets toolbar components for toolbar of parent view - * - * @return an ArrayList of components to be added to a toolbar - */ - public ArrayList getToolBarComponents() { - return toolbarComponents; - } - - /** - * Responds to property change events. TrackView receives the following - * events: "step" or "steps" from the track. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("step")) { // from track //$NON-NLS-1$ - Integer i = (Integer)e.getNewValue(); - refresh(i); - } - else if (name.equals("steps")) { // from particle model tracks //$NON-NLS-1$ - refresh(trackerPanel.getFrameNumber()); - } - else if (name.equals("selectedpoint")) { // from tracker panel //$NON-NLS-1$ - Step step = trackerPanel.getSelectedStep(); - if (step != null && trackerPanel.getSelectedTrack() == track) { - refresh(step.getFrameNumber()); - } - else { - refresh(trackerPanel.getFrameNumber()); - } - } - } - - protected boolean isRefreshEnabled() { - return trackerPanel.isAutoRefresh; - } - -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.Component; +import java.beans.*; +import java.util.*; + +import javax.swing.*; + +/** + * This displays a view of a single track on a TrackerPanel. + * + * @author Douglas Brown + */ +public abstract class TrackView extends JScrollPane + implements PropertyChangeListener { + + // instance fields + protected TTrack track; + protected TrackerPanel trackerPanel; + protected ArrayList toolbarComponents = new ArrayList(); + + // constructor + protected TrackView(TTrack track, TrackerPanel panel) { + this.track = track; + trackerPanel = panel; + trackerPanel.addPropertyChangeListener("selectedpoint", this); //$NON-NLS-1$ + } + + abstract void refresh(int stepNumber); + + abstract void refreshGUI(); + + abstract void dispose(); + + abstract boolean isCustomState(); + + abstract JButton getViewButton(); + + public String getName() { + if (track==null) return null; + return track.getName(); + } + + Icon getIcon() { + if (track==null) return null; + return track.getFootprint().getIcon(21, 16); + } + + TTrack getTrack() { + return track; + } + + /** + * Gets toolbar components for toolbar of parent view + * + * @return an ArrayList of components to be added to a toolbar + */ + public ArrayList getToolBarComponents() { + return toolbarComponents; + } + + /** + * Responds to property change events. TrackView receives the following + * events: "step" or "steps" from the track. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("step")) { // from track //$NON-NLS-1$ + Integer i = (Integer)e.getNewValue(); + refresh(i); + } + else if (name.equals("steps")) { // from particle model tracks //$NON-NLS-1$ + refresh(trackerPanel.getFrameNumber()); + } + else if (name.equals("selectedpoint")) { // from tracker panel //$NON-NLS-1$ + Step step = trackerPanel.getSelectedStep(); + if (step != null && trackerPanel.getSelectedTrack() == track) { + refresh(step.getFrameNumber()); + } + else { + refresh(trackerPanel.getFrameNumber()); + } + } + } + + protected boolean isRefreshEnabled() { + return trackerPanel.isAutoRefresh; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/Vector.java b/src/org/opensourcephysics/cabrillo/tracker/Vector.java index 056c8c31..9c314922 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Vector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Vector.java @@ -1,759 +1,759 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.*; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * A Vector draws a series of VectorSteps that represent a generic - * time-dependent vector. - * - * @author Douglas Brown - */ -public class Vector extends TTrack { - - // instance fields - protected JMenuItem tailsToOriginItem = new JMenuItem(); - protected JCheckBoxMenuItem labelsVisibleItem; - protected Map visMap = new HashMap(); - - /** - * Constructs a Vector. - */ - public Vector() { - super(); - defaultColors = new Color[] { - Color.magenta, Color.cyan, Color.blue, Color.red}; - // set up footprint choices - setFootprints(new Footprint[] - {LineFootprint.getFootprint("Footprint.BoldArrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.Arrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.BigArrow")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - // turn on trail - setTrailVisible(true); - // turn on autoadvance - setAutoAdvance(true); - // assign a default name - setName(TrackerRes.getString("Vector.New.Name")); //$NON-NLS-1$ - // assign default plot variables - setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot0", "x"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot1", "y"); //$NON-NLS-1$ //$NON-NLS-2$ - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Vector.Unmarked.Hint"); //$NON-NLS-1$ - // prepare toolbar components - magLabel.setText("mag"); //$NON-NLS-1$ - // xy action - Action xyAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - setXYComponents(); - ((NumberField)e.getSource()).requestFocusInWindow(); - } - }; - // xy focus listener - FocusListener xyFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - setXYComponents(); - } - }; - // magnitude angle action - Action magAngleAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - setMagnitudeAngle(); - ((NumberField)e.getSource()).requestFocusInWindow(); - } - }; - // magnitude angle focus listener - FocusListener magAngleFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - setMagnitudeAngle(); - } - }; - // add action and focus listeners - xField.addActionListener(xyAction); - yField.addActionListener(xyAction); - xField.addFocusListener(xyFocusListener); - yField.addFocusListener(xyFocusListener); - magField.addActionListener(magAngleAction); - angleField.addActionListener(magAngleAction); - magField.addFocusListener(magAngleFocusListener); - angleField.addFocusListener(magAngleFocusListener); - // tails to origin item - tailsToOriginItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - // snap all vectors to the snapPoint - Iterator it = Vector.this.panels.iterator(); - while (it.hasNext()) { - TrackerPanel panel = it.next(); - TPoint p = panel.getSnapPoint(); - Step[] steps = Vector.this.getSteps(); - for (int i = 0; i < steps.length; i++) { - if (steps[i] != null) { - VectorStep v = (VectorStep)steps[i]; - if (v.chain != null) v.chain.clear(); - // detach any existing point - v.attach(null); - v.attach(p); - } - } - panel.repaint(); - } - } - }); - // labels visible item - labelsVisibleItem = new JCheckBoxMenuItem(TrackerRes.getString("Vector.MenuItem.Label")); //$NON-NLS-1$ - labelsVisibleItem.setSelected(true); - labelsVisibleItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - Step[] steps = getSteps(); - for (int i = 0; i < steps.length; i++) { - if (steps[i] != null) { - VectorStep step = (VectorStep)steps[i]; - step.setLabelVisible(labelsVisibleItem.isSelected()); - step.erase(); - } - } - repaint(); - } - }); - } - - /** - * Implements createStep. When creating a vector the coordinates define - * both the tail and tip position, but when re-marking an existing vector - * they define the tip position only. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the new step - */ - public Step createStep(int n, double x, double y) { - VectorStep step = (VectorStep)getStep(n); - if (step==null) - return createStep(n, x, y, 0, 0); - XMLControl state = new XMLControlElement(step); - step.tip.setXY(x, y); - Undo.postStepEdit(step, state); - return step; - } - - /** - * Creates a vector step with specified tail position and vector - * components. - * - * @param n the frame number - * @param x the tail x coordinate in image space - * @param y the tail y coordinate in image space - * @param xc the x component in image space - * @param yc the y component in image space - * @return the new step - */ - public Step createStep(int n, double x, double y, double xc, double yc) { - if (locked) return null; - VectorStep step = (VectorStep)getStep(n); - step = new VectorStep(this, n, x, y, xc, yc); - step.setFirePropertyChangeEvents(true); - steps.setStep(n, step); - step.setFootprint(getFootprint()); - support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ - return step; - } - - /** - * Gets the length of the steps created by this track. - * - * @return the footprint length - */ - public int getStepLength() { - return VectorStep.getLength(); - } - - /** - * Gets the length of the footprints required by this track. - * - * @return the footprint length - */ - public int getFootprintLength() { - return 2; - } - - /** - * Overrides TTrack draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - if (panel instanceof TrackerPanel) { - TrackerPanel trackerPanel = (TrackerPanel)panel; - if (!isVectorsVisible(trackerPanel)) return; -// // snap after loading -// boolean changed = trackerPanel.changed; -// if (!snapVectors.isEmpty() && panel.getClass().equals(TrackerPanel.class)) { -// Iterator it = snapVectors.iterator(); -// while (it.hasNext()) { -// VectorStep step = (VectorStep)it.next(); -// step.snap(trackerPanel); -// } -// snapVectors.clear(); -// trackerPanel.changed = changed; -// } - super.draw(panel, _g); - } - } - - /** - * Overrides TTrack setLocked method. - * - * @param locked true to lock this - */ - public void setLocked(boolean locked) { - super.setLocked(locked); - Step[] steps = getSteps(); - for (int i = 0; i < steps.length; i++) { - VectorStep step = (VectorStep)steps[i]; - if (step != null) step.setTipEnabled(!isLocked()); - } - } - - /** - * Responds to property change events. PointMass listens for the following - * events: "transform" from TrackerPanel. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getSource() instanceof TrackerPanel) { - String name = e.getPropertyName(); - if (name.equals("adjusting")) { //$NON-NLS-1$ - refreshDataLater = (Boolean)e.getNewValue(); - if (!refreshDataLater) { // stopped adjusting - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - } - super.propertyChange(e); - } - - /** - * Refreshes the data. - * - * @param data the DatasetManager - * @param trackerPanel the tracker panel - */ - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - if (refreshDataLater) - return; - dataFrames.clear(); - VideoPlayer player = trackerPanel.getPlayer(); - VideoClip clip = player.getVideoClip(); - ImageCoordSystem coords = trackerPanel.getCoords(); - // define the datasets - int count = 0; - Dataset xComp = data.getDataset(count++); - Dataset yComp = data.getDataset(count++); - Dataset mag = data.getDataset(count++); - Dataset ang = data.getDataset(count++); - Dataset xTail = data.getDataset(count++); - Dataset yTail = data.getDataset(count++); - Dataset stepNum = data.getDataset(count++); - Dataset frameNum = data.getDataset(count++); - // assign column names to the datasets - if (xComp.getColumnName(0).equals("x")) { // not yet initialized //$NON-NLS-1$ - xComp.setXYColumnNames("t", "x"); //$NON-NLS-1$ //$NON-NLS-2$ - yComp.setXYColumnNames("t", "y"); //$NON-NLS-1$ //$NON-NLS-2$ - mag.setXYColumnNames("t", "mag"); //$NON-NLS-1$ //$NON-NLS-2$ - ang.setXYColumnNames("t", "$\\theta$"); //$NON-NLS-1$ //$NON-NLS-2$ - xTail.setXYColumnNames("t", "x_{tail}"); //$NON-NLS-1$ //$NON-NLS-2$ - yTail.setXYColumnNames("t", "y_{tail}"); //$NON-NLS-1$ //$NON-NLS-2$ - stepNum.setXYColumnNames("t", "step"); //$NON-NLS-1$ //$NON-NLS-2$ - frameNum.setXYColumnNames("t", "frame"); //$NON-NLS-1$ //$NON-NLS-2$ - } - else for (int i = 0; i < count; i++) { - data.getDataset(i).clear(); - } - // fill dataDescriptions array - dataDescriptions = new String[count+1]; - for (int i = 0; i < dataDescriptions.length; i++) { - dataDescriptions[i] = TrackerRes.getString("Vector.Data.Description."+i); //$NON-NLS-1$ - } - // get data at each non-null step included in the videoclip - Step[] stepArray = getSteps(); - for (int n = 0; n < stepArray.length; n++) { - if (stepArray[n] == null) continue; - VectorStep step = (VectorStep)stepArray[n]; - // get the frame number of the step - int frame = step.getFrameNumber(); - // check that the frame is included in the clip - if (!clip.includesFrame(frame)) continue; - // get the step number and time - int stepNumber = clip.frameToStep(frame); - double t = player.getStepTime(stepNumber)/1000.0; - if (t < 0) continue; // indicates the time is unknown - // get the x and y component data - double xcomp = step.getXComponent(); - double ycomp = step.getYComponent(); - double wxc = coords.imageToWorldXComponent(frame, xcomp, ycomp); - double wyc = coords.imageToWorldYComponent(frame, xcomp, ycomp); - // append the data to the data sets - xComp.append(t, wxc); - yComp.append(t, wyc); - mag.append(t, Math.sqrt(wxc*wxc + wyc*wyc)); - ang.append(t, Math.atan2(wyc, wxc)); - // get the tail data - Point2D tailPosition = step.getTail().getWorldPosition(trackerPanel); - xTail.append(t, tailPosition.getX()); - yTail.append(t, tailPosition.getY()); - stepNum.append(t, stepNumber); - frameNum.append(t, frame); - dataFrames.add(new Integer(frame)); - } - } - - /** - * Finds the interactive drawable object located at the specified - * pixel position. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step TPoint that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - Interactive ia = super.findInteractive(panel, xpix, ypix); - if (ia == null) { - TPoint p = trackerPanel.getSelectedPoint(); - if (p!=null) { - if (p instanceof VectorStep.Handle) { - partName = TrackerRes.getString("Vector.Handle.Name"); //$NON-NLS-1$ - partName += " "+TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ - hint = TrackerRes.getString("Vector.HandleSelected.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("Vector.Tip.Name"); //$NON-NLS-1$ - partName += " "+TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ - hint = TrackerRes.getString("Vector.TipSelected.Hint"); //$NON-NLS-1$ - } - } - else { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (getStep(trackerPanel.getFrameNumber())==null) - hint = TrackerRes.getString("Vector.Unmarked.Hint"); //$NON-NLS-1$ - else { - hint = TrackerRes.getString("Vector.Remark.Hint"); //$NON-NLS-1$ - } - } - return null; - } - if (ia instanceof VectorStep.Handle) { - VectorStep.Handle handle = (VectorStep.Handle)ia; - partName = TrackerRes.getString("Vector.Handle.Name"); //$NON-NLS-1$ - hint = handle.isShort()? - TrackerRes.getString("Vector.ShortHandle.Hint"): //$NON-NLS-1$ - TrackerRes.getString("Vector.Handle.Hint"); //$NON-NLS-1$ - } - else { - partName = TrackerRes.getString("Vector.Tip.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Vector.Tip.Hint"); //$NON-NLS-1$ - } - return ia; - } - - /** - * Sets the visibility of force vector labels. - * - * @param visible true to show all labels - */ - public void setLabelsVisible(boolean visible) { - Step[] steps = this.getSteps(); - for (int i = 0; i < steps.length; i++) { - VectorStep step = (VectorStep)steps[i]; - if (step != null) { - step.setLabelVisible(visible); - step.setRolloverVisible(!visible); - } - } - } - - /** - * Gets the labels visibility. - * - * @return true if labels are visible - */ - public boolean isLabelsVisible() { - Step[] steps = this.getSteps(); - for (int i = 0; i < steps.length; i++) { - VectorStep step = (VectorStep)steps[i]; - if (step != null) return step.isLabelVisible(); - } - return false; - } - - /** - * Sets the visibility of the vectors on the specified tracker panel. - * - * @param panel the tracker panel - * @param visible true to show vectors - */ - public void setVectorsVisible(TrackerPanel panel, boolean visible) { - if (visible == isVectorsVisible(panel)) return; - visMap.put(panel, new Boolean(visible)); - if (!visible) { - Step step = panel.getSelectedStep(); - if (step != null && step == getStep(step.getFrameNumber())) { - panel.setSelectedPoint(null); - } - } - } - - /** - * Gets whether the vectors are visible on the specified panel. - * - * @param trackerPanel the tracker panel - * @return true if positions are visible - */ - public boolean isVectorsVisible(TrackerPanel trackerPanel) { - if (trackerPanel instanceof WorldTView) { - trackerPanel = ((WorldTView)trackerPanel).getTrackerPanel(); - } - Boolean vis = visMap.get(trackerPanel); - if (vis == null) { - vis = new Boolean(true); // vectors are visible by default - visMap.put(trackerPanel, vis); - } - return vis.booleanValue(); - } - - /** - * Overrides TTrack getMenu method. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - // remove delete item from end - if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ - menu.remove(deleteTrackItem); - if (menu.getItemCount() > 0) - menu.remove(menu.getItemCount()-1); // remove separator - } - // add autoAdvance and markByDefault items at end - if (trackerPanel.isEnabled("track.autoAdvance") || //$NON-NLS-1$ - trackerPanel.isEnabled("track.markByDefault")) { //$NON-NLS-1$ - if (menu.getItemCount() > 0) - menu.addSeparator(); - if (trackerPanel.isEnabled("track.autoAdvance")) //$NON-NLS-1$ - menu.add(autoAdvanceItem); - if (trackerPanel.isEnabled("track.markByDefault")) //$NON-NLS-1$ - menu.add(markByDefaultItem); - } - // add tailsToOrigin item - if (menu.getItemCount() > 0) - menu.addSeparator(); - tailsToOriginItem.setText(TrackerRes.getString("Vector.MenuItem.ToOrigin")); //$NON-NLS-1$ - menu.add(tailsToOriginItem); - // replace delete item - if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ - if (menu.getItemCount() > 0) - menu.addSeparator(); - TPoint p = trackerPanel.getSelectedPoint(); - Step step = getStep(p, trackerPanel); - deleteStepItem.setEnabled(step!=null); - menu.add(deleteStepItem); - menu.add(clearStepsItem); - menu.add(deleteTrackItem); - } - return menu; - } - - /** - * Overrides TTrack getToolbarTrackComponents method. - * - * @param trackerPanel the tracker panel - * @return the DataSetManager - */ - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - return list; - } - - /** - * Overrides TTrack getToolbarPointComponents method. - * - * @param trackerPanel the tracker panel - * @param point the TPoint - * @return a list of components - */ - public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, - TPoint point) { - ArrayList list = super.getToolbarPointComponents(trackerPanel, point); - list.add(stepLabel); - list.add(stepValueLabel); - list.add(tValueLabel); - list.add(tSeparator); - list.add(xLabel); - list.add(xField); - list.add(xSeparator); - list.add(yLabel); - list.add(yField); - list.add(ySeparator); - list.add(magLabel); - list.add(magField); - list.add(magSeparator); - list.add(angleLabel); - list.add(angleField); - list.add(angleSeparator); - xField.setEnabled(!isLocked()); - yField.setEnabled(!isLocked()); - magField.setEnabled(!isLocked()); - angleField.setEnabled(!isLocked()); - return list; - } - - /** - * Overrides Object toString method. - * - * @return a description of this object - */ - public String toString() { - return TrackerRes.getString("Vector.Name") + " \"" + name + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - XML.setLoader(FrameData.class, new FrameDataLoader()); - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - Vector vec = (Vector) obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - Step[] steps = vec.getSteps(); - FrameData[] data = new FrameData[steps.length]; - for (int n = 0; n < steps.length; n++) { - if (steps[n] == null) continue; - VectorStep v = (VectorStep)steps[n]; - data[n] = new FrameData(v, vec.isDependent()); - } - control.setValue("framedata", data); //$NON-NLS-1$ - } - - /** - * Creates a new object with data from an XMLControl. - * - * @param control the control - * @return the newly created object - */ - public Object createObject(XMLControl control) { - return new Vector(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the control - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - Vector vec = (Vector) obj; - // load track data - XML.getLoader(TTrack.class).loadObject(control, obj); - // load step data - FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ - if (data != null) { - boolean locked = vec.isLocked(); - vec.setLocked(false); - for (int n = 0; n < data.length; n++) { - if (data[n] == null) { - vec.steps.setStep(n, null); - continue; - } - vec.createStep(n, data[n].x, data[n].y, data[n].xc, data[n].yc); - } - vec.setLocked(locked); - } - return obj; - } - } - -//__________________________ private methods ___________________________ - - /** - * Sets the components of the currently selected vector based on the values - * in the x and y fields. - */ - private void setXYComponents() { - Iterator it = panels.iterator(); - while (it.hasNext()) { - TrackerPanel trackerPanel = it.next(); - TPoint p = trackerPanel.getSelectedPoint(); - VectorStep step = (VectorStep) getStep(p, trackerPanel); - if (step != null) { - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - double x = coords.worldToImageXComponent(n, - xField.getValue(), - yField.getValue()); - double y = coords.worldToImageYComponent(n, - xField.getValue(), - yField.getValue()); - step.setXYComponents(x, y); - x = coords.imageToWorldXComponent(n, - step.getXComponent(), - step.getYComponent()); - y = coords.imageToWorldYComponent(n, - step.getXComponent(), - step.getYComponent()); - xField.setValue(x); - yField.setValue(y); - magField.setValue(Math.sqrt(x*x + y*y)); - double theta = Math.atan2(y, x); - angleField.setValue(theta); - p.showCoordinates(trackerPanel); - } - } - } - - /** - * Sets the components of the currently selected vector based on the values - * in the mag and angle fields. - */ - private void setMagnitudeAngle() { - double theta = angleField.getValue(); - double xval = magField.getValue() * Math.cos(theta); - double yval = magField.getValue() * Math.sin(theta); - Iterator it = panels.iterator(); - while (it.hasNext()) { - TrackerPanel trackerPanel = it.next(); - TPoint p = trackerPanel.getSelectedPoint(); - VectorStep step = (VectorStep) getStep(p, trackerPanel); - if (step != null) { - ImageCoordSystem coords = trackerPanel.getCoords(); - int n = trackerPanel.getFrameNumber(); - double x = coords.worldToImageXComponent(n, xval, yval); - double y = coords.worldToImageYComponent(n, xval, yval); - step.setXYComponents(x, y); - x = coords.imageToWorldXComponent(n, - step.getXComponent(), - step.getYComponent()); - y = coords.imageToWorldYComponent(n, - step.getXComponent(), - step.getYComponent()); - xField.setValue(x); - yField.setValue(y); - magField.setValue(Math.sqrt(x*x + y*y)); - theta = Math.atan2(y, x); - angleField.setValue(theta); - p.showCoordinates(trackerPanel); - } - } - } - - /** - * Inner class containing the vector data for a single frame number. - */ - public static class FrameData { - double x, y, xc, yc; - boolean independent; - FrameData() {/** empty block */} - FrameData(VectorStep v, boolean dependent) { - x = v.getTail().getX(); - y = v.getTail().getY(); - xc = v.getXComponent(); - yc = v.getYComponent(); - independent = !dependent; - } - } - - /** - * A class to save and load a FrameData. - */ - private static class FrameDataLoader - implements XML.ObjectLoader { - - public void saveObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - control.setValue("xtail", data.x); //$NON-NLS-1$ - control.setValue("ytail", data.y); //$NON-NLS-1$ - if (data.independent) { - control.setValue("xcomponent", data.xc); //$NON-NLS-1$ - control.setValue("ycomponent", data.yc); //$NON-NLS-1$ - } - } - - public Object createObject(XMLControl control) { - return new FrameData(); - } - - public Object loadObject(XMLControl control, Object obj) { - FrameData data = (FrameData) obj; - double x = control.getDouble("xcomponent"); //$NON-NLS-1$ - if (!Double.isNaN(x)) { - data.xc = x; - data.yc = control.getDouble("ycomponent"); //$NON-NLS-1$ - } - data.x = control.getDouble("xtail"); //$NON-NLS-1$ - data.y = control.getDouble("ytail"); //$NON-NLS-1$ - return obj; - } - } -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.*; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * A Vector draws a series of VectorSteps that represent a generic + * time-dependent vector. + * + * @author Douglas Brown + */ +public class Vector extends TTrack { + + // instance fields + protected JMenuItem tailsToOriginItem = new JMenuItem(); + protected JCheckBoxMenuItem labelsVisibleItem; + protected Map visMap = new HashMap(); + + /** + * Constructs a Vector. + */ + public Vector() { + super(); + defaultColors = new Color[] { + Color.magenta, Color.cyan, Color.blue, Color.red}; + // set up footprint choices + setFootprints(new Footprint[] + {LineFootprint.getFootprint("Footprint.BoldArrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.Arrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.BigArrow")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + // turn on trail + setTrailVisible(true); + // turn on autoadvance + setAutoAdvance(true); + // assign a default name + setName(TrackerRes.getString("Vector.New.Name")); //$NON-NLS-1$ + // assign default plot variables + setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot0", "x"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot1", "y"); //$NON-NLS-1$ //$NON-NLS-2$ + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("Vector.Unmarked.Hint"); //$NON-NLS-1$ + // prepare toolbar components + magLabel.setText("mag"); //$NON-NLS-1$ + // xy action + Action xyAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + setXYComponents(); + ((NumberField)e.getSource()).requestFocusInWindow(); + } + }; + // xy focus listener + FocusListener xyFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + setXYComponents(); + } + }; + // magnitude angle action + Action magAngleAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + setMagnitudeAngle(); + ((NumberField)e.getSource()).requestFocusInWindow(); + } + }; + // magnitude angle focus listener + FocusListener magAngleFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + setMagnitudeAngle(); + } + }; + // add action and focus listeners + xField.addActionListener(xyAction); + yField.addActionListener(xyAction); + xField.addFocusListener(xyFocusListener); + yField.addFocusListener(xyFocusListener); + magField.addActionListener(magAngleAction); + angleField.addActionListener(magAngleAction); + magField.addFocusListener(magAngleFocusListener); + angleField.addFocusListener(magAngleFocusListener); + // tails to origin item + tailsToOriginItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + // snap all vectors to the snapPoint + Iterator it = Vector.this.panels.iterator(); + while (it.hasNext()) { + TrackerPanel panel = it.next(); + TPoint p = panel.getSnapPoint(); + Step[] steps = Vector.this.getSteps(); + for (int i = 0; i < steps.length; i++) { + if (steps[i] != null) { + VectorStep v = (VectorStep)steps[i]; + if (v.chain != null) v.chain.clear(); + // detach any existing point + v.attach(null); + v.attach(p); + } + } + panel.repaint(); + } + } + }); + // labels visible item + labelsVisibleItem = new JCheckBoxMenuItem(TrackerRes.getString("Vector.MenuItem.Label")); //$NON-NLS-1$ + labelsVisibleItem.setSelected(true); + labelsVisibleItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + Step[] steps = getSteps(); + for (int i = 0; i < steps.length; i++) { + if (steps[i] != null) { + VectorStep step = (VectorStep)steps[i]; + step.setLabelVisible(labelsVisibleItem.isSelected()); + step.erase(); + } + } + repaint(); + } + }); + } + + /** + * Implements createStep. When creating a vector the coordinates define + * both the tail and tip position, but when re-marking an existing vector + * they define the tip position only. + * + * @param n the frame number + * @param x the x coordinate in image space + * @param y the y coordinate in image space + * @return the new step + */ + public Step createStep(int n, double x, double y) { + VectorStep step = (VectorStep)getStep(n); + if (step==null) + return createStep(n, x, y, 0, 0); + XMLControl state = new XMLControlElement(step); + step.tip.setXY(x, y); + Undo.postStepEdit(step, state); + return step; + } + + /** + * Creates a vector step with specified tail position and vector + * components. + * + * @param n the frame number + * @param x the tail x coordinate in image space + * @param y the tail y coordinate in image space + * @param xc the x component in image space + * @param yc the y component in image space + * @return the new step + */ + public Step createStep(int n, double x, double y, double xc, double yc) { + if (locked) return null; + VectorStep step = (VectorStep)getStep(n); + step = new VectorStep(this, n, x, y, xc, yc); + step.setFirePropertyChangeEvents(true); + steps.setStep(n, step); + step.setFootprint(getFootprint()); + support.firePropertyChange("step", null, new Integer(n)); //$NON-NLS-1$ + return step; + } + + /** + * Gets the length of the steps created by this track. + * + * @return the footprint length + */ + public int getStepLength() { + return VectorStep.getLength(); + } + + /** + * Gets the length of the footprints required by this track. + * + * @return the footprint length + */ + public int getFootprintLength() { + return 2; + } + + /** + * Overrides TTrack draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + if (panel instanceof TrackerPanel) { + TrackerPanel trackerPanel = (TrackerPanel)panel; + if (!isVectorsVisible(trackerPanel)) return; +// // snap after loading +// boolean changed = trackerPanel.changed; +// if (!snapVectors.isEmpty() && panel.getClass().equals(TrackerPanel.class)) { +// Iterator it = snapVectors.iterator(); +// while (it.hasNext()) { +// VectorStep step = (VectorStep)it.next(); +// step.snap(trackerPanel); +// } +// snapVectors.clear(); +// trackerPanel.changed = changed; +// } + super.draw(panel, _g); + } + } + + /** + * Overrides TTrack setLocked method. + * + * @param locked true to lock this + */ + public void setLocked(boolean locked) { + super.setLocked(locked); + Step[] steps = getSteps(); + for (int i = 0; i < steps.length; i++) { + VectorStep step = (VectorStep)steps[i]; + if (step != null) step.setTipEnabled(!isLocked()); + } + } + + /** + * Responds to property change events. PointMass listens for the following + * events: "transform" from TrackerPanel. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getSource() instanceof TrackerPanel) { + String name = e.getPropertyName(); + if (name.equals("adjusting")) { //$NON-NLS-1$ + refreshDataLater = (Boolean)e.getNewValue(); + if (!refreshDataLater) { // stopped adjusting + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + } + } + super.propertyChange(e); + } + + /** + * Refreshes the data. + * + * @param data the DatasetManager + * @param trackerPanel the tracker panel + */ + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (refreshDataLater) + return; + dataFrames.clear(); + VideoPlayer player = trackerPanel.getPlayer(); + VideoClip clip = player.getVideoClip(); + ImageCoordSystem coords = trackerPanel.getCoords(); + // define the datasets + int count = 0; + Dataset xComp = data.getDataset(count++); + Dataset yComp = data.getDataset(count++); + Dataset mag = data.getDataset(count++); + Dataset ang = data.getDataset(count++); + Dataset xTail = data.getDataset(count++); + Dataset yTail = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + // assign column names to the datasets + if (xComp.getColumnName(0).equals("x")) { // not yet initialized //$NON-NLS-1$ + xComp.setXYColumnNames("t", "x"); //$NON-NLS-1$ //$NON-NLS-2$ + yComp.setXYColumnNames("t", "y"); //$NON-NLS-1$ //$NON-NLS-2$ + mag.setXYColumnNames("t", "mag"); //$NON-NLS-1$ //$NON-NLS-2$ + ang.setXYColumnNames("t", "$\\theta$"); //$NON-NLS-1$ //$NON-NLS-2$ + xTail.setXYColumnNames("t", "x_{tail}"); //$NON-NLS-1$ //$NON-NLS-2$ + yTail.setXYColumnNames("t", "y_{tail}"); //$NON-NLS-1$ //$NON-NLS-2$ + stepNum.setXYColumnNames("t", "step"); //$NON-NLS-1$ //$NON-NLS-2$ + frameNum.setXYColumnNames("t", "frame"); //$NON-NLS-1$ //$NON-NLS-2$ + } + else for (int i = 0; i < count; i++) { + data.getDataset(i).clear(); + } + // fill dataDescriptions array + dataDescriptions = new String[count+1]; + for (int i = 0; i < dataDescriptions.length; i++) { + dataDescriptions[i] = TrackerRes.getString("Vector.Data.Description."+i); //$NON-NLS-1$ + } + // get data at each non-null step included in the videoclip + Step[] stepArray = getSteps(); + for (int n = 0; n < stepArray.length; n++) { + if (stepArray[n] == null) continue; + VectorStep step = (VectorStep)stepArray[n]; + // get the frame number of the step + int frame = step.getFrameNumber(); + // check that the frame is included in the clip + if (!clip.includesFrame(frame)) continue; + // get the step number and time + int stepNumber = clip.frameToStep(frame); + double t = player.getStepTime(stepNumber)/1000.0; + if (t < 0) continue; // indicates the time is unknown + // get the x and y component data + double xcomp = step.getXComponent(); + double ycomp = step.getYComponent(); + double wxc = coords.imageToWorldXComponent(frame, xcomp, ycomp); + double wyc = coords.imageToWorldYComponent(frame, xcomp, ycomp); + // append the data to the data sets + xComp.append(t, wxc); + yComp.append(t, wyc); + mag.append(t, Math.sqrt(wxc*wxc + wyc*wyc)); + ang.append(t, Math.atan2(wyc, wxc)); + // get the tail data + Point2D tailPosition = step.getTail().getWorldPosition(trackerPanel); + xTail.append(t, tailPosition.getX()); + yTail.append(t, tailPosition.getY()); + stepNum.append(t, stepNumber); + frameNum.append(t, frame); + dataFrames.add(new Integer(frame)); + } + } + + /** + * Finds the interactive drawable object located at the specified + * pixel position. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step TPoint that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + Interactive ia = super.findInteractive(panel, xpix, ypix); + if (ia == null) { + TPoint p = trackerPanel.getSelectedPoint(); + if (p!=null) { + if (p instanceof VectorStep.Handle) { + partName = TrackerRes.getString("Vector.Handle.Name"); //$NON-NLS-1$ + partName += " "+TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ + hint = TrackerRes.getString("Vector.HandleSelected.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("Vector.Tip.Name"); //$NON-NLS-1$ + partName += " "+TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ //$NON-NLS-2$ + hint = TrackerRes.getString("Vector.TipSelected.Hint"); //$NON-NLS-1$ + } + } + else { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (getStep(trackerPanel.getFrameNumber())==null) + hint = TrackerRes.getString("Vector.Unmarked.Hint"); //$NON-NLS-1$ + else { + hint = TrackerRes.getString("Vector.Remark.Hint"); //$NON-NLS-1$ + } + } + return null; + } + if (ia instanceof VectorStep.Handle) { + VectorStep.Handle handle = (VectorStep.Handle)ia; + partName = TrackerRes.getString("Vector.Handle.Name"); //$NON-NLS-1$ + hint = handle.isShort()? + TrackerRes.getString("Vector.ShortHandle.Hint"): //$NON-NLS-1$ + TrackerRes.getString("Vector.Handle.Hint"); //$NON-NLS-1$ + } + else { + partName = TrackerRes.getString("Vector.Tip.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("Vector.Tip.Hint"); //$NON-NLS-1$ + } + return ia; + } + + /** + * Sets the visibility of force vector labels. + * + * @param visible true to show all labels + */ + public void setLabelsVisible(boolean visible) { + Step[] steps = this.getSteps(); + for (int i = 0; i < steps.length; i++) { + VectorStep step = (VectorStep)steps[i]; + if (step != null) { + step.setLabelVisible(visible); + step.setRolloverVisible(!visible); + } + } + } + + /** + * Gets the labels visibility. + * + * @return true if labels are visible + */ + public boolean isLabelsVisible() { + Step[] steps = this.getSteps(); + for (int i = 0; i < steps.length; i++) { + VectorStep step = (VectorStep)steps[i]; + if (step != null) return step.isLabelVisible(); + } + return false; + } + + /** + * Sets the visibility of the vectors on the specified tracker panel. + * + * @param panel the tracker panel + * @param visible true to show vectors + */ + public void setVectorsVisible(TrackerPanel panel, boolean visible) { + if (visible == isVectorsVisible(panel)) return; + visMap.put(panel, new Boolean(visible)); + if (!visible) { + Step step = panel.getSelectedStep(); + if (step != null && step == getStep(step.getFrameNumber())) { + panel.setSelectedPoint(null); + } + } + } + + /** + * Gets whether the vectors are visible on the specified panel. + * + * @param trackerPanel the tracker panel + * @return true if positions are visible + */ + public boolean isVectorsVisible(TrackerPanel trackerPanel) { + if (trackerPanel instanceof WorldTView) { + trackerPanel = ((WorldTView)trackerPanel).getTrackerPanel(); + } + Boolean vis = visMap.get(trackerPanel); + if (vis == null) { + vis = new Boolean(true); // vectors are visible by default + visMap.put(trackerPanel, vis); + } + return vis.booleanValue(); + } + + /** + * Overrides TTrack getMenu method. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + // remove delete item from end + if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ + menu.remove(deleteTrackItem); + if (menu.getItemCount() > 0) + menu.remove(menu.getItemCount()-1); // remove separator + } + // add autoAdvance and markByDefault items at end + if (trackerPanel.isEnabled("track.autoAdvance") || //$NON-NLS-1$ + trackerPanel.isEnabled("track.markByDefault")) { //$NON-NLS-1$ + if (menu.getItemCount() > 0) + menu.addSeparator(); + if (trackerPanel.isEnabled("track.autoAdvance")) //$NON-NLS-1$ + menu.add(autoAdvanceItem); + if (trackerPanel.isEnabled("track.markByDefault")) //$NON-NLS-1$ + menu.add(markByDefaultItem); + } + // add tailsToOrigin item + if (menu.getItemCount() > 0) + menu.addSeparator(); + tailsToOriginItem.setText(TrackerRes.getString("Vector.MenuItem.ToOrigin")); //$NON-NLS-1$ + menu.add(tailsToOriginItem); + // replace delete item + if (trackerPanel.isEnabled("track.delete")) { //$NON-NLS-1$ + if (menu.getItemCount() > 0) + menu.addSeparator(); + TPoint p = trackerPanel.getSelectedPoint(); + Step step = getStep(p, trackerPanel); + deleteStepItem.setEnabled(step!=null); + menu.add(deleteStepItem); + menu.add(clearStepsItem); + menu.add(deleteTrackItem); + } + return menu; + } + + /** + * Overrides TTrack getToolbarTrackComponents method. + * + * @param trackerPanel the tracker panel + * @return the DataSetManager + */ + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + return list; + } + + /** + * Overrides TTrack getToolbarPointComponents method. + * + * @param trackerPanel the tracker panel + * @param point the TPoint + * @return a list of components + */ + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + list.add(stepLabel); + list.add(stepValueLabel); + list.add(tValueLabel); + list.add(tSeparator); + list.add(xLabel); + list.add(xField); + list.add(xSeparator); + list.add(yLabel); + list.add(yField); + list.add(ySeparator); + list.add(magLabel); + list.add(magField); + list.add(magSeparator); + list.add(angleLabel); + list.add(angleField); + list.add(angleSeparator); + xField.setEnabled(!isLocked()); + yField.setEnabled(!isLocked()); + magField.setEnabled(!isLocked()); + angleField.setEnabled(!isLocked()); + return list; + } + + /** + * Overrides Object toString method. + * + * @return a description of this object + */ + public String toString() { + return TrackerRes.getString("Vector.Name") + " \"" + name + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + XML.setLoader(FrameData.class, new FrameDataLoader()); + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + Vector vec = (Vector) obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + Step[] steps = vec.getSteps(); + FrameData[] data = new FrameData[steps.length]; + for (int n = 0; n < steps.length; n++) { + if (steps[n] == null) continue; + VectorStep v = (VectorStep)steps[n]; + data[n] = new FrameData(v, vec.isDependent()); + } + control.setValue("framedata", data); //$NON-NLS-1$ + } + + /** + * Creates a new object with data from an XMLControl. + * + * @param control the control + * @return the newly created object + */ + public Object createObject(XMLControl control) { + return new Vector(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the control + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + Vector vec = (Vector) obj; + // load track data + XML.getLoader(TTrack.class).loadObject(control, obj); + // load step data + FrameData[] data = (FrameData[])control.getObject("framedata"); //$NON-NLS-1$ + if (data != null) { + boolean locked = vec.isLocked(); + vec.setLocked(false); + for (int n = 0; n < data.length; n++) { + if (data[n] == null) { + vec.steps.setStep(n, null); + continue; + } + vec.createStep(n, data[n].x, data[n].y, data[n].xc, data[n].yc); + } + vec.setLocked(locked); + } + return obj; + } + } + +//__________________________ private methods ___________________________ + + /** + * Sets the components of the currently selected vector based on the values + * in the x and y fields. + */ + private void setXYComponents() { + Iterator it = panels.iterator(); + while (it.hasNext()) { + TrackerPanel trackerPanel = it.next(); + TPoint p = trackerPanel.getSelectedPoint(); + VectorStep step = (VectorStep) getStep(p, trackerPanel); + if (step != null) { + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + double x = coords.worldToImageXComponent(n, + xField.getValue(), + yField.getValue()); + double y = coords.worldToImageYComponent(n, + xField.getValue(), + yField.getValue()); + step.setXYComponents(x, y); + x = coords.imageToWorldXComponent(n, + step.getXComponent(), + step.getYComponent()); + y = coords.imageToWorldYComponent(n, + step.getXComponent(), + step.getYComponent()); + xField.setValue(x); + yField.setValue(y); + magField.setValue(Math.sqrt(x*x + y*y)); + double theta = Math.atan2(y, x); + angleField.setValue(theta); + p.showCoordinates(trackerPanel); + } + } + } + + /** + * Sets the components of the currently selected vector based on the values + * in the mag and angle fields. + */ + private void setMagnitudeAngle() { + double theta = angleField.getValue(); + double xval = magField.getValue() * Math.cos(theta); + double yval = magField.getValue() * Math.sin(theta); + Iterator it = panels.iterator(); + while (it.hasNext()) { + TrackerPanel trackerPanel = it.next(); + TPoint p = trackerPanel.getSelectedPoint(); + VectorStep step = (VectorStep) getStep(p, trackerPanel); + if (step != null) { + ImageCoordSystem coords = trackerPanel.getCoords(); + int n = trackerPanel.getFrameNumber(); + double x = coords.worldToImageXComponent(n, xval, yval); + double y = coords.worldToImageYComponent(n, xval, yval); + step.setXYComponents(x, y); + x = coords.imageToWorldXComponent(n, + step.getXComponent(), + step.getYComponent()); + y = coords.imageToWorldYComponent(n, + step.getXComponent(), + step.getYComponent()); + xField.setValue(x); + yField.setValue(y); + magField.setValue(Math.sqrt(x*x + y*y)); + theta = Math.atan2(y, x); + angleField.setValue(theta); + p.showCoordinates(trackerPanel); + } + } + } + + /** + * Inner class containing the vector data for a single frame number. + */ + public static class FrameData { + double x, y, xc, yc; + boolean independent; + FrameData() {/** empty block */} + FrameData(VectorStep v, boolean dependent) { + x = v.getTail().getX(); + y = v.getTail().getY(); + xc = v.getXComponent(); + yc = v.getYComponent(); + independent = !dependent; + } + } + + /** + * A class to save and load a FrameData. + */ + private static class FrameDataLoader + implements XML.ObjectLoader { + + public void saveObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + control.setValue("xtail", data.x); //$NON-NLS-1$ + control.setValue("ytail", data.y); //$NON-NLS-1$ + if (data.independent) { + control.setValue("xcomponent", data.xc); //$NON-NLS-1$ + control.setValue("ycomponent", data.yc); //$NON-NLS-1$ + } + } + + public Object createObject(XMLControl control) { + return new FrameData(); + } + + public Object loadObject(XMLControl control, Object obj) { + FrameData data = (FrameData) obj; + double x = control.getDouble("xcomponent"); //$NON-NLS-1$ + if (!Double.isNaN(x)) { + data.xc = x; + data.yc = control.getDouble("ycomponent"); //$NON-NLS-1$ + } + data.x = control.getDouble("xtail"); //$NON-NLS-1$ + data.y = control.getDouble("ytail"); //$NON-NLS-1$ + return obj; + } + } +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java b/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java index 3f2e3c7e..85e6ee33 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java @@ -1,285 +1,285 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; - -/** - * This is an ArrayList that represents a chain of vectors linked tip-to-tail. - * - * @author Douglas Brown - */ -public class VectorChain extends ArrayList { - - /** - * Constructs a chain. - * - * @param start the start vector - */ - protected VectorChain(VectorStep start) { - if (isAllowed(start)) { - start.chain = this; - super.add(start); - } - } - - /** - * Constructs a chain. - * - * @param start the start vector - * @param end the end vector - */ - public VectorChain(VectorStep start, VectorStep end) { - if (isAllowed(start) && isAllowed(end)) { - start.chain = this; - super.add(start); - add(end); - } - } - - /** - * Gets the end of the chain. - * - * @return the end vector - */ - public VectorStep getEnd() { - return get(size() - 1); - } - - /** - * Gets the start of the chain. - * - * @return the start vector - */ - public VectorStep getStart() { - return get(0); - } - - /** - * Removes the end of the chain. - * - * @return the removed end - */ - public VectorStep removeEnd() { - if (size() == 0) return null; - VectorStep end = getEnd(); - end.chain = null; - end.attach(null); - super.remove(size() - 1); - return end; - } - - /** - /** - * Attempts to break this chain in two. If successful, the specified vector - * becomes the tail vector of a new chain. - * - * @param vector the vector - * @return the new chain, if any - */ - public VectorChain breakAt(VectorStep vector) { - if (vector.chain != this || - vector == getStart()) { - return null; - } - if (vector == getEnd()) { - removeEnd(); - return null; - } - // remove the downstream linked vectors from this chain - ArrayList list = remove(vector); - // create a new chain and add the removed vectors - VectorChain chain = new VectorChain(vector); - for (int i = 1; i < list.size(); i++) { - chain.add(list.get(i)); - } - return chain; - } - - /** - * Overrides ArrayList method. - */ - public void clear() { - Iterator it = iterator(); - while (it.hasNext()) { - VectorStep link = it.next(); - // detach link and remove reference to this chain - link.chain = null; - link.attach(null); - } - super.clear(); - } - - /** - * Ads a vector to this chain. - * - * @param vector the vector to add - * @return true if the vector is successfully added - */ - public boolean add(VectorStep vector) { - // add a chain of vectors - if (vector.getChain() != null) { - return add(vector.getChain()); - } - // link to the end hinge if allowed - if (isAllowed(vector)) { - VectorStep end = getEnd(); - vector.attach(end.getHinge()); - vector.chain = this; - super.add(vector); - return true; - } - return false; - } - - /** - * Adds a VectorChain to this chain. - * - * @param chain the chain to add - * @return true if successfully added - */ - public boolean add(VectorChain chain) { - if (chain == this) return false; - // remove all vectors from the chain and add them to this - ArrayList vectors = chain.remove(chain.getStart()); - addAll(vectors); - return true; - } - - /** - * Overrides ArrayList method. - * - * @param c the collection to add - * @return true if at least one item in the collection is successfully added - */ - public boolean addAll(Collection c) { - boolean added = false; - Iterator it = c.iterator(); - while (it.hasNext()) { - added = add(it.next()) || added; - } - return added; - } - - /** - * Overrides ArrayList method. - * - * @param index the index - * @param v the vector to add - */ - public void add(int index, VectorStep v) {/** empty block */} - - /** - * Overrides ArrayList method. - * - * @param index the index - * @return the object removed - */ - public VectorStep remove(int index) { - return null; - } - - /** - * Overrides ArrayList method. - * - * @param obj the object to remove - * @return false - */ - public boolean remove(Object obj) { - return false; - } - - /** - * Overrides ArrayList method. - * - * @param from index - * @param to index - */ - public void removeRange(int from, int to) {/** empty block */} - - /** - * Overrides ArrayList method. - * - * @param c a collection - * @return false - */ - public boolean retainAll(Collection c) { - return false; - } - - /** - * Overrides ArrayList method. - * - * @param index the index - * @param c the collection to add - * @return true if the collection is successfully added - */ - public boolean addAll(int index, Collection c) { - return false; - } - - /** - * Overrides ArrayList method. - * - * @param index the index - * @param obj the object - * @return the element previously at index - */ - public VectorStep set(int index, VectorStep obj) { - return null; - } - -//_____________________________ protected methods _____________________________ - - /** - * Determines whether the specified vector is allowed to be added to the end hinge. - * - * @param vector the vector - * @return true if allowed - */ - protected boolean isAllowed(VectorStep vector) { - if (vector.getChain() != null) return false; - if (size() == 0) return true; - Class endClass = getEnd().getTrack().getClass(); - return endClass.equals(vector.getTrack().getClass()); - } - - /** - * Removes vectors downstream of and including the specified vector. - * - * @param vector the vector - * @return the list of vectors removed - */ - protected ArrayList remove(VectorStep vector) { - ArrayList list = new ArrayList(); - int length = size(); - for (int i = indexOf(vector); i < length; i++) { - list.add(0, removeEnd()); - } - return list; - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; + +/** + * This is an ArrayList that represents a chain of vectors linked tip-to-tail. + * + * @author Douglas Brown + */ +public class VectorChain extends ArrayList { + + /** + * Constructs a chain. + * + * @param start the start vector + */ + protected VectorChain(VectorStep start) { + if (isAllowed(start)) { + start.chain = this; + super.add(start); + } + } + + /** + * Constructs a chain. + * + * @param start the start vector + * @param end the end vector + */ + public VectorChain(VectorStep start, VectorStep end) { + if (isAllowed(start) && isAllowed(end)) { + start.chain = this; + super.add(start); + add(end); + } + } + + /** + * Gets the end of the chain. + * + * @return the end vector + */ + public VectorStep getEnd() { + return get(size() - 1); + } + + /** + * Gets the start of the chain. + * + * @return the start vector + */ + public VectorStep getStart() { + return get(0); + } + + /** + * Removes the end of the chain. + * + * @return the removed end + */ + public VectorStep removeEnd() { + if (size() == 0) return null; + VectorStep end = getEnd(); + end.chain = null; + end.attach(null); + super.remove(size() - 1); + return end; + } + + /** + /** + * Attempts to break this chain in two. If successful, the specified vector + * becomes the tail vector of a new chain. + * + * @param vector the vector + * @return the new chain, if any + */ + public VectorChain breakAt(VectorStep vector) { + if (vector.chain != this || + vector == getStart()) { + return null; + } + if (vector == getEnd()) { + removeEnd(); + return null; + } + // remove the downstream linked vectors from this chain + ArrayList list = remove(vector); + // create a new chain and add the removed vectors + VectorChain chain = new VectorChain(vector); + for (int i = 1; i < list.size(); i++) { + chain.add(list.get(i)); + } + return chain; + } + + /** + * Overrides ArrayList method. + */ + public void clear() { + Iterator it = iterator(); + while (it.hasNext()) { + VectorStep link = it.next(); + // detach link and remove reference to this chain + link.chain = null; + link.attach(null); + } + super.clear(); + } + + /** + * Ads a vector to this chain. + * + * @param vector the vector to add + * @return true if the vector is successfully added + */ + public boolean add(VectorStep vector) { + // add a chain of vectors + if (vector.getChain() != null) { + return add(vector.getChain()); + } + // link to the end hinge if allowed + if (isAllowed(vector)) { + VectorStep end = getEnd(); + vector.attach(end.getHinge()); + vector.chain = this; + super.add(vector); + return true; + } + return false; + } + + /** + * Adds a VectorChain to this chain. + * + * @param chain the chain to add + * @return true if successfully added + */ + public boolean add(VectorChain chain) { + if (chain == this) return false; + // remove all vectors from the chain and add them to this + ArrayList vectors = chain.remove(chain.getStart()); + addAll(vectors); + return true; + } + + /** + * Overrides ArrayList method. + * + * @param c the collection to add + * @return true if at least one item in the collection is successfully added + */ + public boolean addAll(Collection c) { + boolean added = false; + Iterator it = c.iterator(); + while (it.hasNext()) { + added = add(it.next()) || added; + } + return added; + } + + /** + * Overrides ArrayList method. + * + * @param index the index + * @param v the vector to add + */ + public void add(int index, VectorStep v) {/** empty block */} + + /** + * Overrides ArrayList method. + * + * @param index the index + * @return the object removed + */ + public VectorStep remove(int index) { + return null; + } + + /** + * Overrides ArrayList method. + * + * @param obj the object to remove + * @return false + */ + public boolean remove(Object obj) { + return false; + } + + /** + * Overrides ArrayList method. + * + * @param from index + * @param to index + */ + public void removeRange(int from, int to) {/** empty block */} + + /** + * Overrides ArrayList method. + * + * @param c a collection + * @return false + */ + public boolean retainAll(Collection c) { + return false; + } + + /** + * Overrides ArrayList method. + * + * @param index the index + * @param c the collection to add + * @return true if the collection is successfully added + */ + public boolean addAll(int index, Collection c) { + return false; + } + + /** + * Overrides ArrayList method. + * + * @param index the index + * @param obj the object + * @return the element previously at index + */ + public VectorStep set(int index, VectorStep obj) { + return null; + } + +//_____________________________ protected methods _____________________________ + + /** + * Determines whether the specified vector is allowed to be added to the end hinge. + * + * @param vector the vector + * @return true if allowed + */ + protected boolean isAllowed(VectorStep vector) { + if (vector.getChain() != null) return false; + if (size() == 0) return true; + Class endClass = getEnd().getTrack().getClass(); + return endClass.equals(vector.getTrack().getClass()); + } + + /** + * Removes vectors downstream of and including the specified vector. + * + * @param vector the vector + * @return the list of vectors removed + */ + protected ArrayList remove(VectorStep vector) { + ArrayList list = new ArrayList(); + int length = size(); + for (int i = indexOf(vector); i < length; i++) { + list.add(0, removeEnd()); + } + return list; + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java b/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java index cc4d3af8..f54d3a68 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java @@ -1,509 +1,509 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.beans.*; -import java.util.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.controls.*; - -/** - * A VectorSum draws a series of VectorSteps that represent a - * vector sum of its set of vectors. - * - * @author Douglas Brown - */ -public class VectorSum extends Vector { - - // instance fields - protected Vector[] vectors; - protected ArrayList vectorNames = new ArrayList(); - protected JMenuItem inspectorItem; - protected Map tails = new HashMap(); - protected VectorSumInspector inspector; - - /** - * Constructs an empty VectorSum. - */ - public VectorSum() { - this(new Vector[0]); - } - - /** - * Constructs a VectorSum with specified vectors. - * - * @param vectors an array of vectors - */ - public VectorSum(Vector[] vectors) { - super(); - defaultColors = new Color[] {new Color(51, 204, 51)}; - setName(TrackerRes.getString("VectorSum.New.Name")); //$NON-NLS-1$ - setFootprints(new Footprint[] - {LineFootprint.getFootprint("Footprint.BoldArrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.Arrow"), //$NON-NLS-1$ - LineFootprint.getFootprint("Footprint.BigArrow")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - Footprint[] footprint = getFootprints(); - for (int i = 0; i < footprint.length; i++) { - if (footprint[i] instanceof ArrowFootprint) { - ArrowFootprint arrow = (ArrowFootprint) footprint[i]; - arrow.setDashArray(LineFootprint.DASHED_LINE); - } - } - this.vectors = vectors; - setColor(defaultColors[0]); - for (int i = 0; i < vectors.length; i++) - vectors[i].addPropertyChangeListener(this); - locked = true; - // set initial hint - if (vectors.length == 0) - hint = TrackerRes.getString("VectorSum.Empty.Hint"); //$NON-NLS-1$ - update(); - } - - /** - * Overrides Vector draw method. - * - * @param panel the drawing panel requesting the drawing - * @param _g the graphics context on which to draw - */ - public void draw(DrawingPanel panel, Graphics _g) { - // add vectors listed in vectorNames (this occurs on initial loading) - if (!vectorNames.isEmpty() && panel.getClass().equals(TrackerPanel.class)) { - TrackerPanel trackerPanel = (TrackerPanel) panel; - Iterator it = vectorNames.iterator(); - while (it.hasNext()) { - String name = it.next(); - for (Vector v: trackerPanel.getDrawables(Vector.class)) { - if (v.getName().equals(name)) - addVector(v); - } - } - vectorNames.clear(); - } - super.draw(panel, _g); - } - - /** - * Finds the interactive drawable object located at the specified - * pixel position. - * - * @param panel the drawing panel - * @param xpix the x pixel position on the panel - * @param ypix the y pixel position on the panel - * @return the first step TPoint that is hit - */ - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - Interactive ia = super.findInteractive(panel, xpix, ypix); - if (ia instanceof VectorStep.Handle) { - hint = TrackerRes.getString("Vector.Handle.Hint"); //$NON-NLS-1$ - } - else if (vectors.length == 0) { - hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ - } - else hint = null; - return ia; - } - - /** - * Adds a vector to this sum. - * - * @param vec the vector - */ - public void addVector(Vector vec) { - synchronized(vectors) { - // don't add if already present - for (int i = 0; i < vectors.length; i++) { - if (vectors[i] == vec) return; - } - Vector[] newVectors = new Vector[vectors.length + 1]; - System.arraycopy(vectors, 0, newVectors, 0, vectors.length); - newVectors[vectors.length] = vec; - vectors = newVectors; - vec.addPropertyChangeListener(this); - } - update(); - } - - /** - * Removes a vector from this sum. - * - * @param vec the vector - */ - public void removeVector(Vector vec) { - synchronized(vectors) { - for (int i = 0; i < vectors.length; i++) - if (vectors[i] == vec) { - vec.removePropertyChangeListener(this); - Vector[] newVectors = new Vector[vectors.length - 1]; - System.arraycopy(vectors, 0, newVectors, 0, i); - System.arraycopy(vectors, i+1, newVectors, i, newVectors.length-i); - vectors = newVectors; - break; - } - } - update(); - } - - /** - * Gets the array of vectors in this sum. - * - * @return a shallow clone of the vectors array - */ - public Vector[] getVectors() { - synchronized(vectors) { - return vectors.clone(); - } - } - - /** - * Determines if the specified vector is in this sum. - * - * @param vec the vector - * @return true if vector is in this sum - */ - public boolean contains(Vector vec) { - synchronized(vectors) { - for (int i = 0; i < vectors.length; i++) { - if (vectors[i] == vec) return true; - } - return false; - } - } - - /** - * Overrides vector method. - * Saves the specified tail position, then updates the step. - * - * @param n the frame number - * @param x the tail x coordinate in image space - * @param y the tail y coordinate in image space - * @param xc ignored - * @param yc ignored - * @return the new step - */ - public Step createStep(int n, double x, double y, double xc, double yc) { - if (isLocked()) { - tails.put(new Integer(n), new TPoint(x, y)); - update(n); - return getStep(n); - } - return super.createStep(n, x, y, xc, yc); - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - if (inspector!=null && inspector.isVisible()) { - // call setVisible to force inspector to resize itself - inspector.setVisible(true); - } - } - - /** - * Overrides TTrack setLocked method. VectorSum is always locked. - * - * @param locked ignored - */ - public void setLocked(boolean locked) {/** empty block */} - - /** - * Overrides TTrack isStepComplete method. Always returns true. - * - * @param n the frame number - * @return true always since sum gets data from vectors - */ - public boolean isStepComplete(int n) { - return true; - } - - /** - * Overrides TTrack isDependent method to return true. - * - * @return true since sum is dependent on its vectors - */ - public boolean isDependent() { - return true; - } - - /** - * Responds to property change events. VectorSum listens for the - * following events: "track" from tracker panel, "color", "footprint" - * and "step" from Vector. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (name.equals("track") && e.getNewValue() == null) { // track deleted //$NON-NLS-1$ - TTrack track = (TTrack)e.getOldValue(); - if (track instanceof Vector) - removeVector((Vector)track); - } - if (e.getSource() instanceof Vector) { - if (name.equals("step")){ //$NON-NLS-1$ - int n = ((Integer)e.getNewValue()).intValue(); - update(n); - } - } - else super.propertyChange(e); - } - - /** - * Cleans up associated resources when this track is deleted or cleared. - */ - protected void cleanup() { - super.cleanup(); - if (inspector != null) inspector.dispose(); - } - - /** - * Updates all steps. - */ - private void update() { - int length = getSteps().length; - for (int n = 0; n < length; n++) - update(n); - } - - /** - * Updates the specified step. - * - * @param n the frame number - */ - private void update(int n) { - if (vectors.length == 0) { // delete step, if any - locked = false; - VectorStep deletedStep = (VectorStep)deleteStep(n); - if (deletedStep != null) { - deletedStep.attach(null); - repaint(deletedStep); - } - locked = true; - return; - } - double x = 0, y = 0; // x and y components in imagespace - // add components in imagespace - for (int i = 0; i < vectors.length; i++) { - VectorStep step = (VectorStep)vectors[i].getStep(n); - if (step == null) { // if any vector missing, - if (getStep(n) != null) { // delete existing step if any - locked = false; - VectorStep deletedStep = (VectorStep)deleteStep(n); - tails.put(new Integer(n), deletedStep.getTail()); - deletedStep.attach(null); - repaint(deletedStep); - locked = true; - } - return; - } - - x += step.getXComponent(); - y += step.getYComponent(); - } - - // create step if none exists - VectorStep step = (VectorStep)getStep(n); - if (step == null) { - locked = false; - VectorStep newStep = null; - Integer i = new Integer(n); - TPoint tail = tails.get(i); - if (tail != null) { - newStep = (VectorStep) createStep(n, tail.getX(), tail.getY(), x, y); - tails.remove(i); - } - else { - newStep = (VectorStep) createStep(n, 0, 0, x, y); - Iterator it = panels.iterator(); - while (it.hasNext()) { - TrackerPanel panel = it.next(); - newStep.attach(panel.getSnapPoint()); - } - } - newStep.setTipEnabled(false); - newStep.setDefaultPointIndex(2); // handle - repaint(newStep); - locked = true; - } - // or set components of existing step - else { - locked = false; - step.setXYComponents(x, y); - locked = true; - } - } - - /** - * Returns a menu with items that control this track. - * - * @param trackerPanel the tracker panel - * @return a menu - */ - public JMenu getMenu(TrackerPanel trackerPanel) { - // create a vector sum inspector item - inspectorItem = new JMenuItem( - TrackerRes.getString("VectorSum.MenuItem.Inspector")); //$NON-NLS-1$ - inspectorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - VectorSumInspector inspector = getInspector(); - inspector.updateDisplay(); - inspector.setVisible(true); - } - }); - // assemble the menu - JMenu menu = super.getMenu(trackerPanel); - // remove unwanted menu items and separators - menu.remove(lockedItem); - menu.remove(autoAdvanceItem); - menu.remove(markByDefaultItem); - menu.insert(inspectorItem, 0); - if (menu.getItemCount() > 1) - menu.insertSeparator(1); - // eliminate any double separators - Object prevItem = inspectorItem; - int n = menu.getItemCount(); - for (int j = 1; j < n; j++) { - Object item = menu.getItem(j); - if (item == null && prevItem == null) { // found extra separator - menu.remove(j-1); - j = j-1; - n = n-1; - } - prevItem = item; - } - return menu; - } - - /** - * Overrides TTrack getToolbarPointComponents method. - * - * @param trackerPanel the tracker panel - * @param point the TPoint - * @return a list of components - */ - public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, - TPoint point) { - ArrayList list = super.getToolbarPointComponents(trackerPanel, point); - xField.setEnabled(false); - yField.setEnabled(false); - return list; - } - - /** - * Overrides Object toString method. - * - * @return a description of this object - */ - public String toString() { - return TrackerRes.getString("VectorSum.Name") + " \"" + name + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - VectorSum sum = (VectorSum) obj; - // save names of vectors in this sum - ArrayList list = new ArrayList(); - Vector[] vectors = sum.getVectors(); - for (int i = 0; i < vectors.length; i++) { - list.add(vectors[i].getName()); - } - control.setValue("vectors", list); //$NON-NLS-1$ - // save this vector data - XML.getLoader(Vector.class).saveObject(control, obj); - } - - /** - * Creates a new object. - * - * @param control the XMLControl with the object data - * @return the newly created object - */ - public Object createObject(XMLControl control) { - return new VectorSum(); - } - - /** - * Loads an object with data from an XMLControl. - * - * @param control the element - * @param obj the object - * @return the loaded object - */ - public Object loadObject(XMLControl control, Object obj) { - VectorSum sum = (VectorSum) obj; - // load this vector data - XML.getLoader(Vector.class).loadObject(control, obj); - // load names of vectors in this sum - ArrayList names = ArrayList.class.cast(control.getObject("vectors")); //$NON-NLS-1$ - Iterator it = names.iterator(); - while (it.hasNext()) { - sum.vectorNames.add(it.next().toString()); - } - return obj; - } - } - - /** - * Gets the vector sum inspector. - * - * @return the vector sum inspector - */ - public VectorSumInspector getInspector() { - if (inspector == null) { - inspector = new VectorSumInspector(this); - inspector.setLocation(200, 200); - } - return inspector; - } - -} - +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.beans.*; +import java.util.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.controls.*; + +/** + * A VectorSum draws a series of VectorSteps that represent a + * vector sum of its set of vectors. + * + * @author Douglas Brown + */ +public class VectorSum extends Vector { + + // instance fields + protected Vector[] vectors; + protected ArrayList vectorNames = new ArrayList(); + protected JMenuItem inspectorItem; + protected Map tails = new HashMap(); + protected VectorSumInspector inspector; + + /** + * Constructs an empty VectorSum. + */ + public VectorSum() { + this(new Vector[0]); + } + + /** + * Constructs a VectorSum with specified vectors. + * + * @param vectors an array of vectors + */ + public VectorSum(Vector[] vectors) { + super(); + defaultColors = new Color[] {new Color(51, 204, 51)}; + setName(TrackerRes.getString("VectorSum.New.Name")); //$NON-NLS-1$ + setFootprints(new Footprint[] + {LineFootprint.getFootprint("Footprint.BoldArrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.Arrow"), //$NON-NLS-1$ + LineFootprint.getFootprint("Footprint.BigArrow")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + Footprint[] footprint = getFootprints(); + for (int i = 0; i < footprint.length; i++) { + if (footprint[i] instanceof ArrowFootprint) { + ArrowFootprint arrow = (ArrowFootprint) footprint[i]; + arrow.setDashArray(LineFootprint.DASHED_LINE); + } + } + this.vectors = vectors; + setColor(defaultColors[0]); + for (int i = 0; i < vectors.length; i++) + vectors[i].addPropertyChangeListener(this); + locked = true; + // set initial hint + if (vectors.length == 0) + hint = TrackerRes.getString("VectorSum.Empty.Hint"); //$NON-NLS-1$ + update(); + } + + /** + * Overrides Vector draw method. + * + * @param panel the drawing panel requesting the drawing + * @param _g the graphics context on which to draw + */ + public void draw(DrawingPanel panel, Graphics _g) { + // add vectors listed in vectorNames (this occurs on initial loading) + if (!vectorNames.isEmpty() && panel.getClass().equals(TrackerPanel.class)) { + TrackerPanel trackerPanel = (TrackerPanel) panel; + Iterator it = vectorNames.iterator(); + while (it.hasNext()) { + String name = it.next(); + for (Vector v: trackerPanel.getDrawables(Vector.class)) { + if (v.getName().equals(name)) + addVector(v); + } + } + vectorNames.clear(); + } + super.draw(panel, _g); + } + + /** + * Finds the interactive drawable object located at the specified + * pixel position. + * + * @param panel the drawing panel + * @param xpix the x pixel position on the panel + * @param ypix the y pixel position on the panel + * @return the first step TPoint that is hit + */ + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + Interactive ia = super.findInteractive(panel, xpix, ypix); + if (ia instanceof VectorStep.Handle) { + hint = TrackerRes.getString("Vector.Handle.Hint"); //$NON-NLS-1$ + } + else if (vectors.length == 0) { + hint = TrackerRes.getString("CenterOfMass.Empty.Hint"); //$NON-NLS-1$ + } + else hint = null; + return ia; + } + + /** + * Adds a vector to this sum. + * + * @param vec the vector + */ + public void addVector(Vector vec) { + synchronized(vectors) { + // don't add if already present + for (int i = 0; i < vectors.length; i++) { + if (vectors[i] == vec) return; + } + Vector[] newVectors = new Vector[vectors.length + 1]; + System.arraycopy(vectors, 0, newVectors, 0, vectors.length); + newVectors[vectors.length] = vec; + vectors = newVectors; + vec.addPropertyChangeListener(this); + } + update(); + } + + /** + * Removes a vector from this sum. + * + * @param vec the vector + */ + public void removeVector(Vector vec) { + synchronized(vectors) { + for (int i = 0; i < vectors.length; i++) + if (vectors[i] == vec) { + vec.removePropertyChangeListener(this); + Vector[] newVectors = new Vector[vectors.length - 1]; + System.arraycopy(vectors, 0, newVectors, 0, i); + System.arraycopy(vectors, i+1, newVectors, i, newVectors.length-i); + vectors = newVectors; + break; + } + } + update(); + } + + /** + * Gets the array of vectors in this sum. + * + * @return a shallow clone of the vectors array + */ + public Vector[] getVectors() { + synchronized(vectors) { + return vectors.clone(); + } + } + + /** + * Determines if the specified vector is in this sum. + * + * @param vec the vector + * @return true if vector is in this sum + */ + public boolean contains(Vector vec) { + synchronized(vectors) { + for (int i = 0; i < vectors.length; i++) { + if (vectors[i] == vec) return true; + } + return false; + } + } + + /** + * Overrides vector method. + * Saves the specified tail position, then updates the step. + * + * @param n the frame number + * @param x the tail x coordinate in image space + * @param y the tail y coordinate in image space + * @param xc ignored + * @param yc ignored + * @return the new step + */ + public Step createStep(int n, double x, double y, double xc, double yc) { + if (isLocked()) { + tails.put(new Integer(n), new TPoint(x, y)); + update(n); + return getStep(n); + } + return super.createStep(n, x, y, xc, yc); + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + if (inspector!=null && inspector.isVisible()) { + // call setVisible to force inspector to resize itself + inspector.setVisible(true); + } + } + + /** + * Overrides TTrack setLocked method. VectorSum is always locked. + * + * @param locked ignored + */ + public void setLocked(boolean locked) {/** empty block */} + + /** + * Overrides TTrack isStepComplete method. Always returns true. + * + * @param n the frame number + * @return true always since sum gets data from vectors + */ + public boolean isStepComplete(int n) { + return true; + } + + /** + * Overrides TTrack isDependent method to return true. + * + * @return true since sum is dependent on its vectors + */ + public boolean isDependent() { + return true; + } + + /** + * Responds to property change events. VectorSum listens for the + * following events: "track" from tracker panel, "color", "footprint" + * and "step" from Vector. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + String name = e.getPropertyName(); + if (name.equals("track") && e.getNewValue() == null) { // track deleted //$NON-NLS-1$ + TTrack track = (TTrack)e.getOldValue(); + if (track instanceof Vector) + removeVector((Vector)track); + } + if (e.getSource() instanceof Vector) { + if (name.equals("step")){ //$NON-NLS-1$ + int n = ((Integer)e.getNewValue()).intValue(); + update(n); + } + } + else super.propertyChange(e); + } + + /** + * Cleans up associated resources when this track is deleted or cleared. + */ + protected void cleanup() { + super.cleanup(); + if (inspector != null) inspector.dispose(); + } + + /** + * Updates all steps. + */ + private void update() { + int length = getSteps().length; + for (int n = 0; n < length; n++) + update(n); + } + + /** + * Updates the specified step. + * + * @param n the frame number + */ + private void update(int n) { + if (vectors.length == 0) { // delete step, if any + locked = false; + VectorStep deletedStep = (VectorStep)deleteStep(n); + if (deletedStep != null) { + deletedStep.attach(null); + repaint(deletedStep); + } + locked = true; + return; + } + double x = 0, y = 0; // x and y components in imagespace + // add components in imagespace + for (int i = 0; i < vectors.length; i++) { + VectorStep step = (VectorStep)vectors[i].getStep(n); + if (step == null) { // if any vector missing, + if (getStep(n) != null) { // delete existing step if any + locked = false; + VectorStep deletedStep = (VectorStep)deleteStep(n); + tails.put(new Integer(n), deletedStep.getTail()); + deletedStep.attach(null); + repaint(deletedStep); + locked = true; + } + return; + } + + x += step.getXComponent(); + y += step.getYComponent(); + } + + // create step if none exists + VectorStep step = (VectorStep)getStep(n); + if (step == null) { + locked = false; + VectorStep newStep = null; + Integer i = new Integer(n); + TPoint tail = tails.get(i); + if (tail != null) { + newStep = (VectorStep) createStep(n, tail.getX(), tail.getY(), x, y); + tails.remove(i); + } + else { + newStep = (VectorStep) createStep(n, 0, 0, x, y); + Iterator it = panels.iterator(); + while (it.hasNext()) { + TrackerPanel panel = it.next(); + newStep.attach(panel.getSnapPoint()); + } + } + newStep.setTipEnabled(false); + newStep.setDefaultPointIndex(2); // handle + repaint(newStep); + locked = true; + } + // or set components of existing step + else { + locked = false; + step.setXYComponents(x, y); + locked = true; + } + } + + /** + * Returns a menu with items that control this track. + * + * @param trackerPanel the tracker panel + * @return a menu + */ + public JMenu getMenu(TrackerPanel trackerPanel) { + // create a vector sum inspector item + inspectorItem = new JMenuItem( + TrackerRes.getString("VectorSum.MenuItem.Inspector")); //$NON-NLS-1$ + inspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + VectorSumInspector inspector = getInspector(); + inspector.updateDisplay(); + inspector.setVisible(true); + } + }); + // assemble the menu + JMenu menu = super.getMenu(trackerPanel); + // remove unwanted menu items and separators + menu.remove(lockedItem); + menu.remove(autoAdvanceItem); + menu.remove(markByDefaultItem); + menu.insert(inspectorItem, 0); + if (menu.getItemCount() > 1) + menu.insertSeparator(1); + // eliminate any double separators + Object prevItem = inspectorItem; + int n = menu.getItemCount(); + for (int j = 1; j < n; j++) { + Object item = menu.getItem(j); + if (item == null && prevItem == null) { // found extra separator + menu.remove(j-1); + j = j-1; + n = n-1; + } + prevItem = item; + } + return menu; + } + + /** + * Overrides TTrack getToolbarPointComponents method. + * + * @param trackerPanel the tracker panel + * @param point the TPoint + * @return a list of components + */ + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + xField.setEnabled(false); + yField.setEnabled(false); + return list; + } + + /** + * Overrides Object toString method. + * + * @return a description of this object + */ + public String toString() { + return TrackerRes.getString("VectorSum.Name") + " \"" + name + "\""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + VectorSum sum = (VectorSum) obj; + // save names of vectors in this sum + ArrayList list = new ArrayList(); + Vector[] vectors = sum.getVectors(); + for (int i = 0; i < vectors.length; i++) { + list.add(vectors[i].getName()); + } + control.setValue("vectors", list); //$NON-NLS-1$ + // save this vector data + XML.getLoader(Vector.class).saveObject(control, obj); + } + + /** + * Creates a new object. + * + * @param control the XMLControl with the object data + * @return the newly created object + */ + public Object createObject(XMLControl control) { + return new VectorSum(); + } + + /** + * Loads an object with data from an XMLControl. + * + * @param control the element + * @param obj the object + * @return the loaded object + */ + public Object loadObject(XMLControl control, Object obj) { + VectorSum sum = (VectorSum) obj; + // load this vector data + XML.getLoader(Vector.class).loadObject(control, obj); + // load names of vectors in this sum + ArrayList names = ArrayList.class.cast(control.getObject("vectors")); //$NON-NLS-1$ + Iterator it = names.iterator(); + while (it.hasNext()) { + sum.vectorNames.add(it.next().toString()); + } + return obj; + } + } + + /** + * Gets the vector sum inspector. + * + * @return the vector sum inspector + */ + public VectorSumInspector getInspector() { + if (inspector == null) { + inspector = new VectorSumInspector(this); + inspector.setLocation(200, 200); + } + return inspector; + } + +} + diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java b/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java index d9f81893..75a6f73a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java @@ -1,262 +1,262 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.beans.*; -import java.awt.*; -import java.awt.event.*; - -import javax.swing.*; -import javax.swing.border.*; - -import org.opensourcephysics.tools.FontSizer; - -/** - * This displays and sets VectorSum properties. - * - * @author Douglas Brown - */ -public class VectorSumInspector extends JDialog - implements PropertyChangeListener { - - // instance fields - protected VectorSum sum; - protected TrackerPanel trackerPanel; - protected JButton okButton; - protected JPanel mainPanel; - protected JPanel checkboxPanel; - protected JPanel sumPanel; - protected ActionListener listener; - protected boolean isVisible; - - /** - * Constructs a VectorSumInspector. - * - * @param sum the vector sum - */ - public VectorSumInspector(VectorSum sum) { - // nonmodal - super(JOptionPane.getFrameForComponent(sum.trackerPanel), false); - this.sum = sum; - trackerPanel = sum.trackerPanel; - if (trackerPanel != null) { - trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - // listener for the checkboxes - listener = new ActionListener() { - public void actionPerformed(ActionEvent e) {updateSum();} - }; - setTitle(TrackerRes.getString("VectorSumInspector.Title") //$NON-NLS-1$ - + " \"" + sum.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ - setResizable(false); - createGUI(); - initialize(); - pack(); - } - - /** - * Overrides JDialog setVisible method. - * - * @param vis true to show this inspector - */ - public void setVisible(boolean vis) { - if (vis) { - FontSizer.setFonts(this, FontSizer.getLevel()); - pack(); - } - super.setVisible(vis); - isVisible = vis; - } - - /** - * Initializes this inpector. - */ - public void initialize() { - updateDisplay(); - } - - /** - * Disposes of this inpector. - */ - public void dispose() { - checkboxPanel.removeAll(); - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ - Iterator it = trackerPanel.getDrawables(Vector.class).iterator(); - while (it.hasNext()) { - Vector v = it.next(); - v.removePropertyChangeListener("name", this); //$NON-NLS-1$ - v.removePropertyChangeListener("color", this); //$NON-NLS-1$ - v.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - } - TFrame frame = trackerPanel.getTFrame(); - if (frame != null) { - frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ - } - } - super.dispose(); - } - - /** - * Responds to property change events. VectorSumInspector listens for the - * following events: "color", "footprint" and "name" from Vector, "track" - * from TrackerPanel, and "tab" from TFrame. - * - * @param e the property change event - */ - public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ - if (trackerPanel != null && e.getNewValue() == trackerPanel) { - setVisible(isVisible); - } - else { - boolean vis = isVisible; - setVisible(false); - isVisible = vis; - } - } - else updateDisplay(); - } - - /** - * Updates this inspector to show sum's current vectors. - */ - protected void updateDisplay() { - setTitle(TrackerRes.getString("VectorSumInspector.Title") //$NON-NLS-1$ - + " \"" + sum.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ - // make checkboxes for all vectors (but not vector sums) in tracker panel - checkboxPanel.removeAll(); - Iterator it = trackerPanel.getDrawables(Vector.class).iterator(); - while (it.hasNext()) { - Vector v = it.next(); - v.removePropertyChangeListener("name", this); //$NON-NLS-1$ - v.removePropertyChangeListener("color", this); //$NON-NLS-1$ - v.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ - v.addPropertyChangeListener("name", this); //$NON-NLS-1$ - v.addPropertyChangeListener("color", this); //$NON-NLS-1$ - v.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ - if (v instanceof VectorSum) continue; // don't include other sums - JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem( - v.getName(), v.getFootprint().getIcon(21, 16)); - // check the checkbox and show components if vector is in the sum - if (sum.contains(v)) { - checkbox.setSelected(true); - } - checkbox.addActionListener(listener); - checkboxPanel.add(checkbox); - } - FontSizer.setFonts(checkboxPanel, FontSizer.getLevel()); - pack(); - repaint(); - } - -//_____________________________ private methods ____________________________ - - /** - * Creates the visible components of this panel. - */ - private void createGUI() { - JPanel inspectorPanel = new JPanel(new BorderLayout()); - setContentPane(inspectorPanel); - // create mainPanel - mainPanel = new JPanel(new GridLayout(1, 0)); - Border etched = BorderFactory.createEtchedBorder(); - TitledBorder title = BorderFactory.createTitledBorder( - etched, TrackerRes.getString("VectorSumInspector.Border.Title")); //$NON-NLS-1$ - mainPanel.setBorder(title); - inspectorPanel.add(mainPanel, BorderLayout.CENTER); - // create checkboxPanel - checkboxPanel = new JPanel(new GridLayout(0, 1)); - mainPanel.add(checkboxPanel); - // create sumPanel - sumPanel = new JPanel(new GridLayout(0, 2)); - // create ok button - okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ - okButton.setForeground(new Color(0, 0, 102)); - okButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - // create buttonbar at bottom - JPanel buttonbar = new JPanel(new GridLayout(1, 3)); - buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); - inspectorPanel.add(buttonbar, BorderLayout.SOUTH); - Box box = Box.createHorizontalBox(); - buttonbar.add(box); - buttonbar.add(okButton); - box = Box.createHorizontalBox(); - buttonbar.add(box); - } - - /** - * Updates the vector sum to reflect the current checkbox states. - */ - private void updateSum() { - // get the checkbox array - Component[] checkboxes = checkboxPanel.getComponents(); - for (int i = 0; i < checkboxes.length; i++) { - JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem)checkboxes[i]; - // get the vector - Vector v = getVector(checkbox.getActionCommand()); - if (checkbox.isSelected() && !sum.contains(v)) { - // add and show selected vectors - sum.addVector(v); - v.setVisible(true); - } - if (!checkbox.isSelected() && sum.contains(v)) - // remove unselected vectors - sum.removeVector(v); - } - if (trackerPanel != null) { - if (trackerPanel.getSelectedTrack() == sum && - trackerPanel.getSelectedPoint() != null) { - trackerPanel.getSelectedPoint().showCoordinates(trackerPanel); - } - trackerPanel.repaint(); - } - } - - /** - * Gets the vector with the specified name. - * - * @param name name of the vector - * @return the vector - */ - private Vector getVector(String name) { - if (trackerPanel != null) { - ArrayList tracks = trackerPanel.getDrawables(Vector.class); - for (Vector v: tracks) { - if (v.getName() == name) return v; - } - } - return null; - } -} +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.beans.*; +import java.awt.*; +import java.awt.event.*; + +import javax.swing.*; +import javax.swing.border.*; + +import org.opensourcephysics.tools.FontSizer; + +/** + * This displays and sets VectorSum properties. + * + * @author Douglas Brown + */ +public class VectorSumInspector extends JDialog + implements PropertyChangeListener { + + // instance fields + protected VectorSum sum; + protected TrackerPanel trackerPanel; + protected JButton okButton; + protected JPanel mainPanel; + protected JPanel checkboxPanel; + protected JPanel sumPanel; + protected ActionListener listener; + protected boolean isVisible; + + /** + * Constructs a VectorSumInspector. + * + * @param sum the vector sum + */ + public VectorSumInspector(VectorSum sum) { + // nonmodal + super(JOptionPane.getFrameForComponent(sum.trackerPanel), false); + this.sum = sum; + trackerPanel = sum.trackerPanel; + if (trackerPanel != null) { + trackerPanel.addPropertyChangeListener("track", this); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.addPropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + // listener for the checkboxes + listener = new ActionListener() { + public void actionPerformed(ActionEvent e) {updateSum();} + }; + setTitle(TrackerRes.getString("VectorSumInspector.Title") //$NON-NLS-1$ + + " \"" + sum.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ + setResizable(false); + createGUI(); + initialize(); + pack(); + } + + /** + * Overrides JDialog setVisible method. + * + * @param vis true to show this inspector + */ + public void setVisible(boolean vis) { + if (vis) { + FontSizer.setFonts(this, FontSizer.getLevel()); + pack(); + } + super.setVisible(vis); + isVisible = vis; + } + + /** + * Initializes this inpector. + */ + public void initialize() { + updateDisplay(); + } + + /** + * Disposes of this inpector. + */ + public void dispose() { + checkboxPanel.removeAll(); + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("track", this); //$NON-NLS-1$ + Iterator it = trackerPanel.getDrawables(Vector.class).iterator(); + while (it.hasNext()) { + Vector v = it.next(); + v.removePropertyChangeListener("name", this); //$NON-NLS-1$ + v.removePropertyChangeListener("color", this); //$NON-NLS-1$ + v.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + } + TFrame frame = trackerPanel.getTFrame(); + if (frame != null) { + frame.removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.dispose(); + } + + /** + * Responds to property change events. VectorSumInspector listens for the + * following events: "color", "footprint" and "name" from Vector, "track" + * from TrackerPanel, and "tab" from TFrame. + * + * @param e the property change event + */ + public void propertyChange(PropertyChangeEvent e) { + if (e.getPropertyName().equals("tab")) { //$NON-NLS-1$ + if (trackerPanel != null && e.getNewValue() == trackerPanel) { + setVisible(isVisible); + } + else { + boolean vis = isVisible; + setVisible(false); + isVisible = vis; + } + } + else updateDisplay(); + } + + /** + * Updates this inspector to show sum's current vectors. + */ + protected void updateDisplay() { + setTitle(TrackerRes.getString("VectorSumInspector.Title") //$NON-NLS-1$ + + " \"" + sum.getName() + "\""); //$NON-NLS-1$ //$NON-NLS-2$ + // make checkboxes for all vectors (but not vector sums) in tracker panel + checkboxPanel.removeAll(); + Iterator it = trackerPanel.getDrawables(Vector.class).iterator(); + while (it.hasNext()) { + Vector v = it.next(); + v.removePropertyChangeListener("name", this); //$NON-NLS-1$ + v.removePropertyChangeListener("color", this); //$NON-NLS-1$ + v.removePropertyChangeListener("footprint", this); //$NON-NLS-1$ + v.addPropertyChangeListener("name", this); //$NON-NLS-1$ + v.addPropertyChangeListener("color", this); //$NON-NLS-1$ + v.addPropertyChangeListener("footprint", this); //$NON-NLS-1$ + if (v instanceof VectorSum) continue; // don't include other sums + JCheckBoxMenuItem checkbox = new JCheckBoxMenuItem( + v.getName(), v.getFootprint().getIcon(21, 16)); + // check the checkbox and show components if vector is in the sum + if (sum.contains(v)) { + checkbox.setSelected(true); + } + checkbox.addActionListener(listener); + checkboxPanel.add(checkbox); + } + FontSizer.setFonts(checkboxPanel, FontSizer.getLevel()); + pack(); + repaint(); + } + +//_____________________________ private methods ____________________________ + + /** + * Creates the visible components of this panel. + */ + private void createGUI() { + JPanel inspectorPanel = new JPanel(new BorderLayout()); + setContentPane(inspectorPanel); + // create mainPanel + mainPanel = new JPanel(new GridLayout(1, 0)); + Border etched = BorderFactory.createEtchedBorder(); + TitledBorder title = BorderFactory.createTitledBorder( + etched, TrackerRes.getString("VectorSumInspector.Border.Title")); //$NON-NLS-1$ + mainPanel.setBorder(title); + inspectorPanel.add(mainPanel, BorderLayout.CENTER); + // create checkboxPanel + checkboxPanel = new JPanel(new GridLayout(0, 1)); + mainPanel.add(checkboxPanel); + // create sumPanel + sumPanel = new JPanel(new GridLayout(0, 2)); + // create ok button + okButton = new JButton(TrackerRes.getString("Dialog.Button.OK")); //$NON-NLS-1$ + okButton.setForeground(new Color(0, 0, 102)); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setVisible(false); + } + }); + // create buttonbar at bottom + JPanel buttonbar = new JPanel(new GridLayout(1, 3)); + buttonbar.setBorder(BorderFactory.createEmptyBorder(1, 0, 3, 0)); + inspectorPanel.add(buttonbar, BorderLayout.SOUTH); + Box box = Box.createHorizontalBox(); + buttonbar.add(box); + buttonbar.add(okButton); + box = Box.createHorizontalBox(); + buttonbar.add(box); + } + + /** + * Updates the vector sum to reflect the current checkbox states. + */ + private void updateSum() { + // get the checkbox array + Component[] checkboxes = checkboxPanel.getComponents(); + for (int i = 0; i < checkboxes.length; i++) { + JCheckBoxMenuItem checkbox = (JCheckBoxMenuItem)checkboxes[i]; + // get the vector + Vector v = getVector(checkbox.getActionCommand()); + if (checkbox.isSelected() && !sum.contains(v)) { + // add and show selected vectors + sum.addVector(v); + v.setVisible(true); + } + if (!checkbox.isSelected() && sum.contains(v)) + // remove unselected vectors + sum.removeVector(v); + } + if (trackerPanel != null) { + if (trackerPanel.getSelectedTrack() == sum && + trackerPanel.getSelectedPoint() != null) { + trackerPanel.getSelectedPoint().showCoordinates(trackerPanel); + } + trackerPanel.repaint(); + } + } + + /** + * Gets the vector with the specified name. + * + * @param name name of the vector + * @return the vector + */ + private Vector getVector(String name) { + if (trackerPanel != null) { + ArrayList tracks = trackerPanel.getDrawables(Vector.class); + for (Vector v: tracks) { + if (v.getName() == name) return v; + } + } + return null; + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java index 88d75fef..1fab4f1f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java +++ b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java @@ -1,306 +1,306 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Rectangle; -import java.awt.Stroke; -import java.awt.geom.Line2D; -import java.awt.geom.Point2D; -import java.util.ArrayList; - -import org.opensourcephysics.display.DrawingPanel; -import org.opensourcephysics.media.core.TPoint; -import org.opensourcephysics.media.core.Trackable; - -/** - * This draws a world grid on a TrackerPanel. - * - * @author Douglas Brown - */ -public class WorldGrid implements Trackable { - - private static final float[] DASHED_LINE = new float[] {1, 8}; - private static final float[] DOTTED_LINE = new float[] {2, 2}; - private static Stroke dashed, dotted; - private static int defaultAlpha = 128; - private static Color defaultColor = new Color(128, 128, 128, defaultAlpha); - - ArrayList dashedLines = new ArrayList(); - ArrayList dottedLines = new ArrayList(); - TPoint[] viewCorners = {new TPoint(), new TPoint(), new TPoint(), new TPoint()}; - Point2D[] worldCorners = new Point2D[4]; - TPoint[] lineEnds = {new TPoint(), new TPoint()}; - double[] minMaxWorldValues = new double[4]; - int[] minMaxIndices = new int[4]; - boolean showMajorX=true, showMinorX=true, showMajorY=true, showMinorY=true; - private int alpha = defaultAlpha; - private Color lineColor = defaultColor; - private boolean visible; - - /** - * Constructor. - * - * @param panel a TrackerPanel - */ - public WorldGrid() { - dashed = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DASHED_LINE,0); - dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); - } - - public void draw(DrawingPanel panel, Graphics g) { - if (!visible || (!showMajorX && !showMajorY)) return; - Graphics2D g2 = (Graphics2D)g; - TrackerPanel trackerPanel = (TrackerPanel)panel; - // find world coordinates of corners of the visible trackerPanel view - Rectangle rect = trackerPanel.getVisibleRect(); - for (int i=0; i<4; i++) { - switch (i) { - case 0: // top left - viewCorners[i].setScreenPosition(rect.x, rect.y, trackerPanel); - break; - case 1: // top right - viewCorners[i].setScreenPosition(rect.x+rect.width, rect.y, trackerPanel); - break; - case 2: // bottom left - viewCorners[i].setScreenPosition(rect.x, rect.y+rect.height, trackerPanel); - break; - default: // bottom right - viewCorners[i].setScreenPosition(rect.x+rect.width, rect.y+rect.height, trackerPanel); - } - worldCorners[i] = viewCorners[i].getWorldPosition(trackerPanel); - if (i==0) { - minMaxWorldValues[0] = minMaxWorldValues[1] = worldCorners[i].getX(); - minMaxWorldValues[2] = minMaxWorldValues[3] = worldCorners[i].getY(); - } - else { - minMaxWorldValues[0] = Math.min(minMaxWorldValues[0], worldCorners[i].getX()); // xMin - minMaxWorldValues[1] = Math.max(minMaxWorldValues[1], worldCorners[i].getX()); // xMax - minMaxWorldValues[2] = Math.min(minMaxWorldValues[2], worldCorners[i].getY()); // yMin - minMaxWorldValues[3] = Math.max(minMaxWorldValues[3], worldCorners[i].getY()); // yMax - } - } - - // determine a world delta between lines at least 30 pixels apart - int lineCount = Math.min(60, rect.width/25); - // make a first approximation - double delta = (minMaxWorldValues[1]-minMaxWorldValues[0])/lineCount; - - // find power of ten - double pow = 1; - while (pow*10 < delta) pow *= 10; - while (pow > delta) pow /= 10; - - // get "significand" and increase to nearest 2, 5 or 10 - double significand = delta/pow; // number between 1 and 10 - int minorSpacing = 10; - int majorSpacing = 100; - if (significand<2) { - minorSpacing = 2; - majorSpacing = 10; - } - else if (significand<5) { - minorSpacing = 5; - majorSpacing = 10; - } - - // determine final value of delta - delta = minorSpacing*pow; - - // determine which lines to draw - for (int i=0; i<4; i++) { - minMaxIndices[i] = (int)(minMaxWorldValues[i]/delta); - } - - dashedLines.clear(); - dottedLines.clear(); - - // create x-grid lines parallel to y-axis - if (showMajorX) { - for (int i=minMaxIndices[0]-1; i lines = isMajor? dottedLines: dashedLines; - double x = i*delta; - Line2D line = new Line2D.Double(); - lines.add(line); - // set line end points to world positions (x, yMin) and (x, yMax) - lineEnds[0].setWorldPosition(x, minMaxWorldValues[2], trackerPanel); - lineEnds[1].setWorldPosition(x, minMaxWorldValues[3], trackerPanel); - // set Line2D to screen coordinates - line.setLine(lineEnds[0].getScreenPosition(trackerPanel), lineEnds[1].getScreenPosition(trackerPanel)); - } - } - - // create y-grid lines parallel to x-axis - if (showMajorY) { - for (int i=minMaxIndices[2]-1; i lines = isMajor? dottedLines: dashedLines; - double y = i*delta; - Line2D line = new Line2D.Double(); - lines.add(line); - // set line end points to world positions (xMin, y) and (xMax, y) - lineEnds[0].setWorldPosition(minMaxWorldValues[0], y, trackerPanel); - lineEnds[1].setWorldPosition(minMaxWorldValues[1], y, trackerPanel); - // set Line2D to screen coordinates - line.setLine(lineEnds[0].getScreenPosition(trackerPanel), lineEnds[1].getScreenPosition(trackerPanel)); - } - } - - // prepare to draw lines - // save original color and stroke - Color color = g2.getColor(); - Stroke stroke = g2.getStroke(); - - // set color and stroke for dashed lines - g2.setPaint(lineColor); - g2.setStroke(dashed); - for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.Stroke; +import java.awt.geom.Line2D; +import java.awt.geom.Point2D; +import java.util.ArrayList; + +import org.opensourcephysics.display.DrawingPanel; +import org.opensourcephysics.media.core.TPoint; +import org.opensourcephysics.media.core.Trackable; + +/** + * This draws a world grid on a TrackerPanel. + * + * @author Douglas Brown + */ +public class WorldGrid implements Trackable { + + private static final float[] DASHED_LINE = new float[] {1, 8}; + private static final float[] DOTTED_LINE = new float[] {2, 2}; + private static Stroke dashed, dotted; + private static int defaultAlpha = 128; + private static Color defaultColor = new Color(128, 128, 128, defaultAlpha); + + ArrayList dashedLines = new ArrayList(); + ArrayList dottedLines = new ArrayList(); + TPoint[] viewCorners = {new TPoint(), new TPoint(), new TPoint(), new TPoint()}; + Point2D[] worldCorners = new Point2D[4]; + TPoint[] lineEnds = {new TPoint(), new TPoint()}; + double[] minMaxWorldValues = new double[4]; + int[] minMaxIndices = new int[4]; + boolean showMajorX=true, showMinorX=true, showMajorY=true, showMinorY=true; + private int alpha = defaultAlpha; + private Color lineColor = defaultColor; + private boolean visible; + + /** + * Constructor. + * + * @param panel a TrackerPanel + */ + public WorldGrid() { + dashed = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DASHED_LINE,0); + dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); + } + + public void draw(DrawingPanel panel, Graphics g) { + if (!visible || (!showMajorX && !showMajorY)) return; + Graphics2D g2 = (Graphics2D)g; + TrackerPanel trackerPanel = (TrackerPanel)panel; + // find world coordinates of corners of the visible trackerPanel view + Rectangle rect = trackerPanel.getVisibleRect(); + for (int i=0; i<4; i++) { + switch (i) { + case 0: // top left + viewCorners[i].setScreenPosition(rect.x, rect.y, trackerPanel); + break; + case 1: // top right + viewCorners[i].setScreenPosition(rect.x+rect.width, rect.y, trackerPanel); + break; + case 2: // bottom left + viewCorners[i].setScreenPosition(rect.x, rect.y+rect.height, trackerPanel); + break; + default: // bottom right + viewCorners[i].setScreenPosition(rect.x+rect.width, rect.y+rect.height, trackerPanel); + } + worldCorners[i] = viewCorners[i].getWorldPosition(trackerPanel); + if (i==0) { + minMaxWorldValues[0] = minMaxWorldValues[1] = worldCorners[i].getX(); + minMaxWorldValues[2] = minMaxWorldValues[3] = worldCorners[i].getY(); + } + else { + minMaxWorldValues[0] = Math.min(minMaxWorldValues[0], worldCorners[i].getX()); // xMin + minMaxWorldValues[1] = Math.max(minMaxWorldValues[1], worldCorners[i].getX()); // xMax + minMaxWorldValues[2] = Math.min(minMaxWorldValues[2], worldCorners[i].getY()); // yMin + minMaxWorldValues[3] = Math.max(minMaxWorldValues[3], worldCorners[i].getY()); // yMax + } + } + + // determine a world delta between lines at least 30 pixels apart + int lineCount = Math.min(60, rect.width/25); + // make a first approximation + double delta = (minMaxWorldValues[1]-minMaxWorldValues[0])/lineCount; + + // find power of ten + double pow = 1; + while (pow*10 < delta) pow *= 10; + while (pow > delta) pow /= 10; + + // get "significand" and increase to nearest 2, 5 or 10 + double significand = delta/pow; // number between 1 and 10 + int minorSpacing = 10; + int majorSpacing = 100; + if (significand<2) { + minorSpacing = 2; + majorSpacing = 10; + } + else if (significand<5) { + minorSpacing = 5; + majorSpacing = 10; + } + + // determine final value of delta + delta = minorSpacing*pow; + + // determine which lines to draw + for (int i=0; i<4; i++) { + minMaxIndices[i] = (int)(minMaxWorldValues[i]/delta); + } + + dashedLines.clear(); + dottedLines.clear(); + + // create x-grid lines parallel to y-axis + if (showMajorX) { + for (int i=minMaxIndices[0]-1; i lines = isMajor? dottedLines: dashedLines; + double x = i*delta; + Line2D line = new Line2D.Double(); + lines.add(line); + // set line end points to world positions (x, yMin) and (x, yMax) + lineEnds[0].setWorldPosition(x, minMaxWorldValues[2], trackerPanel); + lineEnds[1].setWorldPosition(x, minMaxWorldValues[3], trackerPanel); + // set Line2D to screen coordinates + line.setLine(lineEnds[0].getScreenPosition(trackerPanel), lineEnds[1].getScreenPosition(trackerPanel)); + } + } + + // create y-grid lines parallel to x-axis + if (showMajorY) { + for (int i=minMaxIndices[2]-1; i lines = isMajor? dottedLines: dashedLines; + double y = i*delta; + Line2D line = new Line2D.Double(); + lines.add(line); + // set line end points to world positions (xMin, y) and (xMax, y) + lineEnds[0].setWorldPosition(minMaxWorldValues[0], y, trackerPanel); + lineEnds[1].setWorldPosition(minMaxWorldValues[1], y, trackerPanel); + // set Line2D to screen coordinates + line.setLine(lineEnds[0].getScreenPosition(trackerPanel), lineEnds[1].getScreenPosition(trackerPanel)); + } + } + + // prepare to draw lines + // save original color and stroke + Color color = g2.getColor(); + Stroke stroke = g2.getStroke(); + + // set color and stroke for dashed lines + g2.setPaint(lineColor); + g2.setStroke(dashed); + for (int i=0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker.deploy; - -import java.io.File; -import java.io.FilenameFilter; - -/** - * A FilenameFilter to find tracker jar files. - * - * @author Douglas Brown - */ -public class TrackerJarFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - String fileName = getName(name).toLowerCase(); - if (!fileName.endsWith(".jar")) return false; //$NON-NLS-1$ - if (fileName.equals("tracker.jar")) return true; //$NON-NLS-1$ - if (fileName.startsWith("tracker-")) { //$NON-NLS-1$ - // attempt to get version number - String version = fileName.substring(8); - int len = version.length(); - version = version.substring(0, len-4); // strips ".jar" - try { - Double.parseDouble(version); - return true; - } catch (Exception ex1) { - try { - String snapshot = "-snapshot"; //$NON-NLS-1$ - int n = version.indexOf(snapshot); - if (n>-1) { - version = version.substring(0, n); - Double.parseDouble(version); - return true; - } - } catch (Exception ex2) { - } - - } - } - return false; - } - - /** - * Gets the name from the specified path. - * - * @param path the full path - * @return the name alone - */ - private String getName(String path) { - if(path==null) return ""; //$NON-NLS-1$ - int i = path.lastIndexOf("/"); //$NON-NLS-1$ - if(i==-1) i = path.lastIndexOf("\\"); //$NON-NLS-1$ - if(i!=-1) return path.substring(i+1); - return path; - } - -} +/* + * The tracker.deploy package defines classes for launching and installing Tracker. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker.deploy; + +import java.io.File; +import java.io.FilenameFilter; + +/** + * A FilenameFilter to find tracker jar files. + * + * @author Douglas Brown + */ +public class TrackerJarFilter implements FilenameFilter { + + public boolean accept(File dir, String name) { + String fileName = getName(name).toLowerCase(); + if (!fileName.endsWith(".jar")) return false; //$NON-NLS-1$ + if (fileName.equals("tracker.jar")) return true; //$NON-NLS-1$ + if (fileName.startsWith("tracker-")) { //$NON-NLS-1$ + // attempt to get version number + String version = fileName.substring(8); + int len = version.length(); + version = version.substring(0, len-4); // strips ".jar" + try { + Double.parseDouble(version); + return true; + } catch (Exception ex1) { + try { + String snapshot = "-snapshot"; //$NON-NLS-1$ + int n = version.indexOf(snapshot); + if (n>-1) { + version = version.substring(0, n); + Double.parseDouble(version); + return true; + } + } catch (Exception ex2) { + } + + } + } + return false; + } + + /** + * Gets the name from the specified path. + * + * @param path the full path + * @return the name alone + */ + private String getName(String path) { + if(path==null) return ""; //$NON-NLS-1$ + int i = path.lastIndexOf("/"); //$NON-NLS-1$ + if(i==-1) i = path.lastIndexOf("\\"); //$NON-NLS-1$ + if(i!=-1) return path.substring(i+1); + return path; + } + +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java index 3ceee5ff..a56d384c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java @@ -1,421 +1,421 @@ -/* - * The tracker.deploy package defines classes for launching and installing Tracker. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker.deploy; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; -import java.util.ArrayList; -import java.util.List; -import java.util.prefs.Preferences; - -/** - * A class to read and write Windows Registry values. - * - * @author Douglas Brown - */ -public class WinRegistry { - @SuppressWarnings("javadoc") - public static final int HKEY_CURRENT_USER = 0x80000001; - @SuppressWarnings("javadoc") - public static final int HKEY_LOCAL_MACHINE = 0x80000002; - @SuppressWarnings("javadoc") - public static final int REG_SUCCESS = 0; - @SuppressWarnings("javadoc") - public static final int REG_NOTFOUND = 2; - @SuppressWarnings("javadoc") - public static final int REG_ACCESSDENIED = 5; - - private static final int KEY_ALL_ACCESS = 0xf003f; - private static final int KEY_READ = 0x20019; - private static Preferences userRoot = Preferences.userRoot(); - private static Preferences systemRoot = Preferences.systemRoot(); - private static Class userClass = userRoot.getClass(); - private static Method regOpenKey = null; - private static Method regCloseKey = null; - private static Method regQueryValueEx = null; - private static Method regEnumValue = null; - private static Method regQueryInfoKey = null; - private static Method regEnumKeyEx = null; - private static Method regCreateKeyEx = null; - private static Method regSetValueEx = null; - private static Method regDeleteKey = null; - private static Method regDeleteValue = null; - - static { - try { - regOpenKey = userClass.getDeclaredMethod("WindowsRegOpenKey", //$NON-NLS-1$ - new Class[] { int.class, byte[].class, int.class }); - regOpenKey.setAccessible(true); - regCloseKey = userClass.getDeclaredMethod("WindowsRegCloseKey", //$NON-NLS-1$ - new Class[] { int.class }); - regCloseKey.setAccessible(true); - regQueryValueEx = userClass.getDeclaredMethod("WindowsRegQueryValueEx", //$NON-NLS-1$ - new Class[] { int.class, byte[].class }); - regQueryValueEx.setAccessible(true); - regEnumValue = userClass.getDeclaredMethod("WindowsRegEnumValue", //$NON-NLS-1$ - new Class[] { int.class, int.class, int.class }); - regEnumValue.setAccessible(true); - regQueryInfoKey = userClass.getDeclaredMethod("WindowsRegQueryInfoKey1", //$NON-NLS-1$ - new Class[] { int.class }); - regQueryInfoKey.setAccessible(true); - regEnumKeyEx = userClass.getDeclaredMethod( - "WindowsRegEnumKeyEx", new Class[] { int.class, int.class, //$NON-NLS-1$ - int.class }); - regEnumKeyEx.setAccessible(true); - regCreateKeyEx = userClass.getDeclaredMethod( - "WindowsRegCreateKeyEx", new Class[] { int.class, //$NON-NLS-1$ - byte[].class }); - regCreateKeyEx.setAccessible(true); - regSetValueEx = userClass.getDeclaredMethod( - "WindowsRegSetValueEx", new Class[] { int.class, //$NON-NLS-1$ - byte[].class, byte[].class }); - regSetValueEx.setAccessible(true); - regDeleteValue = userClass.getDeclaredMethod( - "WindowsRegDeleteValue", new Class[] { int.class, //$NON-NLS-1$ - byte[].class }); - regDeleteValue.setAccessible(true); - regDeleteKey = userClass.getDeclaredMethod( - "WindowsRegDeleteKey", new Class[] { int.class, //$NON-NLS-1$ - byte[].class }); - regDeleteKey.setAccessible(true); - } - catch (Exception e) { - e.printStackTrace(); - } - } - - private WinRegistry() { } - - /** - * Read a value from key and value name - * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE - * @param key - * @param valueName - * @return the value - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static String readString(int hkey, String key, String valueName) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - if (hkey == HKEY_LOCAL_MACHINE) { - return readString(systemRoot, hkey, key, valueName); - } - else if (hkey == HKEY_CURRENT_USER) { - return readString(userRoot, hkey, key, valueName); - } - else { - throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ - } - } - - /** - * Read value(s) and value name(s) form given key - * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE - * @param key - * @return the value name(s) plus the value(s) - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static Map readStringValues(int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - if (hkey == HKEY_LOCAL_MACHINE) { - return readStringValues(systemRoot, hkey, key); - } - else if (hkey == HKEY_CURRENT_USER) { - return readStringValues(userRoot, hkey, key); - } - else { - throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ - } - } - - /** - * Read the value name(s) from a given key - * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE - * @param key - * @return the value name(s) - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static List readStringSubKeys(int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - if (hkey == HKEY_LOCAL_MACHINE) { - return readStringSubKeys(systemRoot, hkey, key); - } - else if (hkey == HKEY_CURRENT_USER) { - return readStringSubKeys(userRoot, hkey, key); - } - else { - throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ - } - } - - /** - * Create a key - * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE - * @param key - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static void createKey(int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int [] ret; - if (hkey == HKEY_LOCAL_MACHINE) { - ret = createKey(systemRoot, hkey, key); - regCloseKey.invoke(systemRoot, new Object[] { new Integer(ret[0]) }); - } - else if (hkey == HKEY_CURRENT_USER) { - ret = createKey(userRoot, hkey, key); - regCloseKey.invoke(userRoot, new Object[] { new Integer(ret[0]) }); - } - else { - throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ - } - if (ret[1] != REG_SUCCESS) { - throw new IllegalArgumentException("rc=" + ret[1] + " key=" + key); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - /** - * Write a value in a given key/value name - * @param hkey - * @param key - * @param valueName - * @param value - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static void writeStringValue - (int hkey, String key, String valueName, String value) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - if (hkey == HKEY_LOCAL_MACHINE) { - writeStringValue(systemRoot, hkey, key, valueName, value); - } - else if (hkey == HKEY_CURRENT_USER) { - writeStringValue(userRoot, hkey, key, valueName, value); - } - else { - throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ - } - } - - /** - * Delete a given key - * @param hkey - * @param key - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static void deleteKey(int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int rc = -1; - if (hkey == HKEY_LOCAL_MACHINE) { - rc = deleteKey(systemRoot, hkey, key); - } - else if (hkey == HKEY_CURRENT_USER) { - rc = deleteKey(userRoot, hkey, key); - } - if (rc != REG_SUCCESS) { - throw new IllegalArgumentException("rc=" + rc + " key=" + key); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - /** - * delete a value from a given key/value name - * @param hkey - * @param key - * @param value - * @throws IllegalArgumentException - * @throws IllegalAccessException - * @throws InvocationTargetException - */ - public static void deleteValue(int hkey, String key, String value) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int rc = -1; - if (hkey == HKEY_LOCAL_MACHINE) { - rc = deleteValue(systemRoot, hkey, key, value); - } - else if (hkey == HKEY_CURRENT_USER) { - rc = deleteValue(userRoot, hkey, key, value); - } - if (rc != REG_SUCCESS) { - throw new IllegalArgumentException("rc=" + rc + " key=" + key + " value=" + value); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - } - - // ===================== - - private static int deleteValue - (Preferences root, int hkey, String key, String value) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { - new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) }); - if (handles[1] != REG_SUCCESS) { - return handles[1]; // can be REG_NOTFOUND, REG_ACCESSDENIED - } - int rc =((Integer) regDeleteValue.invoke(root, - new Object[] { - new Integer(handles[0]), toCstr(value) - })).intValue(); - regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) }); - return rc; - } - - private static int deleteKey(Preferences root, int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int rc =((Integer) regDeleteKey.invoke(root, - new Object[] { new Integer(hkey), toCstr(key) })).intValue(); - return rc; // can REG_NOTFOUND, REG_ACCESSDENIED, REG_SUCCESS - } - - private static String readString(Preferences root, int hkey, String key, String value) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { - new Integer(hkey), toCstr(key), new Integer(KEY_READ) }); - if (handles[1] != REG_SUCCESS) { - return null; - } - byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] { - new Integer(handles[0]), toCstr(value) }); - regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) }); - return (valb != null ? new String(valb).trim() : null); - } - - private static Map readStringValues - (Preferences root, int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - HashMap results = new HashMap(); - int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { - new Integer(hkey), toCstr(key), new Integer(KEY_READ) }); - if (handles[1] != REG_SUCCESS) { - return null; - } - int[] info = (int[]) regQueryInfoKey.invoke(root, - new Object[] { new Integer(handles[0]) }); - - int count = info[2]; // count - int maxlen = info[3]; // value length max - for(int index=0; index readStringSubKeys - (Preferences root, int hkey, String key) - throws IllegalArgumentException, IllegalAccessException, - InvocationTargetException - { - List results = new ArrayList(); - int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { - new Integer(hkey), toCstr(key), new Integer(KEY_READ) - }); - if (handles[1] != REG_SUCCESS) { - return null; - } - int[] info = (int[]) regQueryInfoKey.invoke(root, - new Object[] { new Integer(handles[0]) }); - - int count = info[0]; // count - int maxlen = info[3]; // value length max - for(int index=0; index + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker.deploy; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; +import java.util.ArrayList; +import java.util.List; +import java.util.prefs.Preferences; + +/** + * A class to read and write Windows Registry values. + * + * @author Douglas Brown + */ +public class WinRegistry { + @SuppressWarnings("javadoc") + public static final int HKEY_CURRENT_USER = 0x80000001; + @SuppressWarnings("javadoc") + public static final int HKEY_LOCAL_MACHINE = 0x80000002; + @SuppressWarnings("javadoc") + public static final int REG_SUCCESS = 0; + @SuppressWarnings("javadoc") + public static final int REG_NOTFOUND = 2; + @SuppressWarnings("javadoc") + public static final int REG_ACCESSDENIED = 5; + + private static final int KEY_ALL_ACCESS = 0xf003f; + private static final int KEY_READ = 0x20019; + private static Preferences userRoot = Preferences.userRoot(); + private static Preferences systemRoot = Preferences.systemRoot(); + private static Class userClass = userRoot.getClass(); + private static Method regOpenKey = null; + private static Method regCloseKey = null; + private static Method regQueryValueEx = null; + private static Method regEnumValue = null; + private static Method regQueryInfoKey = null; + private static Method regEnumKeyEx = null; + private static Method regCreateKeyEx = null; + private static Method regSetValueEx = null; + private static Method regDeleteKey = null; + private static Method regDeleteValue = null; + + static { + try { + regOpenKey = userClass.getDeclaredMethod("WindowsRegOpenKey", //$NON-NLS-1$ + new Class[] { int.class, byte[].class, int.class }); + regOpenKey.setAccessible(true); + regCloseKey = userClass.getDeclaredMethod("WindowsRegCloseKey", //$NON-NLS-1$ + new Class[] { int.class }); + regCloseKey.setAccessible(true); + regQueryValueEx = userClass.getDeclaredMethod("WindowsRegQueryValueEx", //$NON-NLS-1$ + new Class[] { int.class, byte[].class }); + regQueryValueEx.setAccessible(true); + regEnumValue = userClass.getDeclaredMethod("WindowsRegEnumValue", //$NON-NLS-1$ + new Class[] { int.class, int.class, int.class }); + regEnumValue.setAccessible(true); + regQueryInfoKey = userClass.getDeclaredMethod("WindowsRegQueryInfoKey1", //$NON-NLS-1$ + new Class[] { int.class }); + regQueryInfoKey.setAccessible(true); + regEnumKeyEx = userClass.getDeclaredMethod( + "WindowsRegEnumKeyEx", new Class[] { int.class, int.class, //$NON-NLS-1$ + int.class }); + regEnumKeyEx.setAccessible(true); + regCreateKeyEx = userClass.getDeclaredMethod( + "WindowsRegCreateKeyEx", new Class[] { int.class, //$NON-NLS-1$ + byte[].class }); + regCreateKeyEx.setAccessible(true); + regSetValueEx = userClass.getDeclaredMethod( + "WindowsRegSetValueEx", new Class[] { int.class, //$NON-NLS-1$ + byte[].class, byte[].class }); + regSetValueEx.setAccessible(true); + regDeleteValue = userClass.getDeclaredMethod( + "WindowsRegDeleteValue", new Class[] { int.class, //$NON-NLS-1$ + byte[].class }); + regDeleteValue.setAccessible(true); + regDeleteKey = userClass.getDeclaredMethod( + "WindowsRegDeleteKey", new Class[] { int.class, //$NON-NLS-1$ + byte[].class }); + regDeleteKey.setAccessible(true); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + private WinRegistry() { } + + /** + * Read a value from key and value name + * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE + * @param key + * @param valueName + * @return the value + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static String readString(int hkey, String key, String valueName) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + if (hkey == HKEY_LOCAL_MACHINE) { + return readString(systemRoot, hkey, key, valueName); + } + else if (hkey == HKEY_CURRENT_USER) { + return readString(userRoot, hkey, key, valueName); + } + else { + throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ + } + } + + /** + * Read value(s) and value name(s) form given key + * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE + * @param key + * @return the value name(s) plus the value(s) + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static Map readStringValues(int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + if (hkey == HKEY_LOCAL_MACHINE) { + return readStringValues(systemRoot, hkey, key); + } + else if (hkey == HKEY_CURRENT_USER) { + return readStringValues(userRoot, hkey, key); + } + else { + throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ + } + } + + /** + * Read the value name(s) from a given key + * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE + * @param key + * @return the value name(s) + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static List readStringSubKeys(int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + if (hkey == HKEY_LOCAL_MACHINE) { + return readStringSubKeys(systemRoot, hkey, key); + } + else if (hkey == HKEY_CURRENT_USER) { + return readStringSubKeys(userRoot, hkey, key); + } + else { + throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ + } + } + + /** + * Create a key + * @param hkey HKEY_CURRENT_USER/HKEY_LOCAL_MACHINE + * @param key + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static void createKey(int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int [] ret; + if (hkey == HKEY_LOCAL_MACHINE) { + ret = createKey(systemRoot, hkey, key); + regCloseKey.invoke(systemRoot, new Object[] { new Integer(ret[0]) }); + } + else if (hkey == HKEY_CURRENT_USER) { + ret = createKey(userRoot, hkey, key); + regCloseKey.invoke(userRoot, new Object[] { new Integer(ret[0]) }); + } + else { + throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ + } + if (ret[1] != REG_SUCCESS) { + throw new IllegalArgumentException("rc=" + ret[1] + " key=" + key); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + /** + * Write a value in a given key/value name + * @param hkey + * @param key + * @param valueName + * @param value + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static void writeStringValue + (int hkey, String key, String valueName, String value) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + if (hkey == HKEY_LOCAL_MACHINE) { + writeStringValue(systemRoot, hkey, key, valueName, value); + } + else if (hkey == HKEY_CURRENT_USER) { + writeStringValue(userRoot, hkey, key, valueName, value); + } + else { + throw new IllegalArgumentException("hkey=" + hkey); //$NON-NLS-1$ + } + } + + /** + * Delete a given key + * @param hkey + * @param key + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static void deleteKey(int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int rc = -1; + if (hkey == HKEY_LOCAL_MACHINE) { + rc = deleteKey(systemRoot, hkey, key); + } + else if (hkey == HKEY_CURRENT_USER) { + rc = deleteKey(userRoot, hkey, key); + } + if (rc != REG_SUCCESS) { + throw new IllegalArgumentException("rc=" + rc + " key=" + key); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + + /** + * delete a value from a given key/value name + * @param hkey + * @param key + * @param value + * @throws IllegalArgumentException + * @throws IllegalAccessException + * @throws InvocationTargetException + */ + public static void deleteValue(int hkey, String key, String value) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int rc = -1; + if (hkey == HKEY_LOCAL_MACHINE) { + rc = deleteValue(systemRoot, hkey, key, value); + } + else if (hkey == HKEY_CURRENT_USER) { + rc = deleteValue(userRoot, hkey, key, value); + } + if (rc != REG_SUCCESS) { + throw new IllegalArgumentException("rc=" + rc + " key=" + key + " value=" + value); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + } + + // ===================== + + private static int deleteValue + (Preferences root, int hkey, String key, String value) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { + new Integer(hkey), toCstr(key), new Integer(KEY_ALL_ACCESS) }); + if (handles[1] != REG_SUCCESS) { + return handles[1]; // can be REG_NOTFOUND, REG_ACCESSDENIED + } + int rc =((Integer) regDeleteValue.invoke(root, + new Object[] { + new Integer(handles[0]), toCstr(value) + })).intValue(); + regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) }); + return rc; + } + + private static int deleteKey(Preferences root, int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int rc =((Integer) regDeleteKey.invoke(root, + new Object[] { new Integer(hkey), toCstr(key) })).intValue(); + return rc; // can REG_NOTFOUND, REG_ACCESSDENIED, REG_SUCCESS + } + + private static String readString(Preferences root, int hkey, String key, String value) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { + new Integer(hkey), toCstr(key), new Integer(KEY_READ) }); + if (handles[1] != REG_SUCCESS) { + return null; + } + byte[] valb = (byte[]) regQueryValueEx.invoke(root, new Object[] { + new Integer(handles[0]), toCstr(value) }); + regCloseKey.invoke(root, new Object[] { new Integer(handles[0]) }); + return (valb != null ? new String(valb).trim() : null); + } + + private static Map readStringValues + (Preferences root, int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + HashMap results = new HashMap(); + int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { + new Integer(hkey), toCstr(key), new Integer(KEY_READ) }); + if (handles[1] != REG_SUCCESS) { + return null; + } + int[] info = (int[]) regQueryInfoKey.invoke(root, + new Object[] { new Integer(handles[0]) }); + + int count = info[2]; // count + int maxlen = info[3]; // value length max + for(int index=0; index readStringSubKeys + (Preferences root, int hkey, String key) + throws IllegalArgumentException, IllegalAccessException, + InvocationTargetException + { + List results = new ArrayList(); + int[] handles = (int[]) regOpenKey.invoke(root, new Object[] { + new Integer(hkey), toCstr(key), new Integer(KEY_READ) + }); + if (handles[1] != REG_SUCCESS) { + return null; + } + int[] info = (int[]) regQueryInfoKey.invoke(root, + new Object[] { new Integer(handles[0]) }); + + int count = info[0]; // count + int maxlen = info[3]; // value length max + for(int index=0; index -Tracker.Dialog.CopyQT.Message4= 2. Tracker täytyy käynnistää uudelleen. -Tracker.Dialog.CopyQT.Message5=Haluatko kopioida QTJava.zip nyt? -Tracker.Dialog.CopyFailed.Title=Kopiointi epäonnistui -Tracker.Dialog.CopyFailed.Message=QTJava.zip ei voitu kopioida. -Tracker.Dialog.CopiedTo.Title=Kopiointi onnistui -Tracker.Dialog.CopiedTo.Message1=QTJava.zip on kopioitu onnistuneesti -Tracker.Dialog.CopiedTo.Message2=Tracker täytyy käynnistää uudelleen ja siksi ohjelma lopetetaan. -Tracker.Splash.Loading=Ladataan -TrackerIO.Dialog.Import.Title=Tuo Tracker-tiedosto -TrackerIO.Dialog.Import.Message=Valitse tuotavat kohteet -TrackerIO.Dialog.ImportVideo.Title=Tuo video -TrackerIO.Dialog.Export.Title=Vie -TrackerIO.Dialog.Export.Message=Valitse vietävät kohteet -TrackerIO.Dialog.ReplaceFile.Title=Korvataanko olemassaoleva tiedosto? -TrackerIO.Dialog.ReplaceFile.Message=on jo olemassa. Haluatko korvata sen? -TrackerIO.Dialog.NotTrackerXML.Title=Yhteensopimaton XML -TrackerIO.Dialog.NotTrackerXML.Message=on XML-tiedosto toiselle sovellukselle. -TrackerIO.Dialog.BadVideo.Message=Tiedoston video on väärää formaattia: -TrackerIO.Dialog.BadVideo.Title=Tunnistamaton videotiedosto -TrackerPanel.NewTab.Name=Otsikko -TrackerPanel.DragToMark.Hint=Merkitse shift-vetämällä -TrackerPanel.ClickToMark.Hint=Merkitse shift-klikkaamalla -TrackerPanel.Dialog.LoadFailed.Title=Viallinen Tracker-tiedosto -TrackerPanel.Dialog.LoadFailed.Message=Tiedosto ei ole kelvollinen Tracker-tiedosto: -TrackerPanel.Dialog.SaveChanges.Title=Tallenna muutokset -TrackerPanel.Dialog.SaveChanges.Message=Tallenna muutokset nimellä -TrackPlottingPanel.Popup.MenuItem.Lines=Suorat -TrackPlottingPanel.Popup.MenuItem.Points=Pisteet -TrackPlottingPanel.Popup.MenuItem.Scale=Asteikko -TrackPlottingPanel.Popup.MenuItem.Print=Tulosta... -TrackPlottingPanel.Popup.MenuItem.Measure=Sovita asteikko -TrackPlottingPanel.Popup.MenuItem.Analyze=Analysoi... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Suurenna -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Pienennä -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Sovita -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Sovita laatikkoon -TrackPlottingPanelInspector.Title=Asteikko -TrackPlottingPanelInspector.Label.Min=Minimi -TrackPlottingPanelInspector.Label.Max=Maksimi -TrackPlottingPanelInspector.Label.Auto=Automaattinen -TToolBar.Button.Footprint.Tooltip=Aseta merkit -TToolBar.Dropdown.SelectedTrack.Tooltip=Valitse mittasarja -TToolBar.Dropdown.SelectedTrack.None=Ei mitään -TTrack.MenuItem.Delete=Poista -TTrack.MenuItem.Color=Värit... -TTrack.Dialog.Color.Title=Valitse mittasarjan värit -TTrack.MenuItem.Name=Nimi... -TTrack.MenuItem.Footprint=Askelmerkit -TTrack.MenuItem.Description=Muistio... -TTrack.MenuItem.Visible=Näkyvissä -TTrack.MenuItem.TrailVisible=Mittasarja näkyvissä -TTrack.MenuItem.Autostep=Automaattinen askel -TTrack.MenuItem.MarkByDefault=Merkitse oletuksena -TTrack.MenuItem.Locked=Lukittu -TTrack.MenuItem.Delete=Poista -TTrack.Name.None=ei nimeä -TTrack.Dialog.Description.Title=Muistio: -TTrack.Dialog.Name.Title=Aseta nimi -TTrack.Dialog.Name.Label=Nimi: -TViewChooser.Button.Choose.Tooltip=Valitse näkymä -Vector.Name=Vektori -Vector.New.Name=vektori -Vector.MenuItem.ToOrigin=Kanta origoon -Vector.MenuItem.Label=Näytä tunnus -VectorSum.Name=Vektorisumma -VectorSum.New.Name=summa -VectorSum.MenuItem.Inspector=Valitse vektorit... -VectorSumInspector.Title=Vektorisumma -VectorSumInspector.Border.Title=Valitse vektorit -WorldTView.Popup.MenuItem.Projectile=Heittoliike - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Kinemaattisten partikkelien malli -AnalyticParticle.Inspector.Title=Kinemaattisten partikkelien malli -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=säde 4 -CircleFootprint.Circle_6=säde 6 -CircleFootprint.Circle_8=säde 8 -DynamicParticle.Name=Dynaamisten partikkelien malli (Karteesinen) -DynamicParticle.Inspector.Title=Dynaamisten partikkelien malli -DynamicParticle.Property.ForceX=force x -DynamicParticle.Property.ForceY=force y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Kiinteä paikka -ParticleModel.New.Name=malli -ParticleModel.MenuItem.InspectModel=Mallinnus... -ParticleModel.Inspector.Button.Undo=Peruuta -ParticleModel.Inspector.Button.Redo=Tee uudestaan -ParticleModel.Inspector.Button.Close=Sulje -ParticleModel.Inspector.Button.Help=Ohjeet - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=Vain X -Calibration.Axes.YOnly=Vain Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Valitse kalibointiakselit -Calibration.Label.Axes=akselit -Calibration.Dialog.InvalidCoordinates.Title=Koordinaattivirhe -Calibration.Dialog.InvalidCoordinates.Message=Pisteillä ei voi olla samoja todellisia koordinaatteja. -Calibration.Dialog.InvalidXCoordinates.Message=Pisteillä ei voi olla samoja todellisia x-koordinaatteja. -Calibration.Dialog.InvalidYCoordinates.Message=Pisteillä ei voi olla samoja todellisia y-koordinaatteja. -SpectralLineFilter.Title=Kaasun spektri -SpectralLineFilter.H=Vety -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Elohopea -TFrame.View.Unknown=Näytä -TMenuBar.MenuItem.Undo=Peruuta -TMenuBar.MenuItem.Redo=Tee uudelleen -TMenuBar.MenuItem.Replace=Korvaa... -TMenuBar.Menu.AddImage=Tuo kuvia -TMenuBar.MenuItem.AddBefore=Ennen tätä kehystä... -TMenuBar.MenuItem.AddAfter=Tämän kehyksen jälkeen... -TMenuBar.MenuItem.RemoveImage=Poista tämä kehys -TMenuBar.Menu.Tools=Työvälineet -TMenuBar.MenuItem.DataFunctionTool=Dataeditori -TMenuBar.MenuItem.DatasetTool=Tilastoanalyysi -TMenuBar.Menu.CopyImage=Kopioi kuva -TMenuBar.MenuItem.CopyMainView=Päänäkymä -TMenuBar.MenuItem.CopyFrame=Kehys -TMenuBar.MenuItem.PrintFrame=Tulosta... -TrackerIO.Dialog.AddImage.Title=Tuo kuvia (valiste yksi tai useita) -TTrack.Dialog.Name.BadName=on jo käytössä. Valitse toinen nimi. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=resultanttivoima -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Kuvaajalle varattu tila. -TableTView.Label.NoData=Taulukolle varattu tila. -TrackerPanel.Message.NoData0=Videolle varattu tila. -TrackerPanel.Message.NoData1=Valiste aloittaaksesi Tiedosto|Avaa tai Mittaussarjat|Uusi. -WorldTView.Label.NoData=Videolle varattu tila. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Solveri: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptive Multistep -DynamicParticle.Table.Force.Border.Title=Differentiaaliyhtälöt (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Paikkavektori (t) -ParticleModel.Table.Initial.Border.Title=Alkuarvot -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Liitä kuva -TMenuBar.MenuItem.PasteAfter=Tämän kehyksen jälkeen -TMenuBar.MenuItem.PasteBefore=Ennen tätä kehystä -TMenuBar.MenuItem.PasteReplace=Korvaa video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Aloitetaan... -Tracker.Splash.HelpMessage=Uusi käyttäjä? Katso - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=kulma mitattuna vaakatasosta -LineProfile.Checkbox.Rotates=kiertymä -LineProfile.Label.Spread=levitys -RGBRegion.Name=RGB-alue -RGBRegion.New.Name=alue -RGBRegion.MenuItem.Fixed=Kiinteä paikka -RGBRegion.Label.Radius=pikselin koko -TTrack.Label.Step=askel - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=paikan numero -LineProfile.Data.Description.1=paikan x-koordinaatti -LineProfile.Data.Description.2=paikan y-koordinaatti -LineProfile.Data.Description.3=punainen -LineProfile.Data.Description.4=vihreä -LineProfile.Data.Description.5=sininen -LineProfile.Data.Description.6=koettu kirkkaus -LineProfile.Data.Description.7=viivan paksuus -ParticleModel.MenuItem.TraceVisible=Mittasarja näkyvissä -ParticleModel.MenuItem.StepsVisible=Askeleet näkyvissä -PointMass.Data.Description.0=aika -PointMass.Data.Description.1=paikan x-koordinaatti -PointMass.Data.Description.2=paikan y-koordinaatti -PointMass.Data.Description.3=paikan arvo -PointMass.Data.Description.4=paikan kulma -PointMass.Data.Description.5=nopeuden x-komponentti -PointMass.Data.Description.6=nopeuden y-komponentti -PointMass.Data.Description.7=nopeuden suuruus -PointMass.Data.Description.8=nopeuden kulma -PointMass.Data.Description.9=kiihtyvyyden x-komponentti -PointMass.Data.Description.10=kiihtyvyyden y-komponentti -PointMass.Data.Description.11=kiihtyvyyden suuruus -PointMass.Data.Description.12=kiihtyvyyden kulma -PointMass.Data.Description.13=kulmankierto -PointMass.Data.Description.14=kulmanopeus -PointMass.Data.Description.15=kulmakiihtyvyys -PointMass.Data.Description.16=askelnumero -PointMass.Data.Description.17=kehysnumero -PointMass.Data.Description.18=momentin x-komponentti -PointMass.Data.Description.19=momentin y-komponentti -PointMass.Data.Description.20=momentin suuruus -PointMass.Data.Description.21=momentin kulma -PointMass.Data.Description.22=kineettinen energia -RGBRegion.Data.Description.0=aika -RGBRegion.Data.Description.1=paikan x-koordinaatti -RGBRegion.Data.Description.2=paikan y-koordinaatti -RGBRegion.Data.Description.3=punainen -RGBRegion.Data.Description.4=vihreä -RGBRegion.Data.Description.5=sininen -RGBRegion.Data.Description.6=koettu kirkkaus -RGBRegion.Data.Description.7=pikselilaskuri -RGBRegion.Data.Description.8=askelnumero -RGBRegion.Data.Description.9=kehysnumero -TView.Menuitem.Define=Määritä... -Vector.Data.Description.0=aika -Vector.Data.Description.1=x-komponentti -Vector.Data.Description.2=y-komponentti -Vector.Data.Description.3=suuruus -Vector.Data.Description.4=kulma -Vector.Data.Description.5=kannan x-koordinaatti -Vector.Data.Description.6=kannan y-koordinaatti -Vector.Data.Description.7=askelnumero -Vector.Data.Description.8=kehysnumero - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Tämän partikkelin massa -ParticleModel.Parameter.InitialTime.Description=Aloitusaika -AnalyticParticle.PositionFunction.X.Description=Paikan x-koordinaatti -AnalyticParticle.PositionFunction.Y.Description=Paikan y-koordinaatti -DynamicParticle.ForceFunction.X.Description=Voiman x-komponentti -DynamicParticle.ForceFunction.Y.Description=Voiman y-komponentti -DynamicParticle.Parameter.InitialX.Description=Lähtöpaikan x-koordinaatti -DynamicParticle.Parameter.InitialY.Description=Lähtöpaikan y-koordinaatti -DynamicParticle.Parameter.InitialVelocityX.Description=Alkunopeuden x-komponentti -DynamicParticle.Parameter.InitialVelocityY.Description=Alkunopeuden y-komponentti -TrackerPanel.ModelBuilder.Title=Mallinnus -TrackerPanel.DataBuilder.Title=Dataeditori -TrackControl.TrailMenu.NoTrail=Ei mittapisteitä -TrackControl.TrailMenu.ShortTrail=Vähän mittapisteitä -TrackControl.TrailMenu.LongTrail=Paljon mittapisteitä -TrackControl.TrailMenu.FullTrail=Kaikki mittapisteet -TrackerPanel.ModelBuilder.Spinner.Tooltip=Valittuna oleva malli -TrackerPanel.ModelBuilder.LineButton.Text=Viivan tyyli -TrackerPanel.ModelBuilder.LineButton.Tooltip=Aseta viivan tyyli -ParticleModel.LineStyle.None=Ei viivaa -ParticleModel.LineStyle.Connect=Yhdistetyt askeleet -ParticleModel.LineStyle.Smooth=Käyrä -ModelFunctionPanel.Label=Malli -AnalyticFunctionPanel.FunctionEditor.Border.Title=Paikkasuureet -DynamicFunctionPanel.FunctionEditor.Border.Title=Differentiaaliyhtälöt - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Näkyvä sarake -Tracker.About.ProjectOf=Projekti: -Tracker.About.TranslationBy=Kääntäjä: -Tracker.About.Translator=Jari Hokkanen -TMenuBar.Menu.SaveVideoAs=Tallenna video nimellä -TActions.SaveClipAs.ProgressMonitor.Message=Tallentaa videon nimellä -TActions.SaveClipAs.ProgressMonitor.Progress=Suoritettu - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Synkro -PlotTrackView.Checkbox.Synchronize.Tooltip=Synkronoi vaaka-akselit -RGBRegion.MenuItem.FixedRadius=Kiinteä säde -Tracker.VideoZoom.Hint=valitse suurennos klikkaamalla, sovita kaksoisklikkaamalla -Tracker.PlotZoomIn.Hint=suurenna vetämällä, kaksoisklikkaa kun sovitat -Tracker.PlotZoomOut.Hint=pienennä klikkaamalla -Tracker.MenuItem.Hints=Näytä vihjeet -TapeMeasure.Label.Length=pituus -TapeMeasure.Label.TapeAngle=kulma x-akselilta -TapeMeasure.Label.ArcAngle=astemitan kulma -TrackerIO.Dialog.NotAnImage.Title=Kelvoton tiedostotyyppi -TrackerIO.Dialog.NotAnImage.Message1=ei ole JPG- tai GIF-kuva. -TrackerIO.Dialog.NotAnImage.Message2=Haluatko jatkaa? -TToolBar.Button.Zoom.Tooltip=Aseta videon suurennos -TrackChooserTView.DropDown.Tooltip=Valitse mittaussarja -TapeMeasure.Field.TapeAngle.Tooltip=Mittanauhan ja x-akselin välinen kulma -TapeMeasure.Field.Magnitude.Tooltip=Pituus todellisella mitta-asteikolla -TapeMeasure.Readout.Magnitude.Name=pituus -TapeMeasure.Readout.Magnitude.Hint=todellinen mitta-asteikko -TapeMeasure.Readout.Angle.Name=kulman lukema -TapeMeasure.Readout.Angle.Hint=kulma mitattuna positiiviselta x-akselilta -TapeMeasure.End.Name=loppu -TapeMeasure.End.Hint=siirrä hiirellä mittaaksesi etäisyyksiä ja kulmia, shift-klikkaa -TapeMeasure.Handle.Name=kahva -TapeMeasure.Handle.Hint=liikuta vetämällä hiirellä -Vector.Tip.Name=kärki -Vector.Tip.Hint=valitse klikkaamalla, liikuta vetämällä -Vector.Handle.Name=kahva -Vector.Handle.Hint=valitse klikkaamalla, liikuta vetämällä -Vector.ShortHandle.Hint=valitse klikkaamalla, liikuta vetämällä, valitse kärki alt-klikkaamalla -PointMass.Position.Name=paikka -PointMass.Position.Hint=valitse klikkaamalla, liikuta vetämällä -PointMass.Velocity.Name=nopeus -PointMass.Acceleration.Name=kiihtyvyys -PointMass.Vector.Hint=valitse klikkaamalla, liikuta vetämällä -PointMass.Position.Locked.Hint=valitse klikkaamalla--ei voi vetää -CoordAxes.Handle.Name=+x-akseli -CoordAxes.Handle.Hint=muuta asentoa vetämällä -CoordAxes.Origin.Name=origo -CoordAxes.Origin.Hint=siirrä vetämällä -OffsetOrigin.Position.Name=paikka -OffsetOrigin.Position.Hint=siirrä origo vetämällä tai kirjoittamalla koordinaatit -Calibration.Point.Name=piste -Calibration.Point.Hint=siirrä akseli tai vaihda asteikko vetämällä tai kirjoittamalla koordinaatit -RGBRegion.Position.Name=paikka -RGBRegion.Position.Hint=siirrä origo vetämällä tai kirjoittamalla koordinaatit -LineProfile.End.Name=loppu -LineProfile.End.Hint=muuta viivan pituutta vetämällä -LineProfile.Handle.Name=kahva -LineProfile.Handle.Hint=siirrä viiva vetämällä -PointMass.Hint=määrää massa työkalurivillä -PointMass.Unmarked.Hint=, merkitse paikka shift-klikkaamalla -TTrack.Unselected.Hint=klikkaa muuttaaksesi ominaisuuksia -Vector.Unmarked.Hint=aseta vektori shift-vetämällä -OffsetOrigin.Unmarked.Hint=merkitse shift-klikkaamalla -Calibration.Unmarked.Hint=merkitse ensimmäinen piste shift-klikkaamalla -Calibration.Halfmarked.Hint=merkitse shift-klikkaamalla -CenterOfMass.Empty.Hint=määritä systeemi valitsemalla massat -VectorSum.Empty.Hint=määritä summa valitsemalla vektorit -TapeMeasure.Hint=mittaa etäisyydet ja kulmat vetämällä mittanauhan päitä -CoordAxes.Hint=vaihda asentoa muuttamalla kulmaa -ParticleModel.Hint=aseta massa työkalurivillä, lisää lausekkeita Mallintajaan voidaksesi animoida -RGBRegion.Hint=muuta kokoa antamalla uusi säde -RGBRegion.Unmarked.Hint=merkitse paikka shift-klikkaamalla -TTrack.ImportVideo.Hint=mittaa RGB tuomalla kuva tai video -TTrack.Selected.Hint=on valittuna -LineProfile.Hint=muuta viivan leveys antamalla levitys -LineProfile.Unmarked.Hint=piirrä viiva vetämällä se hiirellä -LineProfile.Menu.Orientation=Asento -LineProfile.MenuItem.Horizontal=Vaakatasossa -LineProfile.MenuItem.XAxis=X-alselia pitkin -Footprint.PositionVector=vektori -Footprint.BoldPositionVector=lihava vektori -Tracker.Startup.Hint=katsotästä vihjeitä (tai kytke vihjeet pois päältä Ohje-valikossa), paina F1 lisäohjeita varten -TrackerPanel.NoVideo.Hint=avaa tai tuo video analysoitavaksi -TrackerPanel.CalibrateVideo.Hint=kalibroi video kalibrointityökalulla -TrackerPanel.NoTracks.Hint=luo uusi mittaussarja tutkiaksesi haluamaasi ilmiötä -TrackerPanel.SetClip.Hint=aseta tai katso videon asetuksia settings -TrackerPanel.ShowAxes.Hint=aseta origo ja akselien kallistuskulma -VideoPlayer.Step.Hint=askel eteenpäin (pikanäppäin: PageDown) -VideoPlayer.Back.Hint=askel taaksepäin (pikanäppäin: PageUp) -TrackerPanel.DVVideo.Hint=käytä muodonmuutos-filtteriä korjataksesi vääristymät DV-videoissa -TrackerIO.DataFileFilter.Description=Tracker File (*.trk) -Tracker.Button.PDFHelp=Tulostettava PDF-tiedosto -TToolbar.Button.TapeVisible.Tooltip=Näytä, piilota ja luo kalibrointivälineitä - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Mittaussarja -TMenuBar.MenuItem.Description=Muistio -TrackPlottingPanel.RightDrag.Hint=näytä vaihtoehdot vetämällä hiiren oikealla napilla -TMenuBar.MenuItem.DeleteSelectedPoint=Valitut askeleet -TFrame.InfoDialog.SaveChanges.Title=Tallenna muutokset -TFrame.InfoDialog.SaveChanges.Message=Haluatko tallentaa muutokset? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Karteesinen -DynamicParticle.Editor.Button.Polar=Polaarinen -DynamicParticle.Parameter.InitialR.Description=Aloitussäde -DynamicParticle.Parameter.InitialTheta.Description=Alkukulma -DynamicParticle.Parameter.InitialVelocityR.Description=Normaalisuunnan alkunopeus -DynamicParticle.Parameter.InitialOmega.Description=Kulmanopeuden alkuarvo -DynamicParticle.ForceFunction.R.Description=Voiman normaalikomponentti -DynamicParticle.ForceFunction.Theta.Description=Voiman tangentiaalikomponentti -DynamicParticlePolar.Name=Dynaaminen hiukkasmalli (polaari) -TMenuBar.Menu.DynamicParticle=Dynaaminen hiukkasmalli -TMenuBar.MenuItem.Cartesian=Karteesinen -TMenuBar.MenuItem.Polar=Polaarinen - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotrack -Dialog.Button.Help=Ohjeet -AutoTracker.Wizard.Button.Reset=Alusta -AutoTracker.Wizard.Button.Back=Taakse -AutoTracker.Wizard.Button.Next=Askel -AutoTracker.Wizard.Button.Accept=Hyväksy -AutoTracker.Wizard.Button.Search=Etsi -AutoTracker.Wizard.Button.Pause=Pysäytä -AutoTracker.Wizard.Button.Skip=Ohita -AutoTracker.Label.Mask=Mallikuva -AutoTracker.Label.AcceptLevel=Hyväksymistaso -AutoTracker.TabbedPane.TabTitle.Mask=Mallikuva -AutoTracker.TabbedPane.TabTitle.Target=Kohde -AutoTracker.TabbedPane.TabTitle.Settings=Hyväksy -AutoTracker.TabbedPane.TabTitle.Search=Etsi -AutoTracker.Info.GetStarted=Luodaksesi uuden etsintäalueen, osoita mitattavaa kohdetta shift-ctrl-klikkauksella. -AutoTracker.Info.Mask1=Mallikuvan avulla ohjelma löytää mitattavan kohteen videon eri kehyksistä. -AutoTracker.Info.Mask2=Se huomioi muoto- ja värimuutokset etsimisen aikana. Suurempi evoluutionopeus tunnistaa nopeammat muutokset, mutta ei ole pidemmän päälle niin tarkka. -AutoTracker.Info.MaskLocked1=Mallikuva on käytössä ja lukittuna. -AutoTracker.Info.MaskLocked2=Klikkaa Alusta-nappia, jolloin kaikki merkinnät häviävät ja etsintä aloitetaan alusta. -AutoTracker.Info.Target1=Kohde merkitään automaattisesti kunhan tunnistamisstatus ylittää kynnysarvon. -AutoTracker.Info.Target2=Vinkki: Voit siirtää mallikuvaa vielä jälkeenpäin. Näkyvä mallikuva seuraa siirtyvää kohdetta. -AutoTracker.Info.TargetLocked=Kohde on käytössä ja on lukittuna havaittuun mittauskohtaan. Kohteen liikuttaminen siirtää myös mittauspisteet. -AutoTracker.Info.Settings1=Tunnistamisstatukset, jotka ylittävät kynnysarvon, aiheuttavat mittapisteen merkitsemisen. -AutoTracker.Info.Settings2=Vinkki: alentamalla hyväksymistasoa kasvatat todennäköisyyttä merkitä mittauspisteeksi virheellinen tunnistus. Kasvata sen sijaan muutostiheyttä. -AutoTracker.Info.Search1=Etsintäalue käydään läpi parhaan vastineen löytämiseksi. Liikuta tai muotoile etsintäaluetta tarttumalla sen reunoihin tai kahvoihin hiirellä. -AutoTracker.Info.Search2=Vinkki: Etsintäalueen ei tarvitse olla suuri. Etsintäalue seuraa mitattavaa kohdetta tunnistuksen edistyessä. -AutoTracker.Info.Frame=Kehys -AutoTracker.Info.Match=Tunnistettu kohde merkittiin automaattisesti. -AutoTracker.Info.Possible=Mahdollinen kohteen tunnistus tehty etsintäalueella. Päätä jatkotoimenpiteestä: -AutoTracker.Info.NoMatch=Etsintäalueella ei tunnistettu kohdetta. Päätä jatkotoimenpiteestä: -AutoTracker.Info.Outside=Etsintäalue on videon ulkopuolella. Päätä jatkotoimenpiteestä: -AutoTracker.Info.Accepted=Tunnistus hyväksyttiin. -AutoTracker.Info.MarkedByUser=Mittapiste on merkitty manuaalisesti. -AutoTracker.Info.NoVideo=Video puuttuu. -AutoTracker.Info.Height=korkeus -AutoTracker.Info.Width=leveys -AutoTracker.Info.Accept=--hyväksy tunnistus -AutoTracker.Info.Retry=--muokkaa etsintäaluetta ja jatka etsimistä -AutoTracker.Info.Mark=--merkitse manuaalisesti shift-klikkaamalla -AutoTracker.Info.Skip=--ohita tämä kehys ja jatka seuraavalla kehyksellä -AutoTracker.Info.Reset=--palaa edelliseen merkittyyn kehykseen ja shift-ctrl-klikkaa luodaksesi uuden etsintäalueen -AutoTracker.Info.MatchScore=tunnistus lkm -AutoTracker.Dialog.MaskLocked.Title=Mallikuva lukittu -PointMass.Cursor.Autotrack.Description=Autotrackerin kursori -VideoPlayer.StartFrame.Hint=vedä aloituskehyksen kohdalle -VideoPlayer.EndFrame.Hint=vedä loppukehyksen kohdalle -VideoPlayer.Slider.Hint=kelaa video läpi vetämällä -FileDropHandler.Dialog.BadFile.Message=ei voitu ladata. -FileDropHandler.Dialog.BadFile.Title=Tunnistamaton tiedosto - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Suorita -DynamicParticle.Dialog.Delete.Message=Poistamalla hiukkanen nyt, häviää se myös koko järjestelmästä. Poistatko silti? -DynamicParticle.Dialog.Delete.Title=Dynaaminen systeemi -DynamicParticle.System.In=sisään -DynamicSystem.Empty=tyhjä -DynamicSystem.Force.Name.Internal=sisäinen -DynamicSystem.ForceFunction.R.Description=Sisäisen voiman normaalikomponentti -DynamicSystem.ForceFunction.Theta.Description=Sisäisen voiman tangentiaalikomponentti -DynamicSystem.MenuItem.Inspector=Valitse hiukkaset... -DynamicSystem.Name=Dynaaminen kahden kappaleen systeemi -DynamicSystem.New.Name=systeemi -DynamicSystem.Parameter.Of=jstkin -DynamicSystem.Parameter.RelativeTo=suhteessa -DynamicSystem.Parameter.Name.Relative=suhteellinen -DynamicSystem.Parameter.ParticleMass.Description=Massa: -DynamicSystem.Parameter.Mass.Description=Systeemin kokonaismassa -DynamicSystemInspector.Border.Title=Hiukkanen -DynamicSystemInspector.Title=Kahden kappaleen systeemi -DynamicSystemInspector.Button.Change=Vaihdetaan... -DynamicSystemInspector.ParticleName.None=(ei nimeä) -TMenuBar.MenuItem.Clone=Klooni -TMenuBar.MenuItem.TwoBody=Kahden kappaleen systeemi -TrackerPanel.DataBuilder.Dropdown.Tooltip=Valittuna oleva mittasarja -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Synkronoi pystyakselit -TrackControl.Button.Trace.ToolTip=Näytä tai piilota reitti -TToolBar.Button.Open.Tooltip=Avaa video tai Tracker-tiedosto uudessa välilehdessä -TToolBar.Button.Save.Tooltip=Tallenna nykyinen välilehti tiedostoksi -TToolBar.Button.SelectTrack=Valitse -TToolBar.Button.SelectTrack.Tooltip=Valitse olemassa oleva mittasarja -TTrack.MenuItem.ClearSteps=Tyhjennä askeleet -PointMass.MenuItem.Position=Paikka -TMenuBar.MenuItem.Empty=(Tyhjä) -TTrackBar.Button.Memory=muistia käytössä: -TTrackBar.Button.Memory.Tooltip=Monitoroi ja hallitse muistia -TTrackBar.Memory.PopupItem.Launch1=Käynnistä -TTrackBar.Memory.PopupItem.Launch2=muistilla -TButton.Track.ToolTip=Muuta ominaisuudet: -Tracker.Dialog.OutOfMemory.Message1=Tracker on ylittänyt muistialueensa. -Tracker.Dialog.OutOfMemory.Message2=Klikkaa Muisti-nappia ja lue vaihtoehdot. -Tracker.Dialog.OutOfMemory.Title=Muisti loppui - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Etsi seuraavaa -AutoTracker.Label.Original=Etsintäalue -AutoTracker.Label.NoMask=ei mallikuvaa -AutoTracker.Label.Rate=Nopeus: -AutoTracker.Info.Mask3=Vinkki: mallikuvan ei tarvitse olla suuri eikä sisältää seurattavaa esinettä kokonaan. Seuranta toimii parhaiten, kun mallikuvaan voi kohdistaa helposti tunnistettava yksityiskohta, jossa kontrasti on suuri. -AutoTracker.Wizard.Checkbox.XAxis=Seuraa X-akselia -AutoTracker.Info.SearchOnAxis1=Etsintäalue seuraa x-akselia löytääkseen parhaan tunnistuksen. Liikuta tai muotoile etsintäaluetta tarttumalla sen reunoihin tai kahvoja hiirellä. -AutoTracker.Info.PossibleOnAxis=Mahdollinen tunnistus on tehty etsintäalueella seuraamalla x-akselia. Päätä jatkotoimenpiteestä: -AutoTracker.Info.NoMatchOnAxis=Yhtään tunnistusta ei ole tehty etsintäalueella seuraamalla x-akselia. Päätä jatkotoimenpiteestä: -AutoTracker.Info.RetryOnAxis=--siirrä etsintäaluetta tai x-akselia ja jatka etsintää -AutoTracker.Wizard.Button.Delete=Poista -AutoTracker.Wizard.Button.DeleteMore=Poista jälkimmäiset pisteet -Button.Define.Tooltip=Määritä sarakkeiden muuttujille funktiot -Calibration.Label.Point=piste -CalibrationStick.Hint=määritä pituus tai venytä päästä, määritä kulma muuttaaksesi kallistusta -CalibrationStick.End.Hint=muuta asteikkoa vetämällä, shift-klikkaa lopetuksen merkiksi -CalibrationStick.New.Name=kalibrointitikku -CalibrationTapeMeasure.New.Name=kalibrointinauha -CalibrationTapeMeasure.Readout.Magnitude.Hint=klikkaa ja lisää pituus metreinä -CalibrationTapeMeasure.Hint=syötä pituus muuttaaksesi asteikkoa, syötä kulman suuruus muuttaaksesi kallistusta -DynamicSystem.Data.Description.0=hiukkasten välinen suhteellinen pituus -DynamicSystem.Data.Description.1=suhteellinen kulma -DynamicSystem.Data.Description.2=suhteellinen normaalinopeus -DynamicSystem.Data.Description.3=suhteellinen kulmanopeus -ExportDataDialog.Subtitle.Table=Mittataulukko -ExportDataDialog.Subtitle.Content=Solut -ExportDataDialog.Subtitle.Format=Lukujen muotoilu -ExportDataDialog.Subtitle.Delimiter=Erotin -ExportDataDialog.Title=Vie mittatiedot -ExportDataDialog.Delimiter.Add=Lisää... -ExportDataDialog.Delimiter.Remove=Poista... -ExportDataDialog.Content.AllCells=Kaikki solut -ExportDataDialog.Content.SelectedCells=Valitut solut -ExportDataDialog.MenuItem.RemoveDelimiter=Poista oma erotin -ExportDataDialog.Chooser.SaveData.Title=Tallenna tiedot nimellä -ExportVideoDialog.Button.SaveAs=Tallenna nimellä... -ExportVideoDialog.Button.FullSize=Täysi koko -ExportVideoDialog.Button.DrawnSize=Kuten piirretty -ExportVideoDialog.Content.VideoOnly=Vain video -ExportVideoDialog.Content.VideoAndGraphics=Video ja grafiikka -ExportVideoDialog.Content.GraphicsOnly=Vain grafiikka -ExportVideoDialog.Title=Vie videoleike -ExportVideoDialog.Label.ClipSettings=Videoklippien asetukset -ExportVideoDialog.Subtitle.Size=Koko -ExportVideoDialog.Subtitle.Content=Sisältö -ExportVideoDialog.Subtitle.View=Näytä -ExportVideoDialog.Subtitle.Format=Formaatti -ExportVideoDialog.Complete.Message1=Video on tallennettu nimellä -ExportVideoDialog.Complete.Message2=Haluatko avata se Trackerissa nyt? -ExportVideoDialog.Complete.Title=Vienti valmis -ExportVideoDialog.VideoSize=videon koko -ExportVideoDialog.MatSize=Kuvamatriisi -ExportVideo.Dialog.HiddenPlots.Message=Kuvaajien tulee olla kokonaan näkyvissä. -ExportVideo.Dialog.HiddenPlots.Title=Riittämätön näkymä -Footprint.DoubleTarget=kaksoisristi -Footprint.BoldDoubleTarget=lihava kaksoisristi -OffsetOrigin.MenuItem.Fixed=Kiinteät Todelliset Koordinaatit -ParticleModel.Dialog.Offscreen.Message1=Jotkin mallin askeljäljet ovat tyhjiä, koska ovat liikaa kuvan ulkopuolella. -ParticleModel.Dialog.Offscreen.Message2=Korjataksesi tämän, vaihda malli tai muuta videon kohdistusta. -ParticleModel.Dialog.Offscreen.Title=Kuvan ulkopuolella -PrefsDialog.Tab.Configuration.Title=Konfigurointi -PrefsDialog.Memory.BorderTitle=Muistin koko -PrefsDialog.Tab.General.Title=Yleistä -PrefsDialog.RecentFiles.BorderTitle=Avatut tiedostot menu -PrefsDialog.Label.RecentSize=Tiedostoja -PrefsDialog.Hints.BorderTitle=Vihjeitä -PrefsDialog.Button.Relaunch=Käynnistä Uudelleen -PrefsDialog.Button.ClearRecent=Tyhjennä -PrefsDialog.Checkbox.DefaultSize=Käytä oletusta -PrefsDialog.Checkbox.HintsOn=Näytä aina vinkit -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video-ohjelma -PrefsDialog.Button.Xuggle=Xuggle -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Muistinhallintaa ei käytetä, kun Tracker käynnistetään "Web Start":illa. -PrefsDialog.Dialog.WebStart.Title=Web Start-tila -PrefsDialog.LookFeel.BorderTitle=Ulkoasu -PrefsDialog.Language.BorderTitle=Kieli -PrefsDialog.Upgrades.BorderTitle=Tarkista päivitykset -PrefsDialog.Tab.Runtime.Title=Ohjelman suoritus -PrefsDialog.Tab.Display.Title=Näkymä -PrefsDialog.Language.Default=oletus -PrefsDialog.Upgrades.Always=Joka kerta -PrefsDialog.Upgrades.Weekly=Viikoittain -PrefsDialog.Upgrades.Monthly=Kuukausittain -PrefsDialog.Upgrades.Never=Ei koskaan -PrefsDialog.Button.CheckForUpgrade=Tarkista nyt -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle-videon Toisto -PrefsDialog.Xuggle.Slow=Pehmeästi (voi olla hidasta) -PrefsDialog.Xuggle.Fast=Nopeasti (voi olla nykivää) -PrefsDialog.CalibrationTool.BorderTitle=Oletuksena oleva kalibrointityökalu -Protractor.Name=Astemitta -Protractor.New.Name=astemitta -Protractor.Hint=siirrä varsia kun mittaat kulmia -Protractor.Label.Angle=kulma -Protractor.Field.Angle.Tooltip=Kulma astemitan varsien välissä -Protractor.Vertex.Name=kärki -Protractor.Vertex.Hint=liikuta kärkeä vetämällä -Protractor.End.Name=varren pää -Protractor.End.Hint=kierrä vartta vetämällä -Protractor.Handle.Name=kahva -Protractor.Handle.Hint=siirrä kulmamittaa vetämällä -Protractor.Rotator.Name=kiertäjä -Protractor.Rotator.Hint=kääntääksesi kulmamittaa vedä kahvasta -Protractor.Readout.Name=lue lukema -Protractor.Readout.Hint=kulma astemitan varsien välissä -ProtractorFootprint.Circle3=pieni ympyrä -ProtractorFootprint.Circle5=suuri ympyrä -ProtractorFootprint.Circle3Bold=lihava pieni ympyrä -ProtractorFootprint.Circle5Bold=lihava suuri ympyrä -Stick.Name=Kalibrointitikku -Stick.New.Name=kalibrointitikku -TableTrackView.MenuItem.Unformatted=Täydellä tarkkuudella -TableTrackView.MenuItem.Formatted=Annetulla formaatilla -TableTrackView.Menu.SetDelimiter=Aseta erotin -TableTrackView.MenuItem.AddDelimiter=Lisää... -TableTrackView.MenuItem.RemoveDelimiter=Poista... -TableTrackView.Dialog.CustomDelimiter.Message=Anna uusi erotin (myös merkkijono): -TableTrackView.Dialog.CustomDelimiter.Title=Lisää erotin -TableTrackView.Header.Tooltip=Lajittele klikkauksella ja valitse sarake kaksoisklikkauksella -TableTrackView.MenuItem.CopySelectedData=Kopioi valitut tiedot -TableTrackView.Dialog.RemoveDelimiter.Message=Valitse poistettava erotin: -TableTrackView.Dialog.RemoveDelimiter.Title=Poista erotin -TableTrackView.Radians.Tooltip=radiaaneissa -TableTrackView.Degrees.Tooltip=asteissa -TableTrackView.RadiansPerSecond.Tooltip=radiaani/s -TableTrackView.DegreesPerSecond.Tooltip=aste/s -TableTrackView.RadiansPerSecondSquared.Tooltip=radiaani/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=aste/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Tuhoa fysiikan kaava -TActions.Action.SaveFrame=Tallenna ryhmä välilehtiä... -TActions.AboutVideo=Ominaisuudet... -TActions.Dialog.AboutVideo.Title=Videon ominaisuudet -TActions.Dialog.AboutVideo.Type=Tyyppi -TActions.Dialog.AboutVideo.Size=Mitat -TActions.Dialog.AboutVideo.Length=Pituus -TActions.Dialog.AboutVideo.Frames=kehyksiä -TActions.Dialog.AboutVideo.Seconds=sekuntia -TActions.Dialog.AboutVideo.FrameRate=kehysnopeus -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Polku -TActions.Action.ImportTRK=Tracker-tiedosto... -TActions.Action.ProtractorVisible=Näkyvissä -TapeMeasure.MenuItem.FixedLength=Kiinteä pituus -TextTView.Label.NoTab=Klikkaa "Sivu", kun lisäät tekstiä tai HTML-sivun tänne. -TextTView.NewTab.Text1=Aloita tekstin tai otsikon muokkauksen kaksoisklikkaamalla. -TextTView.NewTab.Text2=Voit näyttää HTML-sivun, jos kirjoitat url-osoitteen tai avaat tiedoston klikkaamalla hiiren oikealla napilla. -TextTView.NewTab.Title=Ei otsikkoa -TextTView.Dialog.TabTitle.Title=Anna otsikko -TextTView.MenuItem.OpenHTML=Avaa HTML... -TextTView.MenuItem.SetTitle=Syötä otsikko... -TextTView.Button.NewTab=Uusi -TextTView.TextEdit.Description=Teksti -TFrame.Dialog.FileNotFound.Message=Tiedostoa ei löydy: -TFrame.Dialog.FileNotFound.Title=Tiedostoa ei löydy -TFrame.View.Text=Sivu-näkymä -TFrame.View.Main=Päänäkymä -TMenuBar.Menu.OpenRecent=Avaa viimeisin -TMenuBar.Menu.Import=Tuo -TMenuBar.Menu.Export=Vie -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=Mittatiedosto... -TMenuBar.Menu.CopyObject=Kopioi objekti -TMenuBar.MenuItem.Coords=Koordinaatisto -TMenuBar.MenuItem.VideoClip=Video-klippi -TMenuBar.Menu.MeasuringTools=Mittausvälineet -TMenuBar.Menu.AngleUnits=Kulmayksikkö -TMenuBar.MenuItem.Degrees=Asteet -TMenuBar.MenuItem.Radians=Radiaanit -Tracker.Dialog.NoXuggle.Title=Xuggle ei löydy -Tracker.Dialog.NoXuggle.Message1=Xuggle (video-ohjelma) ei ole asennettu. -Tracker.Dialog.NoXuggle.Message2=Lataa Xuggle osoitteesta http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Tietoa Xuggle'sta... -Tracker.Dialog.AboutXuggle.Title=Tietoa Xuggle'sta -Tracker.Dialog.AboutXuggle.Message.Version=Xugglen versio -Tracker.Dialog.AboutXuggle.Message.Home=Xugglen kotisivu: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle'n jar-polku: -Tracker.Dialog.NoVideoEngine.Message1=Video-ohjelmia ei ole asennettuna. Ilman niitä voit -Tracker.Dialog.NoVideoEngine.Message2=avata vain kuvia (JPEG, PNG) ja GIF-animaatioita. -Tracker.Dialog.NoVideoEngine.Message3=Suositus: Asenna Tracker Xuggle-ohjelman kanssa. -Tracker.Dialog.NoVideoEngine.Title=Ei video-ohjelmaa -Tracker.Dialog.NoXuggle.Message1=Xuggle ei toimi oikein. Varmista, että -Tracker.Dialog.NoXuggle.Message2=Xugglen jar-tiedosto on Trackerin kotikansiossa. Lisäohjeita saat -Tracker.Dialog.NoXuggle.Message3=lukemalla tiedosto Tracker_README.txt Trackerin kotikansiossa. -Tracker.Dialog.NoXuggle.Message4=Asentaaksesi Xuggle, lataa viimeisin Tracker-asennustiedosto -Tracker.Dialog.NoXuggle.Title=Xuggle ei käytettävissä -Tracker.About.DefaultLocale=Oletuspaikka -Tracker.About.CurrentLanguage=Kieli -Tracker.Dialog.InsufficientMemory.Title=Riittämätön muisti -Tracker.Dialog.InsufficientMemory.Message=Pyydetyn muistin määrä on liian suuri. -TrackerIO.Dialog.TabMustBeSaved.Message1=Välilehti -TrackerIO.Dialog.TabMustBeSaved.Message2=tulee tallentaa Tracker-tiedostona voidakseen kuulua välilehtien ryhmään. -TrackerIO.Dialog.TabMustBeSaved.Message3=Haluatko tallentaa sen? -TrackerIO.Dialog.TabMustBeSaved.Title=Tallentamaton välilehti -TrackerIO.Dialog.NoTabs.Message=Ei ole välilehtiä tallennettavaksi! -TrackerIO.Dialog.NoTabs.Title=Tyhjä välilehtiryhmä -TrackerIO.Dialog.SaveTabset.Title=Tallenna välilehtiryhmä -TrackerIO.Dialog.SaveTab.Title=Tallenna välilehti -TrackerIO.Delimiter.Tab=Välilehti -TrackerIO.Delimiter.Space=Välilyönti -TrackerIO.Delimiter.Comma=Pilkku -TrackerIO.Delimiter.Semicolon=Puolipiste -TrackerIO.VideoAndDataFileFilter.Description=Video- ja Tracker-tiedostot -TrackerPanel.Dialog.Version.Message1=Olet avaamassa Tracker-tiedoston, joka -TrackerPanel.Dialog.Version.Message2=viittaa sellaisiin ominaisuuksiin, -TrackerPanel.Dialog.Version.Message3=jotka puuttuvat käyttämästäsi Tracker-versiosta. -TrackerPanel.Dialog.Version.Message4=Viimeisin versio on saatavilla -TrackerPanel.Dialog.Version.Title=Versioiden sopimattomuus -TrackerPanel.Label.ModelStart=Aloituskehys -TrackerPanel.Label.ModelEnd=Lopetuskehys -TrackerPanel.Spinner.ModelStart.Tooltip=Aseta tälle mallille aloituskehys -TrackerPanel.Spinner.ModelEnd.Tooltip=Aseta tälle mallille lopetuskehys -TToolbar.Button.ProtractorVisible.Tooltip=Näytä tai piilota astemitta -TToolbar.Button.AxesVisible.Tooltip=Näytä tai piilota koordinaattiakselit -TToolBar.Button.TrackControl.Tooltip=Näytä tai piilota Mittauskontrolli -TTrack.Dialog.StepSizeWarning.Message1=Varoitus: eräät mittapisteet on merkitty yli 1 pituisilla askeleilla jättäen ohitettuja kehyksiä merkitsemättä. -TTrack.Dialog.StepSizeWarning.Message2=Askelpituudet tulevat todennäköisesti vaihtumaan mittasarjan aukoissa. -TTrack.Dialog.StepSizeWarning.Message3=Aukoissa jää nopeus ja kiihtyvyys määrittämättä kunnes ne merkitään asianmukaisesti. -TTrack.Dialog.StepSizeWarning.Title=Varoitus -TTrack.Dialog.SkippedStepWarning.Message1=Varoitus: jättämällä askeleita väliin paikkojen merkitsemisessä, jättää myös mittasarjaan aukkoja. -TTrack.Dialog.SkippedStepWarning.Title=Varoitus -TTrack.Dialog.SkippedStepWarning.Checkbox=Älä näytä tätä enää -TTrack.Locked.Hint=lukittu -TTrack.AngleField.Radians.Tooltip=Kulma radiaaneissa -TTrack.AngleField.Degrees.Tooltip=Kulma asteissa -TTrack.AngleField.Popup.Radians=Vaihda radiaaneihin -TTrack.AngleField.Popup.Degrees=Vaihda asteisiin -TTrackBar.Memory.Menu.SetSize=Aseta muistin koko... -TTrackBar.Button.Version=Nyt saatavissa: versio -TTrackBar.Popup.MenuItem.Upgrade=Päivitä nyt... -TTrackBar.Popup.MenuItem.Ignore=Ohita -XuggleVideo.MenuItem.SmoothPlay=Pehmeä toisto (voi olla hidas) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Kalibrointinauha -CircleFootprint.Circle=ympyrä -CircleFootprint.FilledCircle=täytetty ympyrä -CircleFootprint.Dialog.Title=Ympyrä (askelmerkki) -CircleFootprint.Dialog.Label.Radius=Säde -CircleFootprint.Dialog.Checkbox.Bold=Lihava -CircleFootprint.Dialog.Checkbox.CenterSpot=Keskuspiste -LineProfile.Hint.Marking=merkitse viiva hiirellä vetämällä -PageTView.Button.Page=Sivu -PageTView.MenuItem.ClosePage=Sulje sivu -PointMass.Hint.Marking=merkitse klikkaamalla, paina Enter kloonataksesi edellinen askel -PrefsDialog.Dialog.NewVersion.Title=Päivitys -PrefsDialog.Dialog.NewVersion.Message1=Versio -PrefsDialog.Dialog.NewVersion.Message2=on nyt saatavilla osoitteessa -PrefsDialog.Dialog.NewVersion.None.Message=Uusia päivityksiä ei tällä hetkellä saatavilla. -RGBRegion.Hint.Marking=merkitse alueen keskikohta, klikkaa kohtaa hiirellä -TMenuBar.MenuItem.Restore=Palauta näkymät -TrackControl.StretchVectors.None=Ei venytystä -TViewChooser.Maximize.Tooltip=Suurenna tämä näkymä -TViewChooser.Restore.Tooltip=Palauta näkymät -Vector.Hint.Marking=merkitse alueen keskikohta, klikkaa kohtaa hiirellä -WorldTView.Button.World=Maailma - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Varoituksia -PrefsDialog.Checkbox.WarnIfNoEngine=Ei video-ohjelmaa -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle-virheitä -PropertiesDialog.Title=Ominaisuudet -PropertiesDialog.Label.Author=Tekijät -PropertiesDialog.Label.Contact=Ota yhteyttä -TActions.Action.Properties=Ominaisuudet... -TActions.Action.OpenBrowser=Avaa Kirjastoselain... -TFrame.Progress.Xuggle=Xuggle'in latauskehys -TFrame.Progress.ClickToCancel=(peruuta klikkaamalla) -TFrame.Dialog.StalledVideo.Title=Virhe ladatessa videota -TFrame.Dialog.StalledVideo.Message0=Video on pysähtynyt latautuessaan. Se voi olla väliaikaista. -TFrame.Dialog.StalledVideo.Message1=Voit lopettaa lataamisen tai jatkaa odottamista. -TFrame.Dialog.StalledVideo.Message2=Muut vaihtoehdot avataksesi tämän videon ovat: -TFrame.Dialog.StalledVideo.Message3=1. Muuta videon formaattia konvertointiohjelmalla. -TFrame.Dialog.StalledVideo.Message4=2. Valitse QuickTime-tiedosto tai määrää se Asetuksia-ikkunassa. -TFrame.Dialog.StalledVideo.MessageMac=2. Käynnistä Tracker 32-bittisellä Javalla ja avaa video QuickTime'illa. -TFrame.Dialog.StalledVideo.Button.Stop=Pysäytä -TFrame.Dialog.StalledVideo.Button.Wait=Odota -Tracker.Dialog.NoVideoEngine.Checkbox=Älä näytä tätä enää -TrackerIO.ZipFileFilter.Description=ZIP-tiedosto (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle on kohdannut seuraavan virheen avatessaan videota: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Kaikki virheet eivät ole vakavia. Tutki virheilmoitusta komennolla Ohje|Viestiloki. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Ellet pysty avaamaan videota Xuggle'illa, voit avata sen vielä QuickTime'illa. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Huomaa: Macillä tämä onnistuu suorittamalla Tracker 32-bitin Javalla. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle-virhe -TrackerIO.ErrorFFMPEG.LogMessage=Lisätietoa saat, kun kytket Xuggle-varoitukset päälle Asetuksia-komennolla (Muokkaa|Asetuksia). -TToolBar.Button.OpenBrowser.Tooltip=Avaa OSP Digital Library'n selain - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=Tiedostoa ei löydy -TFrame.Dialog.NoTRKInComPADRE.Message=Ei löydetty Tracker-tiedostoa - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinemaattinen Hiukkasmalli -DynamicParticle.Builder.Title=Dynaaminen Hiukkasmalli (Karteesinen) -DynamicParticlePolar.Builder.Title=Dynaaminen Hiukkasmalli (Polaari) -DynamicSystem.Builder.Title=Dynaaminen Systeemi (Sisäinen) -PropertiesDialog.Button.CopyFilePath=Kopioi tiedostopolku -PropertiesDialog.Button.CopyVideoPath=Kopioi videopolku -PropertiesDialog.Tab.TrackerFile=Tracker-tiedosto -PropertiesDialog.Tab.Metadata=Metatiedot -PropertiesDialog.Header.Property=Ominaisuus -PropertiesDialog.Header.Value=Arvo -TActions.Action.OpenURL=Avaa URL... -TActions.Dialog.OpenURL.Title=Avaa URL -TActions.Dialog.OpenURL.Message=Syötä nettivideon, Tracker-tiedoston tai Trackerin ZIP-tiedoston URL-osoite -TActions.Dialog.AboutVideo.Name=Nimi - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Välimuistin nettitiedostot -PrefsDialog.Button.ClearCache=Tyhjennä kaikki - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, merkitse korostettu sijainti shift-klikkaamalla -PointMass.Remarking.Hint=merkitse paikka klikkaamalla -PointMass.PositionSelected.Hint=vedä tai syötä paikka työkalurivillä -PointMass.VectorSelected.Hint=siirrä vetämällä -Vector.Remark.Hint=merkitse korostettu kärki shift-klikkaamalla -Vector.TipSelected.Hint=vedä tai syötä komponentit työkalurivillä -Vector.HandleSelected.Hint=siirrä vetämällä -Vector.Remarking.Hint=merkitse kärki klikkaamalla -AutoTracker.Label.Search=Etsi -AutoTracker.Label.Target=Kohde -AutoTracker.Label.Frame=Kehys -AutoTracker.Label.Point=Piste -AutoTracker.Label.Template=Sapluuna -AutoTracker.Label.Track=Mittasarja -AutoTracker.Label.Match=Tunnistus -AutoTracker.Label.NoTemplate=Ei Sapluunaa -AutoTracker.Label.EvolutionRate=Muutosnopeus -AutoTracker.Label.Automark=Auto-merkkaus -AutoTracker.Info.Instructions=Klikkaa Etsi-nappia löytääksesi etsintäalueella kohteen tunnistuksen. -AutoTracker.Info.KeyFrame.Instructions1=Tämä etsintäalue määrittää näkyvän sapluunan ja kohteen. Tutki painamalla Etsi-nappia, löytyykö tunnistaako ohjelma sapluunan näköisen kohteen. -AutoTracker.Info.KeyFrame.Instructions2=Voit vetää kohdetta, sapluunaa tai etsintäaluetta siirtääksesi tai muuttaaksesi sitä. -AutoTracker.Info.MouseOver.Instructions=Liikuta hiirtä kontrollien yli ja seuraa ohjeita. -AutoTracker.Info.Mask1=Sapluuna on kuva, jota tunnistetaan. Etsintä alkaa aloituskehyksestä ja tunnistus seuraa muodon ja värien muuttumista. -AutoTracker.Info.Mask2=Kohde merkitään automaattisesti kunhan tunnistamisstatus ylittää kynnysarvon. -AutoTracker.Info.Mask.Instructions=Siirrä tai muuta sapluunaa vetämällä sen reunoja tai kahvaa (vain aloituskehyksessä). Säädä muutosnopeutta ja kynnysarvoa säätimistä. -AutoTracker.Info.Mask.Tip=Alhainen kynnysarvo kasvattaa todennäköisyyttä merkitä mittauspisteeksi virheellinen tunnistus. Kasvata sen sijaan muutostiheyttä. -AutoTracker.Info.Search=Etsintäalue käydään läpi parhaan vastineen löytämiseksi. -AutoTracker.Info.SearchOnAxis=Etsitään x-akselin suunnasta parhaan tunnistuksen tekemiseksi. -AutoTracker.Info.Search.Instructions=Siirrä tai muuta etsintäaluetta vetämällä reunoista tai kahvaa. Ota käyttöön x-akseli ja seurantaehdot valitsemalla ne. -AutoTracker.Info.Search.Tip=Etsintäalueen ei tarvitse olla suuri. Seuranta-toiminto siirtää automaattisesti etsintäalueen kohteen suuntaan. -AutoTracker.Info.Target=Kohde sijaitsee siellä, mihin tunnistetun kohteen mittapiste on merkitty. -AutoTracker.Info.Target.Instructions=Siirrä kohde vetämällä sitä (vain aloituskehys). Valitse pudotusvalikosta mittaussarja ja mittauspiste. -AutoTracker.Info.Title.Settings=Asetuksia -AutoTracker.Info.Title.Tip=Vinkki -AutoTracker.Info.SelectTrack=Valitse tai luo mittasarja ja mittapiste, jota haluat mitata automaattisesti. -AutoTracker.Info.OutsideXAxis=X-akseli ei kulje etsintäalueen läpi. X-akseli ei kulke etsintäalueen läpi. Päätä jatkotoimenpiteestä: -AutoTracker.Info.NewKeyFrame=--palaa takaisin ja vaihda tilalle uusi muutosnopeus tai merkitse uusi etsintäalue shif-ctrl-klikkauksella. -AutoTracker.Info.Replace=--hyväksy tunnistus -AutoTracker.Info.Keep=--ohita tämä kehys ja jätä merkitsemättä -AutoTracker.Info.PossibleReplace=Näytetään mahdollinen tunnistus. Päätä jatkotoimenpiteestä: -AutoTracker.Wizard.Button.Accept=Hyväksy -AutoTracker.Wizard.Button.Stop=Pysäytä -AutoTracker.Wizard.Button.Skip=Ohita -AutoTracker.Wizard.Button.Replace=Korvaa -AutoTracker.Wizard.Button.Keep=Hylkää -AutoTracker.Wizard.Button.Search=Etsi -AutoTracker.Wizard.Button.SearchThis=Etsi tämä -AutoTracker.Wizard.Button.SearchNext=Etsi seuraava -AutoTracker.Wizard.Button.Delete=Poista -AutoTracker.Wizard.Button.ShowKeyFrame=Näytä etsintäalue -AutoTracker.Wizard.Button.DeleteKeyFrame=Poista etsintäalue -AutoTracker.Wizard.Checkbox.LookAhead=Siirry eteenpäin -AutoTracker.Wizard.Checkbox.XAxis=Vain X-akseli -AutoTracker.Wizard.Menuitem.DeleteThis=Tämä piste -AutoTracker.Wizard.Menuitem.DeleteLater=Seuraavat pisteet -AutoTracker.Wizard.Menuitem.DeleteAll=Tyhjennä kaikki -TToolBar.Button.AutoTracker.Tooltip=Näytä tai piilota Autotrackeri -MainTView.Popup.MenuItem.ZoomIn=Suurenna -MainTView.Popup.MenuItem.ZoomOut=Pienennä -MainTView.Popup.MenuItem.ZoomToFit=Sovita -TrackerIO.Dialog.DurationVaries.Title=Kehyksien viiveet -TrackerIO.Dialog.DurationVaries.Message1=Joidenkin kehyksien kesto poikkeaa keskimääräisestä kestosta enemmän kuin -TrackerIO.Dialog.DurationVaries.Message2=Kelvollisten nopeuksien tai kiihtyvyyksien laskemiseksi, sinun tulisi rajata nämä kehykset pois laskuista -TrackerIO.Dialog.DurationVaries.Message3=asettamalla videolle aloitus- ja lopetuskehykset. -TrackerIO.Dialog.DurationVaries.Message4=Pois rajattavat kehykset: -TrackerIO.Dialog.DurationVaries.Message5=Keskimääräinen kehysviive ja kehysnopeus, jos rajataan: -TFrame.Dialog.LibraryError.Title=Virhe -TFrame.Dialog.LibraryError.Message=Mitään resurssia ei voitu ladata. - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=merkitse shift-klikkaamalla -PrefsDialog.Label.Path=Polku -PrefsDialog.Checkbox.ClearCacheOnExit=Tyhjennä poistuessa -PrefsDialog.FileChooser.Title.Cache=Aseta välimuisti -PrefsDialog.FileFilter.Directories=Kansiot -Tracker.Action.AboutThreads=Tietoa moniajosta (Threads)... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Valitse Java VM -PrefsDialog.FileFilter.JRE=Kansiot ja Java VMs -PrefsDialog.Version.BorderTitle=Trackerin Versio -PrefsDialog.Version.Default=oletus -PrefsDialog.Tab.ClearCacheOnExit=Tyhjennä poistuessa -PrefsDialog.Run.BorderTitle=Ohjelmat, jotka suoritetaan käynnistettäessä -PrefsDialog.FileChooser.Title.Run=Valitse käynistyvät tiedostot -PrefsDialog.Button.Save=Tallenna -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README-tiedosto ei löydy -Popup.MenuItem.Algorithm=Algoritmit... -AlgorithmDialog.Button.FiniteDifference=Differenssimenetelmä -AlgorithmDialog.Button.BounceDetect=Kolaritutka -AlgorithmDialog.TitledBorder.Choose=Valitse algoritmi, jolla lasketaan nopeus ja kiihtyvyys: -AlgorithmDialog.Title=Algoritmit -AlgorithmDialog.FiniteDifference.Message1=Tämä on oletusalgoritmi. -AlgorithmDialog.FiniteDifference.Message2=Nopeus: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Kiihtyvyys: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Tämä algoritmi tasaa nopeuksien ja kiihtyvyyksien vaihteluita, mutta se huomaa myös äkilliset vaihtelut nopeudessa. -AlgorithmDialog.BounceDetect.Message2=Varoitus: aiheuttaa ongelmia. Listätietoa varten katso: -TMenuBar.Menu.Diagnostics=Diagnostiikka - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Kelvoton XML -Tracker.Dialog.Invalid.Message=Tiedostoa ei voida lukea. -TrackPlottingPanel.Popup.Menu.CompareWith=Vertaa -TrackerPanel.DataBuilder.TrackType.Unknown=tuntematon -TrackerPanel.DataBuilder.Button.Load.Tooltip=Lataa fysiikan kaavoja XML-tiedostosta -TrackerPanel.DataBuilder.Button.Save.Tooltip=Tallenna fysiikan kaavoja XML-tiedostoon -TrackerPanel.DataBuilder.Load.Title=Lataa fysiikan kaavoja -TrackerPanel.DataBuilder.Load.Message=Valitse ladattavat kaavat: -TrackerPanel.DataBuilder.Save.Title=Tallenna fysiikan kaavat -TrackerPanel.DataBuilder.Save.Message=Valitse tallennettavat kaavat: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Lataa kaikki -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Lataa vain -TrackerPanel.DataBuilder.Dialog.Load.Title=Valitse mittasarja -TrackerPanel.DataBuilder.Dialog.Load.Message=Haluatko ladata fysiikan kaavat kaikkiin mittasarjoihin, jotka ovat -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Sopimaton mittasarjan tyyppi -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Tiedostossa on fysiikan kaavoja mittasarjalle -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Kaavoja ei voitu ladata mittasarjalle -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Sopimaton mittasarjan tyyppi -TrackerPanel.DataBuilder.Dialog.WrongType.Message=Tiedostossa ei ole fysiikan kaavoja -TToolbar.Button.Refresh=Virkistä mittasarjoja ja näkymiä - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=Tracker-leike on tallennettu -ExportTRKDialog.Complete.Message2=Haluatko avata sen Trackerissa nyt? -ExportTRKDialog.Complete.Title=Tracker-tiedoston vienti valmis -ExportTRKDialog.Title=Vie Tracker-klippi -ExportTRKDialog.Message1=This (1) vie video-klipin, (2) konvertoi mittausten välilehdet vastaamaan vietyä videota, ja (3) tallentaa konvertoidut välilehdet uutena Tracker-tiedostona. -ExportTRKDialog.Message2=Tracker- ja video-tiedostot tallennetaan samaan kansioon samalla nimellä eri tunnisteella. -TMenuBar.MenuItem.TabClip=Tracker-klippi -TMenuBar.Menu.CalibrationTools=Kalibroinnin työvälineet -TrackerIO.Dialog.DurationVaries.Button.SetClip=Aseta suositeltu klippi -TrackerIO.Dialog.DurationVaries.Start=aloita -TrackerIO.Dialog.DurationVaries.End=lopeta -TrackerIO.Dialog.DurationVaries.Recommended=Suositeltu klippi - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Kiinnitä mitan päät -AttachmentInspector.Label.End=Pää -AttachmentInspector.Label.Vertex=Kärki -AttachmentInspector.Header.PointName=Nimi -AttachmentInspector.Header.AttachedTo=Kiinnitä -ExportTRKDialog.Label.VideoFormat=Videoformaatti -MeasuringTool.MenuItem.Attach=Kiinnitä päät... -PerspectiveTrack.Corner=nurkka -PrefsDialog.LogLevel.BorderTitle=Siirry Viestiloki-tilaan -Protractor.Data.Description.0=aika -Protractor.Data.Description.1=Astemitan kulma -Protractor.Data.Description.2=kyljen 1 pituus -Protractor.Data.Description.3=kyljen 2 pituus -Protractor.Data.Description.4=askelnumero -Protractor.Data.Description.5=kehysnumero -TapeMeasure.Data.Description.0=aika -TapeMeasure.Data.Description.1=pituus -TapeMeasure.Data.Description.2=+x-akselista mitattu kulma -TapeMeasure.Data.Description.3=askelnumero -TapeMeasure.Data.Description.4=kehysnumero - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=ei etsitty -AutoTracker.Info.KeyFrame=Etsintäalue -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Tämä etsintäalue -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Tämä tunnistus -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Myöhemmät tunnistukset -PrefsDialog.Checkbox.64BitVM=64-bittinen - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotrackeri -Dialog.Button.Add=Lisää -Dialog.Button.Remove=Poista -PrefsDialog.Button.ClearHost=Tyhjennä verkkosivu -PrefsDialog.Button.ClearHost.Tooltip=poista kaikki tiedostot, jotka liittyvät valittuun verkkosivustoon OSP-välimuistissa -PrefsDialog.Button.ClearCache.Tooltip=tuhoa kaikki tiedostot OSP-välimuistista -TActions.Action.SaveZip=Vie Trackerin ZIP-tiedosto -ThumbnailDialog.Title=Vie kuvake -ThumbnailDialog.Settings.Title=Kuvakkeen asetukset -ThumbnailDialog.Label.CurrentImage=Nykyinen kuva -ThumbnailDialog.Label.FrameNumber=kehys -ThumbnailDialog.Label.StepNumber=askel -ThumbnailDialog.View.VideoOnly=Vain Video -ThumbnailDialog.View.MainView=Päänäkymä -ThumbnailDialog.View.WholeFrame=Koko kehys -ThumbnailDialog.Format.PNG=PNG-kuva -ThumbnailDialog.Format.JPG=JPEG-kuva -ThumbnailDialog.Chooser.SaveThumbnail.Title=Tallenna kuvake -ThumbnailDialog.Subtitle.Image=Kuva -TMenuBar.MenuItem.Thumbnail=Kuvake -TToolBar.Button.SaveZip.Tooltip=Vie Tracker-ZIP-tiedosto -TTrack.MenuItem.DeletePoint=Tuhoa valittu askel -ZipResourceDialog.Title=Vie Tracker-ZIP-tiedosto -ZipResourceDialog.Label.Format=Formaatti -ZipResourceDialog.Label.Title=Nimi -ZipResourceDialog.Label.Description=Kuvaus -ZipResourceDialog.Label.Keywords=Avainsanat -ZipResourceDialog.Label.Link=Ulkoinen linkki -ZipResourceDialog.Label.HTML=HTML-lähde -ZipResourceDialog.Complete.Message1=Tracker-ZIP-tiedosto on tallennettu nimellä -ZipResourceDialog.Complete.Message2=Haluatko avata sen Trackerissa nyt? -ZipResourceDialog.Complete.Title=Onnistui -ZipResourceDialog.Border.Title.Documentation=HTML-dokumentti -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Kuvake -ZipResourceDialog.FileChooser.SaveZip.Title=Vie Tracker-ZIP-tiedosto -ZipResourceDialog.FileChooser.AddFile.Title=Lisää tiedosto Tracker-ZIP-tiedostoon -ZipResourceDialog.FileChooser.OpenHTML.Title=Avaa HTML-tiedosto -ZipResourceDialog.Button.AddFiles=Lisää tiedostoja -ZipResourceDialog.Button.ThumbnailSettings=Kuvake asetukset -ZipResourceDialog.Checkbox.TrimVideo=Katkaise klipiksi -ZipResourceDialog.AddHTMLInfo.Title=Lisää HTML-Info-tiedosto -ZipResourceDialog.AddHTMLInfo.Message1=Haluatko lisätä HTML-Info-tiedoston -ZipResourceDialog.AddHTMLInfo.Message2=Tracker-ZIP-tiedostoon? -ZipResourceDialog.HTMLField.DefaultText=Ellei mitään ilmoiteta, tiedosto muodostetaan perusosista -ZipResourceDialog.Dialog.AddFiles.Title=Lisää HTML- ja PDF-tiedostoja -ZipResourceDialog.Tooltip.HTML=Polku HTML-lähteeseen (ellei mitään anneta, tiedosto muodostetaan perusosista) -ZipResourceDialog.Tooltip.Author=Tämän aineiston tekijät -ZipResourceDialog.Tooltip.Title=Näytä tämän aineiston nimi (ei tiedoston nimi) -ZipResourceDialog.Tooltip.Description=Hyödyllinen selostus aineistosta -ZipResourceDialog.Tooltip.Keywords=Luettelo avainsanoista DL-selaimelle -ZipResourceDialog.Tooltip.Contact=Tekijän yhteystiedot (laitos, s-posti, verkkosivu, jne.) -ZipResourceDialog.Tooltip.Link=URL ulkoiseen HTML-tiedostoon, jossa on enemmän tietoa aineistosta -ZipResourceDialog.Tooltip.ThumbnailSettings=Vaihda kuvakenäkymä, koko, tai tiedostotyyppi -ZipResourceDialog.Tooltip.AddFiles=Lisää HTML- ja PDF-tiedostoja Trackerin ZIP-tiedostoon -ZipResourceDialog.Tooltip.TrimVideo=Valitse vidäksesi videoklipin, poista valinta käyttääksesi alkuperäistä videota -ZipResourceDialog.Tooltip.LoadHTML=Käytä tiedoston valintaikkunaa lataaksesi HTML--Info-tiedoston - -# Additions by Doug Brown 2012-12-10 -PrefsDialog.Checkbox.32BitVM=32-bittinen -PrefsDialog.Checkbox.WarnVariableDuration=Muuttuvat kehysviiveet -PrefsDialog.Button.NoEngine=Ei video-ohjelmaa -PrefsDialog.Dialog.SwitchToQT.Message=Vaihtamalla QuickTime'iin vaihtuu myös Java VM 32-bittiseksi. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 32-bittiseksi. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 64-bittiseksi. -PrefsDialog.Dialog.SwitchVM.Title=Java VM vaihtui -PrefsDialog.Dialog.SwitchTo32.Message=Vaihtamalla Java VM 32-bittiseksi vaihtuu myös video-ohjelma QuickTime'iksi. -PrefsDialog.Dialog.SwitchTo64.Message=Vaihtamalla Java VM 64-bittiseksi vaihtuu myös video-ohjelma Xuggleksi. -PrefsDialog.Dialog.SwitchEngine.Title=Video-ohjelma vaihtui -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Yhtään video-ohjlmaa ei ole käytettävissä 64-bittiselle Javalle. Voit -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=kuitenkin vielä avata kuvia (JPEG, PNG) and GIF-animatioita. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Oletko varma, että haluat vaihtaa 64-bittiseen Javaan? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ei 64-bittistä Video-ohjelmaa -PrefsDialog.Dialog.No32bitVMXuggle.Message=Ennen kuin Xugglea voi käyttää tulee ensin asentaa 32-bittinen Java VM. -PrefsDialog.Dialog.No32bitVMQT.Message=Ennen kuin QuickTime'ia voi käyttää tulee ensin asentaa 32-bittinen Java VM. -PrefsDialog.Dialog.No32bitVM.Message=Lisätietoa saa Trackerin ohjeista: Asennus. -PrefsDialog.Dialog.No32bitVM.Title=Tarvitaan 32-bittinen Java VM -PrefsDialog.Button.ShowHelpNow=Näytä Ohje nyt -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=EI VAKIO -TMenuBar.MenuItem.CheckFrameDurations=Kehysviive -TMenuBar.MenuItem.ExportZIP=Tracker-Zip -Tracker.Dialog.Install32BitVM.Message=Ennen kuin video-ohjelmia voi käyttää tulee ensin asentaa 32-bittinen Java VM. -Tracker.Dialog.SwitchTo32BitVM.Message1=Yksi tai useampi video-ohjelma on asennettuna, mutta niitä ei voi käyttää, koska -Tracker.Dialog.SwitchTo32BitVM.Message2=ne tarvitsevat 32-bittisen Javan ja sinä käytät tällä hetkellä 64-bittistä Javaa. -Tracker.Dialog.SwitchTo32BitVM.Message3=Muuttaaksesi tämän, avaa Asetuksia-ikkuna (Muokkaa|Asetuksia...) -Tracker.Dialog.SwitchTo32BitVM.Message4=ja valitse 64-bittinen Java VM Suoritus-välilehdellä. -Tracker.Dialog.EngineProblems.Message1=Yksi tai useampi video-ohjelma on asennettuna, mutta niitä ei voi käyttää. -Tracker.Dialog.EngineProblems.Message2=Lisätietoa saa: Ohje|Diagnostiikka|Tietoa Xugglesta or QuickTime'ista. -Tracker.Dialog.ReplaceXuggle.Message1=Suosittelemme nykyisen Xugglen korvaamista -Tracker.Dialog.ReplaceXuggle.Message2=uudella Xuggle-versiolla 3.4 asentamalla Tracker (versio 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=tai uudempi) ja valitsemalla Xuggle-asennusvaihtoehto. -TrackerIO.Dialog.DurationIsConstant.Message=Kaikki kehyksien kestot ovat samat (vakio-fps). -TrackerIO.ZIPResourceFilter.Description=Trackerin ZIP-tiedosto (.trz) -TToolbar.Button.Desktop.Tooltip=Näytä täydentäviä HTML- tai/ja PDF-dokumentteja -ZipResourceDialog.BadModels.Message1=Videoklippi ei sisällä aloituskehystä -ZipResourceDialog.BadModels.Message2=sitä seuraavalle Hiukkasmallin mittaussarjalle. Jos katkaiset videon, niin -ZipResourceDialog.BadModels.Message3=malli ei tallennu Tracker-ZIP'iin. -ZipResourceDialog.BadModels.Question=Jatkatko ja jätätkö pois mallit? -ZipResourceDialog.BadModels.Title=Videoleikkeen ja mallin ristiriita -TMenuBar.MenuItem.EditVideoFrames=Lataa kaikki kuvat -TMenuBar.Dialog.RequiresMemory.Message1=Kaikki kuvat ladataan muistiin nopeamman selaamisen ja muokkaamisen takia. -TMenuBar.Dialog.RequiresMemory.Message2=Tarkista käytettävän muistin määrä ja tarvittaessa käynnistä Tracker suuremmalla muistilla. -TMenuBar.Dialog.RequiresMemory.Title=Muisti - -# Additions by Doug Brown 2013-01-25 -PointMass.Data.Description.PixelX=pikselin x-koordinaatti -PointMass.Data.Description.PixelY=pikselin y-koordinaatti -ExportVideoDialog.Content.DeinterlacedVideo=Lomittamaton video -ExportVideoDialog.Deinterlace.OddFirst=Parittomat kentät ensin -ExportVideoDialog.Deinterlace.EvenFirst=Parilliset kentät ensin -ExportVideoDialog.Deinterlace.Dialog.Title=Lomittamaton videokenttä -TFrame.Dialog.LibraryError.FileNotFound.Title=Tiedostoa ei löydy -TFrame.Dialog.LibraryError.FileNotFound.Message=Tiedostoa ei löydy -TrackerPanel.DataBuilder.Button.Autoload=Auto-lataus -TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Halliste fysiikan kaavojen auto-latausta -TrackerPanel.DataBuilder.Autoload.Title=Lataa automaattisesti fysiikan kaavat -TrackerPanel.DataBuilder.Autoload.Message=Valiste automaattisesti ladattavat kaavat: -TrackerPanel.DataBuilder.Chooser.XMLFiles=XML-tiedostot -TrackerIO.Dialog.Open.Title=Avaa -TToolbar.Button.Refresh.Popup.RefreshNow=Virkistä -TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-virkistys -TToolbar.Button.Refresh.Tooltip=Virkistä mittasarjoja ja näkymiä - -# Additions by Doug Brown 2013-05-10 -CoordAxes.Origin.Label=origon pikselien paikka -CoordAxes.Origin.Field.Tooltip=origon paikka mitatuna videon ylävasemasta kulmauksesta - -# Additions by Doug Brown 2013-08-24 -MainTView.Popup.MenuItem.Select=Valitse Pisteet -MainTView.Popup.MenuItem.Deselect=Vapauta Pisteet +# This is the Finnish tracker.properties file +# Translation by Jari Hokkanen 2013 + +Calibration.Name=Kalibrointipisteet +Calibration.New.Name=kalibrointipisteet +CenterOfMass.Name=Painopiste +CenterOfMass.New.Name=pp +CenterOfMass.MenuItem.Inspector=Valitse massat... +CenterOfMassInspector.Title=Painopiste +CenterOfMassInspector.Border.Title=Valitse massat +ConfigInspector.Border.Title=Halutut ominaisuudet +ConfigInspector.Title=Asetukset +ConfigInspector.Button.SaveAsDefault=Tallenna oletukseksi +CoordAxes.Name=Akselit +CoordAxes.New.Name=akselit +Dialog.Button.Cancel=Peruuta +Dialog.Button.OK=OK +Dialog.Button.Close=Sulje +Dialog.Button.All=Kaikki +Dialog.Button.None=Ei mitään +Dialog.Button.Copy=Kopioi +Dialog.Button.Update=Päivitä +Dialog.Button.SelectAll=Valitse kaikki +Footprint.Diamond=ruutu +Footprint.BoldDiamond=paksu ruutu +Footprint.SolidDiamond=täytetty ruutu +Footprint.Triangle=kolmio +Footprint.BoldTriangle=paksu kolmio +Footprint.SolidTriangle=täytetty kolmio +Footprint.Circle=ympyrä +Footprint.BoldCircle=paksu ympyrä +Footprint.SolidCircle=täytetty ympyrä +Footprint.VerticalLine=pystysuora +Footprint.BoldVerticalLine=paksu pystysuora +Footprint.HorizontalLine=vaakasuora +Footprint.BoldHorizontalLine=paksu vaakasuora +Footprint.Crosshair=rasti +Footprint.BoldCrosshair=paksu rasti +Footprint.SimpleAxes=perusakselit +Footprint.BoldSimpleAxes=paksut perusakselit +Footprint.Spot=piste +Footprint.Line=suora +Footprint.BoldLine=paksu suora +Footprint.Outline=reunaviiva +Footprint.BoldOutline=lihava reunaviiva +Footprint.Arrow=vektori +Footprint.BoldArrow=paksu vektori +Footprint.DoubleArrow=kaksoisvektori +Footprint.BoldDoubleArrow=paksu kaksoisvektori +Footprint.2xArrow=2x vektori +Footprint.Bold2xArrow=paksu 2x vektori +Footprint.4xArrow=4x vektori +Footprint.Bold4xArrow=paksu 4x vektori +Footprint.DashArrow=katkoviivavektori +Footprint.BoldDashArrow=lihava katkoviivavektori +Footprint.BigArrow=suuri vektori +Footprint.BigDashArrow=lihava katkoviivavektori +LineProfile.Name=Viivan profiili +LineProfile.New.Name=profiili +LineProfile.Data.Brightness=kirkkaus +LineProfile.Data.Pixel=pikseli +LineProfile.Data.Red=punainen +LineProfile.Data.Green=vihreä +LineProfile.Data.Blue=sininen +LineProfile.Data.Weighting=painotus +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Suurennus +MainTView.Popup.MenuItem.ToFit=Sovitus +OffsetOrigin.Name=Apuorigo +OffsetOrigin.New.Name=apuorigo +PlotTrackView.Button.PlotCount=Kuvaajat +PlotTrackView.Button.PlotCount.ToolTip=Kuvaajien lukumäärä +PointMass.Name=Massapiste +PointMass.New.Name=massa +PointMass.MenuItem.VectorsToPosition=Paikka +PointMass.MenuItem.Velocity=Nopeus +PointMass.MenuItem.Acceleration=Kiihtyvyys +Star.Name=Tähti +Star.New.Name=tähti +TableTrackView.Action.CopyData=Kopioi tiedot +TableTrackView.Button.SelectTableData=Taulukko +TableTrackView.Button.SelectTableData.ToolTip=Valitse sarakkeet +TableTrackView.Popup.MenuItem.Analyze=Analysoi... +TableTrackView.Dialog.Border.Title=Näkyvissä: +TActions.Action.Description=Muistio +TActions.Action.ClearTracks=Kaikki mittasarjat +TActions.Action.NewTab=Uusi välilehti +TActions.Action.Copy=Kopioi +TActions.Action.Paste=Liitä +TActions.Action.Open=Avaa tiedosto... +TActions.Action.Close=Sulje välilehti +TActions.Action.Import=Tuo... +TActions.Action.Save=Tallenna välilehti +TActions.Action.SaveAs=Tallenna välilehti nimellä +TActions.Action.Export=Vie... +TActions.Action.CaptureVideo=Kaappaa video... +TActions.Action.Delete=Poista +TActions.Action.Config=Asetukset +TActions.Action.AxesVisible=Näkyvissä +TActions.Action.TapeVisible=Näkyvissä +TActions.Action.Print=Tulosta... +TActions.Action.ClearFilters=Tyhjennä +TActions.Action.ImportVideo=Tuo... +TActions.Action.CloseVideo=Sulje +TActions.Action.CloseAll=Sulje kaikki välilehdet +TActions.Action.Exit=Poistu +TActions.Dialog.PrintError.Message=On tapahtunut tulostusvirhe. +TActions.Dialog.PrintError.Title=Tulostusvirhe +TActions.Dialog.Description.Title=Muistio: +TActions.Dialog.DeleteLockedTracks.Message=Eräät mittasarjat ovat lukittuja. Poistetaanko ne silti? +TActions.Dialog.DeleteLockedTracks.Title=Poista lukitut mittasarjat? +TActions.Dialog.NewPointMass.Title=Uusi paikka +TapeMeasure.Name=Mittanauha +TapeMeasure.New.Name=mittanauha +TapeMeasure.MenuItem.Fixed=Kiinnitetty +TFrame.View.Plot=Kuvaajat +TFrame.View.Table=Taulukot +TFrame.View.World=Maailma +TFrame.View.Video=Video +TFrame.Dialog.Help.Title=Trackerin ohjeet +TMenuBar.Menu.File=Tiedosto +TMenuBar.Menu.Edit=Muokkaa +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Mittasarjat +TMenuBar.Menu.Coords=Koordinaatisto +TMenuBar.Menu.Window=Ikkuna +TMenuBar.Menu.Help=Ohjeet +TMenuBar.MenuItem.EditProperties=Ominaisuudet +TMenuBar.MenuItem.VideoVisible=Näkyvissä +TMenuBar.MenuItem.VideoFilters=Filtterit +TMenuBar.MenuItem.NewVideoFilter=Uusi +TMenuBar.MenuItem.NewTrack=Uusi +TMenuBar.MenuItem.CoordsLocked=Lukittu +TMenuBar.MenuItem.CoordsFixedOrigin=Kiinteä origo +TMenuBar.MenuItem.CoordsFixedAngle=Kiinteä kulma +TMenuBar.MenuItem.CoordsFixedScale=Kiinteä asteikko +TMenuBar.MenuItem.CoordsRefFrame=Vertailukehys +TMenuBar.MenuItem.CoordsDefault=Oletus +TMenuBar.MenuItem.WindowRight=Ikkunat oikealla +TMenuBar.MenuItem.WindowBottom=Ikkunat alapuolella +TMenuBar.MenuItem.PlayAllSteps=Toista kaikki askeleet +TMenuBar.MenuItem.Record=Tallenna +TMenuBar.MenuItem.MatSize=Pikselimatriisi +TMenuBar.MenuItem.Language=Kieli +TMenuBar.MenuItem.DeleteTrack=Poista +TMenuBar.MenuItem.TrackerHelp=Tracker ohjeet... +TMenuBar.MenuItem.MessageLog=Loki +TrackControl.Name=Mittasarjakontrolli +TrackControl.Button.NewTrack=Luo uusi +TrackControl.Button.NewTrack.ToolTip=Luo uusi mittasarja +TrackControl.Button.Trails.ToolTip=Aseta mittasarjan pituus +TrackControl.Button.Labels.ToolTip=Näytä/piilota numerointi +TrackControl.Button.StretchVectors.ToolTip=Venytä vektorit +TrackControl.Button.Accelerations.ToolTip=Näytä/piilota kiihtyvyysvektorit +TrackControl.Button.Xmass.ToolTip=Kerro vektorit massalla +TrackControl.Button.Vectors.ToolTip=Vektoreita +TrackControl.Button.Velocities.ToolTip=Näytä/piilota nopeusvektorit +TrackControl.Button.Properties.ToolTip=Valitse klikkaamalla +TrackControl.Button.Positions.ToolTip=Näytä/piilota paikat +Tracker.Popup.MenuItem.Snapshot=Tilannekuva... +Tracker.Popup.MenuItem.Help=Ohjeet... +Tracker.Cursor.Crosshair.Description=Risti +Tracker.Action.AboutTracker=Tietoja Trackeristä... +Tracker.Dialog.AboutTracker.Title=Tietoja Trackeristä +Tracker.Action.AboutJava=Tietoja Javasta... +Tracker.Dialog.AboutJava.Title=Tietoja Javasta +Tracker.Dialog.AboutJava.UnknownVersion=tuntematon +Tracker.Dialog.AboutJava.Message=Javan versio +Tracker.Action.AboutQT=Tietoja QuickTime'sta... +Tracker.Dialog.AboutQT.Title=Tietoja QuickTime'sta +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime'in versio +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJavan versio +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJavan polku: +Tracker.Dialog.NoQT.Title=QTJava.zip ei löydy +Tracker.Dialog.NoQT.Message1=QuickTime for Java ei ole asennettu. +Tracker.Dialog.NoQT.Message2=Jos haluat käyttää QuickTime videoita, asenna QuickTime uudestaan. +Tracker.Dialog.NoQT.Message3=HUOMIO: QuickTime for Java TÄYTYY OLLA VALITTUNA asennettaessa QuickTime. +Tracker.Dialog.UpdateQT.Title=Päivitä QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Uudempi versio paketista QTJava.zip on löytynyt +Tracker.Dialog.UpdateQT.Message2=Haluatko päivittä olemassa oleva tiedosto? +Tracker.Dialog.CopyQT.Title=Kopioi QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime on asennettuna, mutta ennen kuin Tracker voi käyttää sitä: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip täytyy kopioida +Tracker.Dialog.CopyQT.Message3= --> +Tracker.Dialog.CopyQT.Message4= 2. Tracker täytyy käynnistää uudelleen. +Tracker.Dialog.CopyQT.Message5=Haluatko kopioida QTJava.zip nyt? +Tracker.Dialog.CopyFailed.Title=Kopiointi epäonnistui +Tracker.Dialog.CopyFailed.Message=QTJava.zip ei voitu kopioida. +Tracker.Dialog.CopiedTo.Title=Kopiointi onnistui +Tracker.Dialog.CopiedTo.Message1=QTJava.zip on kopioitu onnistuneesti +Tracker.Dialog.CopiedTo.Message2=Tracker täytyy käynnistää uudelleen ja siksi ohjelma lopetetaan. +Tracker.Splash.Loading=Ladataan +TrackerIO.Dialog.Import.Title=Tuo Tracker-tiedosto +TrackerIO.Dialog.Import.Message=Valitse tuotavat kohteet +TrackerIO.Dialog.ImportVideo.Title=Tuo video +TrackerIO.Dialog.Export.Title=Vie +TrackerIO.Dialog.Export.Message=Valitse vietävät kohteet +TrackerIO.Dialog.ReplaceFile.Title=Korvataanko olemassaoleva tiedosto? +TrackerIO.Dialog.ReplaceFile.Message=on jo olemassa. Haluatko korvata sen? +TrackerIO.Dialog.NotTrackerXML.Title=Yhteensopimaton XML +TrackerIO.Dialog.NotTrackerXML.Message=on XML-tiedosto toiselle sovellukselle. +TrackerIO.Dialog.BadVideo.Message=Tiedoston video on väärää formaattia: +TrackerIO.Dialog.BadVideo.Title=Tunnistamaton videotiedosto +TrackerPanel.NewTab.Name=Otsikko +TrackerPanel.DragToMark.Hint=Merkitse shift-vetämällä +TrackerPanel.ClickToMark.Hint=Merkitse shift-klikkaamalla +TrackerPanel.Dialog.LoadFailed.Title=Viallinen Tracker-tiedosto +TrackerPanel.Dialog.LoadFailed.Message=Tiedosto ei ole kelvollinen Tracker-tiedosto: +TrackerPanel.Dialog.SaveChanges.Title=Tallenna muutokset +TrackerPanel.Dialog.SaveChanges.Message=Tallenna muutokset nimellä +TrackPlottingPanel.Popup.MenuItem.Lines=Suorat +TrackPlottingPanel.Popup.MenuItem.Points=Pisteet +TrackPlottingPanel.Popup.MenuItem.Scale=Asteikko +TrackPlottingPanel.Popup.MenuItem.Print=Tulosta... +TrackPlottingPanel.Popup.MenuItem.Measure=Sovita asteikko +TrackPlottingPanel.Popup.MenuItem.Analyze=Analysoi... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Suurenna +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Pienennä +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Sovita +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Sovita laatikkoon +TrackPlottingPanelInspector.Title=Asteikko +TrackPlottingPanelInspector.Label.Min=Minimi +TrackPlottingPanelInspector.Label.Max=Maksimi +TrackPlottingPanelInspector.Label.Auto=Automaattinen +TToolBar.Button.Footprint.Tooltip=Aseta merkit +TToolBar.Dropdown.SelectedTrack.Tooltip=Valitse mittasarja +TToolBar.Dropdown.SelectedTrack.None=Ei mitään +TTrack.MenuItem.Delete=Poista +TTrack.MenuItem.Color=Värit... +TTrack.Dialog.Color.Title=Valitse mittasarjan värit +TTrack.MenuItem.Name=Nimi... +TTrack.MenuItem.Footprint=Askelmerkit +TTrack.MenuItem.Description=Muistio... +TTrack.MenuItem.Visible=Näkyvissä +TTrack.MenuItem.TrailVisible=Mittasarja näkyvissä +TTrack.MenuItem.Autostep=Automaattinen askel +TTrack.MenuItem.MarkByDefault=Merkitse oletuksena +TTrack.MenuItem.Locked=Lukittu +TTrack.MenuItem.Delete=Poista +TTrack.Name.None=ei nimeä +TTrack.Dialog.Description.Title=Muistio: +TTrack.Dialog.Name.Title=Aseta nimi +TTrack.Dialog.Name.Label=Nimi: +TViewChooser.Button.Choose.Tooltip=Valitse näkymä +Vector.Name=Vektori +Vector.New.Name=vektori +Vector.MenuItem.ToOrigin=Kanta origoon +Vector.MenuItem.Label=Näytä tunnus +VectorSum.Name=Vektorisumma +VectorSum.New.Name=summa +VectorSum.MenuItem.Inspector=Valitse vektorit... +VectorSumInspector.Title=Vektorisumma +VectorSumInspector.Border.Title=Valitse vektorit +WorldTView.Popup.MenuItem.Projectile=Heittoliike + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Kinemaattisten partikkelien malli +AnalyticParticle.Inspector.Title=Kinemaattisten partikkelien malli +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=säde 4 +CircleFootprint.Circle_6=säde 6 +CircleFootprint.Circle_8=säde 8 +DynamicParticle.Name=Dynaamisten partikkelien malli (Karteesinen) +DynamicParticle.Inspector.Title=Dynaamisten partikkelien malli +DynamicParticle.Property.ForceX=force x +DynamicParticle.Property.ForceY=force y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Kiinteä paikka +ParticleModel.New.Name=malli +ParticleModel.MenuItem.InspectModel=Mallinnus... +ParticleModel.Inspector.Button.Undo=Peruuta +ParticleModel.Inspector.Button.Redo=Tee uudestaan +ParticleModel.Inspector.Button.Close=Sulje +ParticleModel.Inspector.Button.Help=Ohjeet + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=Vain X +Calibration.Axes.YOnly=Vain Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Valitse kalibointiakselit +Calibration.Label.Axes=akselit +Calibration.Dialog.InvalidCoordinates.Title=Koordinaattivirhe +Calibration.Dialog.InvalidCoordinates.Message=Pisteillä ei voi olla samoja todellisia koordinaatteja. +Calibration.Dialog.InvalidXCoordinates.Message=Pisteillä ei voi olla samoja todellisia x-koordinaatteja. +Calibration.Dialog.InvalidYCoordinates.Message=Pisteillä ei voi olla samoja todellisia y-koordinaatteja. +SpectralLineFilter.Title=Kaasun spektri +SpectralLineFilter.H=Vety +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Elohopea +TFrame.View.Unknown=Näytä +TMenuBar.MenuItem.Undo=Peruuta +TMenuBar.MenuItem.Redo=Tee uudelleen +TMenuBar.MenuItem.Replace=Korvaa... +TMenuBar.Menu.AddImage=Tuo kuvia +TMenuBar.MenuItem.AddBefore=Ennen tätä kehystä... +TMenuBar.MenuItem.AddAfter=Tämän kehyksen jälkeen... +TMenuBar.MenuItem.RemoveImage=Poista tämä kehys +TMenuBar.Menu.Tools=Työvälineet +TMenuBar.MenuItem.DataFunctionTool=Dataeditori +TMenuBar.MenuItem.DatasetTool=Tilastoanalyysi +TMenuBar.Menu.CopyImage=Kopioi kuva +TMenuBar.MenuItem.CopyMainView=Päänäkymä +TMenuBar.MenuItem.CopyFrame=Kehys +TMenuBar.MenuItem.PrintFrame=Tulosta... +TrackerIO.Dialog.AddImage.Title=Tuo kuvia (valiste yksi tai useita) +TTrack.Dialog.Name.BadName=on jo käytössä. Valitse toinen nimi. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=resultanttivoima +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Kuvaajalle varattu tila. +TableTView.Label.NoData=Taulukolle varattu tila. +TrackerPanel.Message.NoData0=Videolle varattu tila. +TrackerPanel.Message.NoData1=Valiste aloittaaksesi Tiedosto|Avaa tai Mittaussarjat|Uusi. +WorldTView.Label.NoData=Videolle varattu tila. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Solveri: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptive Multistep +DynamicParticle.Table.Force.Border.Title=Differentiaaliyhtälöt (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Paikkavektori (t) +ParticleModel.Table.Initial.Border.Title=Alkuarvot +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Liitä kuva +TMenuBar.MenuItem.PasteAfter=Tämän kehyksen jälkeen +TMenuBar.MenuItem.PasteBefore=Ennen tätä kehystä +TMenuBar.MenuItem.PasteReplace=Korvaa video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Aloitetaan... +Tracker.Splash.HelpMessage=Uusi käyttäjä? Katso + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=kulma mitattuna vaakatasosta +LineProfile.Checkbox.Rotates=kiertymä +LineProfile.Label.Spread=levitys +RGBRegion.Name=RGB-alue +RGBRegion.New.Name=alue +RGBRegion.MenuItem.Fixed=Kiinteä paikka +RGBRegion.Label.Radius=pikselin koko +TTrack.Label.Step=askel + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=paikan numero +LineProfile.Data.Description.1=paikan x-koordinaatti +LineProfile.Data.Description.2=paikan y-koordinaatti +LineProfile.Data.Description.3=punainen +LineProfile.Data.Description.4=vihreä +LineProfile.Data.Description.5=sininen +LineProfile.Data.Description.6=koettu kirkkaus +LineProfile.Data.Description.7=viivan paksuus +ParticleModel.MenuItem.TraceVisible=Mittasarja näkyvissä +ParticleModel.MenuItem.StepsVisible=Askeleet näkyvissä +PointMass.Data.Description.0=aika +PointMass.Data.Description.1=paikan x-koordinaatti +PointMass.Data.Description.2=paikan y-koordinaatti +PointMass.Data.Description.3=paikan arvo +PointMass.Data.Description.4=paikan kulma +PointMass.Data.Description.5=nopeuden x-komponentti +PointMass.Data.Description.6=nopeuden y-komponentti +PointMass.Data.Description.7=nopeuden suuruus +PointMass.Data.Description.8=nopeuden kulma +PointMass.Data.Description.9=kiihtyvyyden x-komponentti +PointMass.Data.Description.10=kiihtyvyyden y-komponentti +PointMass.Data.Description.11=kiihtyvyyden suuruus +PointMass.Data.Description.12=kiihtyvyyden kulma +PointMass.Data.Description.13=kulmankierto +PointMass.Data.Description.14=kulmanopeus +PointMass.Data.Description.15=kulmakiihtyvyys +PointMass.Data.Description.16=askelnumero +PointMass.Data.Description.17=kehysnumero +PointMass.Data.Description.18=momentin x-komponentti +PointMass.Data.Description.19=momentin y-komponentti +PointMass.Data.Description.20=momentin suuruus +PointMass.Data.Description.21=momentin kulma +PointMass.Data.Description.22=kineettinen energia +RGBRegion.Data.Description.0=aika +RGBRegion.Data.Description.1=paikan x-koordinaatti +RGBRegion.Data.Description.2=paikan y-koordinaatti +RGBRegion.Data.Description.3=punainen +RGBRegion.Data.Description.4=vihreä +RGBRegion.Data.Description.5=sininen +RGBRegion.Data.Description.6=koettu kirkkaus +RGBRegion.Data.Description.7=pikselilaskuri +RGBRegion.Data.Description.8=askelnumero +RGBRegion.Data.Description.9=kehysnumero +TView.Menuitem.Define=Määritä... +Vector.Data.Description.0=aika +Vector.Data.Description.1=x-komponentti +Vector.Data.Description.2=y-komponentti +Vector.Data.Description.3=suuruus +Vector.Data.Description.4=kulma +Vector.Data.Description.5=kannan x-koordinaatti +Vector.Data.Description.6=kannan y-koordinaatti +Vector.Data.Description.7=askelnumero +Vector.Data.Description.8=kehysnumero + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Tämän partikkelin massa +ParticleModel.Parameter.InitialTime.Description=Aloitusaika +AnalyticParticle.PositionFunction.X.Description=Paikan x-koordinaatti +AnalyticParticle.PositionFunction.Y.Description=Paikan y-koordinaatti +DynamicParticle.ForceFunction.X.Description=Voiman x-komponentti +DynamicParticle.ForceFunction.Y.Description=Voiman y-komponentti +DynamicParticle.Parameter.InitialX.Description=Lähtöpaikan x-koordinaatti +DynamicParticle.Parameter.InitialY.Description=Lähtöpaikan y-koordinaatti +DynamicParticle.Parameter.InitialVelocityX.Description=Alkunopeuden x-komponentti +DynamicParticle.Parameter.InitialVelocityY.Description=Alkunopeuden y-komponentti +TrackerPanel.ModelBuilder.Title=Mallinnus +TrackerPanel.DataBuilder.Title=Dataeditori +TrackControl.TrailMenu.NoTrail=Ei mittapisteitä +TrackControl.TrailMenu.ShortTrail=Vähän mittapisteitä +TrackControl.TrailMenu.LongTrail=Paljon mittapisteitä +TrackControl.TrailMenu.FullTrail=Kaikki mittapisteet +TrackerPanel.ModelBuilder.Spinner.Tooltip=Valittuna oleva malli +TrackerPanel.ModelBuilder.LineButton.Text=Viivan tyyli +TrackerPanel.ModelBuilder.LineButton.Tooltip=Aseta viivan tyyli +ParticleModel.LineStyle.None=Ei viivaa +ParticleModel.LineStyle.Connect=Yhdistetyt askeleet +ParticleModel.LineStyle.Smooth=Käyrä +ModelFunctionPanel.Label=Malli +AnalyticFunctionPanel.FunctionEditor.Border.Title=Paikkasuureet +DynamicFunctionPanel.FunctionEditor.Border.Title=Differentiaaliyhtälöt + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Näkyvä sarake +Tracker.About.ProjectOf=Projekti: +Tracker.About.TranslationBy=Kääntäjä: +Tracker.About.Translator=Jari Hokkanen +TMenuBar.Menu.SaveVideoAs=Tallenna video nimellä +TActions.SaveClipAs.ProgressMonitor.Message=Tallentaa videon nimellä +TActions.SaveClipAs.ProgressMonitor.Progress=Suoritettu + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Synkro +PlotTrackView.Checkbox.Synchronize.Tooltip=Synkronoi vaaka-akselit +RGBRegion.MenuItem.FixedRadius=Kiinteä säde +Tracker.VideoZoom.Hint=valitse suurennos klikkaamalla, sovita kaksoisklikkaamalla +Tracker.PlotZoomIn.Hint=suurenna vetämällä, kaksoisklikkaa kun sovitat +Tracker.PlotZoomOut.Hint=pienennä klikkaamalla +Tracker.MenuItem.Hints=Näytä vihjeet +TapeMeasure.Label.Length=pituus +TapeMeasure.Label.TapeAngle=kulma x-akselilta +TapeMeasure.Label.ArcAngle=astemitan kulma +TrackerIO.Dialog.NotAnImage.Title=Kelvoton tiedostotyyppi +TrackerIO.Dialog.NotAnImage.Message1=ei ole JPG- tai GIF-kuva. +TrackerIO.Dialog.NotAnImage.Message2=Haluatko jatkaa? +TToolBar.Button.Zoom.Tooltip=Aseta videon suurennos +TrackChooserTView.DropDown.Tooltip=Valitse mittaussarja +TapeMeasure.Field.TapeAngle.Tooltip=Mittanauhan ja x-akselin välinen kulma +TapeMeasure.Field.Magnitude.Tooltip=Pituus todellisella mitta-asteikolla +TapeMeasure.Readout.Magnitude.Name=pituus +TapeMeasure.Readout.Magnitude.Hint=todellinen mitta-asteikko +TapeMeasure.Readout.Angle.Name=kulman lukema +TapeMeasure.Readout.Angle.Hint=kulma mitattuna positiiviselta x-akselilta +TapeMeasure.End.Name=loppu +TapeMeasure.End.Hint=siirrä hiirellä mittaaksesi etäisyyksiä ja kulmia, shift-klikkaa +TapeMeasure.Handle.Name=kahva +TapeMeasure.Handle.Hint=liikuta vetämällä hiirellä +Vector.Tip.Name=kärki +Vector.Tip.Hint=valitse klikkaamalla, liikuta vetämällä +Vector.Handle.Name=kahva +Vector.Handle.Hint=valitse klikkaamalla, liikuta vetämällä +Vector.ShortHandle.Hint=valitse klikkaamalla, liikuta vetämällä, valitse kärki alt-klikkaamalla +PointMass.Position.Name=paikka +PointMass.Position.Hint=valitse klikkaamalla, liikuta vetämällä +PointMass.Velocity.Name=nopeus +PointMass.Acceleration.Name=kiihtyvyys +PointMass.Vector.Hint=valitse klikkaamalla, liikuta vetämällä +PointMass.Position.Locked.Hint=valitse klikkaamalla--ei voi vetää +CoordAxes.Handle.Name=+x-akseli +CoordAxes.Handle.Hint=muuta asentoa vetämällä +CoordAxes.Origin.Name=origo +CoordAxes.Origin.Hint=siirrä vetämällä +OffsetOrigin.Position.Name=paikka +OffsetOrigin.Position.Hint=siirrä origo vetämällä tai kirjoittamalla koordinaatit +Calibration.Point.Name=piste +Calibration.Point.Hint=siirrä akseli tai vaihda asteikko vetämällä tai kirjoittamalla koordinaatit +RGBRegion.Position.Name=paikka +RGBRegion.Position.Hint=siirrä origo vetämällä tai kirjoittamalla koordinaatit +LineProfile.End.Name=loppu +LineProfile.End.Hint=muuta viivan pituutta vetämällä +LineProfile.Handle.Name=kahva +LineProfile.Handle.Hint=siirrä viiva vetämällä +PointMass.Hint=määrää massa työkalurivillä +PointMass.Unmarked.Hint=, merkitse paikka shift-klikkaamalla +TTrack.Unselected.Hint=klikkaa muuttaaksesi ominaisuuksia +Vector.Unmarked.Hint=aseta vektori shift-vetämällä +OffsetOrigin.Unmarked.Hint=merkitse shift-klikkaamalla +Calibration.Unmarked.Hint=merkitse ensimmäinen piste shift-klikkaamalla +Calibration.Halfmarked.Hint=merkitse shift-klikkaamalla +CenterOfMass.Empty.Hint=määritä systeemi valitsemalla massat +VectorSum.Empty.Hint=määritä summa valitsemalla vektorit +TapeMeasure.Hint=mittaa etäisyydet ja kulmat vetämällä mittanauhan päitä +CoordAxes.Hint=vaihda asentoa muuttamalla kulmaa +ParticleModel.Hint=aseta massa työkalurivillä, lisää lausekkeita Mallintajaan voidaksesi animoida +RGBRegion.Hint=muuta kokoa antamalla uusi säde +RGBRegion.Unmarked.Hint=merkitse paikka shift-klikkaamalla +TTrack.ImportVideo.Hint=mittaa RGB tuomalla kuva tai video +TTrack.Selected.Hint=on valittuna +LineProfile.Hint=muuta viivan leveys antamalla levitys +LineProfile.Unmarked.Hint=piirrä viiva vetämällä se hiirellä +LineProfile.Menu.Orientation=Asento +LineProfile.MenuItem.Horizontal=Vaakatasossa +LineProfile.MenuItem.XAxis=X-alselia pitkin +Footprint.PositionVector=vektori +Footprint.BoldPositionVector=lihava vektori +Tracker.Startup.Hint=katsotästä vihjeitä (tai kytke vihjeet pois päältä Ohje-valikossa), paina F1 lisäohjeita varten +TrackerPanel.NoVideo.Hint=avaa tai tuo video analysoitavaksi +TrackerPanel.CalibrateVideo.Hint=kalibroi video kalibrointityökalulla +TrackerPanel.NoTracks.Hint=luo uusi mittaussarja tutkiaksesi haluamaasi ilmiötä +TrackerPanel.SetClip.Hint=aseta tai katso videon asetuksia settings +TrackerPanel.ShowAxes.Hint=aseta origo ja akselien kallistuskulma +VideoPlayer.Step.Hint=askel eteenpäin (pikanäppäin: PageDown) +VideoPlayer.Back.Hint=askel taaksepäin (pikanäppäin: PageUp) +TrackerPanel.DVVideo.Hint=käytä muodonmuutos-filtteriä korjataksesi vääristymät DV-videoissa +TrackerIO.DataFileFilter.Description=Tracker File (*.trk) +Tracker.Button.PDFHelp=Tulostettava PDF-tiedosto +TToolbar.Button.TapeVisible.Tooltip=Näytä, piilota ja luo kalibrointivälineitä + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Mittaussarja +TMenuBar.MenuItem.Description=Muistio +TrackPlottingPanel.RightDrag.Hint=näytä vaihtoehdot vetämällä hiiren oikealla napilla +TMenuBar.MenuItem.DeleteSelectedPoint=Valitut askeleet +TFrame.InfoDialog.SaveChanges.Title=Tallenna muutokset +TFrame.InfoDialog.SaveChanges.Message=Haluatko tallentaa muutokset? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Karteesinen +DynamicParticle.Editor.Button.Polar=Polaarinen +DynamicParticle.Parameter.InitialR.Description=Aloitussäde +DynamicParticle.Parameter.InitialTheta.Description=Alkukulma +DynamicParticle.Parameter.InitialVelocityR.Description=Normaalisuunnan alkunopeus +DynamicParticle.Parameter.InitialOmega.Description=Kulmanopeuden alkuarvo +DynamicParticle.ForceFunction.R.Description=Voiman normaalikomponentti +DynamicParticle.ForceFunction.Theta.Description=Voiman tangentiaalikomponentti +DynamicParticlePolar.Name=Dynaaminen hiukkasmalli (polaari) +TMenuBar.Menu.DynamicParticle=Dynaaminen hiukkasmalli +TMenuBar.MenuItem.Cartesian=Karteesinen +TMenuBar.MenuItem.Polar=Polaarinen + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotrack +Dialog.Button.Help=Ohjeet +AutoTracker.Wizard.Button.Reset=Alusta +AutoTracker.Wizard.Button.Back=Taakse +AutoTracker.Wizard.Button.Next=Askel +AutoTracker.Wizard.Button.Accept=Hyväksy +AutoTracker.Wizard.Button.Search=Etsi +AutoTracker.Wizard.Button.Pause=Pysäytä +AutoTracker.Wizard.Button.Skip=Ohita +AutoTracker.Label.Mask=Mallikuva +AutoTracker.Label.AcceptLevel=Hyväksymistaso +AutoTracker.TabbedPane.TabTitle.Mask=Mallikuva +AutoTracker.TabbedPane.TabTitle.Target=Kohde +AutoTracker.TabbedPane.TabTitle.Settings=Hyväksy +AutoTracker.TabbedPane.TabTitle.Search=Etsi +AutoTracker.Info.GetStarted=Luodaksesi uuden etsintäalueen, osoita mitattavaa kohdetta shift-ctrl-klikkauksella. +AutoTracker.Info.Mask1=Mallikuvan avulla ohjelma löytää mitattavan kohteen videon eri kehyksistä. +AutoTracker.Info.Mask2=Se huomioi muoto- ja värimuutokset etsimisen aikana. Suurempi evoluutionopeus tunnistaa nopeammat muutokset, mutta ei ole pidemmän päälle niin tarkka. +AutoTracker.Info.MaskLocked1=Mallikuva on käytössä ja lukittuna. +AutoTracker.Info.MaskLocked2=Klikkaa Alusta-nappia, jolloin kaikki merkinnät häviävät ja etsintä aloitetaan alusta. +AutoTracker.Info.Target1=Kohde merkitään automaattisesti kunhan tunnistamisstatus ylittää kynnysarvon. +AutoTracker.Info.Target2=Vinkki: Voit siirtää mallikuvaa vielä jälkeenpäin. Näkyvä mallikuva seuraa siirtyvää kohdetta. +AutoTracker.Info.TargetLocked=Kohde on käytössä ja on lukittuna havaittuun mittauskohtaan. Kohteen liikuttaminen siirtää myös mittauspisteet. +AutoTracker.Info.Settings1=Tunnistamisstatukset, jotka ylittävät kynnysarvon, aiheuttavat mittapisteen merkitsemisen. +AutoTracker.Info.Settings2=Vinkki: alentamalla hyväksymistasoa kasvatat todennäköisyyttä merkitä mittauspisteeksi virheellinen tunnistus. Kasvata sen sijaan muutostiheyttä. +AutoTracker.Info.Search1=Etsintäalue käydään läpi parhaan vastineen löytämiseksi. Liikuta tai muotoile etsintäaluetta tarttumalla sen reunoihin tai kahvoihin hiirellä. +AutoTracker.Info.Search2=Vinkki: Etsintäalueen ei tarvitse olla suuri. Etsintäalue seuraa mitattavaa kohdetta tunnistuksen edistyessä. +AutoTracker.Info.Frame=Kehys +AutoTracker.Info.Match=Tunnistettu kohde merkittiin automaattisesti. +AutoTracker.Info.Possible=Mahdollinen kohteen tunnistus tehty etsintäalueella. Päätä jatkotoimenpiteestä: +AutoTracker.Info.NoMatch=Etsintäalueella ei tunnistettu kohdetta. Päätä jatkotoimenpiteestä: +AutoTracker.Info.Outside=Etsintäalue on videon ulkopuolella. Päätä jatkotoimenpiteestä: +AutoTracker.Info.Accepted=Tunnistus hyväksyttiin. +AutoTracker.Info.MarkedByUser=Mittapiste on merkitty manuaalisesti. +AutoTracker.Info.NoVideo=Video puuttuu. +AutoTracker.Info.Height=korkeus +AutoTracker.Info.Width=leveys +AutoTracker.Info.Accept=--hyväksy tunnistus +AutoTracker.Info.Retry=--muokkaa etsintäaluetta ja jatka etsimistä +AutoTracker.Info.Mark=--merkitse manuaalisesti shift-klikkaamalla +AutoTracker.Info.Skip=--ohita tämä kehys ja jatka seuraavalla kehyksellä +AutoTracker.Info.Reset=--palaa edelliseen merkittyyn kehykseen ja shift-ctrl-klikkaa luodaksesi uuden etsintäalueen +AutoTracker.Info.MatchScore=tunnistus lkm +AutoTracker.Dialog.MaskLocked.Title=Mallikuva lukittu +PointMass.Cursor.Autotrack.Description=Autotrackerin kursori +VideoPlayer.StartFrame.Hint=vedä aloituskehyksen kohdalle +VideoPlayer.EndFrame.Hint=vedä loppukehyksen kohdalle +VideoPlayer.Slider.Hint=kelaa video läpi vetämällä +FileDropHandler.Dialog.BadFile.Message=ei voitu ladata. +FileDropHandler.Dialog.BadFile.Title=Tunnistamaton tiedosto + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Suorita +DynamicParticle.Dialog.Delete.Message=Poistamalla hiukkanen nyt, häviää se myös koko järjestelmästä. Poistatko silti? +DynamicParticle.Dialog.Delete.Title=Dynaaminen systeemi +DynamicParticle.System.In=sisään +DynamicSystem.Empty=tyhjä +DynamicSystem.Force.Name.Internal=sisäinen +DynamicSystem.ForceFunction.R.Description=Sisäisen voiman normaalikomponentti +DynamicSystem.ForceFunction.Theta.Description=Sisäisen voiman tangentiaalikomponentti +DynamicSystem.MenuItem.Inspector=Valitse hiukkaset... +DynamicSystem.Name=Dynaaminen kahden kappaleen systeemi +DynamicSystem.New.Name=systeemi +DynamicSystem.Parameter.Of=jstkin +DynamicSystem.Parameter.RelativeTo=suhteessa +DynamicSystem.Parameter.Name.Relative=suhteellinen +DynamicSystem.Parameter.ParticleMass.Description=Massa: +DynamicSystem.Parameter.Mass.Description=Systeemin kokonaismassa +DynamicSystemInspector.Border.Title=Hiukkanen +DynamicSystemInspector.Title=Kahden kappaleen systeemi +DynamicSystemInspector.Button.Change=Vaihdetaan... +DynamicSystemInspector.ParticleName.None=(ei nimeä) +TMenuBar.MenuItem.Clone=Klooni +TMenuBar.MenuItem.TwoBody=Kahden kappaleen systeemi +TrackerPanel.DataBuilder.Dropdown.Tooltip=Valittuna oleva mittasarja +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Synkronoi pystyakselit +TrackControl.Button.Trace.ToolTip=Näytä tai piilota reitti +TToolBar.Button.Open.Tooltip=Avaa video tai Tracker-tiedosto uudessa välilehdessä +TToolBar.Button.Save.Tooltip=Tallenna nykyinen välilehti tiedostoksi +TToolBar.Button.SelectTrack=Valitse +TToolBar.Button.SelectTrack.Tooltip=Valitse olemassa oleva mittasarja +TTrack.MenuItem.ClearSteps=Tyhjennä askeleet +PointMass.MenuItem.Position=Paikka +TMenuBar.MenuItem.Empty=(Tyhjä) +TTrackBar.Button.Memory=muistia käytössä: +TTrackBar.Button.Memory.Tooltip=Monitoroi ja hallitse muistia +TTrackBar.Memory.PopupItem.Launch1=Käynnistä +TTrackBar.Memory.PopupItem.Launch2=muistilla +TButton.Track.ToolTip=Muuta ominaisuudet: +Tracker.Dialog.OutOfMemory.Message1=Tracker on ylittänyt muistialueensa. +Tracker.Dialog.OutOfMemory.Message2=Klikkaa Muisti-nappia ja lue vaihtoehdot. +Tracker.Dialog.OutOfMemory.Title=Muisti loppui + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Etsi seuraavaa +AutoTracker.Label.Original=Etsintäalue +AutoTracker.Label.NoMask=ei mallikuvaa +AutoTracker.Label.Rate=Nopeus: +AutoTracker.Info.Mask3=Vinkki: mallikuvan ei tarvitse olla suuri eikä sisältää seurattavaa esinettä kokonaan. Seuranta toimii parhaiten, kun mallikuvaan voi kohdistaa helposti tunnistettava yksityiskohta, jossa kontrasti on suuri. +AutoTracker.Wizard.Checkbox.XAxis=Seuraa X-akselia +AutoTracker.Info.SearchOnAxis1=Etsintäalue seuraa x-akselia löytääkseen parhaan tunnistuksen. Liikuta tai muotoile etsintäaluetta tarttumalla sen reunoihin tai kahvoja hiirellä. +AutoTracker.Info.PossibleOnAxis=Mahdollinen tunnistus on tehty etsintäalueella seuraamalla x-akselia. Päätä jatkotoimenpiteestä: +AutoTracker.Info.NoMatchOnAxis=Yhtään tunnistusta ei ole tehty etsintäalueella seuraamalla x-akselia. Päätä jatkotoimenpiteestä: +AutoTracker.Info.RetryOnAxis=--siirrä etsintäaluetta tai x-akselia ja jatka etsintää +AutoTracker.Wizard.Button.Delete=Poista +AutoTracker.Wizard.Button.DeleteMore=Poista jälkimmäiset pisteet +Button.Define.Tooltip=Määritä sarakkeiden muuttujille funktiot +Calibration.Label.Point=piste +CalibrationStick.Hint=määritä pituus tai venytä päästä, määritä kulma muuttaaksesi kallistusta +CalibrationStick.End.Hint=muuta asteikkoa vetämällä, shift-klikkaa lopetuksen merkiksi +CalibrationStick.New.Name=kalibrointitikku +CalibrationTapeMeasure.New.Name=kalibrointinauha +CalibrationTapeMeasure.Readout.Magnitude.Hint=klikkaa ja lisää pituus metreinä +CalibrationTapeMeasure.Hint=syötä pituus muuttaaksesi asteikkoa, syötä kulman suuruus muuttaaksesi kallistusta +DynamicSystem.Data.Description.0=hiukkasten välinen suhteellinen pituus +DynamicSystem.Data.Description.1=suhteellinen kulma +DynamicSystem.Data.Description.2=suhteellinen normaalinopeus +DynamicSystem.Data.Description.3=suhteellinen kulmanopeus +ExportDataDialog.Subtitle.Table=Mittataulukko +ExportDataDialog.Subtitle.Content=Solut +ExportDataDialog.Subtitle.Format=Lukujen muotoilu +ExportDataDialog.Subtitle.Delimiter=Erotin +ExportDataDialog.Title=Vie mittatiedot +ExportDataDialog.Delimiter.Add=Lisää... +ExportDataDialog.Delimiter.Remove=Poista... +ExportDataDialog.Content.AllCells=Kaikki solut +ExportDataDialog.Content.SelectedCells=Valitut solut +ExportDataDialog.MenuItem.RemoveDelimiter=Poista oma erotin +ExportDataDialog.Chooser.SaveData.Title=Tallenna tiedot nimellä +ExportVideoDialog.Button.SaveAs=Tallenna nimellä... +ExportVideoDialog.Button.FullSize=Täysi koko +ExportVideoDialog.Button.DrawnSize=Kuten piirretty +ExportVideoDialog.Content.VideoOnly=Vain video +ExportVideoDialog.Content.VideoAndGraphics=Video ja grafiikka +ExportVideoDialog.Content.GraphicsOnly=Vain grafiikka +ExportVideoDialog.Title=Vie videoleike +ExportVideoDialog.Label.ClipSettings=Videoklippien asetukset +ExportVideoDialog.Subtitle.Size=Koko +ExportVideoDialog.Subtitle.Content=Sisältö +ExportVideoDialog.Subtitle.View=Näytä +ExportVideoDialog.Subtitle.Format=Formaatti +ExportVideoDialog.Complete.Message1=Video on tallennettu nimellä +ExportVideoDialog.Complete.Message2=Haluatko avata se Trackerissa nyt? +ExportVideoDialog.Complete.Title=Vienti valmis +ExportVideoDialog.VideoSize=videon koko +ExportVideoDialog.MatSize=Kuvamatriisi +ExportVideo.Dialog.HiddenPlots.Message=Kuvaajien tulee olla kokonaan näkyvissä. +ExportVideo.Dialog.HiddenPlots.Title=Riittämätön näkymä +Footprint.DoubleTarget=kaksoisristi +Footprint.BoldDoubleTarget=lihava kaksoisristi +OffsetOrigin.MenuItem.Fixed=Kiinteät Todelliset Koordinaatit +ParticleModel.Dialog.Offscreen.Message1=Jotkin mallin askeljäljet ovat tyhjiä, koska ovat liikaa kuvan ulkopuolella. +ParticleModel.Dialog.Offscreen.Message2=Korjataksesi tämän, vaihda malli tai muuta videon kohdistusta. +ParticleModel.Dialog.Offscreen.Title=Kuvan ulkopuolella +PrefsDialog.Tab.Configuration.Title=Konfigurointi +PrefsDialog.Memory.BorderTitle=Muistin koko +PrefsDialog.Tab.General.Title=Yleistä +PrefsDialog.RecentFiles.BorderTitle=Avatut tiedostot menu +PrefsDialog.Label.RecentSize=Tiedostoja +PrefsDialog.Hints.BorderTitle=Vihjeitä +PrefsDialog.Button.Relaunch=Käynnistä Uudelleen +PrefsDialog.Button.ClearRecent=Tyhjennä +PrefsDialog.Checkbox.DefaultSize=Käytä oletusta +PrefsDialog.Checkbox.HintsOn=Näytä aina vinkit +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video-ohjelma +PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Muistinhallintaa ei käytetä, kun Tracker käynnistetään "Web Start":illa. +PrefsDialog.Dialog.WebStart.Title=Web Start-tila +PrefsDialog.LookFeel.BorderTitle=Ulkoasu +PrefsDialog.Language.BorderTitle=Kieli +PrefsDialog.Upgrades.BorderTitle=Tarkista päivitykset +PrefsDialog.Tab.Runtime.Title=Ohjelman suoritus +PrefsDialog.Tab.Display.Title=Näkymä +PrefsDialog.Language.Default=oletus +PrefsDialog.Upgrades.Always=Joka kerta +PrefsDialog.Upgrades.Weekly=Viikoittain +PrefsDialog.Upgrades.Monthly=Kuukausittain +PrefsDialog.Upgrades.Never=Ei koskaan +PrefsDialog.Button.CheckForUpgrade=Tarkista nyt +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle-videon Toisto +PrefsDialog.Xuggle.Slow=Pehmeästi (voi olla hidasta) +PrefsDialog.Xuggle.Fast=Nopeasti (voi olla nykivää) +PrefsDialog.CalibrationTool.BorderTitle=Oletuksena oleva kalibrointityökalu +Protractor.Name=Astemitta +Protractor.New.Name=astemitta +Protractor.Hint=siirrä varsia kun mittaat kulmia +Protractor.Label.Angle=kulma +Protractor.Field.Angle.Tooltip=Kulma astemitan varsien välissä +Protractor.Vertex.Name=kärki +Protractor.Vertex.Hint=liikuta kärkeä vetämällä +Protractor.End.Name=varren pää +Protractor.End.Hint=kierrä vartta vetämällä +Protractor.Handle.Name=kahva +Protractor.Handle.Hint=siirrä kulmamittaa vetämällä +Protractor.Rotator.Name=kiertäjä +Protractor.Rotator.Hint=kääntääksesi kulmamittaa vedä kahvasta +Protractor.Readout.Name=lue lukema +Protractor.Readout.Hint=kulma astemitan varsien välissä +ProtractorFootprint.Circle3=pieni ympyrä +ProtractorFootprint.Circle5=suuri ympyrä +ProtractorFootprint.Circle3Bold=lihava pieni ympyrä +ProtractorFootprint.Circle5Bold=lihava suuri ympyrä +Stick.Name=Kalibrointitikku +Stick.New.Name=kalibrointitikku +TableTrackView.MenuItem.Unformatted=Täydellä tarkkuudella +TableTrackView.MenuItem.Formatted=Annetulla formaatilla +TableTrackView.Menu.SetDelimiter=Aseta erotin +TableTrackView.MenuItem.AddDelimiter=Lisää... +TableTrackView.MenuItem.RemoveDelimiter=Poista... +TableTrackView.Dialog.CustomDelimiter.Message=Anna uusi erotin (myös merkkijono): +TableTrackView.Dialog.CustomDelimiter.Title=Lisää erotin +TableTrackView.Header.Tooltip=Lajittele klikkauksella ja valitse sarake kaksoisklikkauksella +TableTrackView.MenuItem.CopySelectedData=Kopioi valitut tiedot +TableTrackView.Dialog.RemoveDelimiter.Message=Valitse poistettava erotin: +TableTrackView.Dialog.RemoveDelimiter.Title=Poista erotin +TableTrackView.Radians.Tooltip=radiaaneissa +TableTrackView.Degrees.Tooltip=asteissa +TableTrackView.RadiansPerSecond.Tooltip=radiaani/s +TableTrackView.DegreesPerSecond.Tooltip=aste/s +TableTrackView.RadiansPerSecondSquared.Tooltip=radiaani/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=aste/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Tuhoa fysiikan kaava +TActions.Action.SaveFrame=Tallenna ryhmä välilehtiä... +TActions.AboutVideo=Ominaisuudet... +TActions.Dialog.AboutVideo.Title=Videon ominaisuudet +TActions.Dialog.AboutVideo.Type=Tyyppi +TActions.Dialog.AboutVideo.Size=Mitat +TActions.Dialog.AboutVideo.Length=Pituus +TActions.Dialog.AboutVideo.Frames=kehyksiä +TActions.Dialog.AboutVideo.Seconds=sekuntia +TActions.Dialog.AboutVideo.FrameRate=kehysnopeus +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Polku +TActions.Action.ImportTRK=Tracker-tiedosto... +TActions.Action.ProtractorVisible=Näkyvissä +TapeMeasure.MenuItem.FixedLength=Kiinteä pituus +TextTView.Label.NoTab=Klikkaa "Sivu", kun lisäät tekstiä tai HTML-sivun tänne. +TextTView.NewTab.Text1=Aloita tekstin tai otsikon muokkauksen kaksoisklikkaamalla. +TextTView.NewTab.Text2=Voit näyttää HTML-sivun, jos kirjoitat url-osoitteen tai avaat tiedoston klikkaamalla hiiren oikealla napilla. +TextTView.NewTab.Title=Ei otsikkoa +TextTView.Dialog.TabTitle.Title=Anna otsikko +TextTView.MenuItem.OpenHTML=Avaa HTML... +TextTView.MenuItem.SetTitle=Syötä otsikko... +TextTView.Button.NewTab=Uusi +TextTView.TextEdit.Description=Teksti +TFrame.Dialog.FileNotFound.Message=Tiedostoa ei löydy: +TFrame.Dialog.FileNotFound.Title=Tiedostoa ei löydy +TFrame.View.Text=Sivu-näkymä +TFrame.View.Main=Päänäkymä +TMenuBar.Menu.OpenRecent=Avaa viimeisin +TMenuBar.Menu.Import=Tuo +TMenuBar.Menu.Export=Vie +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=Mittatiedosto... +TMenuBar.Menu.CopyObject=Kopioi objekti +TMenuBar.MenuItem.Coords=Koordinaatisto +TMenuBar.MenuItem.VideoClip=Video-klippi +TMenuBar.Menu.MeasuringTools=Mittausvälineet +TMenuBar.Menu.AngleUnits=Kulmayksikkö +TMenuBar.MenuItem.Degrees=Asteet +TMenuBar.MenuItem.Radians=Radiaanit +Tracker.Dialog.NoXuggle.Title=Xuggle ei löydy +Tracker.Dialog.NoXuggle.Message1=Xuggle (video-ohjelma) ei ole asennettu. +Tracker.Dialog.NoXuggle.Message2=Lataa Xuggle osoitteesta http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=Tietoa Xuggle'sta... +Tracker.Dialog.AboutXuggle.Title=Tietoa Xuggle'sta +Tracker.Dialog.AboutXuggle.Message.Version=Xugglen versio +Tracker.Dialog.AboutXuggle.Message.Home=Xugglen kotisivu: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle'n jar-polku: +Tracker.Dialog.NoVideoEngine.Message1=Video-ohjelmia ei ole asennettuna. Ilman niitä voit +Tracker.Dialog.NoVideoEngine.Message2=avata vain kuvia (JPEG, PNG) ja GIF-animaatioita. +Tracker.Dialog.NoVideoEngine.Message3=Suositus: Asenna Tracker Xuggle-ohjelman kanssa. +Tracker.Dialog.NoVideoEngine.Title=Ei video-ohjelmaa +Tracker.Dialog.NoXuggle.Message1=Xuggle ei toimi oikein. Varmista, että +Tracker.Dialog.NoXuggle.Message2=Xugglen jar-tiedosto on Trackerin kotikansiossa. Lisäohjeita saat +Tracker.Dialog.NoXuggle.Message3=lukemalla tiedosto Tracker_README.txt Trackerin kotikansiossa. +Tracker.Dialog.NoXuggle.Message4=Asentaaksesi Xuggle, lataa viimeisin Tracker-asennustiedosto +Tracker.Dialog.NoXuggle.Title=Xuggle ei käytettävissä +Tracker.About.DefaultLocale=Oletuspaikka +Tracker.About.CurrentLanguage=Kieli +Tracker.Dialog.InsufficientMemory.Title=Riittämätön muisti +Tracker.Dialog.InsufficientMemory.Message=Pyydetyn muistin määrä on liian suuri. +TrackerIO.Dialog.TabMustBeSaved.Message1=Välilehti +TrackerIO.Dialog.TabMustBeSaved.Message2=tulee tallentaa Tracker-tiedostona voidakseen kuulua välilehtien ryhmään. +TrackerIO.Dialog.TabMustBeSaved.Message3=Haluatko tallentaa sen? +TrackerIO.Dialog.TabMustBeSaved.Title=Tallentamaton välilehti +TrackerIO.Dialog.NoTabs.Message=Ei ole välilehtiä tallennettavaksi! +TrackerIO.Dialog.NoTabs.Title=Tyhjä välilehtiryhmä +TrackerIO.Dialog.SaveTabset.Title=Tallenna välilehtiryhmä +TrackerIO.Dialog.SaveTab.Title=Tallenna välilehti +TrackerIO.Delimiter.Tab=Välilehti +TrackerIO.Delimiter.Space=Välilyönti +TrackerIO.Delimiter.Comma=Pilkku +TrackerIO.Delimiter.Semicolon=Puolipiste +TrackerIO.VideoAndDataFileFilter.Description=Video- ja Tracker-tiedostot +TrackerPanel.Dialog.Version.Message1=Olet avaamassa Tracker-tiedoston, joka +TrackerPanel.Dialog.Version.Message2=viittaa sellaisiin ominaisuuksiin, +TrackerPanel.Dialog.Version.Message3=jotka puuttuvat käyttämästäsi Tracker-versiosta. +TrackerPanel.Dialog.Version.Message4=Viimeisin versio on saatavilla +TrackerPanel.Dialog.Version.Title=Versioiden sopimattomuus +TrackerPanel.Label.ModelStart=Aloituskehys +TrackerPanel.Label.ModelEnd=Lopetuskehys +TrackerPanel.Spinner.ModelStart.Tooltip=Aseta tälle mallille aloituskehys +TrackerPanel.Spinner.ModelEnd.Tooltip=Aseta tälle mallille lopetuskehys +TToolbar.Button.ProtractorVisible.Tooltip=Näytä tai piilota astemitta +TToolbar.Button.AxesVisible.Tooltip=Näytä tai piilota koordinaattiakselit +TToolBar.Button.TrackControl.Tooltip=Näytä tai piilota Mittauskontrolli +TTrack.Dialog.StepSizeWarning.Message1=Varoitus: eräät mittapisteet on merkitty yli 1 pituisilla askeleilla jättäen ohitettuja kehyksiä merkitsemättä. +TTrack.Dialog.StepSizeWarning.Message2=Askelpituudet tulevat todennäköisesti vaihtumaan mittasarjan aukoissa. +TTrack.Dialog.StepSizeWarning.Message3=Aukoissa jää nopeus ja kiihtyvyys määrittämättä kunnes ne merkitään asianmukaisesti. +TTrack.Dialog.StepSizeWarning.Title=Varoitus +TTrack.Dialog.SkippedStepWarning.Message1=Varoitus: jättämällä askeleita väliin paikkojen merkitsemisessä, jättää myös mittasarjaan aukkoja. +TTrack.Dialog.SkippedStepWarning.Title=Varoitus +TTrack.Dialog.SkippedStepWarning.Checkbox=Älä näytä tätä enää +TTrack.Locked.Hint=lukittu +TTrack.AngleField.Radians.Tooltip=Kulma radiaaneissa +TTrack.AngleField.Degrees.Tooltip=Kulma asteissa +TTrack.AngleField.Popup.Radians=Vaihda radiaaneihin +TTrack.AngleField.Popup.Degrees=Vaihda asteisiin +TTrackBar.Memory.Menu.SetSize=Aseta muistin koko... +TTrackBar.Button.Version=Nyt saatavissa: versio +TTrackBar.Popup.MenuItem.Upgrade=Päivitä nyt... +TTrackBar.Popup.MenuItem.Ignore=Ohita +XuggleVideo.MenuItem.SmoothPlay=Pehmeä toisto (voi olla hidas) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Kalibrointinauha +CircleFootprint.Circle=ympyrä +CircleFootprint.FilledCircle=täytetty ympyrä +CircleFootprint.Dialog.Title=Ympyrä (askelmerkki) +CircleFootprint.Dialog.Label.Radius=Säde +CircleFootprint.Dialog.Checkbox.Bold=Lihava +CircleFootprint.Dialog.Checkbox.CenterSpot=Keskuspiste +LineProfile.Hint.Marking=merkitse viiva hiirellä vetämällä +PageTView.Button.Page=Sivu +PageTView.MenuItem.ClosePage=Sulje sivu +PointMass.Hint.Marking=merkitse klikkaamalla, paina Enter kloonataksesi edellinen askel +PrefsDialog.Dialog.NewVersion.Title=Päivitys +PrefsDialog.Dialog.NewVersion.Message1=Versio +PrefsDialog.Dialog.NewVersion.Message2=on nyt saatavilla osoitteessa +PrefsDialog.Dialog.NewVersion.None.Message=Uusia päivityksiä ei tällä hetkellä saatavilla. +RGBRegion.Hint.Marking=merkitse alueen keskikohta, klikkaa kohtaa hiirellä +TMenuBar.MenuItem.Restore=Palauta näkymät +TrackControl.StretchVectors.None=Ei venytystä +TViewChooser.Maximize.Tooltip=Suurenna tämä näkymä +TViewChooser.Restore.Tooltip=Palauta näkymät +Vector.Hint.Marking=merkitse alueen keskikohta, klikkaa kohtaa hiirellä +WorldTView.Button.World=Maailma + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Varoituksia +PrefsDialog.Checkbox.WarnIfNoEngine=Ei video-ohjelmaa +PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle-virheitä +PropertiesDialog.Title=Ominaisuudet +PropertiesDialog.Label.Author=Tekijät +PropertiesDialog.Label.Contact=Ota yhteyttä +TActions.Action.Properties=Ominaisuudet... +TActions.Action.OpenBrowser=Avaa Kirjastoselain... +TFrame.Progress.Xuggle=Xuggle'in latauskehys +TFrame.Progress.ClickToCancel=(peruuta klikkaamalla) +TFrame.Dialog.StalledVideo.Title=Virhe ladatessa videota +TFrame.Dialog.StalledVideo.Message0=Video on pysähtynyt latautuessaan. Se voi olla väliaikaista. +TFrame.Dialog.StalledVideo.Message1=Voit lopettaa lataamisen tai jatkaa odottamista. +TFrame.Dialog.StalledVideo.Message2=Muut vaihtoehdot avataksesi tämän videon ovat: +TFrame.Dialog.StalledVideo.Message3=1. Muuta videon formaattia konvertointiohjelmalla. +TFrame.Dialog.StalledVideo.Message4=2. Valitse QuickTime-tiedosto tai määrää se Asetuksia-ikkunassa. +TFrame.Dialog.StalledVideo.MessageMac=2. Käynnistä Tracker 32-bittisellä Javalla ja avaa video QuickTime'illa. +TFrame.Dialog.StalledVideo.Button.Stop=Pysäytä +TFrame.Dialog.StalledVideo.Button.Wait=Odota +Tracker.Dialog.NoVideoEngine.Checkbox=Älä näytä tätä enää +TrackerIO.ZipFileFilter.Description=ZIP-tiedosto (.zip) +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle on kohdannut seuraavan virheen avatessaan videota: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Kaikki virheet eivät ole vakavia. Tutki virheilmoitusta komennolla Ohje|Viestiloki. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Ellet pysty avaamaan videota Xuggle'illa, voit avata sen vielä QuickTime'illa. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Huomaa: Macillä tämä onnistuu suorittamalla Tracker 32-bitin Javalla. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle-virhe +TrackerIO.ErrorFFMPEG.LogMessage=Lisätietoa saat, kun kytket Xuggle-varoitukset päälle Asetuksia-komennolla (Muokkaa|Asetuksia). +TToolBar.Button.OpenBrowser.Tooltip=Avaa OSP Digital Library'n selain + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=Tiedostoa ei löydy +TFrame.Dialog.NoTRKInComPADRE.Message=Ei löydetty Tracker-tiedostoa + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinemaattinen Hiukkasmalli +DynamicParticle.Builder.Title=Dynaaminen Hiukkasmalli (Karteesinen) +DynamicParticlePolar.Builder.Title=Dynaaminen Hiukkasmalli (Polaari) +DynamicSystem.Builder.Title=Dynaaminen Systeemi (Sisäinen) +PropertiesDialog.Button.CopyFilePath=Kopioi tiedostopolku +PropertiesDialog.Button.CopyVideoPath=Kopioi videopolku +PropertiesDialog.Tab.TrackerFile=Tracker-tiedosto +PropertiesDialog.Tab.Metadata=Metatiedot +PropertiesDialog.Header.Property=Ominaisuus +PropertiesDialog.Header.Value=Arvo +TActions.Action.OpenURL=Avaa URL... +TActions.Dialog.OpenURL.Title=Avaa URL +TActions.Dialog.OpenURL.Message=Syötä nettivideon, Tracker-tiedoston tai Trackerin ZIP-tiedoston URL-osoite +TActions.Dialog.AboutVideo.Name=Nimi + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Välimuistin nettitiedostot +PrefsDialog.Button.ClearCache=Tyhjennä kaikki + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, merkitse korostettu sijainti shift-klikkaamalla +PointMass.Remarking.Hint=merkitse paikka klikkaamalla +PointMass.PositionSelected.Hint=vedä tai syötä paikka työkalurivillä +PointMass.VectorSelected.Hint=siirrä vetämällä +Vector.Remark.Hint=merkitse korostettu kärki shift-klikkaamalla +Vector.TipSelected.Hint=vedä tai syötä komponentit työkalurivillä +Vector.HandleSelected.Hint=siirrä vetämällä +Vector.Remarking.Hint=merkitse kärki klikkaamalla +AutoTracker.Label.Search=Etsi +AutoTracker.Label.Target=Kohde +AutoTracker.Label.Frame=Kehys +AutoTracker.Label.Point=Piste +AutoTracker.Label.Template=Sapluuna +AutoTracker.Label.Track=Mittasarja +AutoTracker.Label.Match=Tunnistus +AutoTracker.Label.NoTemplate=Ei Sapluunaa +AutoTracker.Label.EvolutionRate=Muutosnopeus +AutoTracker.Label.Automark=Auto-merkkaus +AutoTracker.Info.Instructions=Klikkaa Etsi-nappia löytääksesi etsintäalueella kohteen tunnistuksen. +AutoTracker.Info.KeyFrame.Instructions1=Tämä etsintäalue määrittää näkyvän sapluunan ja kohteen. Tutki painamalla Etsi-nappia, löytyykö tunnistaako ohjelma sapluunan näköisen kohteen. +AutoTracker.Info.KeyFrame.Instructions2=Voit vetää kohdetta, sapluunaa tai etsintäaluetta siirtääksesi tai muuttaaksesi sitä. +AutoTracker.Info.MouseOver.Instructions=Liikuta hiirtä kontrollien yli ja seuraa ohjeita. +AutoTracker.Info.Mask1=Sapluuna on kuva, jota tunnistetaan. Etsintä alkaa aloituskehyksestä ja tunnistus seuraa muodon ja värien muuttumista. +AutoTracker.Info.Mask2=Kohde merkitään automaattisesti kunhan tunnistamisstatus ylittää kynnysarvon. +AutoTracker.Info.Mask.Instructions=Siirrä tai muuta sapluunaa vetämällä sen reunoja tai kahvaa (vain aloituskehyksessä). Säädä muutosnopeutta ja kynnysarvoa säätimistä. +AutoTracker.Info.Mask.Tip=Alhainen kynnysarvo kasvattaa todennäköisyyttä merkitä mittauspisteeksi virheellinen tunnistus. Kasvata sen sijaan muutostiheyttä. +AutoTracker.Info.Search=Etsintäalue käydään läpi parhaan vastineen löytämiseksi. +AutoTracker.Info.SearchOnAxis=Etsitään x-akselin suunnasta parhaan tunnistuksen tekemiseksi. +AutoTracker.Info.Search.Instructions=Siirrä tai muuta etsintäaluetta vetämällä reunoista tai kahvaa. Ota käyttöön x-akseli ja seurantaehdot valitsemalla ne. +AutoTracker.Info.Search.Tip=Etsintäalueen ei tarvitse olla suuri. Seuranta-toiminto siirtää automaattisesti etsintäalueen kohteen suuntaan. +AutoTracker.Info.Target=Kohde sijaitsee siellä, mihin tunnistetun kohteen mittapiste on merkitty. +AutoTracker.Info.Target.Instructions=Siirrä kohde vetämällä sitä (vain aloituskehys). Valitse pudotusvalikosta mittaussarja ja mittauspiste. +AutoTracker.Info.Title.Settings=Asetuksia +AutoTracker.Info.Title.Tip=Vinkki +AutoTracker.Info.SelectTrack=Valitse tai luo mittasarja ja mittapiste, jota haluat mitata automaattisesti. +AutoTracker.Info.OutsideXAxis=X-akseli ei kulje etsintäalueen läpi. X-akseli ei kulke etsintäalueen läpi. Päätä jatkotoimenpiteestä: +AutoTracker.Info.NewKeyFrame=--palaa takaisin ja vaihda tilalle uusi muutosnopeus tai merkitse uusi etsintäalue shif-ctrl-klikkauksella. +AutoTracker.Info.Replace=--hyväksy tunnistus +AutoTracker.Info.Keep=--ohita tämä kehys ja jätä merkitsemättä +AutoTracker.Info.PossibleReplace=Näytetään mahdollinen tunnistus. Päätä jatkotoimenpiteestä: +AutoTracker.Wizard.Button.Accept=Hyväksy +AutoTracker.Wizard.Button.Stop=Pysäytä +AutoTracker.Wizard.Button.Skip=Ohita +AutoTracker.Wizard.Button.Replace=Korvaa +AutoTracker.Wizard.Button.Keep=Hylkää +AutoTracker.Wizard.Button.Search=Etsi +AutoTracker.Wizard.Button.SearchThis=Etsi tämä +AutoTracker.Wizard.Button.SearchNext=Etsi seuraava +AutoTracker.Wizard.Button.Delete=Poista +AutoTracker.Wizard.Button.ShowKeyFrame=Näytä etsintäalue +AutoTracker.Wizard.Button.DeleteKeyFrame=Poista etsintäalue +AutoTracker.Wizard.Checkbox.LookAhead=Siirry eteenpäin +AutoTracker.Wizard.Checkbox.XAxis=Vain X-akseli +AutoTracker.Wizard.Menuitem.DeleteThis=Tämä piste +AutoTracker.Wizard.Menuitem.DeleteLater=Seuraavat pisteet +AutoTracker.Wizard.Menuitem.DeleteAll=Tyhjennä kaikki +TToolBar.Button.AutoTracker.Tooltip=Näytä tai piilota Autotrackeri +MainTView.Popup.MenuItem.ZoomIn=Suurenna +MainTView.Popup.MenuItem.ZoomOut=Pienennä +MainTView.Popup.MenuItem.ZoomToFit=Sovita +TrackerIO.Dialog.DurationVaries.Title=Kehyksien viiveet +TrackerIO.Dialog.DurationVaries.Message1=Joidenkin kehyksien kesto poikkeaa keskimääräisestä kestosta enemmän kuin +TrackerIO.Dialog.DurationVaries.Message2=Kelvollisten nopeuksien tai kiihtyvyyksien laskemiseksi, sinun tulisi rajata nämä kehykset pois laskuista +TrackerIO.Dialog.DurationVaries.Message3=asettamalla videolle aloitus- ja lopetuskehykset. +TrackerIO.Dialog.DurationVaries.Message4=Pois rajattavat kehykset: +TrackerIO.Dialog.DurationVaries.Message5=Keskimääräinen kehysviive ja kehysnopeus, jos rajataan: +TFrame.Dialog.LibraryError.Title=Virhe +TFrame.Dialog.LibraryError.Message=Mitään resurssia ei voitu ladata. + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=merkitse shift-klikkaamalla +PrefsDialog.Label.Path=Polku +PrefsDialog.Checkbox.ClearCacheOnExit=Tyhjennä poistuessa +PrefsDialog.FileChooser.Title.Cache=Aseta välimuisti +PrefsDialog.FileFilter.Directories=Kansiot +Tracker.Action.AboutThreads=Tietoa moniajosta (Threads)... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Valitse Java VM +PrefsDialog.FileFilter.JRE=Kansiot ja Java VMs +PrefsDialog.Version.BorderTitle=Trackerin Versio +PrefsDialog.Version.Default=oletus +PrefsDialog.Tab.ClearCacheOnExit=Tyhjennä poistuessa +PrefsDialog.Run.BorderTitle=Ohjelmat, jotka suoritetaan käynnistettäessä +PrefsDialog.FileChooser.Title.Run=Valitse käynistyvät tiedostot +PrefsDialog.Button.Save=Tallenna +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README-tiedosto ei löydy +Popup.MenuItem.Algorithm=Algoritmit... +AlgorithmDialog.Button.FiniteDifference=Differenssimenetelmä +AlgorithmDialog.Button.BounceDetect=Kolaritutka +AlgorithmDialog.TitledBorder.Choose=Valitse algoritmi, jolla lasketaan nopeus ja kiihtyvyys: +AlgorithmDialog.Title=Algoritmit +AlgorithmDialog.FiniteDifference.Message1=Tämä on oletusalgoritmi. +AlgorithmDialog.FiniteDifference.Message2=Nopeus: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Kiihtyvyys: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Tämä algoritmi tasaa nopeuksien ja kiihtyvyyksien vaihteluita, mutta se huomaa myös äkilliset vaihtelut nopeudessa. +AlgorithmDialog.BounceDetect.Message2=Varoitus: aiheuttaa ongelmia. Listätietoa varten katso: +TMenuBar.Menu.Diagnostics=Diagnostiikka + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Kelvoton XML +Tracker.Dialog.Invalid.Message=Tiedostoa ei voida lukea. +TrackPlottingPanel.Popup.Menu.CompareWith=Vertaa +TrackerPanel.DataBuilder.TrackType.Unknown=tuntematon +TrackerPanel.DataBuilder.Button.Load.Tooltip=Lataa fysiikan kaavoja XML-tiedostosta +TrackerPanel.DataBuilder.Button.Save.Tooltip=Tallenna fysiikan kaavoja XML-tiedostoon +TrackerPanel.DataBuilder.Load.Title=Lataa fysiikan kaavoja +TrackerPanel.DataBuilder.Load.Message=Valitse ladattavat kaavat: +TrackerPanel.DataBuilder.Save.Title=Tallenna fysiikan kaavat +TrackerPanel.DataBuilder.Save.Message=Valitse tallennettavat kaavat: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Lataa kaikki +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Lataa vain +TrackerPanel.DataBuilder.Dialog.Load.Title=Valitse mittasarja +TrackerPanel.DataBuilder.Dialog.Load.Message=Haluatko ladata fysiikan kaavat kaikkiin mittasarjoihin, jotka ovat +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Sopimaton mittasarjan tyyppi +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Tiedostossa on fysiikan kaavoja mittasarjalle +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Kaavoja ei voitu ladata mittasarjalle +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Sopimaton mittasarjan tyyppi +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Tiedostossa ei ole fysiikan kaavoja +TToolbar.Button.Refresh=Virkistä mittasarjoja ja näkymiä + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=Tracker-leike on tallennettu +ExportTRKDialog.Complete.Message2=Haluatko avata sen Trackerissa nyt? +ExportTRKDialog.Complete.Title=Tracker-tiedoston vienti valmis +ExportTRKDialog.Title=Vie Tracker-klippi +ExportTRKDialog.Message1=This (1) vie video-klipin, (2) konvertoi mittausten välilehdet vastaamaan vietyä videota, ja (3) tallentaa konvertoidut välilehdet uutena Tracker-tiedostona. +ExportTRKDialog.Message2=Tracker- ja video-tiedostot tallennetaan samaan kansioon samalla nimellä eri tunnisteella. +TMenuBar.MenuItem.TabClip=Tracker-klippi +TMenuBar.Menu.CalibrationTools=Kalibroinnin työvälineet +TrackerIO.Dialog.DurationVaries.Button.SetClip=Aseta suositeltu klippi +TrackerIO.Dialog.DurationVaries.Start=aloita +TrackerIO.Dialog.DurationVaries.End=lopeta +TrackerIO.Dialog.DurationVaries.Recommended=Suositeltu klippi + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Kiinnitä mitan päät +AttachmentInspector.Label.End=Pää +AttachmentInspector.Label.Vertex=Kärki +AttachmentInspector.Header.PointName=Nimi +AttachmentInspector.Header.AttachedTo=Kiinnitä +ExportTRKDialog.Label.VideoFormat=Videoformaatti +MeasuringTool.MenuItem.Attach=Kiinnitä päät... +PerspectiveTrack.Corner=nurkka +PrefsDialog.LogLevel.BorderTitle=Siirry Viestiloki-tilaan +Protractor.Data.Description.0=aika +Protractor.Data.Description.1=Astemitan kulma +Protractor.Data.Description.2=kyljen 1 pituus +Protractor.Data.Description.3=kyljen 2 pituus +Protractor.Data.Description.4=askelnumero +Protractor.Data.Description.5=kehysnumero +TapeMeasure.Data.Description.0=aika +TapeMeasure.Data.Description.1=pituus +TapeMeasure.Data.Description.2=+x-akselista mitattu kulma +TapeMeasure.Data.Description.3=askelnumero +TapeMeasure.Data.Description.4=kehysnumero + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=ei etsitty +AutoTracker.Info.KeyFrame=Etsintäalue +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Tämä etsintäalue +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Tämä tunnistus +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Myöhemmät tunnistukset +PrefsDialog.Checkbox.64BitVM=64-bittinen + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotrackeri +Dialog.Button.Add=Lisää +Dialog.Button.Remove=Poista +PrefsDialog.Button.ClearHost=Tyhjennä verkkosivu +PrefsDialog.Button.ClearHost.Tooltip=poista kaikki tiedostot, jotka liittyvät valittuun verkkosivustoon OSP-välimuistissa +PrefsDialog.Button.ClearCache.Tooltip=tuhoa kaikki tiedostot OSP-välimuistista +TActions.Action.SaveZip=Vie Trackerin ZIP-tiedosto +ThumbnailDialog.Title=Vie kuvake +ThumbnailDialog.Settings.Title=Kuvakkeen asetukset +ThumbnailDialog.Label.CurrentImage=Nykyinen kuva +ThumbnailDialog.Label.FrameNumber=kehys +ThumbnailDialog.Label.StepNumber=askel +ThumbnailDialog.View.VideoOnly=Vain Video +ThumbnailDialog.View.MainView=Päänäkymä +ThumbnailDialog.View.WholeFrame=Koko kehys +ThumbnailDialog.Format.PNG=PNG-kuva +ThumbnailDialog.Format.JPG=JPEG-kuva +ThumbnailDialog.Chooser.SaveThumbnail.Title=Tallenna kuvake +ThumbnailDialog.Subtitle.Image=Kuva +TMenuBar.MenuItem.Thumbnail=Kuvake +TToolBar.Button.SaveZip.Tooltip=Vie Tracker-ZIP-tiedosto +TTrack.MenuItem.DeletePoint=Tuhoa valittu askel +ZipResourceDialog.Title=Vie Tracker-ZIP-tiedosto +ZipResourceDialog.Label.Format=Formaatti +ZipResourceDialog.Label.Title=Nimi +ZipResourceDialog.Label.Description=Kuvaus +ZipResourceDialog.Label.Keywords=Avainsanat +ZipResourceDialog.Label.Link=Ulkoinen linkki +ZipResourceDialog.Label.HTML=HTML-lähde +ZipResourceDialog.Complete.Message1=Tracker-ZIP-tiedosto on tallennettu nimellä +ZipResourceDialog.Complete.Message2=Haluatko avata sen Trackerissa nyt? +ZipResourceDialog.Complete.Title=Onnistui +ZipResourceDialog.Border.Title.Documentation=HTML-dokumentti +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Kuvake +ZipResourceDialog.FileChooser.SaveZip.Title=Vie Tracker-ZIP-tiedosto +ZipResourceDialog.FileChooser.AddFile.Title=Lisää tiedosto Tracker-ZIP-tiedostoon +ZipResourceDialog.FileChooser.OpenHTML.Title=Avaa HTML-tiedosto +ZipResourceDialog.Button.AddFiles=Lisää tiedostoja +ZipResourceDialog.Button.ThumbnailSettings=Kuvake asetukset +ZipResourceDialog.Checkbox.TrimVideo=Katkaise klipiksi +ZipResourceDialog.AddHTMLInfo.Title=Lisää HTML-Info-tiedosto +ZipResourceDialog.AddHTMLInfo.Message1=Haluatko lisätä HTML-Info-tiedoston +ZipResourceDialog.AddHTMLInfo.Message2=Tracker-ZIP-tiedostoon? +ZipResourceDialog.HTMLField.DefaultText=Ellei mitään ilmoiteta, tiedosto muodostetaan perusosista +ZipResourceDialog.Dialog.AddFiles.Title=Lisää HTML- ja PDF-tiedostoja +ZipResourceDialog.Tooltip.HTML=Polku HTML-lähteeseen (ellei mitään anneta, tiedosto muodostetaan perusosista) +ZipResourceDialog.Tooltip.Author=Tämän aineiston tekijät +ZipResourceDialog.Tooltip.Title=Näytä tämän aineiston nimi (ei tiedoston nimi) +ZipResourceDialog.Tooltip.Description=Hyödyllinen selostus aineistosta +ZipResourceDialog.Tooltip.Keywords=Luettelo avainsanoista DL-selaimelle +ZipResourceDialog.Tooltip.Contact=Tekijän yhteystiedot (laitos, s-posti, verkkosivu, jne.) +ZipResourceDialog.Tooltip.Link=URL ulkoiseen HTML-tiedostoon, jossa on enemmän tietoa aineistosta +ZipResourceDialog.Tooltip.ThumbnailSettings=Vaihda kuvakenäkymä, koko, tai tiedostotyyppi +ZipResourceDialog.Tooltip.AddFiles=Lisää HTML- ja PDF-tiedostoja Trackerin ZIP-tiedostoon +ZipResourceDialog.Tooltip.TrimVideo=Valitse vidäksesi videoklipin, poista valinta käyttääksesi alkuperäistä videota +ZipResourceDialog.Tooltip.LoadHTML=Käytä tiedoston valintaikkunaa lataaksesi HTML--Info-tiedoston + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bittinen +PrefsDialog.Checkbox.WarnVariableDuration=Muuttuvat kehysviiveet +PrefsDialog.Button.NoEngine=Ei video-ohjelmaa +PrefsDialog.Dialog.SwitchToQT.Message=Vaihtamalla QuickTime'iin vaihtuu myös Java VM 32-bittiseksi. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 32-bittiseksi. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 64-bittiseksi. +PrefsDialog.Dialog.SwitchVM.Title=Java VM vaihtui +PrefsDialog.Dialog.SwitchTo32.Message=Vaihtamalla Java VM 32-bittiseksi vaihtuu myös video-ohjelma QuickTime'iksi. +PrefsDialog.Dialog.SwitchTo64.Message=Vaihtamalla Java VM 64-bittiseksi vaihtuu myös video-ohjelma Xuggleksi. +PrefsDialog.Dialog.SwitchEngine.Title=Video-ohjelma vaihtui +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Yhtään video-ohjlmaa ei ole käytettävissä 64-bittiselle Javalle. Voit +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=kuitenkin vielä avata kuvia (JPEG, PNG) and GIF-animatioita. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Oletko varma, että haluat vaihtaa 64-bittiseen Javaan? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ei 64-bittistä Video-ohjelmaa +PrefsDialog.Dialog.No32bitVMXuggle.Message=Ennen kuin Xugglea voi käyttää tulee ensin asentaa 32-bittinen Java VM. +PrefsDialog.Dialog.No32bitVMQT.Message=Ennen kuin QuickTime'ia voi käyttää tulee ensin asentaa 32-bittinen Java VM. +PrefsDialog.Dialog.No32bitVM.Message=Lisätietoa saa Trackerin ohjeista: Asennus. +PrefsDialog.Dialog.No32bitVM.Title=Tarvitaan 32-bittinen Java VM +PrefsDialog.Button.ShowHelpNow=Näytä Ohje nyt +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=EI VAKIO +TMenuBar.MenuItem.CheckFrameDurations=Kehysviive +TMenuBar.MenuItem.ExportZIP=Tracker-Zip +Tracker.Dialog.Install32BitVM.Message=Ennen kuin video-ohjelmia voi käyttää tulee ensin asentaa 32-bittinen Java VM. +Tracker.Dialog.SwitchTo32BitVM.Message1=Yksi tai useampi video-ohjelma on asennettuna, mutta niitä ei voi käyttää, koska +Tracker.Dialog.SwitchTo32BitVM.Message2=ne tarvitsevat 32-bittisen Javan ja sinä käytät tällä hetkellä 64-bittistä Javaa. +Tracker.Dialog.SwitchTo32BitVM.Message3=Muuttaaksesi tämän, avaa Asetuksia-ikkuna (Muokkaa|Asetuksia...) +Tracker.Dialog.SwitchTo32BitVM.Message4=ja valitse 64-bittinen Java VM Suoritus-välilehdellä. +Tracker.Dialog.EngineProblems.Message1=Yksi tai useampi video-ohjelma on asennettuna, mutta niitä ei voi käyttää. +Tracker.Dialog.EngineProblems.Message2=Lisätietoa saa: Ohje|Diagnostiikka|Tietoa Xugglesta or QuickTime'ista. +Tracker.Dialog.ReplaceXuggle.Message1=Suosittelemme nykyisen Xugglen korvaamista +Tracker.Dialog.ReplaceXuggle.Message2=uudella Xuggle-versiolla 3.4 asentamalla Tracker (versio 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=tai uudempi) ja valitsemalla Xuggle-asennusvaihtoehto. +TrackerIO.Dialog.DurationIsConstant.Message=Kaikki kehyksien kestot ovat samat (vakio-fps). +TrackerIO.ZIPResourceFilter.Description=Trackerin ZIP-tiedosto (.trz) +TToolbar.Button.Desktop.Tooltip=Näytä täydentäviä HTML- tai/ja PDF-dokumentteja +ZipResourceDialog.BadModels.Message1=Videoklippi ei sisällä aloituskehystä +ZipResourceDialog.BadModels.Message2=sitä seuraavalle Hiukkasmallin mittaussarjalle. Jos katkaiset videon, niin +ZipResourceDialog.BadModels.Message3=malli ei tallennu Tracker-ZIP'iin. +ZipResourceDialog.BadModels.Question=Jatkatko ja jätätkö pois mallit? +ZipResourceDialog.BadModels.Title=Videoleikkeen ja mallin ristiriita +TMenuBar.MenuItem.EditVideoFrames=Lataa kaikki kuvat +TMenuBar.Dialog.RequiresMemory.Message1=Kaikki kuvat ladataan muistiin nopeamman selaamisen ja muokkaamisen takia. +TMenuBar.Dialog.RequiresMemory.Message2=Tarkista käytettävän muistin määrä ja tarvittaessa käynnistä Tracker suuremmalla muistilla. +TMenuBar.Dialog.RequiresMemory.Title=Muisti + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pikselin x-koordinaatti +PointMass.Data.Description.PixelY=pikselin y-koordinaatti +ExportVideoDialog.Content.DeinterlacedVideo=Lomittamaton video +ExportVideoDialog.Deinterlace.OddFirst=Parittomat kentät ensin +ExportVideoDialog.Deinterlace.EvenFirst=Parilliset kentät ensin +ExportVideoDialog.Deinterlace.Dialog.Title=Lomittamaton videokenttä +TFrame.Dialog.LibraryError.FileNotFound.Title=Tiedostoa ei löydy +TFrame.Dialog.LibraryError.FileNotFound.Message=Tiedostoa ei löydy +TrackerPanel.DataBuilder.Button.Autoload=Auto-lataus +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Halliste fysiikan kaavojen auto-latausta +TrackerPanel.DataBuilder.Autoload.Title=Lataa automaattisesti fysiikan kaavat +TrackerPanel.DataBuilder.Autoload.Message=Valiste automaattisesti ladattavat kaavat: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML-tiedostot +TrackerIO.Dialog.Open.Title=Avaa +TToolbar.Button.Refresh.Popup.RefreshNow=Virkistä +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-virkistys +TToolbar.Button.Refresh.Tooltip=Virkistä mittasarjoja ja näkymiä + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origon pikselien paikka +CoordAxes.Origin.Field.Tooltip=origon paikka mitatuna videon ylävasemasta kulmauksesta + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Valitse Pisteet +MainTView.Popup.MenuItem.Deselect=Vapauta Pisteet diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties index 580650d0..3493dfb9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties @@ -1,1199 +1,1199 @@ -# This is the french tracker.properties file -# Translated by Matthieu Moors 2007-08-07 -# Translated by Laurent Hivon 2012-07 -# Translated by Bernard Marcheterre 2012-09 - -# Trajectoires|Nouvelle est devenu Trajectoires|Nouveau -# Vhercher est redevenu Chercher -# Les "sauvegarder" sont tous devenus des "enregistrer" -# Les tirets après "non" ont été enlevés - -Calibration.Name=Paire de points pour la calibration -Calibration.New.Name=Points de calibration -CenterOfMass.Name=Centre de Masse -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Choisir les masses... -CenterOfMassInspector.Title=Centre de Masse -CenterOfMassInspector.Border.Title=Choisir les masses -ConfigInspector.Border.Title=Cocher les éléments désirés -ConfigInspector.Title=Préférences -ConfigInspector.Button.SaveAsDefault=Enregistrer en tant que paramètres par défaut -CoordAxes.Name=Axes -CoordAxes.New.Name=axes -Dialog.Button.Cancel=Annuler -Dialog.Button.OK=OK -Dialog.Button.Close=Fermer -Dialog.Button.All=Tous -Dialog.Button.None=Aucun -Dialog.Button.Copy=Copier -Dialog.Button.Update=Mettre à jour -Dialog.Button.SelectAll=Tout sélectionner -Footprint.Diamond=Losange -Footprint.BoldDiamond=Losange épais -Footprint.SolidDiamond=Losange plein -Footprint.Triangle=Triangle -Footprint.BoldTriangle=Triangle épais -Footprint.SolidTriangle=Triangle plein -Footprint.Circle=Cercle -Footprint.BoldCircle=Cercle épais -Footprint.SolidCircle=Cercle plein -Footprint.VerticalLine=Ligne verticale -Footprint.BoldVerticalLine=Ligne verticale épaisse -Footprint.HorizontalLine=Ligne horizontale -Footprint.BoldHorizontalLine=Ligne horizontale épaisse -Footprint.Crosshair=Croix -Footprint.BoldCrosshair=Croix épaisse -Footprint.SimpleAxes=Axes simples -Footprint.BoldSimpleAxes=Axes simples épais -Footprint.Spot=Point -Footprint.Line=Ligne -Footprint.BoldLine=Ligne épaisse -Footprint.Outline=Contour -Footprint.BoldOutline=Contour épais -Footprint.Arrow=Flèche -Footprint.BoldArrow=Flèche épaisse -Footprint.DoubleArrow=Double flèche -Footprint.BoldDoubleArrow=Double flèche épaisse -Footprint.2xArrow=Flèche 2x -Footprint.Bold2xArrow=Flèche 2x épaisse -Footprint.4xArrow=Flèche 4x -Footprint.Bold4xArrow=Flèche 4x épaisse -Footprint.DashArrow=Flèche pointillée -Footprint.BoldDashArrow=Flèche pointillée épaisse -Footprint.BigArrow=Grande flèche -Footprint.BigDashArrow=Grande flèche pointillée -LineProfile.Name=Profil de ligne -LineProfile.New.Name=profil -LineProfile.Data.Brightness=Luminosité -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=rouge -LineProfile.Data.Green=vert -LineProfile.Data.Blue=bleu -LineProfile.Data.Weighting=décompte -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=Zoom -MainTView.Popup.MenuItem.ToFit=Ajuster -OffsetOrigin.Name=Origine déplacée -OffsetOrigin.New.Name=Origine déplacée -PlotTrackView.Button.PlotCount=Graphe -PlotTrackView.Button.PlotCount.ToolTip=Choisir le nombre de graphes -PointMass.Name=Masse ponctuelle -PointMass.New.Name=masse -PointMass.MenuItem.VectorsToPosition=À la position -PointMass.MenuItem.Velocity=Vitesse -PointMass.MenuItem.Acceleration=Accélération -Star.Name=Étoile -Star.New.Name=étoile -TableTrackView.Action.CopyData=Copier les données -TableTrackView.Button.SelectTableData=Tableau de données -TableTrackView.Button.SelectTableData.ToolTip=Choisir les colonnes de données -TableTrackView.Popup.MenuItem.Analyze=Analyser... -TableTrackView.Dialog.Border.Title=Visible: -TActions.Action.Description=Notes -TActions.Action.ClearTracks=Toutes les trajectoires -TActions.Action.NewTab=Nouvel onglet -TActions.Action.Copy=Copier -TActions.Action.Paste=Coller -TActions.Action.Open=Ouvrir fichier... -TActions.Action.Close=Fermer l'onglet -TActions.Action.Import=Importer... -TActions.Action.Save=Enregistrer l'onglet -TActions.Action.SaveAs=Enregistrer l'onglet sous... -TActions.Action.Export=Exporter... -TActions.Action.CaptureVideo=Capturer une video... -TActions.Action.Delete=Supprimer -TActions.Action.Config=Préférences... -TActions.Action.AxesVisible=Visible -TActions.Action.TapeVisible=Visible -TActions.Action.Print=Imprimer... -TActions.Action.ClearFilters=Effacer -TActions.Action.ImportVideo=Importer... -TActions.Action.CloseVideo=Fermer -TActions.Action.CloseAll=Fermer tout les onglets -TActions.Action.Exit=Quitter -TActions.Dialog.PrintError.Message=Une erreur d'impression s'est produite. -TActions.Dialog.PrintError.Title=Erreur d'impression -TActions.Dialog.Description.Title=Notes: -TActions.Dialog.DeleteLockedTracks.Message=Certaines trajectoires sont verrouillées. Supprimer quand même? -TActions.Dialog.DeleteLockedTracks.Title=Supprimer les trajectoires verrouillées? -TActions.Dialog.NewPointMass.Title=Nouvelle masse ponctuelle -TapeMeasure.Name=Mesure avec ruban -TapeMeasure.New.Name=ruban -TapeMeasure.MenuItem.Fixed=Position fixe -TFrame.View.Plot=Affichage du graphe -TFrame.View.Table=Affichage de la table de données -TFrame.View.World=Affichage global -TFrame.View.Video=Affichage de la vidéo -TFrame.Dialog.Help.Title=Aide de Tracker -TMenuBar.Menu.File=Fichier -TMenuBar.Menu.Edit=Édition -TMenuBar.Menu.Video=Vidéo -TMenuBar.Menu.Tracks=Trajectoires -TMenuBar.Menu.Coords=Système de Coordonnées -TMenuBar.Menu.Window=Fenêtre -TMenuBar.Menu.Help=Aide -TMenuBar.MenuItem.EditProperties=Propriétés... -TMenuBar.MenuItem.VideoVisible=Visible -TMenuBar.MenuItem.VideoFilters=Filtres -TMenuBar.MenuItem.NewVideoFilter=Nouveau -TMenuBar.MenuItem.NewTrack=Nouveau -TMenuBar.MenuItem.CoordsLocked=Verrouillé -TMenuBar.MenuItem.CoordsFixedOrigin=Origine fixe -TMenuBar.MenuItem.CoordsFixedAngle=Orientation fixe -TMenuBar.MenuItem.CoordsFixedScale=Échelle fixe -TMenuBar.MenuItem.CoordsRefFrame=Image de référence -TMenuBar.MenuItem.CoordsDefault=Par défaut -TMenuBar.MenuItem.WindowRight=Vue de droite -TMenuBar.MenuItem.WindowBottom=Vue du dessous -TMenuBar.MenuItem.PlayAllSteps=Lire tous les incréments -TMenuBar.MenuItem.Record=Enregistrer -TMenuBar.MenuItem.MatSize=Dimensions de la zone de travail -TMenuBar.MenuItem.Language=Langue -TMenuBar.MenuItem.DeleteTrack=Supprimer -TMenuBar.MenuItem.TrackerHelp=Aide de Tracker... -TMenuBar.MenuItem.MessageLog=Journal des messages... -TrackControl.Name=Contrôle des trajectoires -TrackControl.Button.NewTrack=Créer -TrackControl.Button.NewTrack.ToolTip=Créer une nouvelle trajectoire -TrackControl.Button.Trails.ToolTip=Définir la longueur de la trace -TrackControl.Button.Labels.ToolTip=Afficher ou masquer la numérotation -TrackControl.Button.StretchVectors.ToolTip=Étirer les vecteurs -TrackControl.Button.Accelerations.ToolTip=Afficher ou masquer les vecteurs accélération -TrackControl.Button.Xmass.ToolTip=Multiplier les vecteurs par la masse -TrackControl.Button.Vectors.ToolTip=Vecteurs -TrackControl.Button.Velocities.ToolTip=Afficher ou masquer les vecteurs vitesse -TrackControl.Button.Properties.ToolTip=Cliquer pour sélectionner -TrackControl.Button.Positions.ToolTip=Afficher ou masquer les positions -Tracker.Popup.MenuItem.Snapshot=Capture d'écran -Tracker.Popup.MenuItem.Help=Aide... -Tracker.Cursor.Crosshair.Description=Curseur en croix -Tracker.Action.AboutTracker=À propos de Tracker... -Tracker.Dialog.AboutTracker.Title=À propos de Tracker -Tracker.Action.AboutJava=À propos de Java... -Tracker.Dialog.AboutJava.Title=À propos de Java -Tracker.Dialog.AboutJava.UnknownVersion=inconnu -Tracker.Dialog.AboutJava.Message=Version de Java -Tracker.Action.AboutQT=À propos de QuickTime... -Tracker.Dialog.AboutQT.Title=À propos de QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=Version de QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=Version de QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=Chemin d'accès du fichier QTJava: -Tracker.Dialog.NoQT.Title=QTJava.zip non trouvé -Tracker.Dialog.NoQT.Message1=QuickTime pour Java ne semble pas être installé. -Tracker.Dialog.NoQT.Message2=Si vous désirez analyser des séquences Quicktime, veuillez réinstaller Quicktime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime pour Java DOIT ÊTRE SELECTIONNÉ lors de l'installation de Quicktime. -Tracker.Dialog.UpdateQT.Title=Mettre à jour de QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Une version plus récente de QTJava.zip a été trouvé à -Tracker.Dialog.UpdateQT.Message2=Voulez-vous mettre à jour le fichier existant? -Tracker.Dialog.CopyQT.Title=Copier QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime est installé, mais avant que Tracker ne puisse l'utiliser: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip doit être copié de -Tracker.Dialog.CopyQT.Message3= vers -Tracker.Dialog.CopyQT.Message4= 2. Tracker doit redémarrer. -Tracker.Dialog.CopyQT.Message5=Désirez-vous copier QTJava.zip maintenant? -Tracker.Dialog.CopyFailed.Title=La copie a échoué -Tracker.Dialog.CopyFailed.Message=QTJava.zip n'a pas pu être copié. -Tracker.Dialog.CopiedTo.Title=Copie réussie -Tracker.Dialog.CopiedTo.Message1=QTJava.zip a été copié correctement vers -Tracker.Dialog.CopiedTo.Message2=Tracker doit redémarrer et va maintenant fermer. -Tracker.Splash.Loading=Chargement -TrackerIO.Dialog.Import.Title=Importer un fichier Tracker -TrackerIO.Dialog.Import.Message=Sélectionner les éléments à importer -TrackerIO.Dialog.ImportVideo.Title=Importer une vidéo -TrackerIO.Dialog.Export.Title=Exporter -TrackerIO.Dialog.Export.Message=Sélectionner les éléments à exporter -TrackerIO.Dialog.ReplaceFile.Title=Remplacer le fichier existant? -TrackerIO.Dialog.ReplaceFile.Message=existe déjà. Voulez-vous le remplacer? -TrackerIO.Dialog.NotTrackerXML.Title=Erreur XML -TrackerIO.Dialog.NotTrackerXML.Message=contient des données XML pour une autre application. -TrackerIO.Dialog.BadVideo.Message=La vidéo n'est pas d'un type reconnu: -TrackerIO.Dialog.BadVideo.Title=Fichier vidéo non reconnu -TrackerPanel.NewTab.Name=Sans-titre -TrackerPanel.DragToMark.Hint=Maj+glisser pour marquer -TrackerPanel.ClickToMark.Hint=Maj+clic pour marquer -TrackerPanel.Dialog.LoadFailed.Title=Fichier Tracker non valide -TrackerPanel.Dialog.LoadFailed.Message=Ceci n'est pas un fichier Tracker valide: -TrackerPanel.Dialog.SaveChanges.Title=Enregistrer les changements -TrackerPanel.Dialog.SaveChanges.Message=Enregistrer les changements dans -TrackPlottingPanel.Popup.MenuItem.Lines=Lignes -TrackPlottingPanel.Popup.MenuItem.Points=Points -TrackPlottingPanel.Popup.MenuItem.Scale=Échelle... -TrackPlottingPanel.Popup.MenuItem.Print=Imprimer... -TrackPlottingPanel.Popup.MenuItem.Measure=Mettre à l'échelle -TrackPlottingPanel.Popup.MenuItem.Analyze=Analyser -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Augmenter l'échelle -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Diminuer l'échelle -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Mise à l'échelle automatique -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Ajuster l'échelle au cadre -TrackPlottingPanelInspector.Title=Échelle -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Définir l'empreinte -TToolBar.Dropdown.SelectedTrack.Tooltip=Sélectionner une trajectoire -TToolBar.Dropdown.SelectedTrack.None=Aucune -TTrack.MenuItem.Delete=Supprimer -TTrack.MenuItem.Color=Couleur... -TTrack.Dialog.Color.Title=Choisir la couleur de la trajectoire -TTrack.MenuItem.Name=Nom... -TTrack.MenuItem.Footprint=Empreinte -TTrack.MenuItem.Description=Notes... -TTrack.MenuItem.Visible=Visible -TTrack.MenuItem.TrailVisible=Trace Visible -TTrack.MenuItem.Autostep=Incrément automatique -TTrack.MenuItem.MarkByDefault=Marquer par défaut -TTrack.MenuItem.Locked=Verrouillé -TTrack.MenuItem.Delete=Supprimer -TTrack.Name.None=aucun nom -TTrack.Dialog.Description.Title=Notes: -TTrack.Dialog.Name.Title=Définir Nom -TTrack.Dialog.Name.Label=Nom: -TViewChooser.Button.Choose.Tooltip=Choisir un affichage -Vector.Name=Vecteur -Vector.New.Name=vecteur -Vector.MenuItem.ToOrigin=À l'origine -Vector.MenuItem.Label=Étiquette visible -VectorSum.Name=Somme de vecteurs -VectorSum.New.Name=addition -VectorSum.MenuItem.Inspector=Choisir les Vecteurs... -VectorSumInspector.Title=Somme de vecteurs -VectorSumInspector.Border.Title=Sélectionner les vecteurs -WorldTView.Popup.MenuItem.Projectile=Modèle de Projectile - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Modèle cinématique de particule -AnalyticParticle.Inspector.Title=Modèle cinématique de particule -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=Rayon 4 -CircleFootprint.Circle_6=Rayon 6 -CircleFootprint.Circle_8=Rayon 8 -DynamicParticle.Name=Modèle dynamique de particule (Cartésien) -DynamicParticle.Inspector.Title=Modèle dynamique de particule -DynamicParticle.Property.ForceX=force selon x -DynamicParticle.Property.ForceY=force selon y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Position Fixe -ParticleModel.New.Name=modèle -ParticleModel.MenuItem.InspectModel=Création d'un modèle... -ParticleModel.Inspector.Button.Undo=Annuler -ParticleModel.Inspector.Button.Redo=Répéter -ParticleModel.Inspector.Button.Close=Fermer -ParticleModel.Inspector.Button.Help=Aide - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=Seulement X -Calibration.Axes.YOnly=Seulement Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Sélectionner les axes de calibration -Calibration.Label.Axes=axes -Calibration.Dialog.InvalidCoordinates.Title=Coordonnées non valides. -Calibration.Dialog.InvalidCoordinates.Message=Les points ne peuvent avoir les mêmes coordonnées globales. -Calibration.Dialog.InvalidXCoordinates.Message= Les points ne peuvent avoir les mêmes coordonnées globales en x. -Calibration.Dialog.InvalidYCoordinates.Message= Les points ne peuvent avoir les mêmes coordonnées globales en y. -SpectralLineFilter.Title=Spectre gazeux -SpectralLineFilter.H=Hydrogène -SpectralLineFilter.He=Hélium -SpectralLineFilter.Ne=Néon -SpectralLineFilter.Hg=Mercure -TFrame.View.Unknown=Affichage -TMenuBar.MenuItem.Undo=Annuler -TMenuBar.MenuItem.Redo=Répéter -TMenuBar.MenuItem.Replace=Remplacer... -TMenuBar.Menu.AddImage=Importer des images -TMenuBar.MenuItem.AddBefore=Avant cette image... -TMenuBar.MenuItem.AddAfter=Après cette image... -TMenuBar.MenuItem.RemoveImage=Supprimer cette image -TMenuBar.Menu.Tools=Outils -TMenuBar.MenuItem.DataFunctionTool=Traitement des données... -TMenuBar.MenuItem.DatasetTool=Outil d'analyse des données... -TMenuBar.Menu.CopyImage=Copier l'image -TMenuBar.MenuItem.CopyMainView=Affichage principal -TMenuBar.MenuItem.CopyFrame=Image -TMenuBar.MenuItem.PrintFrame=Imprimer... -TrackerIO.Dialog.AddImage.Title=Importer des images (choisir une ou plusieurs) -TTrack.Dialog.Name.BadName=existe déjà! Choisir un autre nom. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=Force résultante -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=L'affichage du graphe des données de la trajectoire apparaîtra ici. -TableTView.Label.NoData=L'affichage du tableau des données de la trajectoire apparaîtra ici. -TrackerPanel.Message.NoData0=L'affichage principal de la vidéo et des trajectoires apparaîtra ici. -TrackerPanel.Message.NoData1=Choisir Fichier|Ouvrir ou Trajectoires|Nouveau pour débuter. -WorldTView.Label.NoData=L'affichage global de la vidéo et des trajectoires apparaîtra ici. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Solveur: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Multi-étapes adaptées -DynamicParticle.Table.Force.Border.Title=Fonctions de force (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Fonctions de la position (t) -ParticleModel.Table.Initial.Border.Title=Valeurs initiales -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Coller l'image -TMenuBar.MenuItem.PasteAfter=Après cette image -TMenuBar.MenuItem.PasteBefore=Avant cette image -TMenuBar.MenuItem.PasteReplace=Remplacer la vidéo - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Pour commencer... -Tracker.Splash.HelpMessage=Nouvel utilisateur? Choisir - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=Angle par rapport à l'horzontale -LineProfile.Checkbox.Rotates=pivote -LineProfile.Label.Spread=étendre -RGBRegion.Name=Région RVB -RGBRegion.New.Name=région -RGBRegion.MenuItem.Fixed=Position fixe -RGBRegion.Label.Radius=taille des pixels -TTrack.Label.Step=Incrément - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=numéro de position -LineProfile.Data.Description.1=composante selon x de la position -LineProfile.Data.Description.2=composante selon y de la position -LineProfile.Data.Description.3=rouge -LineProfile.Data.Description.4=vert -LineProfile.Data.Description.5=bleu -LineProfile.Data.Description.6=luminosité perçue -LineProfile.Data.Description.7=largeur du trait -ParticleModel.MenuItem.TraceVisible=Tracé visible -ParticleModel.MenuItem.StepsVisible=Numéros d'incrément Visible -PointMass.Data.Description.0=temps -PointMass.Data.Description.1=composante selon x de la position -PointMass.Data.Description.2=composante selon y de la position -PointMass.Data.Description.3=module de la position -PointMass.Data.Description.4=orientation de la position -PointMass.Data.Description.5=composante selon x de la vitesse -PointMass.Data.Description.6=composante selon y de la vitesse -PointMass.Data.Description.7=module de la vitesse -PointMass.Data.Description.8=orientation de la vitesse -PointMass.Data.Description.9=composante selon x de l'accélération -PointMass.Data.Description.10=composante selon y de l'accélération -PointMass.Data.Description.11=module de l'accélération -PointMass.Data.Description.12=orientation de l'accélération -PointMass.Data.Description.13=position angulaire -PointMass.Data.Description.14=vitesse angulaire -PointMass.Data.Description.15=accélération angulaire -PointMass.Data.Description.16=numéro de l'incrément -PointMass.Data.Description.17=numéro de l'image -PointMass.Data.Description.18=composante selon x de la quantité de mouvement -PointMass.Data.Description.19=composante selon y de la quantité de mouvement -PointMass.Data.Description.20=module de la quantité de mouvement -PointMass.Data.Description.21=orientation de la quantité de mouvement -PointMass.Data.Description.22=énergie cinétique -RGBRegion.Data.Description.0=temps -RGBRegion.Data.Description.1=composante selon x de la position -RGBRegion.Data.Description.2=composante selon y de la position -RGBRegion.Data.Description.3=rouge -RGBRegion.Data.Description.4=vert -RGBRegion.Data.Description.5=bleu -RGBRegion.Data.Description.6=luminosité perçue -RGBRegion.Data.Description.7=nombre de pixels -RGBRegion.Data.Description.8=numéro de l'incrément -RGBRegion.Data.Description.9=numéro de l'image -TView.Menuitem.Define=Definir... -Vector.Data.Description.0=temps -Vector.Data.Description.1=composante selon x -Vector.Data.Description.2=composante selon y -Vector.Data.Description.3=module -Vector.Data.Description.4=orientation -Vector.Data.Description.5=composante selon x de la position de la queue -Vector.Data.Description.6=composante selon y de la position de la queue -Vector.Data.Description.7=numéro de l'incrément -Vector.Data.Description.8=numéro de l'image - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Masse de cette particule -ParticleModel.Parameter.InitialTime.Description=Instant initial -AnalyticParticle.PositionFunction.X.Description=Composante selon x de la position -AnalyticParticle.PositionFunction.Y.Description=Composante selon y de la position -DynamicParticle.ForceFunction.X.Description=Composante selon x de la force -DynamicParticle.ForceFunction.Y.Description=Composante selon y de la force -DynamicParticle.Parameter.InitialX.Description=Composante selon x de la position initiale -DynamicParticle.Parameter.InitialY.Description=Composante selon y de la position initiale -DynamicParticle.Parameter.InitialVelocityX.Description=Composante selon x de la vitesse initiale -DynamicParticle.Parameter.InitialVelocityY.Description=Composante selon y de la vitesse initiale -TrackerPanel.ModelBuilder.Title=Créateur de modèle -TrackerPanel.DataBuilder.Title=Analyseur de données -TrackControl.TrailMenu.NoTrail=Aucune trace -TrackControl.TrailMenu.ShortTrail=Trace courte -TrackControl.TrailMenu.LongTrail=Trace longue -TrackControl.TrailMenu.FullTrail=Trace complète -TrackerPanel.ModelBuilder.Spinner.Tooltip=Modèle actuellement sélectionné -TrackerPanel.ModelBuilder.LineButton.Text=Style de ligne -TrackerPanel.ModelBuilder.LineButton.Tooltip=Définir le style de ligne -ParticleModel.LineStyle.None=Aucune ligne -ParticleModel.LineStyle.Connect=Relier les points -ParticleModel.LineStyle.Smooth=Arrondir les lignes -ModelFunctionPanel.Label=Modèle -AnalyticFunctionPanel.FunctionEditor.Border.Title=Fonctions de Position -DynamicFunctionPanel.FunctionEditor.Border.Title=Fonctions de Force - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Colonnes visibles dans la table -Tracker.About.ProjectOf=Un projet de: -Tracker.About.TranslationBy=Traduction par -Tracker.About.Translator=Matthieu Moors\net Bernard Marcheterre -TMenuBar.Menu.SaveVideoAs=Enregistrer la vidéo sous -TActions.SaveClipAs.ProgressMonitor.Message=Sauvegarde de la vidéo sous -TActions.SaveClipAs.ProgressMonitor.Progress=Complétée - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Synchroniser -PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronizer les axes horizontaux -RGBRegion.MenuItem.FixedRadius=Rayon fixe -Tracker.VideoZoom.Hint=cliquer pour augmenter l'échelle, alt-clic pour réduire l'échelle, double-clic pour ajuster -Tracker.PlotZoomIn.Hint=glisser pour augmenter l'échelle, double-clic pour échelle automatique -Tracker.PlotZoomOut.Hint=clic pour augmenter l'échelle -Tracker.MenuItem.Hints=Afficher les astuces -TapeMeasure.Label.Length=longueur à l'échelle -TapeMeasure.Label.TapeAngle=angle du ruban -TapeMeasure.Label.ArcAngle=angle du rapporteur -TrackerIO.Dialog.NotAnImage.Title=Fichier de type incorrect -TrackerIO.Dialog.NotAnImage.Message1=n'est pas une image JPG ou GIF. -TrackerIO.Dialog.NotAnImage.Message2=Voulez-vous poursuivre? -TToolBar.Button.Zoom.Tooltip=Outil de modification d'échelle -TrackChooserTView.DropDown.Tooltip=Choisir une trajectoire -TapeMeasure.Field.ArcAngle.Tooltip=Angle entre le ruban et le rapporteur d'angle -TapeMeasure.Field.TapeAngle.Tooltip=Angle entre l'axe des x positifs et le ruban -TapeMeasure.Field.Magnitude.Tooltip=Longueur du ruban en unités globales -TapeMeasure.Readout.Magnitude.Name=mesure de longueur -TapeMeasure.Readout.Magnitude.Hint=cliquer pour définir l'échelle -TapeMeasure.Readout.Angle.Name=mesure de l'angle -TapeMeasure.Readout.Angle.Hint=cliquer pour définir l'angle -TapeMeasure.Arm.Name=segment du rapporteur d'angle -TapeMeasure.Arm.Hint=glisser pour mesurer les angles, raccourcir pour refermer -TapeMeasure.End.Name=fin -TapeMeasure.End.Hint=glisser pour mesurer les distances ou calibrer l'échelle -TapeMeasure.Handle.Name=ancrage -TapeMeasure.Handle.Hint=glisser pour déplacer le ruban -Vector.Tip.Name=conseil -Vector.Tip.Hint=glisser ou introduire les coordonnées pour modifier les composantes -Vector.Handle.Name=ancrage -Vector.Handle.Hint=glisser pour déplacer le vecteur -Vector.ShortHandle.Hint=glisser pour déplacer, alt-clic pour obtenir un conseil -PointMass.Position.Name=position -PointMass.Position.Hint=glisser ou introduire les coordonnées pour modifier la position -PointMass.Velocity.Name=vitesse -PointMass.Acceleration.Name=accélération -PointMass.Vector.Hint=glisser pour déplacer -PointMass.Position.Locked.Hint=cliquer pour sélectionner--ne peut être déplacé -CoordAxes.Handle.Name=axes des x+ -CoordAxes.Handle.Hint=glisser pour changer l'orientation -CoordAxes.Origin.Name=origine -CoordAxes.Origin.Hint=glisser pour changer la position -OffsetOrigin.Position.Name=position -OffsetOrigin.Position.Hint=glisser ou introduire les coordonnées pour déplacer l'origine -Calibration.Point.Name=point -Calibration.Point.Hint=glisser ou introduire les coordonnées pour modifier les axes ou l'échelle -RGBRegion.Position.Name=position -RGBRegion.Position.Hint=glisser ou introduire les coordonnées pour modifier la position -LineProfile.End.Name=fin -LineProfile.End.Hint=glisser pour ajuster la longueur de la ligne -LineProfile.Handle.Name=ancrage -LineProfile.Handle.Hint=glisser pour déplacer la ligne -PointMass.Hint=déterminer la masse sur la barre d'outils -PointMass.Unmarked.Hint=, maj-clic pour marquer les positions -TTrack.Unselected.Hint=cliquer pour choisir et/ou déterminer les propriétés -Vector.Unmarked.Hint=maj-glisser pour dessiner les vecteurs -OffsetOrigin.Unmarked.Hint=maj-clic pour marquer le décalage du point -Calibration.Unmarked.Hint=maj-clic pour marquer le premier point -Calibration.Halfmarked.Hint=maj-clic pour marquer le second point -CenterOfMass.Empty.Hint=choisir les masses pour définir le système -VectorSum.Empty.Hint=choisir les vecteurs pour définir la somme -TapeMeasure.Hint=définir la longueur pour modifier l'échelle, définir l'angle pour modifier l'orientation de l'axe des x -CoordAxes.Hint=fixer la valeur de l'angle pour modifier l'orientation -ParticleModel.Hint=déterminer la masse sur la barre d'outils, insérer les expressions dans le Créateur de Modèle pour animer -RGBRegion.Hint=insérer le rayon pour modifier les dimensions -RGBRegion.Unmarked.Hint=maj-clic pour marquer les positions -TTrack.ImportVideo.Hint=importer une vidéo ou une image pour mesurer les niveaux RVB -TTrack.Selected.Hint=sélectionné -LineProfile.Hint=insérer l'étendue pour modifier la largeur de ligne -LineProfile.Unmarked.Hint=maj-clic pour dessiner une ligne -LineProfile.Menu.Orientation=Orientation -LineProfile.MenuItem.Horizontal=Horizontale -LineProfile.MenuItem.XAxis=Selon l'axe des X -Footprint.PositionVector=vecteur -Footprint.BoldPositionVector=vecteur épais -Tracker.Startup.Hint=explorer ici pour des conseils (ou faire cesser l'affichage des conseils dans le menu d'aide), choisir F1 à tout moment pour de l'aide -TrackerPanel.NoVideo.Hint=ouvrir ou importer une vidéo ou une image pour analyse -TrackerPanel.CalibrateVideo.Hint=identifier un objet dans la vidéo possédant une longueur connue et définisser l'échelle en vous servant du ruban -TrackerPanel.NoTracks.Hint=créer une nouvelle trajectoire pour mesurer une caractéristique intéressante de la vidéo -TrackerPanel.SetClip.Hint=définisser ou réviser les propriétés de la vidéo avec l'inspecteur de vidéo -TrackerPanel.ShowAxes.Hint=définisser la position de l'origine et l'orientation du système d'axes -VideoPlayer.Step.Hint=incrément avant (raccourci: touche PageSuivante) -VideoPlayer.Back.Hint=incrément arrière (raccourci: touche PagePrécédente) -TrackerPanel.DVVideo.Hint=appliquer un filtre de redimensionnement afin de corriger les distorsions dans les fichiers vidéos de format DV -TrackerIO.DataFileFilter.Description=fichiers Tracker -Tracker.Button.PDFHelp=Version PDF imprimable -TToolbar.Button.TapeVisible.Tooltip=Ruban avec rapporteur d'angle - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Contrôle de trajectoire -TMenuBar.MenuItem.Description=Notes -TrackPlottingPanel.RightDrag.Hint=cliquer-glisser pour les options -TMenuBar.MenuItem.DeleteSelectedPoint=Point Sélectionné -TFrame.InfoDialog.SaveChanges.Title=Enregistrer les modifications -TFrame.InfoDialog.SaveChanges.Message=Voulez-vous enregistrer les modifications? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartésien -DynamicParticle.Editor.Button.Polar=Polaire -DynamicParticle.Parameter.InitialR.Description=Rayon initial -DynamicParticle.Parameter.InitialTheta.Description=Orientation initiale -DynamicParticle.Parameter.InitialVelocityR.Description=Vitesse radiale initiale -DynamicParticle.Parameter.InitialOmega.Description=Vitesse angulaire initiale -DynamicParticle.ForceFunction.R.Description=Composante radiale de force -DynamicParticle.ForceFunction.Theta.Description=Composante tangentielle de force -DynamicParticlePolar.Name=Modèle dynamique de particule (Polaire) -DynamicTwoBody.Editor.Button.Particle1=Particule 1 -DynamicTwoBody.Editor.Button.Particle2=Particule 2 -DynamicTwoBody.Name=Modèle dynamique à deux corps -TMenuBar.Menu.DynamicParticle=Modèle dynamique d'une particule -TMenuBar.MenuItem.Cartesian=Cartésien -TMenuBar.MenuItem.Polar=Polaire - -# Additions by Doug Brown 2009-08-24 -Autotrack.Inspector.Title=Repérage Automatique -PointMass.MenuItem.Autotrack=Repérage Automatique... -Dialog.Button.Help=Aide -AutoTracker.Wizard.Button.Reset=Réinitialiser -AutoTracker.Wizard.Button.Back=Précédent -AutoTracker.Wizard.Button.Next=Suivant -AutoTracker.Wizard.Button.Accept=Accepter -AutoTracker.Wizard.Button.Search=Chercher -AutoTracker.Wizard.Button.Start=Début -AutoTracker.Wizard.Button.Pause=Pause -AutoTracker.Wizard.Button.Skip=Omettre -AutoTracker.Label.Mask=Masquer l'image -AutoTracker.Label.Target=Décalage de la cible -AutoTracker.Label.AcceptLevel=Accepter les résultats au-dessus -AutoTracker.TabbedPane.TabTitle.Mask=Masquer -AutoTracker.TabbedPane.TabTitle.Target=Cible -AutoTracker.TabbedPane.TabTitle.Settings=Accepter -AutoTracker.TabbedPane.TabTitle.Search=Chercher -AutoTracker.Info.GetStarted=Cliquer sur la caractéristique vidéo pour laquelle vous voulez lancer le repérage automatique. -AutoTracker.Info.Mask1=Le masque définit le détail qu'il faut chercher et suivre dans chaque image. Déplacer ou modifier la taille du masque en glissant son centre ou l'ancrage, respectivement. -AutoTracker.Info.Mask2=Conseil: le masque n'a pas à être très grand ou à recouvrir tout l'objet. Une caractéristique unique ou possédant un haut degré de contraste est habituellement ce qu'il faut choisir. -AutoTracker.Info.MaskLocked1=Le masque est actuellement utilisé et verrouillé. -AutoTracker.Info.MaskLocked2=Cliquer sur le bouton de Réinitialisation pour effacer tous les incréments, déverrouiller le masque et recommencer. -AutoTracker.Info.Target1=La cible est la région où seront marqués les incréments relativement au masque. Déplacer la cible en la glissant. -AutoTracker.Info.Target2=Tip: Il est possible d'ajuster la cible même après que des incréments ont été marqués. Les incréments déjà marqués se déplaceront automatiquement avec la cible. -AutoTracker.Info.TargetLocked=La cible est actuellement utilisée et liée aux incréments de position déjà marqués. La déplacer aura pour conséquence de déplacer aussi les incréments. -AutoTracker.Info.Settings1=Les incréments possédant un taux de succès supérieur au niveau de concordance optimal seront marqués automatiquemet. -AutoTracker.Info.Settings2=Conseil: réduire le niveau optimal de concordance accélère le processus de marquage mais en augmentant aussi la possibilité d'erreurs. -AutoTracker.Info.Search1=Le rectangle qui apparaît correspond à la zone dans laquelle on cherche la concordance. Déplacer ou modifier la taille du rectangle en glissant son centre ou son ancrage, respectivement. -AutoTracker.Info.Search2=Conseil: La zone de concordance n'a pas à être grande. Après avoir déterminés les deux premiers endroits de concordance, un algorithme redéfinit automatiquement la zone de recherche. -AutoTracker.Info.Frame=Image -AutoTracker.Info.Match=La concordance affichée a été marquée automatiquement à la position de la cible. -AutoTracker.Info.Possible=Un concordance possible a été trouvée. Vos options sont: -AutoTracker.Info.NoMatch=Aucune concordance n'a été trouvée dans la région affichée. Vos options sont: -AutoTracker.Info.Outside=La zone de recherche est en dehors de l'image. Vos options sont: -AutoTracker.Info.Accepted=La concordance a été acceptée par l'utilisateur. -AutoTracker.Info.MarkedByUser=L'incrément a été marqué manuellement par l'utilisateur. -AutoTracker.Info.NoVideo=Le Repérage Automatique nécessite une vidéo. Importer une vidéo pour utiliser le Repérage Automatique. -AutoTracker.Info.Height=hauteur -AutoTracker.Info.Width=largeur -AutoTracker.Info.Accept=--accepter la concordance -AutoTracker.Info.Retry=--déplacer la zone de recherche et chercher à nouveau -AutoTracker.Info.Mark=--maj-clic pour marquer les incréments manuellement -AutoTracker.Info.Skip=--passer cette image et continuer le repérage sur la prochaine -AutoTracker.Info.Reset=--effacer et recommencer avec un nouveau masque -AutoTracker.Info.MatchScore=Valeur de concordance -AutoTracker.Dialog.MaskLocked.Title=Masque verouillé -PointMass.Cursor.Autotrack.Description=Curseur du Repérage Automatique -VideoPlayer.StartFrame.Hint=glisser pour définir l'image de départ -VideoPlayer.EndFrame.Hint=glisser pour définir l'image finale -VideoPlayer.Slider.Hint=glisser pour vous déplacer à travers la vidéo -FileDropHandler.Dialog.BadFile.Message=n'a pu être chargée. -FileDropHandler.Dialog.BadFile.Title=Fichier non reconnu - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Appliquer -DynamicParticle.Dialog.Delete.Message=Supprimer cette particule la retirera du système. Supprimer malgré tout? -DynamicParticle.Dialog.Delete.Title=Système Dynamique -DynamicParticle.System.In=dans -DynamicSystem.Empty=vide -DynamicSystem.Force.Name.Internal=interne -DynamicSystem.ForceFunction.R.Description=Composante radiale de la force interne -DynamicSystem.ForceFunction.Theta.Description=Composante tangentielle de la force interne -DynamicSystem.MenuItem.Inspector=Choisir les Particules... -DynamicSystem.Name=Système Dynamique à deux corps -DynamicSystem.New.Name=système -DynamicSystem.Parameter.Of=de -DynamicSystem.Parameter.RelativeTo=relativement à -DynamicSystem.Parameter.Name.Relative=relatif -DynamicSystem.Parameter.ParticleMass.Description=Masse de -DynamicSystem.Parameter.Mass.Description=Masse totale du système -DynamicSystemInspector.Border.Title=Particule -DynamicSystemInspector.Title=Système à deux corps -DynamicSystemInspector.Button.Change=Changer Pour... -DynamicSystemInspector.ParticleName.None=(aucun) -TMenuBar.MenuItem.Clone=Clone -TMenuBar.MenuItem.TwoBody=Système à deux corps -TrackerPanel.DataBuilder.Dropdown.Tooltip=Trajectoire actuellement sélectionnée -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Synchroniser les axes verticaux -TrackControl.Button.Trace.ToolTip=Afficher ou dissimuler les trajectoires -TToolBar.Button.Open.Tooltip=Ouvrir une vidéo ou un fichier Tracker dans un nouvel onglet -TToolBar.Button.Save.Tooltip=Enregistrer l'onglet sélectionné dans un fichier -TToolBar.Button.SelectTrack=Sélectionner -TToolBar.Button.SelectTrack.Tooltip=Sélectionner une trajectoire existante -TTrack.MenuItem.ClearSteps=Effacer les incréments -PointMass.MenuItem.Position=Position -TMenuBar.MenuItem.Empty=(Vide) -TTrackBar.Button.Memory=mémoire utilisée: -TTrackBar.Button.Memory.Tooltip=Surveiller et gérer la mémoire -TTrackBar.Memory.PopupItem.Launch=Démarrer Tracker avec la mémoire -TButton.Track.ToolTip=Déterminer les propriétés de -Tracker.Dialog.OutOfMemory.Message1=Tracker n'a plus suffisamment de mémoire. -Tracker.Dialog.OutOfMemory.Message2=Cliquer sur le bouton de mémoire pour les options. -Tracker.Dialog.OutOfMemory.Title=Manque de mémoire - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Chercher vers l'avant -AutoTracker.Label.Original=Initiale -AutoTracker.Label.NoMask=aucun -AutoTracker.Label.Rate=Taux d'Évolution: -AutoTracker.Info.Mask3=Conseil: le gabarit n'a pas à être grand ou à inclure tout l'objet. Une caractéristique unique ou possédant un haut degré de contraste est habituellement ce qu'il faut choisir. -AutoTracker.Wizard.Checkbox.XAxis=L'axe des x seulement -AutoTracker.Info.SearchOnAxis1=L'axe des x à l'intérieur du rectangle sera utilisé pour la concordance. Déplacer ou redimensionner la zone de recherche en glissant son centre ou l'ancrage, respectivement. -AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: -AutoTracker.Info.NoMatchOnAxis=Aucune concordance n'a été trouvée sur l'axe des x dans la zone de recherche. Vos options sont: -AutoTracker.Info.RetryOnAxis=--déplacer la zone de recherche ou l'axe des x et recommencer -AutoTracker.Wizard.Button.Delete=Effacer ce point -AutoTracker.Wizard.Button.DeleteMore=Effacer ce point et les suivants -Button.Define.Tooltip=Définir des fonctions sur les variables des colonnes existantes -Calibration.Label.Point=point -CalibrationStick.Hint=déterminer la longueur ou déplacer les extrémités pour fixer l'échelle, changer l'angle pour modifier l'orientation de l'axe -CalibrationStick.End.Hint=glisser pour changer l'échelle -CalibrationStick.New.Name=bâton de calibration -CalibrationTapeMeasure.New.Name=ruban de calibration -CalibrationTapeMeasure.Readout.Magnitude.Hint=cliquer pour insérer une longueur connue en unités globales -CalibrationTapeMeasure.Hint=fixer la longueur pour modifier l'échelle, fixer l'angle pour modifier l'orientation de l'axe -DynamicSystem.Data.Description.0=distance relative entre les particules -DynamicSystem.Data.Description.1=orientation relative -DynamicSystem.Data.Description.2=vitesse radiale relative -DynamicSystem.Data.Description.3=vitesse angulaire relative -ExportDataDialog.Subtitle.Table=Table de données -ExportDataDialog.Subtitle.Content=Cellules -ExportDataDialog.Subtitle.Format=Format de nombre -ExportDataDialog.Subtitle.Delimiter=Délimiteur -ExportDataDialog.Title=Exporter les données -ExportDataDialog.Delimiter.Add=Ajouter... -ExportDataDialog.Delimiter.Remove=Enlever... -ExportDataDialog.Content.AllCells=Toutes les cellules -ExportDataDialog.Content.SelectedCells=Cellules sélectionnées -ExportDataDialog.MenuItem.RemoveDelimiter=Enlever le délimiteur adapté -ExportDataDialog.Chooser.SaveData.Title=Enregistrer les données sous -ExportVideoDialog.Button.SaveAs=Enregistrer sous... -ExportVideoDialog.Button.FullSize=Pleine grandeur -ExportVideoDialog.Button.DrawnSize=Tel que dessiné -ExportVideoDialog.Content.VideoOnly=Vidéo seulement -ExportVideoDialog.Content.VideoAndGraphics=Vidéo et graphes -ExportVideoDialog.Content.GraphicsOnly=Graphes seulement -ExportVideoDialog.Title=Exporter la Vidéo -ExportVideoDialog.Label.ClipSettings=Propriétés de la vidéo -ExportVideoDialog.Subtitle.Size=Dimension -ExportVideoDialog.Subtitle.Content=Contenu -ExportVideoDialog.Subtitle.View=Vue -ExportVideoDialog.Subtitle.Format=Format -ExportVideoDialog.Complete.Message1=La vidéo a été enregistrée sous -ExportVideoDialog.Complete.Message2=Voulez-vous l'ouvrir dans Tracker maintenant? -ExportVideoDialog.Complete.Title=Exportation complétée -ExportVideoDialog.VideoSize=dimension de la vidéo -ExportVideoDialog.MatSize=dimension du cadre -ExportVideo.Dialog.HiddenPlots.Message=Les graphes doivent être complètement visibles pour être exportables. -ExportVideo.Dialog.HiddenPlots.Title=Vue incomplète -Footprint.DoubleTarget=croix double -Footprint.BoldDoubleTarget=croix double épaisse -OffsetOrigin.MenuItem.Fixed=Coordonnées globales fixes -ParticleModel.Dialog.Offscreen.Message1=Certains des incréments du modèle sont absents parce qu'ils sont hors du champ de l'écran. -ParticleModel.Dialog.Offscreen.Message2=Pour fixer ce problème, changer de modèle ou l'échelle de la vidéo. -ParticleModel.Dialog.Offscreen.Title=Hors limite -PrefsDialog.Tab.Configuration.Title=Configuration -PrefsDialog.Memory.BorderTitle=Taille de la mémoire -PrefsDialog.Tab.General.Title=Autre -PrefsDialog.RecentFiles.BorderTitle=Ouvrir le menu Récent -PrefsDialog.Label.RecentSize=Décompte de fichier -PrefsDialog.Hints.BorderTitle=Conseils -PrefsDialog.Button.Relaunch=Relancer maintenant -PrefsDialog.Button.ClearRecent=Effacer -PrefsDialog.Checkbox.DefaultSize=Utiliser la valeur par défaut -PrefsDialog.Checkbox.HintsOn=Par défaut, montrer les conseils -PrefsDialog.Tab.Video.Title=Vidéo -PrefsDialog.VideoPref.BorderTitle=Décrypteur Vidéo -PrefsDialog.Button.Xuggle=Xuggle (recommandé) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Le contrôle de la mémoire est impossible lorsque le démarrage se fait par le Web. -PrefsDialog.Dialog.WebStart.Title=Mode de démarrage Web -PrefsDialog.LookFeel.BorderTitle=Apparence -PrefsDialog.Language.BorderTitle=Langage -PrefsDialog.Upgrades.BorderTitle=Vérifier l'existence de mises à jour -PrefsDialog.Tab.Runtime.Title=Durée d'exécution -PrefsDialog.Tab.Display.Title=Affichage -PrefsDialog.Language.Default=par défaut -PrefsDialog.Upgrades.Always=Toutes les fois -PrefsDialog.Upgrades.Weekly=À chaque semaine -PrefsDialog.Upgrades.Monthly=À chaque mois -PrefsDialog.Upgrades.Never=Jamais -PrefsDialog.Button.CheckForUpgrade=Vérifier maintenant -PrefsDialog.Xuggle.Speed.BorderTitle=Lecture de Vidéo -PrefsDialog.Xuggle.Slow=Continue (peut être lente) -PrefsDialog.Xuggle.Fast=Rapide (peut être saccadée) -PrefsDialog.CalibrationTool.BorderTitle=Outil de Calibration par défaut -Protractor.Name=Rapporteur d'angle -Protractor.New.Name=rapporteur d'angle -Protractor.Hint=glisser les bras pour mesurer les angles -Protractor.Label.Angle=angle -Protractor.Field.Angle.Tooltip=angle entre les bras du rapporteur -Protractor.Vertex.Name=sommet -Protractor.Vertex.Hint=glisser pour déplacer le sommet -Protractor.End.Name=pointe du bras -Protractor.End.Hint=glisser pour tourner le bras -Protractor.Handle.Name=ancrage -Protractor.Handle.Hint=glisser pour déplacer le rapporteur -Protractor.Rotator.Name=rotateur -Protractor.Rotator.Hint=glisser pour tourner le rapporteur -Protractor.Readout.Name=lecture -Protractor.Readout.Hint=angle entre les bras du rapporteur -ProtractorFootprint.Circle3=petit cercle -ProtractorFootprint.Circle5=grand cercle -ProtractorFootprint.Circle3Bold=petit cercle épais -ProtractorFootprint.Circle5Bold=grand cercle épais -Stick.Name=Bâton de mesure -Stick.New.Name=bâton de mesure -TableTrackView.MenuItem.Unformatted=Pleine précision -TableTrackView.MenuItem.Formatted=Tel que mis en forme -TableTrackView.Menu.SetDelimiter=Fixer le délimiteur -TableTrackView.MenuItem.AddDelimiter=Ajouter... -TableTrackView.MenuItem.RemoveDelimiter=Enlever... -TableTrackView.Dialog.CustomDelimiter.Message=Insérer un chaîne de caractères servant de délimiteur: -TableTrackView.Dialog.CustomDelimiter.Title=Ajouter un délimiteur -TableTrackView.Header.Tooltip=cliquer pour classer ou double-clic pour sélectionner une colonne -TableTrackView.MenuItem.CopySelectedData=Copier les données sélectionnées -TableTrackView.Dialog.RemoveDelimiter.Message=Choisir le délimiteur à supprimer: -TableTrackView.Dialog.RemoveDelimiter.Title=Supprimer le délimiteur -TableTrackView.Radians.Tooltip=en radians -TableTrackView.Degrees.Tooltip=en degrés -TableTrackView.RadiansPerSecond.Tooltip=en rad/s -TableTrackView.DegreesPerSecond.Tooltip=en degrés/s -TableTrackView.RadiansPerSecondSquared.Tooltip=en rad/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=en degrés/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Supprimer la fonction de données -TActions.Action.SaveFrame=Enregistrer le contenu de l'onglet comme... -TActions.AboutVideo=Propriétés... -TActions.Dialog.AboutVideo.Title=Propriétés vidéo -TActions.Dialog.AboutVideo.Type=Type -TActions.Dialog.AboutVideo.Size=Dimensions -TActions.Dialog.AboutVideo.Length=Longueur -TActions.Dialog.AboutVideo.Frames=images -TActions.Dialog.AboutVideo.Seconds=secondes -TActions.Dialog.AboutVideo.FrameRate=Vitesse de lecture -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Chemin -TActions.Action.ImportTRK=Tracker Fichier... -TActions.Action.ProtractorVisible=Visible -TapeMeasure.MenuItem.FixedLength=Longueur fixe -TextTView.Label.NoTab=Afficher le texte et les pages HTML ici. -TextTView.NewTab.Text1=Double-clic pour modifier le texte ou le titre. Clic-droit pour plus d'options. -TextTView.NewTab.Text2=Pour afficher une page HTML, insérer l'adresse url ou faire clic-droit pour ouvrir un fichier. -TextTView.NewTab.Title=Sans nom -TextTView.Dialog.TabTitle.Title=Fixer le titre -TextTView.MenuItem.OpenHTML=Ouvrir HTML... -TextTView.MenuItem.SetTitle=Fixer le titre... -TextTView.Button.NewTab=Nouveau -TextTView.TextEdit.Description=Texte -TFrame.Dialog.FileNotFound.Message=Le fichier n'a pas été trouvé: -TFrame.Dialog.FileNotFound.Title=Fichier non trouvé -TFrame.View.Text=Vue texte/HTML -TFrame.View.Main=Vue principale -TMenuBar.Menu.OpenRecent=Ouvrir récent -TMenuBar.Menu.Import=Importer -TMenuBar.Menu.Export=Exporter -TMenuBar.MenuItem.Video=Vidéo... -TMenuBar.MenuItem.Data=Fichier de données... -TMenuBar.Menu.CopyObject=Copier l'objet -TMenuBar.MenuItem.Coords=Système de coordonnées -TMenuBar.MenuItem.VideoClip=Séquence vidéo -TMenuBar.Menu.MeasuringTools=Outils de mesure -TMenuBar.Menu.AngleUnits=Unités des angles -TMenuBar.MenuItem.Degrees=Degrés -TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle n'a pas été trouvé -Tracker.Dialog.NoXuggle.Message1=Xuggle (un moteur d'analyse de vidéos pour toutes plateformes) n'est pas installé. -Tracker.Dialog.NoXuggle.Message2=Télécharger Xuggle à partir de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=À propos de Xuggle... -Tracker.Dialog.AboutXuggle.Title=À propos de Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Version de Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Emplacement de Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Chemin d'accès Xuggle -Tracker.Dialog.NoVideoEngine.Message1=Aucun analyseur vidéo n'a été trouvé! Sans cet analyseur, Tracker ne peut -Tracker.Dialog.NoVideoEngine.Message2=qu'ouvrir des images, des séquences d'images et des GIF animés. -Tracker.Dialog.NoVideoEngine.Message3=Pour installer Xuggle, qui est l'analyseur vidéo préféré de Tracker sur toutes les plateformes, -Tracker.Dialog.NoVideoEngine.Message4=télécharger la plus récente version du fichier d'installation de Tracker à partir de -Tracker.Dialog.NoVideoEngine.Title=Aucun analyseur vidéo -Tracker.Dialog.NoXuggle.Message1=Xuggle, l'analyseur vidéo préféré de Tracker n'est pas encore installé. -Tracker.Dialog.NoXuggle.Message2=Pour installer Xuggle, télécharger la plus récente version du fichier d'installation de Tracker à partir de -Tracker.Dialog.NoXuggle.Title=Xuggle manquant -Tracker.About.DefaultLocale=Locale par défaut -Tracker.About.CurrentLanguage=Langue -Tracker.Dialog.InsufficientMemory.Title=Mémoire insuffisante -Tracker.Dialog.InsufficientMemory.Message=La mémoire nécessaire est trop grande. -TrackerIO.Dialog.TabMustBeSaved.Message1=Onglet -TrackerIO.Dialog.TabMustBeSaved.Message2=doit être enregistré comme un fichier Tracker pour être inclus dans un ensemble d'onglets. -TrackerIO.Dialog.TabMustBeSaved.Message3=Désirez-vous l'enregistrer? -TrackerIO.Dialog.TabMustBeSaved.Title=Contenu d'onglet non enregistré -TrackerIO.Dialog.NoTabs.Message=Il n'y a aucun onglet à enregistrer! -TrackerIO.Dialog.NoTabs.Title=Ensemble d'onglets vide -TrackerIO.Dialog.SaveTabset.Title=Enregistrer l'ensemble d'onglets -TrackerIO.Dialog.SaveTab.Title=Enregistrer le contenu de l'onglet -TrackerIO.Delimiter.Tab=Onglet -TrackerIO.Delimiter.Space=Espace -TrackerIO.Delimiter.Comma=Virgule -TrackerIO.Delimiter.Semicolon=Point-virgule -TrackerIO.VideoAndDataFileFilter.Description=Fichiers vidéo et Tracker -TrackerPanel.Dialog.Version.Message1=Vous êtes à ouvrir un fichier créé par Tracker -TrackerPanel.Dialog.Version.Message2=qui pourrait faire référence à des fonctionnalités -TrackerPanel.Dialog.Version.Message3=qui n'existent pas dans la version que vous utiliser -TrackerPanel.Dialog.Version.Message4=La dernière version de Tracker est disponible au -TrackerPanel.Dialog.Version.Title=Incompatibilité de version -TrackerPanel.Label.ModelStart=Départ -TrackerPanel.Label.ModelEnd=Fin -TrackerPanel.Spinner.ModelStart.Tooltip=Fixer l'image de départ à partir de ce modèle -TrackerPanel.Spinner.ModelEnd.Tooltip=Fixer l'image finale à partir de ce modèle -TToolbar.Button.ProtractorVisible.Tooltip=Afficher ou masquer le rapporteur -TToolbar.Button.AxesVisible.Tooltip=Afficher ou masquer le système d'axes -TToolBar.Button.TrackControl.Tooltip=Afficher ou masquer les contrôles de trajectoire -TTrack.Dialog.StepSizeWarning.Message1=Attention: certaines trajectoires ont été analysées en sautant des images (décompte supérieur à 1). -TTrack.Dialog.StepSizeWarning.Message2=Modifier le décompte, en lui donnant une valeur supérieure à 1, entraîne la présence de lacunes dans l'ensemble des données. -TTrack.Dialog.StepSizeWarning.Message3=Les vitesses et les accélérations ne peuvent être déterminées autour des lacunes de données, tant que toutes les images n'ont pas été analysées. -TTrack.Dialog.StepSizeWarning.Title=Attention -TTrack.Dialog.SkippedStepWarning.Message1=Attention: omettre des images lors du marquage des positions entraîne la présence de lacunes dans l'ensemble des données. -TTrack.Dialog.SkippedStepWarning.Title=Attention -TTrack.Dialog.SkippedStepWarning.Checkbox=Ne plus afficher ceci -TTrack.Locked.Hint=verrouillé -TTrack.AngleField.Radians.Tooltip=angle en radians -TTrack.AngleField.Degrees.Tooltip=angle en degrés -TTrack.AngleField.Popup.Radians=Basculer en Radians -TTrack.AngleField.Popup.Degrees=Basculer en Degrés -TTrackBar.Memory.Menu.SetSize=Déterminer la taille de la mémoire disponible... -TTrackBar.Button.Version=Maintenant disponible: version -TTrackBar.Popup.MenuItem.Upgrade=Mettre à niveau maintenant... -TTrackBar.Popup.MenuItem.Ignore=Ignorer -XuggleVideo.MenuItem.SmoothPlay=Lecture graduelle (peut être lente) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Ruban de Calibration -CircleFootprint.Circle=cercle -CircleFootprint.FilledCircle=cercle plein -CircleFootprint.Dialog.Title=empreinte du cercle -CircleFootprint.Dialog.Label.Radius=Rayon -CircleFootprint.Dialog.Checkbox.Bold=Gras -CircleFootprint.Dialog.Checkbox.CenterSpot=Point central -LineProfile.Hint.Marking=glisser la souris pour marquer le profil de ligne -PageTView.Button.Page=Page -PageTView.MenuItem.ClosePage=Fermer la page -PointMass.Hint.Marking=cliquer pour marquer, la touche Entrée permet de cloner l'incrément précédent -PrefsDialog.Dialog.NewVersion.Title=Mises à jour -PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=est maintenant disponible au -PrefsDialog.Dialog.NewVersion.None.Message=Il n'existe pas de version plus récente en ce moment. -RGBRegion.Hint.Marking=cliquer pour marquer le centre de la zone -TMenuBar.MenuItem.Restore=Restaurer -TrackControl.StretchVectors.None=Aucun étirement -TViewChooser.Maximize.Tooltip=Agrandir cette vue au maximum -TViewChooser.Restore.Tooltip=Restaurer les vues -Vector.Hint.Marking=cliquer pour marquer, la touche Entrée permet de cloner l'incrément précédent -WorldTView.Button.World=Globale - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Avertissements -PrefsDialog.Checkbox.WarnIfNoEngine=Aucun analyseur vidéo -PrefsDialog.Checkbox.WarnIfXuggleError=Erreurs non fatales de Xuggle -PropertiesDialog.Title=Propriétés -PropertiesDialog.Label.Author=Auteur -PropertiesDialog.Label.Contact=Contact -TActions.Action.Properties=Propriétés... -TActions.Action.OpenBrowser=Ouvrir le fureteur de librairie... -TFrame.Progress.Xuggle=Xuggle est en train de charger les images -TFrame.Progress.ClickToCancel=(cliquer pour annuler) -TFrame.Dialog.StalledVideo.Title=Il y a eu une erreur en chargeant la vidéo -TFrame.Dialog.StalledVideo.Message0=La vidéo s'est bloquée en chargeant. Ceci est peut-être temporaire. -TFrame.Dialog.StalledVideo.Message1=Vous pouvez arrêter le chargement ou continuer d'attendre. -TFrame.Dialog.StalledVideo.Message2=Les autres options pour ouvrir cette vidéo sont: -TFrame.Dialog.StalledVideo.Message3=1. Utiliser un convertisseur vidéo pour la traduire dans un autre format. -TFrame.Dialog.StalledVideo.Message4=2. Choisir QuickTime dans le sélecteur de fichiers ou dans les préférences. -TFrame.Dialog.StalledVideo.MessageMac=2. Démarrer Tracker avec Java VM 32-bit et ouvrir avec QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Arrêter -TFrame.Dialog.StalledVideo.Button.Wait=Attendre -Tracker.Dialog.NoVideoEngine.Checkbox=Ne plus afficher ce message -TrackerIO.ZipFileFilter.Description=Fichiers ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle a recontré cette erreur en tentant d'ouvrir cette vidéo: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Toutes les erreurs ne sont pas fatales. Pour obtenir les messages d'erreur complets, choisissez Aide|Historique des messages. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Si Xuggle ne peut y parvenir, vous pourriez peut-être ouvrir la vidéo avec QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: Sur Mac OSX, Tracker fonctionne avec Java VM 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Erreur Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Pour plus de détails, lancer les messages d'alerte Xuggle dans les préférences (Édition|Préférences). -TToolBar.Button.OpenBrowser.Tooltip=Ouvrir le fureteur de la librairie digitale OSP - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=Fichier non trouvé -TFrame.Dialog.NoTRKInComPADRE.Message=Aucun fichier Tracker trouvé pour le noeud - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Particule Cinématique -DynamicParticle.Builder.Title=Particule Dynamique (Cartésien) -DynamicParticlePolar.Builder.Title=Particule Dynamique (Polaire) -DynamicSystem.Builder.Title=Système Dynamique (Interne) -PropertiesDialog.Button.CopyFilePath=Copier le chemin d'accès du fichier -PropertiesDialog.Button.CopyVideoPath=Copier le chemin d'accès de la vidéo -PropertiesDialog.Tab.TrackerFile=Fichier Tracker -PropertiesDialog.Tab.Metadata=Métadonnées -PropertiesDialog.Header.Property=Propriétés -PropertiesDialog.Header.Value=Valeur -TActions.Action.OpenURL=Ouvrir URL... -TActions.Dialog.OpenURL.Title=Ouvrir URL -TActions.Dialog.OpenURL.Message=Insérer le URL d'une vidéo disponible sur le web, d'un fichier Tracker ou d'un fichier Tracker compressé -TActions.Dialog.AboutVideo.Name=Nom - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Fichiers Web en cache -PrefsDialog.Button.ClearCache=Effacer - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, maj-clic pour marquer à nouveau la zone mise en évidence -PointMass.Remarking.Hint=cliquer pour marquer à nouveau -PointMass.PositionSelected.Hint=glisser ou insérer la position dans la barre d'outils -PointMass.VectorSelected.Hint=glisser pour déplacer -Vector.Remark.Hint=maj-clic pour marquer à nouveau -Vector.TipSelected.Hint=glisser ou insérer la position dans la barre d'outils -Vector.HandleSelected.Hint=glisser pour déplacer -Vector.Remarking.Hint=cliquer pour marquer à nouveau -AutoTracker.Label.Search=Chercher -AutoTracker.Label.Target=Cible -AutoTracker.Label.Frame=Image -AutoTracker.Label.Point=Point -AutoTracker.Label.Template=Gabarit -AutoTracker.Label.Track=Trajectoire -AutoTracker.Label.Match=Concordance -AutoTracker.Label.NoTemplate=Pas de gabarit -AutoTracker.Label.EvolutionRate=Taux d'évolution -AutoTracker.Label.Automark=Repérage automatique -AutoTracker.Info.Instructions=Cliquer sur le bouton de recherche pour obtenir la concordance dans la zone affichée. -AutoTracker.Info.KeyFrame.Instructions1=Cette image clé définit le gabarit et la cible. Cliquer sur le bouton de recherche pour obtenir la concordance. -AutoTracker.Info.KeyFrame.Instructions2=On peut déplacer en glissant, la cible, le gabarit ou la zone de recherche, pour en changer la position ou les dimensions. -AutoTracker.Info.MouseOver.Instructions=Glisser la souris au-dessus des contrôles pour découvrir les propriétés et les ajustements. -AutoTracker.Info.Mask1=Le gabarit correspond à ce que l'on cherche à faire concorder. Le processus débute avec une image-clé qui évolue pour s'adapter aux changements de forme et de couleur. -AutoTracker.Info.Mask2=Le niveau de repérage automatique est la valeur minimale de concordance nécessaire au marquage automatique. -AutoTracker.Info.Mask.Instructions=Déplacer ou modifier la taille du gabarit en glissant les bords ou les ancrages de coin (image-clé seulement). Ajuster le taux d'évolution et le niveau de repérage automatique à partir des menus déroulants. -AutoTracker.Info.Mask.Tip=Un faible niveau de repérage auotmatique entraîne de fausses concordances. Essayer plutôt d'augmenter le taux d'évolution. -AutoTracker.Info.Search=La zone de recherche est analysée afin de trouver la meilleure concordance. -AutoTracker.Info.SearchOnAxis=On analyse l'axe des x dans la zone de recherche pour la meilleure concordance. -AutoTracker.Info.Search.Instructions=Déplacer ou modifier la taille du gabarit en glissant les bords ou les ancrages de coin. Déterminer l'axe des x et les conditions d'analyse en cliquant les cases. -AutoTracker.Info.Search.Tip=Dans la plupart des cas, la zone de recherche n'a pas à être grande. Les options de recherche automatique déplacent cette zone là où une meilleure concordance est prédite. -AutoTracker.Info.Target=La cible correspond à l'endroit où le point de cible est marqué. -AutoTracker.Info.Target.Instructions=Déplacer la cible en la faisant glisser (image-clé seulement). Choisir la trajectoire à partir des listes déroulantes. -AutoTracker.Info.Title.Settings=Ajustements -AutoTracker.Info.Title.Tip=Conseil -AutoTracker.Info.SelectTrack=Choisir ou créer la trajectoire ou le point pour lequel on veut le repérage automatique. -AutoTracker.Info.OutsideXAxis=L'axed des x ne traverse pas la zone de recherche. Vos options sont: -AutoTracker.Info.NewKeyFrame=--revener en arrière et changer le taux d'évolution ou maj-ctrl-clic pour définir une nouvelle image-clé -AutoTracker.Info.Replace=--accepter la concordance et remplacer le point existant -AutoTracker.Info.Keep=--conserver le point existant -AutoTracker.Info.PossibleReplace=Une possible concordance a été trouvée pour remplacer le point existant. Vos options sont: -AutoTracker.Wizard.Button.Accept=Accepter -AutoTracker.Wizard.Button.Stop=Arrêter -AutoTracker.Wizard.Button.Skip=Sauter -AutoTracker.Wizard.Button.Replace=Remplacer -AutoTracker.Wizard.Button.Keep=Conserver -AutoTracker.Wizard.Button.Search=Chercher -AutoTracker.Wizard.Button.SearchThis=Chercher ceci -AutoTracker.Wizard.Button.SearchNext=Chercher suivant -AutoTracker.Wizard.Button.Delete=Effacer -AutoTracker.Wizard.Button.ShowKeyFrame=Afficher l'image-clé -AutoTracker.Wizard.Button.DeleteKeyFrame=Effacer l'image-clé -AutoTracker.Wizard.Checkbox.LookAhead=Regarder plus avant -AutoTracker.Wizard.Checkbox.XAxis=axe des x seulement -AutoTracker.Wizard.Menuitem.DeleteThis=Ce point -AutoTracker.Wizard.Menuitem.DeleteLater=Les points qui viennent après -AutoTracker.Wizard.Menuitem.DeleteAll=Tous les points -TToolBar.Button.AutoTracker.Tooltip=Afficher ou masquer l'outil de repérage automatique -MainTView.Popup.MenuItem.ZoomIn=Agrandir l'échelle -MainTView.Popup.MenuItem.ZoomOut=Diminuer l'échelle -MainTView.Popup.MenuItem.ZoomToFit=Ajuster l'échelle -TrackerIO.Dialog.DurationVaries.Title=Durée variable d'image -TrackerIO.Dialog.DurationVaries.Message1=Cette vidéo inclut des images dont la durée varie, par rapport à la valeur moyenne, par plus de -TrackerIO.Dialog.DurationVaries.Message2=Pour des valeurs plus précises de vitesse et d'accélération, vous devriez exclure ces images des -TrackerIO.Dialog.DurationVaries.Message3=calculs en modifiant l'image de départ et l'image finale de la vidéo. -TrackerIO.Dialog.DurationVaries.Message4=Images à exclure: -TrackerIO.Dialog.DurationVaries.Message5=Durée moyenne et taux de lecture si exclus: -TFrame.Dialog.LibraryError.Title=Erreur -TFrame.Dialog.LibraryError.Message=Aucune ressource n'a pu être chargée pour le noeud - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=maj-clic pour marquer -PrefsDialog.Label.Path=Chemin -PrefsDialog.Checkbox.ClearCacheOnExit=Effacer en quittant -PrefsDialog.FileChooser.Title.Cache=Déterminer le cache -PrefsDialog.FileFilter.Directories=Dossiers -Tracker.Action.AboutThreads=À propos des chemins d'accès... -PrefsDialog.JRE.BorderTitle=Machine Virtuelle Java (JVM) -PrefsDialog.FileChooser.Title.JRE=Déterminer Java VM -PrefsDialog.FileFilter.JRE=Dossiers et Java VMs -PrefsDialog.Version.BorderTitle=Version de Tracker -PrefsDialog.Version.Default=par défaut -PrefsDialog.Tab.ClearCacheOnExit=Effacer en quittant -PrefsDialog.Run.BorderTitle=Logiciels exécutés au démarrage -PrefsDialog.FileChooser.Title.Run=Choisir un fichier exécutable -PrefsDialog.Button.Save=Enregistrer -Tracker.Readme=Tracker Lisez-moi (README) -Tracker.Readme.NotFound= Fichier Lisez-moi (README) non trouvé -Popup.MenuItem.Algorithm=Algorithmes... -AlgorithmDialog.Button.FiniteDifference=Différence finie -AlgorithmDialog.Button.BounceDetect=Détection du rebond -AlgorithmDialog.TitledBorder.Choose=Choisir l'algorithme nécessaire au calcul des vitesses et des accélérations: -AlgorithmDialog.Title=Algorithmes -AlgorithmDialog.FiniteDifference.Message1=Ceci est l'algorithme par défaut. -AlgorithmDialog.FiniteDifference.Message2=Vitesse: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Accélération: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Cette algorithme améliore le calcul des vitesses et des accélérations tout en détectant les variations soudaines de vitesse. -AlgorithmDialog.BounceDetect.Message2=Attention: peut produire des artéfacts. Pour plus d'informations, voir: -AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title==XML invalide -Tracker.Dialog.Invalid.Message=Le fichier n'a pu être lu. -TrackPlottingPanel.Popup.Menu.CompareWith=Comparer avec -TrackerPanel.DataBuilder.TrackType.Unknown=inconnu -TrackerPanel.DataBuilder.Button.Load.Tooltip=Charger les fonctions de données à partir du fichier XML -TrackerPanel.DataBuilder.Button.Save.Tooltip=Enregistrer les fonctions de données dans un fichier XML -TrackerPanel.DataBuilder.Load.Title=Charger les fonctions de données -TrackerPanel.DataBuilder.Load.Message=Choisir les fonctions à charger: -TrackerPanel.DataBuilder.Save.Title=Enregistrer les fonctions de données -TrackerPanel.DataBuilder.Save.Message=Sélectionner les fonctions à enregistrer: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Charger dans tout -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Charger seulement dans -TrackerPanel.DataBuilder.Dialog.Load.Title=Sélection des trajectoires -TrackerPanel.DataBuilder.Dialog.Load.Message=Désirez-vous charger les fonctions dans toutes les trajectoires de type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Type incorrect de trajectoire -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Ce fichier définit des fonctions de données pour les trajectoires de type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Ne peut être chargé dans le type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Type incorrect -TrackerPanel.DataBuilder.Dialog.WrongType.Message=Ce fichier ne contient aucune définition de fonctions de données. -TToolbar.Button.Refresh=Rafraîchir les données et les vues - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=Le nouvel onglet a été enregistré sous -ExportTRKDialog.Complete.Message2=Désirez-vous l'ouvrir dans Tracker maintenant? -ExportTRKDialog.Complete.Title=Exportation complétée -ExportTRKDialog.Title=Exporter l'onglet sélectionné -ExportTRKDialog.Message1=Ceci (1) exporte la séquence vidéo, (2) convertit les données de l'onglet pour concorder avec la vidéo exportée, et (3) sauvegarde l'onglet converti comme un nouveau fichier Tracker. -ExportTRKDialog.Message2=Le fichier Tracker et le fichier vidéo sont enregistrés dans le même dossier avec le même nom, mais avec différentes extensions. -TMenuBar.MenuItem.TabClip=Onglet sélectionné -TrackerIO.Dialog.DurationVaries.Button.SetClip=Déterminer la séquence recommandée -TrackerIO.Dialog.DurationVaries.Start=Début -TrackerIO.Dialog.DurationVaries.End=fin -TrackerIO.Dialog.DurationVaries.Recommended=Séquence recommandée -TMenuBar.Menu.CalibrationTools=Outils de calibration - -# Additions by Doug Brown 2012-05-07 -Protractor.Data.Description.0=temps -Protractor.Data.Description.1=angle du rapporteur -Protractor.Data.Description.2=longueur du bras 1 -Protractor.Data.Description.3=longueur du bras 2 -Protractor.Data.Description.4=numéro de l'incrément -Protractor.Data.Description.5=numéro de l'image -TapeMeasure.Data.Description.0=temps -TapeMeasure.Data.Description.1=longueur -TapeMeasure.Data.Description.2=angle mesuré à partir de l'axe des x positifs -TapeMeasure.Data.Description.3=numéro de l'incrément -TapeMeasure.Data.Description.4=numéro de l'image -AttachmentInspector.Title=Lier les fins -AttachmentInspector.Label.End=fin -AttachmentInspector.Label.Vertex=Sommet -AttachmentInspector.Header.PointName=Nom -AttachmentInspector.Header.AttachedTo=Lier à -MeasuringTool.MenuItem.Attach=Lier les fins... -PerspectiveTrack.Corner=coin -ExportTRKDialog.Label.VideoFormat=Format de video -PrefsDialog.LogLevel.BorderTitle=Niveau de suivi du message de démarrage - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=non cherché -AutoTracker.Info.KeyFrame=Image-clé -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Cette image-clé -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Cette concordance -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Les concordances ultérieures -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Repérage automatique -Dialog.Button.Add=Ajouter -Dialog.Button.Remove=Enlever -PrefsDialog.Button.ClearHost=Libérer l'hôte -PrefsDialog.Button.ClearHost.Tooltip=supprimer tous les fichiers associés au site web hôte de la mémoire cache "OSP" -PrefsDialog.Button.ClearCache.Tooltip=supprimer tous les fichiers du cache "OSP" -TActions.Action.SaveZip=Exporter la ressource ZIP -ThumbnailDialog.Title=Exporter l'image miniature -ThumbnailDialog.Settings.Title=Options de la miniature -ThumbnailDialog.Label.CurrentImage=Image sélectionnée -ThumbnailDialog.Label.FrameNumber=cadre -ThumbnailDialog.Label.StepNumber=incrément -ThumbnailDialog.View.VideoOnly=Vidéo seulement -ThumbnailDialog.View.MainView=Vue principale -ThumbnailDialog.View.WholeFrame=Cadre entier -ThumbnailDialog.Format.PNG=Image PNG -ThumbnailDialog.Format.JPG=Image JPEG -ThumbnailDialog.Chooser.SaveThumbnail.Title=Enregistrer la miniature -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Image miniature -TToolBar.Button.SaveZip.Tooltip=Exporter une ressource ZIP pour le fureteur de la bibliothèque digitale OSP (OSP Digital Library Browser) -TTrack.MenuItem.DeletePoint=Supprimer l'incrément sélectionné -ZipResourceDialog.Title=Exporter la ressource ZIP -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Nom -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Mots-clés -ZipResourceDialog.Label.Link=Lien externe -ZipResourceDialog.Label.HTML=Source HTML -ZipResourceDialog.Complete.Message1=La ressource ZIP a été enregistrée sous -ZipResourceDialog.Complete.Message2=Désirez-vous ouvrir la ressource ZIP dans Tracker maintenant? -ZipResourceDialog.Complete.Title=Réussi -ZipResourceDialog.Border.Title.Documentation=Documentation HTML -ZipResourceDialog.Border.Title.Video=Vidéo -ZipResourceDialog.Border.Title.Thumbnail=Miniature -ZipResourceDialog.FileChooser.SaveZip.Title=Exporter la ressource ZIP -ZipResourceDialog.FileChooser.AddFile.Title=Ajouter le fichier à la ressource ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title=Ouvrir le fichier HTML -ZipResourceDialog.Button.AddFiles=Ajouter les fichiers -ZipResourceDialog.Button.ThumbnailSettings=Options de la miniature -ZipResourceDialog.Checkbox.TrimVideo=Réduire au clip -ZipResourceDialog.AddHTMLInfo.Title=Ajouter l'information HTML au fichier -ZipResourceDialog.AddHTMLInfo.Message1=Désirez-vous ajouter l'information HTML au fichier -ZipResourceDialog.AddHTMLInfo.Message2=à la ressource ZIP? -ZipResourceDialog.HTMLField.DefaultText=Si aucun n'est spécifié, un nouveau fichier sera créé -ZipResourceDialog.Dialog.AddFiles.Title=Ajouter les fichiers HTML et PDF -ZipResourceDialog.Tooltip.HTML=Chemin d'accès au fichier source HTML (si aucun n'est spécifié, un nouveau fichier sera créé) -ZipResourceDialog.Tooltip.Author=Auteurs de cette ressource -ZipResourceDialog.Tooltip.Title=Afficher le nom de cette ressource (pas le nom du fichier) -ZipResourceDialog.Tooltip.Description=Une description utile de cette ressource -ZipResourceDialog.Tooltip.Keywords=Une liste de mots-clés pour la recherche à l'aide du fureteur DL -ZipResourceDialog.Tooltip.Contact=Information permettant de contacter l'auteur (institution, courriel, site web, etc.) -ZipResourceDialog.Tooltip.Link=URL vers un fichier HTML externe permettant d'obtenir plus d'information sur cette ressource -ZipResourceDialog.Tooltip.ThumbnailSettings=Modifier la miniature, ses dimensions ou le type de fichier -ZipResourceDialog.Tooltip.AddFiles=Ajouter les informations HTML et PDF à la ressource ZIP -ZipResourceDialog.Tooltip.TrimVideo=Cocher pour exporter le clip vidéo, décocher afin d'utiliser la vidéo originale -ZipResourceDialog.Tooltip.LoadHTML=Utiliser un navigateur de fichiers pour charger le HTML dans un fichier +# This is the french tracker.properties file +# Translated by Matthieu Moors 2007-08-07 +# Translated by Laurent Hivon 2012-07 +# Translated by Bernard Marcheterre 2012-09 + +# Trajectoires|Nouvelle est devenu Trajectoires|Nouveau +# Vhercher est redevenu Chercher +# Les "sauvegarder" sont tous devenus des "enregistrer" +# Les tirets après "non" ont été enlevés + +Calibration.Name=Paire de points pour la calibration +Calibration.New.Name=Points de calibration +CenterOfMass.Name=Centre de Masse +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Choisir les masses... +CenterOfMassInspector.Title=Centre de Masse +CenterOfMassInspector.Border.Title=Choisir les masses +ConfigInspector.Border.Title=Cocher les éléments désirés +ConfigInspector.Title=Préférences +ConfigInspector.Button.SaveAsDefault=Enregistrer en tant que paramètres par défaut +CoordAxes.Name=Axes +CoordAxes.New.Name=axes +Dialog.Button.Cancel=Annuler +Dialog.Button.OK=OK +Dialog.Button.Close=Fermer +Dialog.Button.All=Tous +Dialog.Button.None=Aucun +Dialog.Button.Copy=Copier +Dialog.Button.Update=Mettre à jour +Dialog.Button.SelectAll=Tout sélectionner +Footprint.Diamond=Losange +Footprint.BoldDiamond=Losange épais +Footprint.SolidDiamond=Losange plein +Footprint.Triangle=Triangle +Footprint.BoldTriangle=Triangle épais +Footprint.SolidTriangle=Triangle plein +Footprint.Circle=Cercle +Footprint.BoldCircle=Cercle épais +Footprint.SolidCircle=Cercle plein +Footprint.VerticalLine=Ligne verticale +Footprint.BoldVerticalLine=Ligne verticale épaisse +Footprint.HorizontalLine=Ligne horizontale +Footprint.BoldHorizontalLine=Ligne horizontale épaisse +Footprint.Crosshair=Croix +Footprint.BoldCrosshair=Croix épaisse +Footprint.SimpleAxes=Axes simples +Footprint.BoldSimpleAxes=Axes simples épais +Footprint.Spot=Point +Footprint.Line=Ligne +Footprint.BoldLine=Ligne épaisse +Footprint.Outline=Contour +Footprint.BoldOutline=Contour épais +Footprint.Arrow=Flèche +Footprint.BoldArrow=Flèche épaisse +Footprint.DoubleArrow=Double flèche +Footprint.BoldDoubleArrow=Double flèche épaisse +Footprint.2xArrow=Flèche 2x +Footprint.Bold2xArrow=Flèche 2x épaisse +Footprint.4xArrow=Flèche 4x +Footprint.Bold4xArrow=Flèche 4x épaisse +Footprint.DashArrow=Flèche pointillée +Footprint.BoldDashArrow=Flèche pointillée épaisse +Footprint.BigArrow=Grande flèche +Footprint.BigDashArrow=Grande flèche pointillée +LineProfile.Name=Profil de ligne +LineProfile.New.Name=profil +LineProfile.Data.Brightness=Luminosité +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=rouge +LineProfile.Data.Green=vert +LineProfile.Data.Blue=bleu +LineProfile.Data.Weighting=décompte +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Zoom +MainTView.Popup.MenuItem.ToFit=Ajuster +OffsetOrigin.Name=Origine déplacée +OffsetOrigin.New.Name=Origine déplacée +PlotTrackView.Button.PlotCount=Graphe +PlotTrackView.Button.PlotCount.ToolTip=Choisir le nombre de graphes +PointMass.Name=Masse ponctuelle +PointMass.New.Name=masse +PointMass.MenuItem.VectorsToPosition=À la position +PointMass.MenuItem.Velocity=Vitesse +PointMass.MenuItem.Acceleration=Accélération +Star.Name=Étoile +Star.New.Name=étoile +TableTrackView.Action.CopyData=Copier les données +TableTrackView.Button.SelectTableData=Tableau de données +TableTrackView.Button.SelectTableData.ToolTip=Choisir les colonnes de données +TableTrackView.Popup.MenuItem.Analyze=Analyser... +TableTrackView.Dialog.Border.Title=Visible: +TActions.Action.Description=Notes +TActions.Action.ClearTracks=Toutes les trajectoires +TActions.Action.NewTab=Nouvel onglet +TActions.Action.Copy=Copier +TActions.Action.Paste=Coller +TActions.Action.Open=Ouvrir fichier... +TActions.Action.Close=Fermer l'onglet +TActions.Action.Import=Importer... +TActions.Action.Save=Enregistrer l'onglet +TActions.Action.SaveAs=Enregistrer l'onglet sous... +TActions.Action.Export=Exporter... +TActions.Action.CaptureVideo=Capturer une video... +TActions.Action.Delete=Supprimer +TActions.Action.Config=Préférences... +TActions.Action.AxesVisible=Visible +TActions.Action.TapeVisible=Visible +TActions.Action.Print=Imprimer... +TActions.Action.ClearFilters=Effacer +TActions.Action.ImportVideo=Importer... +TActions.Action.CloseVideo=Fermer +TActions.Action.CloseAll=Fermer tout les onglets +TActions.Action.Exit=Quitter +TActions.Dialog.PrintError.Message=Une erreur d'impression s'est produite. +TActions.Dialog.PrintError.Title=Erreur d'impression +TActions.Dialog.Description.Title=Notes: +TActions.Dialog.DeleteLockedTracks.Message=Certaines trajectoires sont verrouillées. Supprimer quand même? +TActions.Dialog.DeleteLockedTracks.Title=Supprimer les trajectoires verrouillées? +TActions.Dialog.NewPointMass.Title=Nouvelle masse ponctuelle +TapeMeasure.Name=Mesure avec ruban +TapeMeasure.New.Name=ruban +TapeMeasure.MenuItem.Fixed=Position fixe +TFrame.View.Plot=Affichage du graphe +TFrame.View.Table=Affichage de la table de données +TFrame.View.World=Affichage global +TFrame.View.Video=Affichage de la vidéo +TFrame.Dialog.Help.Title=Aide de Tracker +TMenuBar.Menu.File=Fichier +TMenuBar.Menu.Edit=Édition +TMenuBar.Menu.Video=Vidéo +TMenuBar.Menu.Tracks=Trajectoires +TMenuBar.Menu.Coords=Système de Coordonnées +TMenuBar.Menu.Window=Fenêtre +TMenuBar.Menu.Help=Aide +TMenuBar.MenuItem.EditProperties=Propriétés... +TMenuBar.MenuItem.VideoVisible=Visible +TMenuBar.MenuItem.VideoFilters=Filtres +TMenuBar.MenuItem.NewVideoFilter=Nouveau +TMenuBar.MenuItem.NewTrack=Nouveau +TMenuBar.MenuItem.CoordsLocked=Verrouillé +TMenuBar.MenuItem.CoordsFixedOrigin=Origine fixe +TMenuBar.MenuItem.CoordsFixedAngle=Orientation fixe +TMenuBar.MenuItem.CoordsFixedScale=Échelle fixe +TMenuBar.MenuItem.CoordsRefFrame=Image de référence +TMenuBar.MenuItem.CoordsDefault=Par défaut +TMenuBar.MenuItem.WindowRight=Vue de droite +TMenuBar.MenuItem.WindowBottom=Vue du dessous +TMenuBar.MenuItem.PlayAllSteps=Lire tous les incréments +TMenuBar.MenuItem.Record=Enregistrer +TMenuBar.MenuItem.MatSize=Dimensions de la zone de travail +TMenuBar.MenuItem.Language=Langue +TMenuBar.MenuItem.DeleteTrack=Supprimer +TMenuBar.MenuItem.TrackerHelp=Aide de Tracker... +TMenuBar.MenuItem.MessageLog=Journal des messages... +TrackControl.Name=Contrôle des trajectoires +TrackControl.Button.NewTrack=Créer +TrackControl.Button.NewTrack.ToolTip=Créer une nouvelle trajectoire +TrackControl.Button.Trails.ToolTip=Définir la longueur de la trace +TrackControl.Button.Labels.ToolTip=Afficher ou masquer la numérotation +TrackControl.Button.StretchVectors.ToolTip=Étirer les vecteurs +TrackControl.Button.Accelerations.ToolTip=Afficher ou masquer les vecteurs accélération +TrackControl.Button.Xmass.ToolTip=Multiplier les vecteurs par la masse +TrackControl.Button.Vectors.ToolTip=Vecteurs +TrackControl.Button.Velocities.ToolTip=Afficher ou masquer les vecteurs vitesse +TrackControl.Button.Properties.ToolTip=Cliquer pour sélectionner +TrackControl.Button.Positions.ToolTip=Afficher ou masquer les positions +Tracker.Popup.MenuItem.Snapshot=Capture d'écran +Tracker.Popup.MenuItem.Help=Aide... +Tracker.Cursor.Crosshair.Description=Curseur en croix +Tracker.Action.AboutTracker=À propos de Tracker... +Tracker.Dialog.AboutTracker.Title=À propos de Tracker +Tracker.Action.AboutJava=À propos de Java... +Tracker.Dialog.AboutJava.Title=À propos de Java +Tracker.Dialog.AboutJava.UnknownVersion=inconnu +Tracker.Dialog.AboutJava.Message=Version de Java +Tracker.Action.AboutQT=À propos de QuickTime... +Tracker.Dialog.AboutQT.Title=À propos de QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=Version de QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=Version de QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=Chemin d'accès du fichier QTJava: +Tracker.Dialog.NoQT.Title=QTJava.zip non trouvé +Tracker.Dialog.NoQT.Message1=QuickTime pour Java ne semble pas être installé. +Tracker.Dialog.NoQT.Message2=Si vous désirez analyser des séquences Quicktime, veuillez réinstaller Quicktime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime pour Java DOIT ÊTRE SELECTIONNÉ lors de l'installation de Quicktime. +Tracker.Dialog.UpdateQT.Title=Mettre à jour de QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Une version plus récente de QTJava.zip a été trouvé à +Tracker.Dialog.UpdateQT.Message2=Voulez-vous mettre à jour le fichier existant? +Tracker.Dialog.CopyQT.Title=Copier QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime est installé, mais avant que Tracker ne puisse l'utiliser: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip doit être copié de +Tracker.Dialog.CopyQT.Message3= vers +Tracker.Dialog.CopyQT.Message4= 2. Tracker doit redémarrer. +Tracker.Dialog.CopyQT.Message5=Désirez-vous copier QTJava.zip maintenant? +Tracker.Dialog.CopyFailed.Title=La copie a échoué +Tracker.Dialog.CopyFailed.Message=QTJava.zip n'a pas pu être copié. +Tracker.Dialog.CopiedTo.Title=Copie réussie +Tracker.Dialog.CopiedTo.Message1=QTJava.zip a été copié correctement vers +Tracker.Dialog.CopiedTo.Message2=Tracker doit redémarrer et va maintenant fermer. +Tracker.Splash.Loading=Chargement +TrackerIO.Dialog.Import.Title=Importer un fichier Tracker +TrackerIO.Dialog.Import.Message=Sélectionner les éléments à importer +TrackerIO.Dialog.ImportVideo.Title=Importer une vidéo +TrackerIO.Dialog.Export.Title=Exporter +TrackerIO.Dialog.Export.Message=Sélectionner les éléments à exporter +TrackerIO.Dialog.ReplaceFile.Title=Remplacer le fichier existant? +TrackerIO.Dialog.ReplaceFile.Message=existe déjà. Voulez-vous le remplacer? +TrackerIO.Dialog.NotTrackerXML.Title=Erreur XML +TrackerIO.Dialog.NotTrackerXML.Message=contient des données XML pour une autre application. +TrackerIO.Dialog.BadVideo.Message=La vidéo n'est pas d'un type reconnu: +TrackerIO.Dialog.BadVideo.Title=Fichier vidéo non reconnu +TrackerPanel.NewTab.Name=Sans-titre +TrackerPanel.DragToMark.Hint=Maj+glisser pour marquer +TrackerPanel.ClickToMark.Hint=Maj+clic pour marquer +TrackerPanel.Dialog.LoadFailed.Title=Fichier Tracker non valide +TrackerPanel.Dialog.LoadFailed.Message=Ceci n'est pas un fichier Tracker valide: +TrackerPanel.Dialog.SaveChanges.Title=Enregistrer les changements +TrackerPanel.Dialog.SaveChanges.Message=Enregistrer les changements dans +TrackPlottingPanel.Popup.MenuItem.Lines=Lignes +TrackPlottingPanel.Popup.MenuItem.Points=Points +TrackPlottingPanel.Popup.MenuItem.Scale=Échelle... +TrackPlottingPanel.Popup.MenuItem.Print=Imprimer... +TrackPlottingPanel.Popup.MenuItem.Measure=Mettre à l'échelle +TrackPlottingPanel.Popup.MenuItem.Analyze=Analyser +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Augmenter l'échelle +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Diminuer l'échelle +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Mise à l'échelle automatique +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Ajuster l'échelle au cadre +TrackPlottingPanelInspector.Title=Échelle +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Définir l'empreinte +TToolBar.Dropdown.SelectedTrack.Tooltip=Sélectionner une trajectoire +TToolBar.Dropdown.SelectedTrack.None=Aucune +TTrack.MenuItem.Delete=Supprimer +TTrack.MenuItem.Color=Couleur... +TTrack.Dialog.Color.Title=Choisir la couleur de la trajectoire +TTrack.MenuItem.Name=Nom... +TTrack.MenuItem.Footprint=Empreinte +TTrack.MenuItem.Description=Notes... +TTrack.MenuItem.Visible=Visible +TTrack.MenuItem.TrailVisible=Trace Visible +TTrack.MenuItem.Autostep=Incrément automatique +TTrack.MenuItem.MarkByDefault=Marquer par défaut +TTrack.MenuItem.Locked=Verrouillé +TTrack.MenuItem.Delete=Supprimer +TTrack.Name.None=aucun nom +TTrack.Dialog.Description.Title=Notes: +TTrack.Dialog.Name.Title=Définir Nom +TTrack.Dialog.Name.Label=Nom: +TViewChooser.Button.Choose.Tooltip=Choisir un affichage +Vector.Name=Vecteur +Vector.New.Name=vecteur +Vector.MenuItem.ToOrigin=À l'origine +Vector.MenuItem.Label=Étiquette visible +VectorSum.Name=Somme de vecteurs +VectorSum.New.Name=addition +VectorSum.MenuItem.Inspector=Choisir les Vecteurs... +VectorSumInspector.Title=Somme de vecteurs +VectorSumInspector.Border.Title=Sélectionner les vecteurs +WorldTView.Popup.MenuItem.Projectile=Modèle de Projectile + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Modèle cinématique de particule +AnalyticParticle.Inspector.Title=Modèle cinématique de particule +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=Rayon 4 +CircleFootprint.Circle_6=Rayon 6 +CircleFootprint.Circle_8=Rayon 8 +DynamicParticle.Name=Modèle dynamique de particule (Cartésien) +DynamicParticle.Inspector.Title=Modèle dynamique de particule +DynamicParticle.Property.ForceX=force selon x +DynamicParticle.Property.ForceY=force selon y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Position Fixe +ParticleModel.New.Name=modèle +ParticleModel.MenuItem.InspectModel=Création d'un modèle... +ParticleModel.Inspector.Button.Undo=Annuler +ParticleModel.Inspector.Button.Redo=Répéter +ParticleModel.Inspector.Button.Close=Fermer +ParticleModel.Inspector.Button.Help=Aide + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=Seulement X +Calibration.Axes.YOnly=Seulement Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Sélectionner les axes de calibration +Calibration.Label.Axes=axes +Calibration.Dialog.InvalidCoordinates.Title=Coordonnées non valides. +Calibration.Dialog.InvalidCoordinates.Message=Les points ne peuvent avoir les mêmes coordonnées globales. +Calibration.Dialog.InvalidXCoordinates.Message= Les points ne peuvent avoir les mêmes coordonnées globales en x. +Calibration.Dialog.InvalidYCoordinates.Message= Les points ne peuvent avoir les mêmes coordonnées globales en y. +SpectralLineFilter.Title=Spectre gazeux +SpectralLineFilter.H=Hydrogène +SpectralLineFilter.He=Hélium +SpectralLineFilter.Ne=Néon +SpectralLineFilter.Hg=Mercure +TFrame.View.Unknown=Affichage +TMenuBar.MenuItem.Undo=Annuler +TMenuBar.MenuItem.Redo=Répéter +TMenuBar.MenuItem.Replace=Remplacer... +TMenuBar.Menu.AddImage=Importer des images +TMenuBar.MenuItem.AddBefore=Avant cette image... +TMenuBar.MenuItem.AddAfter=Après cette image... +TMenuBar.MenuItem.RemoveImage=Supprimer cette image +TMenuBar.Menu.Tools=Outils +TMenuBar.MenuItem.DataFunctionTool=Traitement des données... +TMenuBar.MenuItem.DatasetTool=Outil d'analyse des données... +TMenuBar.Menu.CopyImage=Copier l'image +TMenuBar.MenuItem.CopyMainView=Affichage principal +TMenuBar.MenuItem.CopyFrame=Image +TMenuBar.MenuItem.PrintFrame=Imprimer... +TrackerIO.Dialog.AddImage.Title=Importer des images (choisir une ou plusieurs) +TTrack.Dialog.Name.BadName=existe déjà! Choisir un autre nom. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=Force résultante +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=L'affichage du graphe des données de la trajectoire apparaîtra ici. +TableTView.Label.NoData=L'affichage du tableau des données de la trajectoire apparaîtra ici. +TrackerPanel.Message.NoData0=L'affichage principal de la vidéo et des trajectoires apparaîtra ici. +TrackerPanel.Message.NoData1=Choisir Fichier|Ouvrir ou Trajectoires|Nouveau pour débuter. +WorldTView.Label.NoData=L'affichage global de la vidéo et des trajectoires apparaîtra ici. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Solveur: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Multi-étapes adaptées +DynamicParticle.Table.Force.Border.Title=Fonctions de force (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Fonctions de la position (t) +ParticleModel.Table.Initial.Border.Title=Valeurs initiales +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Coller l'image +TMenuBar.MenuItem.PasteAfter=Après cette image +TMenuBar.MenuItem.PasteBefore=Avant cette image +TMenuBar.MenuItem.PasteReplace=Remplacer la vidéo + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Pour commencer... +Tracker.Splash.HelpMessage=Nouvel utilisateur? Choisir + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=Angle par rapport à l'horzontale +LineProfile.Checkbox.Rotates=pivote +LineProfile.Label.Spread=étendre +RGBRegion.Name=Région RVB +RGBRegion.New.Name=région +RGBRegion.MenuItem.Fixed=Position fixe +RGBRegion.Label.Radius=taille des pixels +TTrack.Label.Step=Incrément + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=numéro de position +LineProfile.Data.Description.1=composante selon x de la position +LineProfile.Data.Description.2=composante selon y de la position +LineProfile.Data.Description.3=rouge +LineProfile.Data.Description.4=vert +LineProfile.Data.Description.5=bleu +LineProfile.Data.Description.6=luminosité perçue +LineProfile.Data.Description.7=largeur du trait +ParticleModel.MenuItem.TraceVisible=Tracé visible +ParticleModel.MenuItem.StepsVisible=Numéros d'incrément Visible +PointMass.Data.Description.0=temps +PointMass.Data.Description.1=composante selon x de la position +PointMass.Data.Description.2=composante selon y de la position +PointMass.Data.Description.3=module de la position +PointMass.Data.Description.4=orientation de la position +PointMass.Data.Description.5=composante selon x de la vitesse +PointMass.Data.Description.6=composante selon y de la vitesse +PointMass.Data.Description.7=module de la vitesse +PointMass.Data.Description.8=orientation de la vitesse +PointMass.Data.Description.9=composante selon x de l'accélération +PointMass.Data.Description.10=composante selon y de l'accélération +PointMass.Data.Description.11=module de l'accélération +PointMass.Data.Description.12=orientation de l'accélération +PointMass.Data.Description.13=position angulaire +PointMass.Data.Description.14=vitesse angulaire +PointMass.Data.Description.15=accélération angulaire +PointMass.Data.Description.16=numéro de l'incrément +PointMass.Data.Description.17=numéro de l'image +PointMass.Data.Description.18=composante selon x de la quantité de mouvement +PointMass.Data.Description.19=composante selon y de la quantité de mouvement +PointMass.Data.Description.20=module de la quantité de mouvement +PointMass.Data.Description.21=orientation de la quantité de mouvement +PointMass.Data.Description.22=énergie cinétique +RGBRegion.Data.Description.0=temps +RGBRegion.Data.Description.1=composante selon x de la position +RGBRegion.Data.Description.2=composante selon y de la position +RGBRegion.Data.Description.3=rouge +RGBRegion.Data.Description.4=vert +RGBRegion.Data.Description.5=bleu +RGBRegion.Data.Description.6=luminosité perçue +RGBRegion.Data.Description.7=nombre de pixels +RGBRegion.Data.Description.8=numéro de l'incrément +RGBRegion.Data.Description.9=numéro de l'image +TView.Menuitem.Define=Definir... +Vector.Data.Description.0=temps +Vector.Data.Description.1=composante selon x +Vector.Data.Description.2=composante selon y +Vector.Data.Description.3=module +Vector.Data.Description.4=orientation +Vector.Data.Description.5=composante selon x de la position de la queue +Vector.Data.Description.6=composante selon y de la position de la queue +Vector.Data.Description.7=numéro de l'incrément +Vector.Data.Description.8=numéro de l'image + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Masse de cette particule +ParticleModel.Parameter.InitialTime.Description=Instant initial +AnalyticParticle.PositionFunction.X.Description=Composante selon x de la position +AnalyticParticle.PositionFunction.Y.Description=Composante selon y de la position +DynamicParticle.ForceFunction.X.Description=Composante selon x de la force +DynamicParticle.ForceFunction.Y.Description=Composante selon y de la force +DynamicParticle.Parameter.InitialX.Description=Composante selon x de la position initiale +DynamicParticle.Parameter.InitialY.Description=Composante selon y de la position initiale +DynamicParticle.Parameter.InitialVelocityX.Description=Composante selon x de la vitesse initiale +DynamicParticle.Parameter.InitialVelocityY.Description=Composante selon y de la vitesse initiale +TrackerPanel.ModelBuilder.Title=Créateur de modèle +TrackerPanel.DataBuilder.Title=Analyseur de données +TrackControl.TrailMenu.NoTrail=Aucune trace +TrackControl.TrailMenu.ShortTrail=Trace courte +TrackControl.TrailMenu.LongTrail=Trace longue +TrackControl.TrailMenu.FullTrail=Trace complète +TrackerPanel.ModelBuilder.Spinner.Tooltip=Modèle actuellement sélectionné +TrackerPanel.ModelBuilder.LineButton.Text=Style de ligne +TrackerPanel.ModelBuilder.LineButton.Tooltip=Définir le style de ligne +ParticleModel.LineStyle.None=Aucune ligne +ParticleModel.LineStyle.Connect=Relier les points +ParticleModel.LineStyle.Smooth=Arrondir les lignes +ModelFunctionPanel.Label=Modèle +AnalyticFunctionPanel.FunctionEditor.Border.Title=Fonctions de Position +DynamicFunctionPanel.FunctionEditor.Border.Title=Fonctions de Force + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Colonnes visibles dans la table +Tracker.About.ProjectOf=Un projet de: +Tracker.About.TranslationBy=Traduction par +Tracker.About.Translator=Matthieu Moors\net Bernard Marcheterre +TMenuBar.Menu.SaveVideoAs=Enregistrer la vidéo sous +TActions.SaveClipAs.ProgressMonitor.Message=Sauvegarde de la vidéo sous +TActions.SaveClipAs.ProgressMonitor.Progress=Complétée + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Synchroniser +PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronizer les axes horizontaux +RGBRegion.MenuItem.FixedRadius=Rayon fixe +Tracker.VideoZoom.Hint=cliquer pour augmenter l'échelle, alt-clic pour réduire l'échelle, double-clic pour ajuster +Tracker.PlotZoomIn.Hint=glisser pour augmenter l'échelle, double-clic pour échelle automatique +Tracker.PlotZoomOut.Hint=clic pour augmenter l'échelle +Tracker.MenuItem.Hints=Afficher les astuces +TapeMeasure.Label.Length=longueur à l'échelle +TapeMeasure.Label.TapeAngle=angle du ruban +TapeMeasure.Label.ArcAngle=angle du rapporteur +TrackerIO.Dialog.NotAnImage.Title=Fichier de type incorrect +TrackerIO.Dialog.NotAnImage.Message1=n'est pas une image JPG ou GIF. +TrackerIO.Dialog.NotAnImage.Message2=Voulez-vous poursuivre? +TToolBar.Button.Zoom.Tooltip=Outil de modification d'échelle +TrackChooserTView.DropDown.Tooltip=Choisir une trajectoire +TapeMeasure.Field.ArcAngle.Tooltip=Angle entre le ruban et le rapporteur d'angle +TapeMeasure.Field.TapeAngle.Tooltip=Angle entre l'axe des x positifs et le ruban +TapeMeasure.Field.Magnitude.Tooltip=Longueur du ruban en unités globales +TapeMeasure.Readout.Magnitude.Name=mesure de longueur +TapeMeasure.Readout.Magnitude.Hint=cliquer pour définir l'échelle +TapeMeasure.Readout.Angle.Name=mesure de l'angle +TapeMeasure.Readout.Angle.Hint=cliquer pour définir l'angle +TapeMeasure.Arm.Name=segment du rapporteur d'angle +TapeMeasure.Arm.Hint=glisser pour mesurer les angles, raccourcir pour refermer +TapeMeasure.End.Name=fin +TapeMeasure.End.Hint=glisser pour mesurer les distances ou calibrer l'échelle +TapeMeasure.Handle.Name=ancrage +TapeMeasure.Handle.Hint=glisser pour déplacer le ruban +Vector.Tip.Name=conseil +Vector.Tip.Hint=glisser ou introduire les coordonnées pour modifier les composantes +Vector.Handle.Name=ancrage +Vector.Handle.Hint=glisser pour déplacer le vecteur +Vector.ShortHandle.Hint=glisser pour déplacer, alt-clic pour obtenir un conseil +PointMass.Position.Name=position +PointMass.Position.Hint=glisser ou introduire les coordonnées pour modifier la position +PointMass.Velocity.Name=vitesse +PointMass.Acceleration.Name=accélération +PointMass.Vector.Hint=glisser pour déplacer +PointMass.Position.Locked.Hint=cliquer pour sélectionner--ne peut être déplacé +CoordAxes.Handle.Name=axes des x+ +CoordAxes.Handle.Hint=glisser pour changer l'orientation +CoordAxes.Origin.Name=origine +CoordAxes.Origin.Hint=glisser pour changer la position +OffsetOrigin.Position.Name=position +OffsetOrigin.Position.Hint=glisser ou introduire les coordonnées pour déplacer l'origine +Calibration.Point.Name=point +Calibration.Point.Hint=glisser ou introduire les coordonnées pour modifier les axes ou l'échelle +RGBRegion.Position.Name=position +RGBRegion.Position.Hint=glisser ou introduire les coordonnées pour modifier la position +LineProfile.End.Name=fin +LineProfile.End.Hint=glisser pour ajuster la longueur de la ligne +LineProfile.Handle.Name=ancrage +LineProfile.Handle.Hint=glisser pour déplacer la ligne +PointMass.Hint=déterminer la masse sur la barre d'outils +PointMass.Unmarked.Hint=, maj-clic pour marquer les positions +TTrack.Unselected.Hint=cliquer pour choisir et/ou déterminer les propriétés +Vector.Unmarked.Hint=maj-glisser pour dessiner les vecteurs +OffsetOrigin.Unmarked.Hint=maj-clic pour marquer le décalage du point +Calibration.Unmarked.Hint=maj-clic pour marquer le premier point +Calibration.Halfmarked.Hint=maj-clic pour marquer le second point +CenterOfMass.Empty.Hint=choisir les masses pour définir le système +VectorSum.Empty.Hint=choisir les vecteurs pour définir la somme +TapeMeasure.Hint=définir la longueur pour modifier l'échelle, définir l'angle pour modifier l'orientation de l'axe des x +CoordAxes.Hint=fixer la valeur de l'angle pour modifier l'orientation +ParticleModel.Hint=déterminer la masse sur la barre d'outils, insérer les expressions dans le Créateur de Modèle pour animer +RGBRegion.Hint=insérer le rayon pour modifier les dimensions +RGBRegion.Unmarked.Hint=maj-clic pour marquer les positions +TTrack.ImportVideo.Hint=importer une vidéo ou une image pour mesurer les niveaux RVB +TTrack.Selected.Hint=sélectionné +LineProfile.Hint=insérer l'étendue pour modifier la largeur de ligne +LineProfile.Unmarked.Hint=maj-clic pour dessiner une ligne +LineProfile.Menu.Orientation=Orientation +LineProfile.MenuItem.Horizontal=Horizontale +LineProfile.MenuItem.XAxis=Selon l'axe des X +Footprint.PositionVector=vecteur +Footprint.BoldPositionVector=vecteur épais +Tracker.Startup.Hint=explorer ici pour des conseils (ou faire cesser l'affichage des conseils dans le menu d'aide), choisir F1 à tout moment pour de l'aide +TrackerPanel.NoVideo.Hint=ouvrir ou importer une vidéo ou une image pour analyse +TrackerPanel.CalibrateVideo.Hint=identifier un objet dans la vidéo possédant une longueur connue et définisser l'échelle en vous servant du ruban +TrackerPanel.NoTracks.Hint=créer une nouvelle trajectoire pour mesurer une caractéristique intéressante de la vidéo +TrackerPanel.SetClip.Hint=définisser ou réviser les propriétés de la vidéo avec l'inspecteur de vidéo +TrackerPanel.ShowAxes.Hint=définisser la position de l'origine et l'orientation du système d'axes +VideoPlayer.Step.Hint=incrément avant (raccourci: touche PageSuivante) +VideoPlayer.Back.Hint=incrément arrière (raccourci: touche PagePrécédente) +TrackerPanel.DVVideo.Hint=appliquer un filtre de redimensionnement afin de corriger les distorsions dans les fichiers vidéos de format DV +TrackerIO.DataFileFilter.Description=fichiers Tracker +Tracker.Button.PDFHelp=Version PDF imprimable +TToolbar.Button.TapeVisible.Tooltip=Ruban avec rapporteur d'angle + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Contrôle de trajectoire +TMenuBar.MenuItem.Description=Notes +TrackPlottingPanel.RightDrag.Hint=cliquer-glisser pour les options +TMenuBar.MenuItem.DeleteSelectedPoint=Point Sélectionné +TFrame.InfoDialog.SaveChanges.Title=Enregistrer les modifications +TFrame.InfoDialog.SaveChanges.Message=Voulez-vous enregistrer les modifications? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartésien +DynamicParticle.Editor.Button.Polar=Polaire +DynamicParticle.Parameter.InitialR.Description=Rayon initial +DynamicParticle.Parameter.InitialTheta.Description=Orientation initiale +DynamicParticle.Parameter.InitialVelocityR.Description=Vitesse radiale initiale +DynamicParticle.Parameter.InitialOmega.Description=Vitesse angulaire initiale +DynamicParticle.ForceFunction.R.Description=Composante radiale de force +DynamicParticle.ForceFunction.Theta.Description=Composante tangentielle de force +DynamicParticlePolar.Name=Modèle dynamique de particule (Polaire) +DynamicTwoBody.Editor.Button.Particle1=Particule 1 +DynamicTwoBody.Editor.Button.Particle2=Particule 2 +DynamicTwoBody.Name=Modèle dynamique à deux corps +TMenuBar.Menu.DynamicParticle=Modèle dynamique d'une particule +TMenuBar.MenuItem.Cartesian=Cartésien +TMenuBar.MenuItem.Polar=Polaire + +# Additions by Doug Brown 2009-08-24 +Autotrack.Inspector.Title=Repérage Automatique +PointMass.MenuItem.Autotrack=Repérage Automatique... +Dialog.Button.Help=Aide +AutoTracker.Wizard.Button.Reset=Réinitialiser +AutoTracker.Wizard.Button.Back=Précédent +AutoTracker.Wizard.Button.Next=Suivant +AutoTracker.Wizard.Button.Accept=Accepter +AutoTracker.Wizard.Button.Search=Chercher +AutoTracker.Wizard.Button.Start=Début +AutoTracker.Wizard.Button.Pause=Pause +AutoTracker.Wizard.Button.Skip=Omettre +AutoTracker.Label.Mask=Masquer l'image +AutoTracker.Label.Target=Décalage de la cible +AutoTracker.Label.AcceptLevel=Accepter les résultats au-dessus +AutoTracker.TabbedPane.TabTitle.Mask=Masquer +AutoTracker.TabbedPane.TabTitle.Target=Cible +AutoTracker.TabbedPane.TabTitle.Settings=Accepter +AutoTracker.TabbedPane.TabTitle.Search=Chercher +AutoTracker.Info.GetStarted=Cliquer sur la caractéristique vidéo pour laquelle vous voulez lancer le repérage automatique. +AutoTracker.Info.Mask1=Le masque définit le détail qu'il faut chercher et suivre dans chaque image. Déplacer ou modifier la taille du masque en glissant son centre ou l'ancrage, respectivement. +AutoTracker.Info.Mask2=Conseil: le masque n'a pas à être très grand ou à recouvrir tout l'objet. Une caractéristique unique ou possédant un haut degré de contraste est habituellement ce qu'il faut choisir. +AutoTracker.Info.MaskLocked1=Le masque est actuellement utilisé et verrouillé. +AutoTracker.Info.MaskLocked2=Cliquer sur le bouton de Réinitialisation pour effacer tous les incréments, déverrouiller le masque et recommencer. +AutoTracker.Info.Target1=La cible est la région où seront marqués les incréments relativement au masque. Déplacer la cible en la glissant. +AutoTracker.Info.Target2=Tip: Il est possible d'ajuster la cible même après que des incréments ont été marqués. Les incréments déjà marqués se déplaceront automatiquement avec la cible. +AutoTracker.Info.TargetLocked=La cible est actuellement utilisée et liée aux incréments de position déjà marqués. La déplacer aura pour conséquence de déplacer aussi les incréments. +AutoTracker.Info.Settings1=Les incréments possédant un taux de succès supérieur au niveau de concordance optimal seront marqués automatiquemet. +AutoTracker.Info.Settings2=Conseil: réduire le niveau optimal de concordance accélère le processus de marquage mais en augmentant aussi la possibilité d'erreurs. +AutoTracker.Info.Search1=Le rectangle qui apparaît correspond à la zone dans laquelle on cherche la concordance. Déplacer ou modifier la taille du rectangle en glissant son centre ou son ancrage, respectivement. +AutoTracker.Info.Search2=Conseil: La zone de concordance n'a pas à être grande. Après avoir déterminés les deux premiers endroits de concordance, un algorithme redéfinit automatiquement la zone de recherche. +AutoTracker.Info.Frame=Image +AutoTracker.Info.Match=La concordance affichée a été marquée automatiquement à la position de la cible. +AutoTracker.Info.Possible=Un concordance possible a été trouvée. Vos options sont: +AutoTracker.Info.NoMatch=Aucune concordance n'a été trouvée dans la région affichée. Vos options sont: +AutoTracker.Info.Outside=La zone de recherche est en dehors de l'image. Vos options sont: +AutoTracker.Info.Accepted=La concordance a été acceptée par l'utilisateur. +AutoTracker.Info.MarkedByUser=L'incrément a été marqué manuellement par l'utilisateur. +AutoTracker.Info.NoVideo=Le Repérage Automatique nécessite une vidéo. Importer une vidéo pour utiliser le Repérage Automatique. +AutoTracker.Info.Height=hauteur +AutoTracker.Info.Width=largeur +AutoTracker.Info.Accept=--accepter la concordance +AutoTracker.Info.Retry=--déplacer la zone de recherche et chercher à nouveau +AutoTracker.Info.Mark=--maj-clic pour marquer les incréments manuellement +AutoTracker.Info.Skip=--passer cette image et continuer le repérage sur la prochaine +AutoTracker.Info.Reset=--effacer et recommencer avec un nouveau masque +AutoTracker.Info.MatchScore=Valeur de concordance +AutoTracker.Dialog.MaskLocked.Title=Masque verouillé +PointMass.Cursor.Autotrack.Description=Curseur du Repérage Automatique +VideoPlayer.StartFrame.Hint=glisser pour définir l'image de départ +VideoPlayer.EndFrame.Hint=glisser pour définir l'image finale +VideoPlayer.Slider.Hint=glisser pour vous déplacer à travers la vidéo +FileDropHandler.Dialog.BadFile.Message=n'a pu être chargée. +FileDropHandler.Dialog.BadFile.Title=Fichier non reconnu + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Appliquer +DynamicParticle.Dialog.Delete.Message=Supprimer cette particule la retirera du système. Supprimer malgré tout? +DynamicParticle.Dialog.Delete.Title=Système Dynamique +DynamicParticle.System.In=dans +DynamicSystem.Empty=vide +DynamicSystem.Force.Name.Internal=interne +DynamicSystem.ForceFunction.R.Description=Composante radiale de la force interne +DynamicSystem.ForceFunction.Theta.Description=Composante tangentielle de la force interne +DynamicSystem.MenuItem.Inspector=Choisir les Particules... +DynamicSystem.Name=Système Dynamique à deux corps +DynamicSystem.New.Name=système +DynamicSystem.Parameter.Of=de +DynamicSystem.Parameter.RelativeTo=relativement à +DynamicSystem.Parameter.Name.Relative=relatif +DynamicSystem.Parameter.ParticleMass.Description=Masse de +DynamicSystem.Parameter.Mass.Description=Masse totale du système +DynamicSystemInspector.Border.Title=Particule +DynamicSystemInspector.Title=Système à deux corps +DynamicSystemInspector.Button.Change=Changer Pour... +DynamicSystemInspector.ParticleName.None=(aucun) +TMenuBar.MenuItem.Clone=Clone +TMenuBar.MenuItem.TwoBody=Système à deux corps +TrackerPanel.DataBuilder.Dropdown.Tooltip=Trajectoire actuellement sélectionnée +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Synchroniser les axes verticaux +TrackControl.Button.Trace.ToolTip=Afficher ou dissimuler les trajectoires +TToolBar.Button.Open.Tooltip=Ouvrir une vidéo ou un fichier Tracker dans un nouvel onglet +TToolBar.Button.Save.Tooltip=Enregistrer l'onglet sélectionné dans un fichier +TToolBar.Button.SelectTrack=Sélectionner +TToolBar.Button.SelectTrack.Tooltip=Sélectionner une trajectoire existante +TTrack.MenuItem.ClearSteps=Effacer les incréments +PointMass.MenuItem.Position=Position +TMenuBar.MenuItem.Empty=(Vide) +TTrackBar.Button.Memory=mémoire utilisée: +TTrackBar.Button.Memory.Tooltip=Surveiller et gérer la mémoire +TTrackBar.Memory.PopupItem.Launch=Démarrer Tracker avec la mémoire +TButton.Track.ToolTip=Déterminer les propriétés de +Tracker.Dialog.OutOfMemory.Message1=Tracker n'a plus suffisamment de mémoire. +Tracker.Dialog.OutOfMemory.Message2=Cliquer sur le bouton de mémoire pour les options. +Tracker.Dialog.OutOfMemory.Title=Manque de mémoire + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Chercher vers l'avant +AutoTracker.Label.Original=Initiale +AutoTracker.Label.NoMask=aucun +AutoTracker.Label.Rate=Taux d'Évolution: +AutoTracker.Info.Mask3=Conseil: le gabarit n'a pas à être grand ou à inclure tout l'objet. Une caractéristique unique ou possédant un haut degré de contraste est habituellement ce qu'il faut choisir. +AutoTracker.Wizard.Checkbox.XAxis=L'axe des x seulement +AutoTracker.Info.SearchOnAxis1=L'axe des x à l'intérieur du rectangle sera utilisé pour la concordance. Déplacer ou redimensionner la zone de recherche en glissant son centre ou l'ancrage, respectivement. +AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: +AutoTracker.Info.NoMatchOnAxis=Aucune concordance n'a été trouvée sur l'axe des x dans la zone de recherche. Vos options sont: +AutoTracker.Info.RetryOnAxis=--déplacer la zone de recherche ou l'axe des x et recommencer +AutoTracker.Wizard.Button.Delete=Effacer ce point +AutoTracker.Wizard.Button.DeleteMore=Effacer ce point et les suivants +Button.Define.Tooltip=Définir des fonctions sur les variables des colonnes existantes +Calibration.Label.Point=point +CalibrationStick.Hint=déterminer la longueur ou déplacer les extrémités pour fixer l'échelle, changer l'angle pour modifier l'orientation de l'axe +CalibrationStick.End.Hint=glisser pour changer l'échelle +CalibrationStick.New.Name=bâton de calibration +CalibrationTapeMeasure.New.Name=ruban de calibration +CalibrationTapeMeasure.Readout.Magnitude.Hint=cliquer pour insérer une longueur connue en unités globales +CalibrationTapeMeasure.Hint=fixer la longueur pour modifier l'échelle, fixer l'angle pour modifier l'orientation de l'axe +DynamicSystem.Data.Description.0=distance relative entre les particules +DynamicSystem.Data.Description.1=orientation relative +DynamicSystem.Data.Description.2=vitesse radiale relative +DynamicSystem.Data.Description.3=vitesse angulaire relative +ExportDataDialog.Subtitle.Table=Table de données +ExportDataDialog.Subtitle.Content=Cellules +ExportDataDialog.Subtitle.Format=Format de nombre +ExportDataDialog.Subtitle.Delimiter=Délimiteur +ExportDataDialog.Title=Exporter les données +ExportDataDialog.Delimiter.Add=Ajouter... +ExportDataDialog.Delimiter.Remove=Enlever... +ExportDataDialog.Content.AllCells=Toutes les cellules +ExportDataDialog.Content.SelectedCells=Cellules sélectionnées +ExportDataDialog.MenuItem.RemoveDelimiter=Enlever le délimiteur adapté +ExportDataDialog.Chooser.SaveData.Title=Enregistrer les données sous +ExportVideoDialog.Button.SaveAs=Enregistrer sous... +ExportVideoDialog.Button.FullSize=Pleine grandeur +ExportVideoDialog.Button.DrawnSize=Tel que dessiné +ExportVideoDialog.Content.VideoOnly=Vidéo seulement +ExportVideoDialog.Content.VideoAndGraphics=Vidéo et graphes +ExportVideoDialog.Content.GraphicsOnly=Graphes seulement +ExportVideoDialog.Title=Exporter la Vidéo +ExportVideoDialog.Label.ClipSettings=Propriétés de la vidéo +ExportVideoDialog.Subtitle.Size=Dimension +ExportVideoDialog.Subtitle.Content=Contenu +ExportVideoDialog.Subtitle.View=Vue +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=La vidéo a été enregistrée sous +ExportVideoDialog.Complete.Message2=Voulez-vous l'ouvrir dans Tracker maintenant? +ExportVideoDialog.Complete.Title=Exportation complétée +ExportVideoDialog.VideoSize=dimension de la vidéo +ExportVideoDialog.MatSize=dimension du cadre +ExportVideo.Dialog.HiddenPlots.Message=Les graphes doivent être complètement visibles pour être exportables. +ExportVideo.Dialog.HiddenPlots.Title=Vue incomplète +Footprint.DoubleTarget=croix double +Footprint.BoldDoubleTarget=croix double épaisse +OffsetOrigin.MenuItem.Fixed=Coordonnées globales fixes +ParticleModel.Dialog.Offscreen.Message1=Certains des incréments du modèle sont absents parce qu'ils sont hors du champ de l'écran. +ParticleModel.Dialog.Offscreen.Message2=Pour fixer ce problème, changer de modèle ou l'échelle de la vidéo. +ParticleModel.Dialog.Offscreen.Title=Hors limite +PrefsDialog.Tab.Configuration.Title=Configuration +PrefsDialog.Memory.BorderTitle=Taille de la mémoire +PrefsDialog.Tab.General.Title=Autre +PrefsDialog.RecentFiles.BorderTitle=Ouvrir le menu Récent +PrefsDialog.Label.RecentSize=Décompte de fichier +PrefsDialog.Hints.BorderTitle=Conseils +PrefsDialog.Button.Relaunch=Relancer maintenant +PrefsDialog.Button.ClearRecent=Effacer +PrefsDialog.Checkbox.DefaultSize=Utiliser la valeur par défaut +PrefsDialog.Checkbox.HintsOn=Par défaut, montrer les conseils +PrefsDialog.Tab.Video.Title=Vidéo +PrefsDialog.VideoPref.BorderTitle=Décrypteur Vidéo +PrefsDialog.Button.Xuggle=Xuggle (recommandé) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Le contrôle de la mémoire est impossible lorsque le démarrage se fait par le Web. +PrefsDialog.Dialog.WebStart.Title=Mode de démarrage Web +PrefsDialog.LookFeel.BorderTitle=Apparence +PrefsDialog.Language.BorderTitle=Langage +PrefsDialog.Upgrades.BorderTitle=Vérifier l'existence de mises à jour +PrefsDialog.Tab.Runtime.Title=Durée d'exécution +PrefsDialog.Tab.Display.Title=Affichage +PrefsDialog.Language.Default=par défaut +PrefsDialog.Upgrades.Always=Toutes les fois +PrefsDialog.Upgrades.Weekly=À chaque semaine +PrefsDialog.Upgrades.Monthly=À chaque mois +PrefsDialog.Upgrades.Never=Jamais +PrefsDialog.Button.CheckForUpgrade=Vérifier maintenant +PrefsDialog.Xuggle.Speed.BorderTitle=Lecture de Vidéo +PrefsDialog.Xuggle.Slow=Continue (peut être lente) +PrefsDialog.Xuggle.Fast=Rapide (peut être saccadée) +PrefsDialog.CalibrationTool.BorderTitle=Outil de Calibration par défaut +Protractor.Name=Rapporteur d'angle +Protractor.New.Name=rapporteur d'angle +Protractor.Hint=glisser les bras pour mesurer les angles +Protractor.Label.Angle=angle +Protractor.Field.Angle.Tooltip=angle entre les bras du rapporteur +Protractor.Vertex.Name=sommet +Protractor.Vertex.Hint=glisser pour déplacer le sommet +Protractor.End.Name=pointe du bras +Protractor.End.Hint=glisser pour tourner le bras +Protractor.Handle.Name=ancrage +Protractor.Handle.Hint=glisser pour déplacer le rapporteur +Protractor.Rotator.Name=rotateur +Protractor.Rotator.Hint=glisser pour tourner le rapporteur +Protractor.Readout.Name=lecture +Protractor.Readout.Hint=angle entre les bras du rapporteur +ProtractorFootprint.Circle3=petit cercle +ProtractorFootprint.Circle5=grand cercle +ProtractorFootprint.Circle3Bold=petit cercle épais +ProtractorFootprint.Circle5Bold=grand cercle épais +Stick.Name=Bâton de mesure +Stick.New.Name=bâton de mesure +TableTrackView.MenuItem.Unformatted=Pleine précision +TableTrackView.MenuItem.Formatted=Tel que mis en forme +TableTrackView.Menu.SetDelimiter=Fixer le délimiteur +TableTrackView.MenuItem.AddDelimiter=Ajouter... +TableTrackView.MenuItem.RemoveDelimiter=Enlever... +TableTrackView.Dialog.CustomDelimiter.Message=Insérer un chaîne de caractères servant de délimiteur: +TableTrackView.Dialog.CustomDelimiter.Title=Ajouter un délimiteur +TableTrackView.Header.Tooltip=cliquer pour classer ou double-clic pour sélectionner une colonne +TableTrackView.MenuItem.CopySelectedData=Copier les données sélectionnées +TableTrackView.Dialog.RemoveDelimiter.Message=Choisir le délimiteur à supprimer: +TableTrackView.Dialog.RemoveDelimiter.Title=Supprimer le délimiteur +TableTrackView.Radians.Tooltip=en radians +TableTrackView.Degrees.Tooltip=en degrés +TableTrackView.RadiansPerSecond.Tooltip=en rad/s +TableTrackView.DegreesPerSecond.Tooltip=en degrés/s +TableTrackView.RadiansPerSecondSquared.Tooltip=en rad/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=en degrés/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Supprimer la fonction de données +TActions.Action.SaveFrame=Enregistrer le contenu de l'onglet comme... +TActions.AboutVideo=Propriétés... +TActions.Dialog.AboutVideo.Title=Propriétés vidéo +TActions.Dialog.AboutVideo.Type=Type +TActions.Dialog.AboutVideo.Size=Dimensions +TActions.Dialog.AboutVideo.Length=Longueur +TActions.Dialog.AboutVideo.Frames=images +TActions.Dialog.AboutVideo.Seconds=secondes +TActions.Dialog.AboutVideo.FrameRate=Vitesse de lecture +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Chemin +TActions.Action.ImportTRK=Tracker Fichier... +TActions.Action.ProtractorVisible=Visible +TapeMeasure.MenuItem.FixedLength=Longueur fixe +TextTView.Label.NoTab=Afficher le texte et les pages HTML ici. +TextTView.NewTab.Text1=Double-clic pour modifier le texte ou le titre. Clic-droit pour plus d'options. +TextTView.NewTab.Text2=Pour afficher une page HTML, insérer l'adresse url ou faire clic-droit pour ouvrir un fichier. +TextTView.NewTab.Title=Sans nom +TextTView.Dialog.TabTitle.Title=Fixer le titre +TextTView.MenuItem.OpenHTML=Ouvrir HTML... +TextTView.MenuItem.SetTitle=Fixer le titre... +TextTView.Button.NewTab=Nouveau +TextTView.TextEdit.Description=Texte +TFrame.Dialog.FileNotFound.Message=Le fichier n'a pas été trouvé: +TFrame.Dialog.FileNotFound.Title=Fichier non trouvé +TFrame.View.Text=Vue texte/HTML +TFrame.View.Main=Vue principale +TMenuBar.Menu.OpenRecent=Ouvrir récent +TMenuBar.Menu.Import=Importer +TMenuBar.Menu.Export=Exporter +TMenuBar.MenuItem.Video=Vidéo... +TMenuBar.MenuItem.Data=Fichier de données... +TMenuBar.Menu.CopyObject=Copier l'objet +TMenuBar.MenuItem.Coords=Système de coordonnées +TMenuBar.MenuItem.VideoClip=Séquence vidéo +TMenuBar.Menu.MeasuringTools=Outils de mesure +TMenuBar.Menu.AngleUnits=Unités des angles +TMenuBar.MenuItem.Degrees=Degrés +TMenuBar.MenuItem.Radians=Radians +Tracker.Dialog.NoXuggle.Title=Xuggle n'a pas été trouvé +Tracker.Dialog.NoXuggle.Message1=Xuggle (un moteur d'analyse de vidéos pour toutes plateformes) n'est pas installé. +Tracker.Dialog.NoXuggle.Message2=Télécharger Xuggle à partir de http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=À propos de Xuggle... +Tracker.Dialog.AboutXuggle.Title=À propos de Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Version de Xuggle +Tracker.Dialog.AboutXuggle.Message.Home=Emplacement de Xuggle: +Tracker.Dialog.AboutXuggle.Message.Path=Chemin d'accès Xuggle +Tracker.Dialog.NoVideoEngine.Message1=Aucun analyseur vidéo n'a été trouvé! Sans cet analyseur, Tracker ne peut +Tracker.Dialog.NoVideoEngine.Message2=qu'ouvrir des images, des séquences d'images et des GIF animés. +Tracker.Dialog.NoVideoEngine.Message3=Pour installer Xuggle, qui est l'analyseur vidéo préféré de Tracker sur toutes les plateformes, +Tracker.Dialog.NoVideoEngine.Message4=télécharger la plus récente version du fichier d'installation de Tracker à partir de +Tracker.Dialog.NoVideoEngine.Title=Aucun analyseur vidéo +Tracker.Dialog.NoXuggle.Message1=Xuggle, l'analyseur vidéo préféré de Tracker n'est pas encore installé. +Tracker.Dialog.NoXuggle.Message2=Pour installer Xuggle, télécharger la plus récente version du fichier d'installation de Tracker à partir de +Tracker.Dialog.NoXuggle.Title=Xuggle manquant +Tracker.About.DefaultLocale=Locale par défaut +Tracker.About.CurrentLanguage=Langue +Tracker.Dialog.InsufficientMemory.Title=Mémoire insuffisante +Tracker.Dialog.InsufficientMemory.Message=La mémoire nécessaire est trop grande. +TrackerIO.Dialog.TabMustBeSaved.Message1=Onglet +TrackerIO.Dialog.TabMustBeSaved.Message2=doit être enregistré comme un fichier Tracker pour être inclus dans un ensemble d'onglets. +TrackerIO.Dialog.TabMustBeSaved.Message3=Désirez-vous l'enregistrer? +TrackerIO.Dialog.TabMustBeSaved.Title=Contenu d'onglet non enregistré +TrackerIO.Dialog.NoTabs.Message=Il n'y a aucun onglet à enregistrer! +TrackerIO.Dialog.NoTabs.Title=Ensemble d'onglets vide +TrackerIO.Dialog.SaveTabset.Title=Enregistrer l'ensemble d'onglets +TrackerIO.Dialog.SaveTab.Title=Enregistrer le contenu de l'onglet +TrackerIO.Delimiter.Tab=Onglet +TrackerIO.Delimiter.Space=Espace +TrackerIO.Delimiter.Comma=Virgule +TrackerIO.Delimiter.Semicolon=Point-virgule +TrackerIO.VideoAndDataFileFilter.Description=Fichiers vidéo et Tracker +TrackerPanel.Dialog.Version.Message1=Vous êtes à ouvrir un fichier créé par Tracker +TrackerPanel.Dialog.Version.Message2=qui pourrait faire référence à des fonctionnalités +TrackerPanel.Dialog.Version.Message3=qui n'existent pas dans la version que vous utiliser +TrackerPanel.Dialog.Version.Message4=La dernière version de Tracker est disponible au +TrackerPanel.Dialog.Version.Title=Incompatibilité de version +TrackerPanel.Label.ModelStart=Départ +TrackerPanel.Label.ModelEnd=Fin +TrackerPanel.Spinner.ModelStart.Tooltip=Fixer l'image de départ à partir de ce modèle +TrackerPanel.Spinner.ModelEnd.Tooltip=Fixer l'image finale à partir de ce modèle +TToolbar.Button.ProtractorVisible.Tooltip=Afficher ou masquer le rapporteur +TToolbar.Button.AxesVisible.Tooltip=Afficher ou masquer le système d'axes +TToolBar.Button.TrackControl.Tooltip=Afficher ou masquer les contrôles de trajectoire +TTrack.Dialog.StepSizeWarning.Message1=Attention: certaines trajectoires ont été analysées en sautant des images (décompte supérieur à 1). +TTrack.Dialog.StepSizeWarning.Message2=Modifier le décompte, en lui donnant une valeur supérieure à 1, entraîne la présence de lacunes dans l'ensemble des données. +TTrack.Dialog.StepSizeWarning.Message3=Les vitesses et les accélérations ne peuvent être déterminées autour des lacunes de données, tant que toutes les images n'ont pas été analysées. +TTrack.Dialog.StepSizeWarning.Title=Attention +TTrack.Dialog.SkippedStepWarning.Message1=Attention: omettre des images lors du marquage des positions entraîne la présence de lacunes dans l'ensemble des données. +TTrack.Dialog.SkippedStepWarning.Title=Attention +TTrack.Dialog.SkippedStepWarning.Checkbox=Ne plus afficher ceci +TTrack.Locked.Hint=verrouillé +TTrack.AngleField.Radians.Tooltip=angle en radians +TTrack.AngleField.Degrees.Tooltip=angle en degrés +TTrack.AngleField.Popup.Radians=Basculer en Radians +TTrack.AngleField.Popup.Degrees=Basculer en Degrés +TTrackBar.Memory.Menu.SetSize=Déterminer la taille de la mémoire disponible... +TTrackBar.Button.Version=Maintenant disponible: version +TTrackBar.Popup.MenuItem.Upgrade=Mettre à niveau maintenant... +TTrackBar.Popup.MenuItem.Ignore=Ignorer +XuggleVideo.MenuItem.SmoothPlay=Lecture graduelle (peut être lente) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Ruban de Calibration +CircleFootprint.Circle=cercle +CircleFootprint.FilledCircle=cercle plein +CircleFootprint.Dialog.Title=empreinte du cercle +CircleFootprint.Dialog.Label.Radius=Rayon +CircleFootprint.Dialog.Checkbox.Bold=Gras +CircleFootprint.Dialog.Checkbox.CenterSpot=Point central +LineProfile.Hint.Marking=glisser la souris pour marquer le profil de ligne +PageTView.Button.Page=Page +PageTView.MenuItem.ClosePage=Fermer la page +PointMass.Hint.Marking=cliquer pour marquer, la touche Entrée permet de cloner l'incrément précédent +PrefsDialog.Dialog.NewVersion.Title=Mises à jour +PrefsDialog.Dialog.NewVersion.Message1=Version +PrefsDialog.Dialog.NewVersion.Message2=est maintenant disponible au +PrefsDialog.Dialog.NewVersion.None.Message=Il n'existe pas de version plus récente en ce moment. +RGBRegion.Hint.Marking=cliquer pour marquer le centre de la zone +TMenuBar.MenuItem.Restore=Restaurer +TrackControl.StretchVectors.None=Aucun étirement +TViewChooser.Maximize.Tooltip=Agrandir cette vue au maximum +TViewChooser.Restore.Tooltip=Restaurer les vues +Vector.Hint.Marking=cliquer pour marquer, la touche Entrée permet de cloner l'incrément précédent +WorldTView.Button.World=Globale + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Avertissements +PrefsDialog.Checkbox.WarnIfNoEngine=Aucun analyseur vidéo +PrefsDialog.Checkbox.WarnIfXuggleError=Erreurs non fatales de Xuggle +PropertiesDialog.Title=Propriétés +PropertiesDialog.Label.Author=Auteur +PropertiesDialog.Label.Contact=Contact +TActions.Action.Properties=Propriétés... +TActions.Action.OpenBrowser=Ouvrir le fureteur de librairie... +TFrame.Progress.Xuggle=Xuggle est en train de charger les images +TFrame.Progress.ClickToCancel=(cliquer pour annuler) +TFrame.Dialog.StalledVideo.Title=Il y a eu une erreur en chargeant la vidéo +TFrame.Dialog.StalledVideo.Message0=La vidéo s'est bloquée en chargeant. Ceci est peut-être temporaire. +TFrame.Dialog.StalledVideo.Message1=Vous pouvez arrêter le chargement ou continuer d'attendre. +TFrame.Dialog.StalledVideo.Message2=Les autres options pour ouvrir cette vidéo sont: +TFrame.Dialog.StalledVideo.Message3=1. Utiliser un convertisseur vidéo pour la traduire dans un autre format. +TFrame.Dialog.StalledVideo.Message4=2. Choisir QuickTime dans le sélecteur de fichiers ou dans les préférences. +TFrame.Dialog.StalledVideo.MessageMac=2. Démarrer Tracker avec Java VM 32-bit et ouvrir avec QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Arrêter +TFrame.Dialog.StalledVideo.Button.Wait=Attendre +Tracker.Dialog.NoVideoEngine.Checkbox=Ne plus afficher ce message +TrackerIO.ZipFileFilter.Description=Fichiers ZIP +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle a recontré cette erreur en tentant d'ouvrir cette vidéo: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Toutes les erreurs ne sont pas fatales. Pour obtenir les messages d'erreur complets, choisissez Aide|Historique des messages. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Si Xuggle ne peut y parvenir, vous pourriez peut-être ouvrir la vidéo avec QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: Sur Mac OSX, Tracker fonctionne avec Java VM 32-bit. +TrackerIO.Dialog.ErrorFFMPEG.Title=Erreur Xuggle +TrackerIO.ErrorFFMPEG.LogMessage=Pour plus de détails, lancer les messages d'alerte Xuggle dans les préférences (Édition|Préférences). +TToolBar.Button.OpenBrowser.Tooltip=Ouvrir le fureteur de la librairie digitale OSP + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=Fichier non trouvé +TFrame.Dialog.NoTRKInComPADRE.Message=Aucun fichier Tracker trouvé pour le noeud + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Particule Cinématique +DynamicParticle.Builder.Title=Particule Dynamique (Cartésien) +DynamicParticlePolar.Builder.Title=Particule Dynamique (Polaire) +DynamicSystem.Builder.Title=Système Dynamique (Interne) +PropertiesDialog.Button.CopyFilePath=Copier le chemin d'accès du fichier +PropertiesDialog.Button.CopyVideoPath=Copier le chemin d'accès de la vidéo +PropertiesDialog.Tab.TrackerFile=Fichier Tracker +PropertiesDialog.Tab.Metadata=Métadonnées +PropertiesDialog.Header.Property=Propriétés +PropertiesDialog.Header.Value=Valeur +TActions.Action.OpenURL=Ouvrir URL... +TActions.Dialog.OpenURL.Title=Ouvrir URL +TActions.Dialog.OpenURL.Message=Insérer le URL d'une vidéo disponible sur le web, d'un fichier Tracker ou d'un fichier Tracker compressé +TActions.Dialog.AboutVideo.Name=Nom + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Fichiers Web en cache +PrefsDialog.Button.ClearCache=Effacer + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, maj-clic pour marquer à nouveau la zone mise en évidence +PointMass.Remarking.Hint=cliquer pour marquer à nouveau +PointMass.PositionSelected.Hint=glisser ou insérer la position dans la barre d'outils +PointMass.VectorSelected.Hint=glisser pour déplacer +Vector.Remark.Hint=maj-clic pour marquer à nouveau +Vector.TipSelected.Hint=glisser ou insérer la position dans la barre d'outils +Vector.HandleSelected.Hint=glisser pour déplacer +Vector.Remarking.Hint=cliquer pour marquer à nouveau +AutoTracker.Label.Search=Chercher +AutoTracker.Label.Target=Cible +AutoTracker.Label.Frame=Image +AutoTracker.Label.Point=Point +AutoTracker.Label.Template=Gabarit +AutoTracker.Label.Track=Trajectoire +AutoTracker.Label.Match=Concordance +AutoTracker.Label.NoTemplate=Pas de gabarit +AutoTracker.Label.EvolutionRate=Taux d'évolution +AutoTracker.Label.Automark=Repérage automatique +AutoTracker.Info.Instructions=Cliquer sur le bouton de recherche pour obtenir la concordance dans la zone affichée. +AutoTracker.Info.KeyFrame.Instructions1=Cette image clé définit le gabarit et la cible. Cliquer sur le bouton de recherche pour obtenir la concordance. +AutoTracker.Info.KeyFrame.Instructions2=On peut déplacer en glissant, la cible, le gabarit ou la zone de recherche, pour en changer la position ou les dimensions. +AutoTracker.Info.MouseOver.Instructions=Glisser la souris au-dessus des contrôles pour découvrir les propriétés et les ajustements. +AutoTracker.Info.Mask1=Le gabarit correspond à ce que l'on cherche à faire concorder. Le processus débute avec une image-clé qui évolue pour s'adapter aux changements de forme et de couleur. +AutoTracker.Info.Mask2=Le niveau de repérage automatique est la valeur minimale de concordance nécessaire au marquage automatique. +AutoTracker.Info.Mask.Instructions=Déplacer ou modifier la taille du gabarit en glissant les bords ou les ancrages de coin (image-clé seulement). Ajuster le taux d'évolution et le niveau de repérage automatique à partir des menus déroulants. +AutoTracker.Info.Mask.Tip=Un faible niveau de repérage auotmatique entraîne de fausses concordances. Essayer plutôt d'augmenter le taux d'évolution. +AutoTracker.Info.Search=La zone de recherche est analysée afin de trouver la meilleure concordance. +AutoTracker.Info.SearchOnAxis=On analyse l'axe des x dans la zone de recherche pour la meilleure concordance. +AutoTracker.Info.Search.Instructions=Déplacer ou modifier la taille du gabarit en glissant les bords ou les ancrages de coin. Déterminer l'axe des x et les conditions d'analyse en cliquant les cases. +AutoTracker.Info.Search.Tip=Dans la plupart des cas, la zone de recherche n'a pas à être grande. Les options de recherche automatique déplacent cette zone là où une meilleure concordance est prédite. +AutoTracker.Info.Target=La cible correspond à l'endroit où le point de cible est marqué. +AutoTracker.Info.Target.Instructions=Déplacer la cible en la faisant glisser (image-clé seulement). Choisir la trajectoire à partir des listes déroulantes. +AutoTracker.Info.Title.Settings=Ajustements +AutoTracker.Info.Title.Tip=Conseil +AutoTracker.Info.SelectTrack=Choisir ou créer la trajectoire ou le point pour lequel on veut le repérage automatique. +AutoTracker.Info.OutsideXAxis=L'axed des x ne traverse pas la zone de recherche. Vos options sont: +AutoTracker.Info.NewKeyFrame=--revener en arrière et changer le taux d'évolution ou maj-ctrl-clic pour définir une nouvelle image-clé +AutoTracker.Info.Replace=--accepter la concordance et remplacer le point existant +AutoTracker.Info.Keep=--conserver le point existant +AutoTracker.Info.PossibleReplace=Une possible concordance a été trouvée pour remplacer le point existant. Vos options sont: +AutoTracker.Wizard.Button.Accept=Accepter +AutoTracker.Wizard.Button.Stop=Arrêter +AutoTracker.Wizard.Button.Skip=Sauter +AutoTracker.Wizard.Button.Replace=Remplacer +AutoTracker.Wizard.Button.Keep=Conserver +AutoTracker.Wizard.Button.Search=Chercher +AutoTracker.Wizard.Button.SearchThis=Chercher ceci +AutoTracker.Wizard.Button.SearchNext=Chercher suivant +AutoTracker.Wizard.Button.Delete=Effacer +AutoTracker.Wizard.Button.ShowKeyFrame=Afficher l'image-clé +AutoTracker.Wizard.Button.DeleteKeyFrame=Effacer l'image-clé +AutoTracker.Wizard.Checkbox.LookAhead=Regarder plus avant +AutoTracker.Wizard.Checkbox.XAxis=axe des x seulement +AutoTracker.Wizard.Menuitem.DeleteThis=Ce point +AutoTracker.Wizard.Menuitem.DeleteLater=Les points qui viennent après +AutoTracker.Wizard.Menuitem.DeleteAll=Tous les points +TToolBar.Button.AutoTracker.Tooltip=Afficher ou masquer l'outil de repérage automatique +MainTView.Popup.MenuItem.ZoomIn=Agrandir l'échelle +MainTView.Popup.MenuItem.ZoomOut=Diminuer l'échelle +MainTView.Popup.MenuItem.ZoomToFit=Ajuster l'échelle +TrackerIO.Dialog.DurationVaries.Title=Durée variable d'image +TrackerIO.Dialog.DurationVaries.Message1=Cette vidéo inclut des images dont la durée varie, par rapport à la valeur moyenne, par plus de +TrackerIO.Dialog.DurationVaries.Message2=Pour des valeurs plus précises de vitesse et d'accélération, vous devriez exclure ces images des +TrackerIO.Dialog.DurationVaries.Message3=calculs en modifiant l'image de départ et l'image finale de la vidéo. +TrackerIO.Dialog.DurationVaries.Message4=Images à exclure: +TrackerIO.Dialog.DurationVaries.Message5=Durée moyenne et taux de lecture si exclus: +TFrame.Dialog.LibraryError.Title=Erreur +TFrame.Dialog.LibraryError.Message=Aucune ressource n'a pu être chargée pour le noeud + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=maj-clic pour marquer +PrefsDialog.Label.Path=Chemin +PrefsDialog.Checkbox.ClearCacheOnExit=Effacer en quittant +PrefsDialog.FileChooser.Title.Cache=Déterminer le cache +PrefsDialog.FileFilter.Directories=Dossiers +Tracker.Action.AboutThreads=À propos des chemins d'accès... +PrefsDialog.JRE.BorderTitle=Machine Virtuelle Java (JVM) +PrefsDialog.FileChooser.Title.JRE=Déterminer Java VM +PrefsDialog.FileFilter.JRE=Dossiers et Java VMs +PrefsDialog.Version.BorderTitle=Version de Tracker +PrefsDialog.Version.Default=par défaut +PrefsDialog.Tab.ClearCacheOnExit=Effacer en quittant +PrefsDialog.Run.BorderTitle=Logiciels exécutés au démarrage +PrefsDialog.FileChooser.Title.Run=Choisir un fichier exécutable +PrefsDialog.Button.Save=Enregistrer +Tracker.Readme=Tracker Lisez-moi (README) +Tracker.Readme.NotFound= Fichier Lisez-moi (README) non trouvé +Popup.MenuItem.Algorithm=Algorithmes... +AlgorithmDialog.Button.FiniteDifference=Différence finie +AlgorithmDialog.Button.BounceDetect=Détection du rebond +AlgorithmDialog.TitledBorder.Choose=Choisir l'algorithme nécessaire au calcul des vitesses et des accélérations: +AlgorithmDialog.Title=Algorithmes +AlgorithmDialog.FiniteDifference.Message1=Ceci est l'algorithme par défaut. +AlgorithmDialog.FiniteDifference.Message2=Vitesse: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Accélération: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Cette algorithme améliore le calcul des vitesses et des accélérations tout en détectant les variations soudaines de vitesse. +AlgorithmDialog.BounceDetect.Message2=Attention: peut produire des artéfacts. Pour plus d'informations, voir: +AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title==XML invalide +Tracker.Dialog.Invalid.Message=Le fichier n'a pu être lu. +TrackPlottingPanel.Popup.Menu.CompareWith=Comparer avec +TrackerPanel.DataBuilder.TrackType.Unknown=inconnu +TrackerPanel.DataBuilder.Button.Load.Tooltip=Charger les fonctions de données à partir du fichier XML +TrackerPanel.DataBuilder.Button.Save.Tooltip=Enregistrer les fonctions de données dans un fichier XML +TrackerPanel.DataBuilder.Load.Title=Charger les fonctions de données +TrackerPanel.DataBuilder.Load.Message=Choisir les fonctions à charger: +TrackerPanel.DataBuilder.Save.Title=Enregistrer les fonctions de données +TrackerPanel.DataBuilder.Save.Message=Sélectionner les fonctions à enregistrer: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Charger dans tout +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Charger seulement dans +TrackerPanel.DataBuilder.Dialog.Load.Title=Sélection des trajectoires +TrackerPanel.DataBuilder.Dialog.Load.Message=Désirez-vous charger les fonctions dans toutes les trajectoires de type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Type incorrect de trajectoire +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Ce fichier définit des fonctions de données pour les trajectoires de type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Ne peut être chargé dans le type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Type incorrect +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Ce fichier ne contient aucune définition de fonctions de données. +TToolbar.Button.Refresh=Rafraîchir les données et les vues + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=Le nouvel onglet a été enregistré sous +ExportTRKDialog.Complete.Message2=Désirez-vous l'ouvrir dans Tracker maintenant? +ExportTRKDialog.Complete.Title=Exportation complétée +ExportTRKDialog.Title=Exporter l'onglet sélectionné +ExportTRKDialog.Message1=Ceci (1) exporte la séquence vidéo, (2) convertit les données de l'onglet pour concorder avec la vidéo exportée, et (3) sauvegarde l'onglet converti comme un nouveau fichier Tracker. +ExportTRKDialog.Message2=Le fichier Tracker et le fichier vidéo sont enregistrés dans le même dossier avec le même nom, mais avec différentes extensions. +TMenuBar.MenuItem.TabClip=Onglet sélectionné +TrackerIO.Dialog.DurationVaries.Button.SetClip=Déterminer la séquence recommandée +TrackerIO.Dialog.DurationVaries.Start=Début +TrackerIO.Dialog.DurationVaries.End=fin +TrackerIO.Dialog.DurationVaries.Recommended=Séquence recommandée +TMenuBar.Menu.CalibrationTools=Outils de calibration + +# Additions by Doug Brown 2012-05-07 +Protractor.Data.Description.0=temps +Protractor.Data.Description.1=angle du rapporteur +Protractor.Data.Description.2=longueur du bras 1 +Protractor.Data.Description.3=longueur du bras 2 +Protractor.Data.Description.4=numéro de l'incrément +Protractor.Data.Description.5=numéro de l'image +TapeMeasure.Data.Description.0=temps +TapeMeasure.Data.Description.1=longueur +TapeMeasure.Data.Description.2=angle mesuré à partir de l'axe des x positifs +TapeMeasure.Data.Description.3=numéro de l'incrément +TapeMeasure.Data.Description.4=numéro de l'image +AttachmentInspector.Title=Lier les fins +AttachmentInspector.Label.End=fin +AttachmentInspector.Label.Vertex=Sommet +AttachmentInspector.Header.PointName=Nom +AttachmentInspector.Header.AttachedTo=Lier à +MeasuringTool.MenuItem.Attach=Lier les fins... +PerspectiveTrack.Corner=coin +ExportTRKDialog.Label.VideoFormat=Format de video +PrefsDialog.LogLevel.BorderTitle=Niveau de suivi du message de démarrage + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=non cherché +AutoTracker.Info.KeyFrame=Image-clé +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Cette image-clé +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Cette concordance +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Les concordances ultérieures +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Repérage automatique +Dialog.Button.Add=Ajouter +Dialog.Button.Remove=Enlever +PrefsDialog.Button.ClearHost=Libérer l'hôte +PrefsDialog.Button.ClearHost.Tooltip=supprimer tous les fichiers associés au site web hôte de la mémoire cache "OSP" +PrefsDialog.Button.ClearCache.Tooltip=supprimer tous les fichiers du cache "OSP" +TActions.Action.SaveZip=Exporter la ressource ZIP +ThumbnailDialog.Title=Exporter l'image miniature +ThumbnailDialog.Settings.Title=Options de la miniature +ThumbnailDialog.Label.CurrentImage=Image sélectionnée +ThumbnailDialog.Label.FrameNumber=cadre +ThumbnailDialog.Label.StepNumber=incrément +ThumbnailDialog.View.VideoOnly=Vidéo seulement +ThumbnailDialog.View.MainView=Vue principale +ThumbnailDialog.View.WholeFrame=Cadre entier +ThumbnailDialog.Format.PNG=Image PNG +ThumbnailDialog.Format.JPG=Image JPEG +ThumbnailDialog.Chooser.SaveThumbnail.Title=Enregistrer la miniature +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Image miniature +TToolBar.Button.SaveZip.Tooltip=Exporter une ressource ZIP pour le fureteur de la bibliothèque digitale OSP (OSP Digital Library Browser) +TTrack.MenuItem.DeletePoint=Supprimer l'incrément sélectionné +ZipResourceDialog.Title=Exporter la ressource ZIP +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Nom +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Mots-clés +ZipResourceDialog.Label.Link=Lien externe +ZipResourceDialog.Label.HTML=Source HTML +ZipResourceDialog.Complete.Message1=La ressource ZIP a été enregistrée sous +ZipResourceDialog.Complete.Message2=Désirez-vous ouvrir la ressource ZIP dans Tracker maintenant? +ZipResourceDialog.Complete.Title=Réussi +ZipResourceDialog.Border.Title.Documentation=Documentation HTML +ZipResourceDialog.Border.Title.Video=Vidéo +ZipResourceDialog.Border.Title.Thumbnail=Miniature +ZipResourceDialog.FileChooser.SaveZip.Title=Exporter la ressource ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Ajouter le fichier à la ressource ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Ouvrir le fichier HTML +ZipResourceDialog.Button.AddFiles=Ajouter les fichiers +ZipResourceDialog.Button.ThumbnailSettings=Options de la miniature +ZipResourceDialog.Checkbox.TrimVideo=Réduire au clip +ZipResourceDialog.AddHTMLInfo.Title=Ajouter l'information HTML au fichier +ZipResourceDialog.AddHTMLInfo.Message1=Désirez-vous ajouter l'information HTML au fichier +ZipResourceDialog.AddHTMLInfo.Message2=à la ressource ZIP? +ZipResourceDialog.HTMLField.DefaultText=Si aucun n'est spécifié, un nouveau fichier sera créé +ZipResourceDialog.Dialog.AddFiles.Title=Ajouter les fichiers HTML et PDF +ZipResourceDialog.Tooltip.HTML=Chemin d'accès au fichier source HTML (si aucun n'est spécifié, un nouveau fichier sera créé) +ZipResourceDialog.Tooltip.Author=Auteurs de cette ressource +ZipResourceDialog.Tooltip.Title=Afficher le nom de cette ressource (pas le nom du fichier) +ZipResourceDialog.Tooltip.Description=Une description utile de cette ressource +ZipResourceDialog.Tooltip.Keywords=Une liste de mots-clés pour la recherche à l'aide du fureteur DL +ZipResourceDialog.Tooltip.Contact=Information permettant de contacter l'auteur (institution, courriel, site web, etc.) +ZipResourceDialog.Tooltip.Link=URL vers un fichier HTML externe permettant d'obtenir plus d'information sur cette ressource +ZipResourceDialog.Tooltip.ThumbnailSettings=Modifier la miniature, ses dimensions ou le type de fichier +ZipResourceDialog.Tooltip.AddFiles=Ajouter les informations HTML et PDF à la ressource ZIP +ZipResourceDialog.Tooltip.TrimVideo=Cocher pour exporter le clip vidéo, décocher afin d'utiliser la vidéo originale +ZipResourceDialog.Tooltip.LoadHTML=Utiliser un navigateur de fichiers pour charger le HTML dans un fichier diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties index 27450a63..882fc366 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties @@ -1,1273 +1,1273 @@ -# This is the indonesian language tracker_in.properties file -# Translated by Wachid Qomaruddin 2013 - -Calibration.Name=Kalibrasi -Calibration.New.Name=Kalibrasi -CenterOfMass.Name=Pusat Massa -CenterOfMass.New.Name=Pusat Massa -CenterOfMass.MenuItem.Inspector=Pilih Massa -CenterOfMassInspector.Title=Pusat Mssa -CenterOfMassInspector.Border.Title=Pilih Massa -ConfigInspector.Border.Title=Pilih Item Yang Di Inginkan -ConfigInspector.Title=Preferensi -ConfigInspector.Button.SaveAsDefault=Simpan Sebagai Default -CoordAxes.Name=Sumbu Koordinat -CoordAxes.New.Name=Sumbu Koordinat -Dialog.Button.Cancel=Batal -Dialog.Button.OK=OK -Dialog.Button.Close=Tutup -Dialog.Button.All=Semua -Dialog.Button.None=Non -Dialog.Button.Copy=Salin -Dialog.Button.Update=Update -Dialog.Button.SelectAll=Pilih Semua -Footprint.Diamond=Berlian -Footprint.BoldDiamond=Berlian Tebal -Footprint.SolidDiamond=Berlian Tipis -Footprint.Triangle=Segitiga -Footprint.BoldTriangle=Segitiga Tebal -Footprint.SolidTriangle=Segitiga Tipis -Footprint.Circle=Lingkaran -Footprint.BoldCircle=Lingkaran Tebal -Footprint.SolidCircle=Lingkaran Tipis -Footprint.VerticalLine=Garis Vertikal -Footprint.BoldVerticalLine=Garis Vertikal Tebal -Footprint.HorizontalLine=Garis Horisontal -Footprint.BoldHorizontalLine=Garis Horisontal Tebal -Footprint.Crosshair=Salib -Footprint.BoldCrosshair=Salib Tebal -Footprint.SimpleAxes=Sumbu Sederhana -Footprint.BoldSimpleAxes=Sumbu Sederhana Tebal -Footprint.Spot=Noda -Footprint.Line=Garis -Footprint.BoldLine=Garis Tebal -Footprint.Outline=Garis Luar -Footprint.BoldOutline=Garis Luar Tebal -Footprint.Arrow=Anak Panah -Footprint.BoldArrow=Anak Panah Tebal -Footprint.DoubleArrow=Anak Panah Ganda -Footprint.BoldDoubleArrow=Anak Panah Ganda Tebal -Footprint.2xArrow=Anak Panah 2x -Footprint.Bold2xArrow=Anak Panah Tebal 2x -Footprint.4xArrow=Anak Panah 4x -Footprint.Bold4xArrow=Anak Panah Tebal 4x -Footprint.DashArrow=Anak Panah Terpisah -Footprint.BoldDashArrow=Anak Panah Terpisah Tebal -Footprint.BigArrow=Anak Panah Besar -Footprint.BigDashArrow=Anak Panah Besar Terpisah -LineProfile.Name=Profil Garis -LineProfile.New.Name=Profil -LineProfile.Data.Brightness=Ketajaman -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=Merah -LineProfile.Data.Green=Hijau -LineProfile.Data.Blue=Biru -LineProfile.Data.Weighting=Berat -MainTView.Popup.MenuItem.QTPlayer=Memainkan QuickTime -MainTView.Popup.MenuItem.Zoom=Pembesaran -MainTView.Popup.MenuItem.ToFit=Sesuai -OffsetOrigin.Name=Penyesuaian Awal -OffsetOrigin.New.Name=Penyesuaian -PlotTrackView.Button.PlotCount=Plot -PlotTrackView.Button.PlotCount.ToolTip=Pilih Bilangan Plot -PointMass.Name=Titik Massa -PointMass.New.Name=Massa -PointMass.MenuItem.VectorsToPosition=Vektor Posisi -PointMass.MenuItem.Velocity=Kecepatan -PointMass.MenuItem.Acceleration=Percepatan -Star.Name=Bintang -Star.New.Name=Bintang -TableTrackView.Action.CopyData=Salin Data -TableTrackView.Button.SelectTableData=Data -TableTrackView.Button.SelectTableData.ToolTip=Pilih Data -TableTrackView.Popup.MenuItem.Analyze=Analisis -TableTrackView.Dialog.Border.Title=Tunjukkan: -TActions.Action.Description=Deskripsi -TActions.Action.ClearTracks=Bersihkan -TActions.Action.NewTab=Tab Baru -TActions.Action.Copy=Salin -TActions.Action.Paste=Letakkan -TActions.Action.Open=Buka -TActions.Action.Close=Tutup -TActions.Action.Import=Impor -TActions.Action.Save=Simpan -TActions.Action.SaveAs=Simpan Sebagai -TActions.Action.Export=Ekspor -TActions.Action.CaptureVideo=Tangkap Video -TActions.Action.Delete=Hapus -TActions.Action.Config=Preferensi -TActions.Action.AxesVisible=Tampak -TActions.Action.TapeVisible=Tampak -TActions.Action.Print=Cetak -TActions.Action.ClearFilters=Bersihkan -TActions.Action.ImportVideo=Impor Video -TActions.Action.CloseVideo=Tutup Video -TActions.Action.CloseAll=Tutup Semua -TActions.Action.Exit=Keluar -TActions.Dialog.PrintError.Message=Terjadi Error Dalam Pencetakan -TActions.Dialog.PrintError.Title=Pencetakan Error -TActions.Dialog.Description.Title=Deskripsi: -TActions.Dialog.DeleteLockedTracks.Message=Lokasi trek yang sama.Bagaimanapun dihapus? -TActions.Dialog.DeleteLockedTracks.Title=Hapus Lokasi Trek? -TActions.Dialog.NewPointMass.Title=Titik Massa Baru -TapeMeasure.Name=Pita Pengukur -TapeMeasure.New.Name=Pita Pengukur -TapeMeasure.MenuItem.Fixed=Tetap -TFrame.View.Plot=Tampilan Plot -TFrame.View.Table=Tabel Plot -TFrame.View.World=Tampilan Objek -TFrame.View.Video=Tampilan Video -TFrame.Dialog.Help.Title=Panduan -TMenuBar.Menu.File=Berkas -TMenuBar.Menu.Edit=Pembenahan -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Trek -TMenuBar.Menu.Coords=Sumbu Koordinat -TMenuBar.Menu.Window=Jendela Trek -TMenuBar.Menu.Help=Info Tracker -TMenuBar.MenuItem.EditProperties=Properti -TMenuBar.MenuItem.VideoVisible=Ketampakan Video -TMenuBar.MenuItem.VideoFilters=Filter Video -TMenuBar.MenuItem.NewVideoFilter=Filter Video Baru -TMenuBar.MenuItem.NewTrack=Trek Baru -TMenuBar.MenuItem.CoordsLocked=Sumbu Koordinat Berlokasi -TMenuBar.MenuItem.CoordsFixedOrigin=Pastikan Sumbu Koordinat Awal -TMenuBar.MenuItem.CoordsFixedAngle=Pastikan Sumbu Koordinat Sudut -TMenuBar.MenuItem.CoordsFixedScale=Pastikan Sumbu Koordinat Skala -TMenuBar.MenuItem.CoordsRefFrame=Referensi Frame -TMenuBar.MenuItem.CoordsDefault=Default -TMenuBar.MenuItem.WindowRight=Tampilan Plot Pengetrekkan -TMenuBar.MenuItem.WindowBottom=Pengetrekkan Video Bawah -TMenuBar.MenuItem.PlayAllSteps=Mainkan semua Langkah -TMenuBar.MenuItem.Record=Rekam -TMenuBar.MenuItem.MatSize=Ukuran Tampilan Video -TMenuBar.MenuItem.Language=Pilihan Bahasa -TMenuBar.MenuItem.DeleteTrack=Hapus -TMenuBar.MenuItem.TrackerHelp=Panduan -TMenuBar.MenuItem.MessageLog=Kotak Pesan -TrackControl.Name=Kontrol Trek -TrackControl.Button.NewTrack=Trek Baru -TrackControl.Button.NewTrack.ToolTip=Membuat Trek Baru -TrackControl.Button.Trails.ToolTip=Rel Kereta -TrackControl.Button.Labels.ToolTip=Label -TrackControl.Button.StretchVectors.ToolTip=vektor lurus -TrackControl.Button.Accelerations.ToolTip=Percepatan -TrackControl.Button.Xmass.ToolTip=Multiplikasi Massa -TrackControl.Button.Vectors.ToolTip=Vektor -TrackControl.Button.Velocities.ToolTip=Kecepatan -TrackControl.Button.Properties.ToolTip=Properti -TrackControl.Button.Positions.ToolTip=Posisi -Tracker.Name=Tracker Video Analizer -Tracker.Popup.MenuItem.Snapshot=Potret -Tracker.Popup.MenuItem.Help=Panduan -Tracker.Cursor.Crosshair.Description=Krusor salib untuk menandai titik -Tracker.Action.AboutTracker=Perihal Tracker -Tracker.Dialog.AboutTracker.Title=Tracker -Tracker.Dialog.AboutTracker.Copyright=Alih Bahasa Tampilan Tracker oleh Wachid Qomaruddin, atas ijin Douglas Brown -Tracker.Dialog.AboutTracker.URL=http://www.cabrillo.edu/~dbrown/tracker/ -Tracker.Action.AboutJava=Perihal JAVA VM -Tracker.Dialog.AboutTrackerOSPorg=Open Source Physics (OSP) Project -Tracker.Dialog.AboutTrackerOSPurl=http://www.opensourcephysics.org/ -Tracker.Dialog.AboutJava.Title=Perihal JAVA VM -Tracker.Dialog.AboutJava.UnknownVersion=Versi Tidak Diketahui -Tracker.Dialog.AboutJava.Message=Versi JAVA VM -Tracker.Dialog.AboutJava.URL=Update JAVA di http://java.sun.com/javase/downloads/ -Tracker.Action.AboutQT=Perihal QuickTime -Tracker.Dialog.AboutQT.Title=Perihal QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=Versi QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versi QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=Alokasi path QTJava: -Tracker.Dialog.NoQT.Title=Tidak Ditemukan QTJava.zip -Tracker.Dialog.NoQT.Message1=QuickTime untuk Java tidak terlihat telah terinstal atau bukan versi yang diinginkan, Instal QuickTime v7 keatas, atau download di http://www.apple.com/quicktime/download/ -Tracker.Dialog.NoQT.Message2=Jika anda ingin menganalisis QuickTime movie, silakan instal ulang QuickTime v7 keatas atau Instal iTunes v7 keatas. -Tracker.Dialog.NoQT.Message3=PENTING: QuickTime untuk JAVA Sun Microsystem harus dipilih ketika anda menginstal QuickTime. -Tracker.Dialog.UpdateQT.Title=Update QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Ditemukan Versi terbaru QuickTime.zip, silakan download di http://www.apple.com/quicktime/download/ -Tracker.Dialog.UpdateQT.Message2=Anda ingin memperbaharui berkas keluaran? -Tracker.Dialog.CopyQT.Title=Salin QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime telah terinstal, tetapi sebelum menggunakan Tracker dan anda harus : -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip harus anda salin dari -Tracker.Dialog.CopyQT.Message3= ke -Tracker.Dialog.CopyQT.Message4= 2. Tracker harus direstart ulang. -Tracker.Dialog.CopyQT.Message5=Ada ingin menyalin QTJava.zip sekarang? -Tracker.Dialog.CopyFailed.Title=Penyalinan gagal. Periksa versi QuickTime anda. -Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Periksa QuickTime anda sekali lagi atau gunakan iTunes v7. Silakan download di http://www.apple.com/quicktime/download/ -Tracker.Dialog.CopiedTo.Title=Proses penyalinan berhasil. Selamat!. -Tracker.Dialog.CopiedTo.Message1=QTJava.zip telah sukses di salin -Tracker.Dialog.CopiedTo.Message2=Tracker harus direstart ulang dan akan keluar sekarang. -Tracker.Splash.Loading=Dalam proses memuat, silakan tunggu -TrackerIO.Dialog.Import.Title=Impor -TrackerIO.Dialog.Import.Message=Pilih item untuk impor -TrackerIO.Dialog.ImportVideo.Title=Impor Video -TrackerIO.Dialog.Export.Title=Ekspor -TrackerIO.Dialog.Export.Message=Pilih item untuk ekspor -TrackerIO.Dialog.ReplaceFile.Title=Alokasi berkas keluaran? -TrackerIO.Dialog.ReplaceFile.Message=Sudah keluar. Anda ingin mengalokasi ulang berkas tersebut? -TrackerIO.Dialog.NotTrackerXML.Title=Tidak terbaca sebagai XML -TrackerIO.Dialog.NotTrackerXML.Message=Berkas tidak terbaca sebagai berkas bertipe XML. -TrackerIO.Dialog.BadVideo.Message=Video tidak dapat dibuka: -TrackerPanel.NewTab.Name=TanpaNama -TrackerPanel.Message.DragToMark=Shift-seret ke sasaran -TrackerPanel.Message.ClickToMark=Shift-klik ke sasaran -TrackerPanel.Dialog.LoadFailed.Title=Berkas tidak dapat dibuka -TrackerPanel.Dialog.LoadFailed.Message=Tidak dapat membuka berkas: -TrackerPanel.Dialog.SaveChanges.Title=Simpan Pengubahan -TrackerPanel.Dialog.SaveChanges.Message=Simpan pengubahan sebagai -TrackPlottingPanel.Popup.MenuItem.Lines=garis -TrackPlottingPanel.Popup.MenuItem.Points=Titik -TrackPlottingPanel.Popup.MenuItem.Scale=Skala -TrackPlottingPanel.Popup.MenuItem.Print=Cetak -TrackPlottingPanel.Popup.MenuItem.Measure=Skala yang sesuai -TrackPlottingPanel.Popup.MenuItem.Analyze=Analiser -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Di perbesar -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Di perkecil -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoskala -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Di perbesar seukuran box -TrackPlottingPanelInspector.Title=Skala -TrackPlottingPanelInspector.Label.Min=Minimum -TrackPlottingPanelInspector.Label.Max=Maksimum -TrackPlottingPanelInspector.Label.Auto=Automatis -TToolBar.Button.Footprint.Tooltip=Mengatur jejak -TToolBar.Dropdown.SelectedTrack.Tooltip=Seleksi Trek -TToolBar.Dropdown.SelectedTrack.None=Tidak Menyeleksi -TTrack.MenuItem.Delete=Hapus -TTrack.MenuItem.Color=Warna -TTrack.Dialog.Color.Title=Pilih Warna Trek -TTrack.MenuItem.Name=Nama -TTrack.MenuItem.Footprint=Jejak -TTrack.MenuItem.Description=Deskripsi -TTrack.MenuItem.Visible=Tampak -TTrack.MenuItem.TrailVisible=Ketampakan Jalur Trek -TTrack.MenuItem.Autostep=Melangkah Automatis -TTrack.MenuItem.MarkByDefault=Memulai Trek -TTrack.MenuItem.Locked=Terkunci -TTrack.MenuItem.Delete=Hapus -TTrack.Name.None=Tanpa nama -TTrack.Dialog.Description.Title=Deskripsi: -TTrack.Dialog.Name.Title=Nama -TTrack.Dialog.Name.Label=Nama: -TViewChooser.Button.Choose.Tooltip=Pilih Tampilan -Vector.Name=Vektor -Vector.New.Name=Vektor -Vector.MenuItem.ToOrigin=Asal mula -Vector.MenuItem.Label=Tampak label -VectorSum.Name=Vektor penjumlahan -VectorSum.New.Name=penjumlahan -VectorSum.MenuItem.Inspector=Pilih vektor -VectorSumInspector.Title=Vektor Penjumlahan -VectorSumInspector.Border.Title=Pilih Vektor -WorldTView.Popup.MenuItem.Projectile=Model Proyektil - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Model Partikel Analitik -AnalyticParticle.Inspector.Title=Model Partikel Analitik -AnalyticParticle.Property.InitialT=t -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=Radius 4 -CircleFootprint.Circle_6=Radius 6 -CircleFootprint.Circle_8=Radius 8 -DynamicParticle.Name=Model Partikel Dinamik -DynamicParticle.Inspector.Title=Model Partikel Dinamik -DynamicParticle.Property.ForceX=Fungsi x -DynamicParticle.Property.ForceY=Fungsi y -DynamicParticle.Property.InitialT=t -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Dipasti -ParticleModel.New.Name=Model -ParticleModel.MenuItem.InspectModel=Model -ParticleModel.Inspector.Button.Undo=Undo -ParticleModel.Inspector.Button.Redo=Redo -ParticleModel.Inspector.Button.Close=Tutup -ParticleModel.Inspector.Button.Help=Tolong -ParticleModel.Table.Initial.Border.Title=Judul -ParticleModel.Property.InitialT=Periode Awal - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=hanya X -Calibration.Axes.YOnly=hanya Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Pilih Sumbu Kalibrasi -Calibration.Label.Axes=Sumbu -Calibration.Dialog.InvalidCoordinates.Title=Koordinat Tidak Valid -Calibration.Dialog.InvalidCoordinates.Message=Titik tidak memiliki koordinat dunia yang sama. -Calibration.Dialog.InvalidXCoordinates.Message=Titik tidak memiliki koordinat-x dunia yang sama. -Calibration.Dialog.InvalidYCoordinates.Message=Titik tidak memiliki koordinat-x dunia yang sama. -SpectralLineFilter.Title=Spektrum Gas -SpectralLineFilter.H=Hidrogen -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Raksa atau Merkuri -TFrame.View.Unknown=Tampilan -TMenuBar.MenuItem.Undo=Undo -TMenuBar.MenuItem.Redo=Redo -TMenuBar.MenuItem.Replace=Relokasi -TMenuBar.Menu.AddImage=Impor Gambar -TMenuBar.MenuItem.AddBefore=Sebelum Frame Ini -TMenuBar.MenuItem.AddAfter=Setelah Frame Ini -TMenuBar.MenuItem.RemoveImage=Pindahkan Frame Ini -TMenuBar.Menu.Tools=Perangkat -TMenuBar.MenuItem.DataFunctionTool=Kolom Data -TMenuBar.MenuItem.DatasetTool=Analisis Data -TMenuBar.Menu.CopyImage=Salin Gambar -TMenuBar.MenuItem.CopyMainView=Tampilan Utama -TMenuBar.MenuItem.CopyFrame=Frame -TMenuBar.MenuItem.PrintFrame=Cetak Frame -TrackerIO.Dialog.AddImage.Title=Penambahan Gambar -TTrack.Dialog.Name.BadName=Nama ini sudah ada yang punya! Silakan cari nama lain. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=gaya total -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Grafik Data Trek -TableTView.Label.NoData=Tabel Data Trek -TrackerPanel.Message.NoData0=Lembar Analisis -TrackerPanel.Message.NoData1=Klik "Berkas" (pilih "Buka" atau Trek) untuk memulai pengetrekan. -WorldTView.Label.NoData=Pengamatan objek dari video atau trek terlihat di sini. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Pemecahan Masalah: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptif Multilangkah -DynamicParticle.Table.Initial.Border.Title=Nilai Awal -DynamicParticle.Table.Force.Border.Title=Fungsi Gaya (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Fungsi Posisi (t) - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Letakkan Gambar -TMenuBar.MenuItem.PasteAfter=Setelah Frame Ini -TMenuBar.MenuItem.PasteBefore=Sebelum Frame Ini -TMenuBar.MenuItem.PasteReplace=Relokasi Video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Memulai -Tracker.Splash.HelpMessage=Pengguna Baru? Pilih - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=Sudut -LineProfile.Checkbox.Rotates=Rotasi -LineProfile.Label.Spread=Lebar -RGBRegion.Name=Daerah RGB -RGBRegion.New.Name=Daerah -RGBRegion.MenuItem.Fixed=Pasti -RGBRegion.Label.Radius=Jejari -TTrack.Label.Step=Langkah - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=posisi nomor -LineProfile.Data.Description.1=posisi komponen x -LineProfile.Data.Description.2=posisi komponen y -LineProfile.Data.Description.3=Merah -LineProfile.Data.Description.4=Hijau -LineProfile.Data.Description.5=Biru -LineProfile.Data.Description.6=Persensif Kecerahan -LineProfile.Data.Description.7=Ketebalan garis -ParticleModel.MenuItem.TraceVisible=Pengetrekkan -ParticleModel.MenuItem.StepsVisible=Langkah -PointMass.Data.Description.0=waktu -PointMass.Data.Description.1=posisi komponen x -PointMass.Data.Description.2=posisi komponen y -PointMass.Data.Description.3=posisi magnitudo -PointMass.Data.Description.4=posisi sudut -PointMass.Data.Description.5=kecepatan komponen x -PointMass.Data.Description.6=kecepatan komponen y -PointMass.Data.Description.7=kecepatan magnitudo -PointMass.Data.Description.8=kecepatan sudut -PointMass.Data.Description.9=percepatan komponen x -PointMass.Data.Description.10=percepatan komponen y -PointMass.Data.Description.11=percepatan magnitudo -PointMass.Data.Description.12=percepatan sudut -PointMass.Data.Description.13=rotasi sudut -PointMass.Data.Description.14=kecepatan anguler -PointMass.Data.Description.15=percepatan anguler -PointMass.Data.Description.16=jumlah langkah -PointMass.Data.Description.17=jumlah frame -PointMass.Data.Description.18=momentum komponen x -PointMass.Data.Description.19=momentum komponen y -PointMass.Data.Description.20=momentum magnitudo -PointMass.Data.Description.21=momentum sudut -PointMass.Data.Description.22=energi kinetik -RGBRegion.Data.Description.0=waktu -RGBRegion.Data.Description.1=posisi komponen x -RGBRegion.Data.Description.2=posisi komponen y -RGBRegion.Data.Description.3=Merah -RGBRegion.Data.Description.4=Hijau -RGBRegion.Data.Description.5=Biru -RGBRegion.Data.Description.6=Persensif Kecerahan -RGBRegion.Data.Description.7=Penghitungan pixel -RGBRegion.Data.Description.8=jumlah langkah -RGBRegion.Data.Description.9=jumlah frame -TView.Menuitem.Define=Definisi -Vector.Data.Description.0=waktu -Vector.Data.Description.1=komponen x -Vector.Data.Description.2=komponen y -Vector.Data.Description.3=magnitudo -Vector.Data.Description.4=sudut -Vector.Data.Description.5=Ekor posisi komponen x -Vector.Data.Description.6=Ekor posisi komponen y -Vector.Data.Description.7=jumlah langkah -Vector.Data.Description.8=jumlah frame -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Massa partikel ini -ParticleModel.Parameter.InitialTime.Description=Waktu awal -AnalyticParticle.PositionFunction.X.Description=Posisi komponen x -AnalyticParticle.PositionFunction.Y.Description=Posisi komponen y -DynamicParticle.ForceFunction.X.Description=Gaya komponen x -DynamicParticle.ForceFunction.Y.Description=Gaya komponen y -DynamicParticle.Parameter.InitialX.Description=Posisi awal komponen x -DynamicParticle.Parameter.InitialY.Description=Posisi awal komponen y -DynamicParticle.Parameter.InitialVelocityX.Description=Kecepatan awal komponen x -DynamicParticle.Parameter.InitialVelocityY.Description=Kecepatan awal komponen y -TrackerPanel.ModelBuilder.Title=Pembangun Model -TrackerPanel.DataBuilder.Title=Pembangun Data -TrackControl.TrailMenu.NoTrail=Tidak Mengetrek -TrackControl.TrailMenu.ShortTrail=Tampilkan trek -TrackControl.TrailMenu.LongTrail=Trek Panjang -TrackControl.TrailMenu.FullTrail=Trek Penuh -TrackerPanel.ModelBuilder.Spinner.Tooltip=Pilih model sekarang -TrackerPanel.ModelBuilder.LineButton.Text=Model garis -TrackerPanel.ModelBuilder.LineButton.Tooltip=Mengatur model garis -ParticleModel.LineStyle.None=Tidak ada garis -ParticleModel.LineStyle.Connect=Langkah terhubung -ParticleModel.LineStyle.Smooth=Garis lembut -ModelFunctionPanel.Label=Model -AnalyticFunctionPanel.FunctionEditor.Border.Title=Fungsi Posisi -DynamicFunctionPanel.FunctionEditor.Border.Title=Fungsi Gaya - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Menampilkan Tabel Kolom -Tracker.About.ProjectOf=Proyek dari: -Tracker.About.TranslationBy=Translasi oleh: -Tracker.About.Translator=Wachid Qomaruddin -TMenuBar.Menu.SaveVideoAs=Simpan Klip Sebagai -TActions.SaveClipAs.ProgressMonitor.Message=Simpan klip sebagai -TActions.SaveClipAs.ProgressMonitor.Progress=Menyelesaikan - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sinkron -PlotTrackView.Checkbox.Synchronize.Tooltip=Menyamakan koordinat horisontal -RGBRegion.MenuItem.FixedRadius=Menetapkan Jari-Jari -Tracker.VideoZoom.Hint=Klik untuk memperbesar, klik+alt untuk memperkecil, klik ganda untuk menyesuaikan -Tracker.PlotZoomIn.Hint=tarik untuk memperbesar, klik ganda untuk autoskala -Tracker.PlotZoomOut.Hint=klik untuk memperkecil -Tracker.MenuItem.Hints=Tampilkan tanda -TapeMeasure.Label.Length=skala panjang -TapeMeasure.Label.TapeAngle=sudut dari koordinat x -TapeMeasure.Label.ArcAngle=arc -TrackerIO.Dialog.NotAnImage.Title=Tipe berkas salah -TrackerIO.Dialog.NotAnImage.Message1=Bukan gambar JPG atau GIF. -TrackerIO.Dialog.NotAnImage.Message2=Apa anda ingin melanjutkan? -TToolBar.Button.Zoom.Tooltip=Perangkat Pembesaran (shortcut: Z key) -TrackChooserTView.DropDown.Tooltip=Pilih trek -TapeMeasure.Field.ArcAngle.Tooltip=Sudut dari pita ke lengan -TapeMeasure.Field.TapeAngle.Tooltip=Sudut dari sumbu positif x ke pita -TapeMeasure.Field.Magnitude.Tooltip=Panjang pita dengan skala satuan nyata -TapeMeasure.Readout.Magnitude.Name=Panjang terbaca -TapeMeasure.Readout.Magnitude.Hint=Klik untuk mengatur skala -TapeMeasure.Readout.Angle.Name=Sudut terbaca -TapeMeasure.Readout.Angle.Hint=Klik untuk mengatur sudut -TapeMeasure.Arm.Name=lengan sudut -TapeMeasure.Arm.Hint=tarik untuk mengukur sudut, penyusutan untuk menutup -TapeMeasure.End.Name=akhir -TapeMeasure.End.Hint=tarik untuk mengukur jarak atau mengkalibrasi skala -TapeMeasure.Handle.Name=Pengendali -TapeMeasure.Handle.Hint=tarik untuk memindahkan pita -Vector.Tip.Name=tip -Vector.Tip.Hint=tarik atau masukkan koordinat untuk mengubah komponen -Vector.Handle.Name=tangkai pengendali -Vector.Handle.Hint=tarik untuk memindahkan vektor -Vector.ShortHandle.Hint=tarik untuk memindahkan, klik+alt untuk memilih tip -PointMass.Position.Name=posisi -PointMass.Position.Hint=tarik atau masukkan koordinat untuk mengubah posisi -PointMass.Velocity.Name=kecepatan -PointMass.Acceleration.Name=percepatan -PointMass.Vector.Hint=tarik untuk memindahkan -PointMass.Position.Locked.Hint=Klik untuk memilih--tidak dapat ditarik -CoordAxes.Handle.Name=koordinat x -CoordAxes.Handle.Hint=tarik untuk mengubah kemiringan -CoordAxes.Origin.Name=asal -CoordAxes.Origin.Hint=tarik untuk mengubah posisi -OffsetOrigin.Position.Name=posisi -OffsetOrigin.Position.Hint=tarik atau masukkan koordinat untuk memindahkan asal -Calibration.Point.Name=titik -Calibration.Point.Hint=tarik atau masukkan koordinat untuk mengubah sumbu dan skala -RGBRegion.Position.Name=posisi -RGBRegion.Position.Hint=tarik atau masukkan koordinat untuk mengubah posisi -LineProfile.End.Name=akhir -LineProfile.End.Hint=tarik untuk menyetel panjang garis -LineProfile.Handle.Name=Pengendali -LineProfile.Handle.Hint=tarik untuk memindahkan garis -PointMass.Hint=Mengatur massa pada toolbar -PointMass.Unmarked.Hint=, klik+shift untuk menandai posisi -TTrack.Unselected.Hint=klik untuk memilih atau mengatur properti -Vector.Unmarked.Hint=tarik+shift untuk menggambar vektor -OffsetOrigin.Unmarked.Hint=tarik+shift untuk menandai titik awal -Calibration.Unmarked.Hint=tarik+shift untuk menandai titik pertama -Calibration.Halfmarked.Hint=tarik+shift untuk menandai titik kedua -CenterOfMass.Empty.Hint=pilih massa untuk mendefinisikan sistem -VectorSum.Empty.Hint=pilih vektor untuk mendefinisikan jumlah -TapeMeasure.Hint=Mengatur panjang untuk mengubah skala, mengatur sudut untuk mengubah kemiringan sumbu x -CoordAxes.Hint=Mengatur sudut untuk mengubah kemiringan -ParticleModel.Hint=Mengatur massa pada toolbar, masukkan ekspresi pada Pembangun Model Animasi -RGBRegion.Hint=masukkan jari-jari untuk mengubah ukuran -RGBRegion.Unmarked.Hint=klik+shift untuk menandai posisi -TTrack.ImportVideo.Hint=impor video atau image untuk mengukur RGB -TTrack.Selected.Hint=Terpilih -LineProfile.Hint=masukkan penjalaran untuk mengubah lebar garis -LineProfile.Unmarked.Hint=tarik+shift untuk menggambar garis -LineProfile.Menu.Orientation=Orientasi -LineProfile.MenuItem.Horizontal=Horisontal -LineProfile.MenuItem.XAxis=Sepanjang koordinat X -Footprint.PositionVector=vektor -Footprint.BoldPositionVector=vektor tebal -Tracker.Startup.Hint=Tekan F1 untuk panduan -TrackerPanel.NoVideo.Hint=Buka melalui impor video atau gambar untuk dianalisa -TrackerPanel.CalibrateVideo.Hint=identifikasi fitur video dengan mengetahui panjang dan mengatur skala dengan menggunakan pita pengukur -TrackerPanel.NoTracks.Hint=membuat trek baru untuk fitur pengukuran dari video yang diperhatikan -TrackerPanel.SetClip.Hint=Mengatur atau meninjau klip video dalam inspektor klip -TrackerPanel.ShowAxes.Hint=Mengatur asal dan sudut sumbu koordinat -VideoPlayer.Step.Hint=langkah maju (jalan pintas: PageDown key) -VideoPlayer.Back.Hint=langkah balik (jalan pintas: PageUp key) -TrackerPanel.DVVideo.Hint=gunakan ukuran ulang filter untuk mengkoreksi penyimpangan dalam video berformat DV -TrackerIO.DataFileFilter.Description=Berkas Tracker -Tracker.Button.PDFHelp=Versi Cetak PDF -TToolbar.Button.TapeVisible.Tooltip=Pita Pengukur Dengan Lengan Sudut - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Kendali Trek -TMenuBar.MenuItem.Description=Catatan -TrackPlottingPanel.RightDrag.Hint=tarik+kanan untuk opsi -TMenuBar.MenuItem.DeleteSelectedPoint=Titik terpilih -TFrame.InfoDialog.SaveChanges.Title=Simpan Perubahan -TFrame.InfoDialog.SaveChanges.Message=Apa anda ingin menyipan pengubahan? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Kartesian -DynamicParticle.Editor.Button.Polar=Polar -DynamicParticle.Parameter.InitialR.Description=Jari-jari awal -DynamicParticle.Parameter.InitialTheta.Description=Sudut awal -DynamicParticle.Parameter.InitialVelocityR.Description=Kecepatan radian awal -DynamicParticle.Parameter.InitialOmega.Description=Kecepatan anguler awal -DynamicParticle.ForceFunction.R.Description=Komponen gaya radial -DynamicParticle.ForceFunction.Theta.Description=Komponen gaya tangensial -DynamicParticlePolar.Name=Model Partikel Dinamik (Polar) -DynamicTwoBody.Editor.Button.Particle1=Partikel 1 -DynamicTwoBody.Editor.Button.Particle2=Partikel 2 -DynamicTwoBody.Name=Model Dua Benda Dinamik -TMenuBar.Menu.DynamicParticle=Model Partikel Dinamik -TMenuBar.MenuItem.Cartesian=Kartesian -TMenuBar.MenuItem.Polar=Polar - -# Additions by Doug Brown 2009-06-18 -Tracker.About.Language=Indonesia - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotrek -Dialog.Button.Help=Panduan -AutoTracker.Wizard.Title=Autotrek: -AutoTracker.Wizard.Button.Reset=Ulang -AutoTracker.Wizard.Button.Back=Balik -AutoTracker.Wizard.Button.Next=Lanjut -AutoTracker.Wizard.Button.Accept=Harapkan -AutoTracker.Wizard.Button.Search=Cari -AutoTracker.Wizard.Button.Start=Mulai -AutoTracker.Wizard.Button.Pause=Jeda -AutoTracker.Wizard.Button.Skip=Lompati -AutoTracker.Label.Mask=Bayangan Topeng -AutoTracker.Label.Target=Target Offset -AutoTracker.Label.AcceptLevel=Terima Skor Diatas -AutoTracker.TabbedPane.TabTitle.Mask=1. Topeng -AutoTracker.TabbedPane.TabTitle.Target=2. Target -AutoTracker.TabbedPane.TabTitle.Settings=3. Harap -AutoTracker.TabbedPane.TabTitle.Search=4. Cari -AutoTracker.Info.GetStarted=Silakan klik fitur video yang ingin anda autotrek. -AutoTracker.Info.Mask1=Menentukan topeng untuk pengamatan setiap frame video. Pindahkan atau ubah ukuran topeng dengan menyeret atau menahan ditengah secara berturut-turut. -AutoTracker.Info.Mask2=Tip: Topeng sebenarnya tidak membutuhkan ruang petak yang besar untuk menampung objek. Fitur ini khas dan memuat tipe high-contrast untuk membangkitkan kinerja yang bagus. -AutoTracker.Info.MaskLocked1=Topeng digunakan dan terkunci. -AutoTracker.Info.MaskLocked2=Klik tombol ulang untuk menghapus semua langkah, lepaskan kuncian dan memulai lagi. -AutoTracker.Info.Target1=Target dimana langkah akan relatif bertopeng. Untuk pindah target dengan menyeret topeng. -AutoTracker.Info.Target2=Tip: Anda dapat menyesuaikan posisi target setelah semua langkah mendapat topeng. Keluaran langkah secara automatis akan bergerak terus bersama target. -AutoTracker.Info.TargetLocked=Target yang digunakan diikat untuk keluaran posisi langkah. Target bergerak maka seluruh langkah akan bergerak. -AutoTracker.Info.Settings1=Tingkatan skor teramati diterima menunjukan target akan bertopeng secara autormatis. -AutoTracker.Info.Settings2=Tip: kurangi penerimaan skor tingkatan membuat proses pemberian topeng menjadi lebih cepat tetapi penambahan skor berpeluang menghasilkan error. -AutoTracker.Info.Search1=Topeng persegi akan ditampilkan untuk mencari pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret atau menahan ditengah secara berturut-turut. -AutoTracker.Info.Search2=Tip: Area pencarian sebenarnya tidak membutuhkan ruang petak yang besar untuk menampung objek. Setelah menemukan area pertama pengamatan akan dilanjutkan ke area berikutnya, algoritma pencitraan mencari area untuk memprediksi posisi pengamatan. -AutoTracker.Info.Frame=Frame -AutoTracker.Info.Match=Pengamatan menampilkan penopengan automatis pada posisi target. -AutoTracker.Info.Possible=Pengamatan memungkinkan menemukan tampilan area pencarian. Pilihan anda adalah: -AutoTracker.Info.NoMatch=Pengamatan tidak menemukan tampilan area pencarian. Pilihan anda adalah: -AutoTracker.Info.Outside=Area pencarian diluar video atau gambar. Pilihan anda adalah: -AutoTracker.Info.Accepted=Pengamatan menampilkan nilai yang diharapkan pengguna. -AutoTracker.Info.MarkedByUser=Langkah diberi topeng secara manual oleh pengguna. -AutoTracker.Info.NoVideo=Pemberlakuan Autotrek membutuhkan video. Silakan impor video atau akhiri Autotrek ini. -AutoTracker.Info.Height=tinggi -AutoTracker.Info.Width=lebar -AutoTracker.Info.Accept=--Mengharapkan pengamatan -AutoTracker.Info.Retry=--Memindahkan area pencarian dan mencari lagi -AutoTracker.Info.Mark=--Klik+shift untuk memberi topeng dengan langkah manual -AutoTracker.Info.Skip=--Lompati frame ini dan melanjutkan pengetrekan -AutoTracker.Info.Reset=--Ulangi dan mulai lagi dengan topeng termodifikasi -AutoTracker.Info.MatchScore=Skor pengamatan -AutoTracker.Dialog.MaskLocked.Title=Topeng Terkunci -PointMass.Cursor.Autotrack.Description=Kursor Autotrek -VideoPlayer.StartFrame.Hint=Tarik untuk mengatur awal frame -VideoPlayer.EndFrame.Hint=Tarik untuk mengatur akhir frame -VideoPlayer.Slider.Hint=Tarik untuk memindai melalui video -FileDropHandler.Dialog.BadFile.Message=Tidak dapat memuat berkas. -FileDropHandler.Dialog.BadFile.Title=Berkas tidak diakui - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Terapkan -DynamicParticle.Dialog.Delete.Message=Penghapusan partikel yang akan dihilangkan dari sistem. Hapus semua? -DynamicParticle.Dialog.Delete.Title=Sistem Dinamik -DynamicParticle.System.In=dalam -DynamicSystem.Empty=kosong -DynamicSystem.Force.Name.Internal=internal -DynamicSystem.ForceFunction.R.Description=Komponen radial gaya internal -DynamicSystem.ForceFunction.Theta.Description=Komponen tangensial gaya internal -DynamicSystem.MenuItem.Inspector=Memilih Partikel -DynamicSystem.Name=Sistem Dua Benda Dinamik -DynamicSystem.New.Name=sistem -DynamicSystem.Parameter.Of=dari -DynamicSystem.Parameter.RelativeTo=relatif terhadap -DynamicSystem.Parameter.Name.Relative=relatif -DynamicSystem.Parameter.ParticleMass.Description=Massa -DynamicSystem.Parameter.Mass.Description=Total massa sistem -DynamicSystemInspector.Border.Title=Partikel -DynamicSystemInspector.Title=Sistem Dua Benda -DynamicSystemInspector.Button.Change=Ubah Ke... -DynamicSystemInspector.ParticleName.None=(non) -TMenuBar.MenuItem.Clone=Klon -TMenuBar.MenuItem.TwoBody=Sistem dua benda -TrackerPanel.DataBuilder.Dropdown.Tooltip=Trek terpilih saat ini -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sinkron Sumbu Vertikal -TrackControl.Button.Trace.ToolTip=Tampil atau sembunyi path -TToolBar.Button.Open.Tooltip=Buka video atau berkas tracker dalam tab baru -TToolBar.Button.Save.Tooltip=Simpan tab saat ini dalam berkas -TToolBar.Button.SelectTrack=Pilih -TToolBar.Button.SelectTrack.Tooltip=Memilih trek keluaran -TTrack.MenuItem.ClearSteps=Hapus Langkah -PointMass.MenuItem.Position=Posisi -TMenuBar.MenuItem.Empty=(Kosong) -TTrackBar.Button.Memory=Penggunaan memori: -TTrackBar.Button.Memory.Tooltip=Pemantau dan pengatur memori -TTrackBar.Memory.PopupItem.Launch1=Luncur -TTrackBar.Memory.PopupItem.Launch2=dengan memori -TButton.Track.ToolTip=Mengatur properti -Tracker.Dialog.OutOfMemory.Message1=Tracker telah diluar memori. -Tracker.Dialog.OutOfMemory.Message2=Klik tombol memori untuk opsi. -Tracker.Dialog.OutOfMemory.Title=Diluar Memori - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead = Lihat dari Atas -AutoTracker.Label.Original = Kunci Frame -AutoTracker.Label.NoMask = non -AutoTracker.Label.Rate = Penilaian: -AutoTracker.Info.Mask3 = Tip: template tidak perlu besar atau mencakup seluruh objek. Sebuah fitur yang unik dan termasuk tepi kontras tinggi umumnya bekerja terbaik. -AutoTracker.Wizard.Checkbox.XAxis = Hanya sumbu x -AutoTracker.Info.SearchOnAxis1 = Pencarian pemindaian di daerah sumbu-x untuk pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret pusatnya atau masing-masing pegangan. -AutoTracker.Info.PossibleOnAxis = Pengamatan tampilan yang mungkin ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: -AutoTracker.Info.NoMatchOnAxis = Tidak ada pengamatan yang ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: -AutoTracker.Info.RetryOnAxis = - memindahkan area pencarian atau sumbu x dan cari lagi -AutoTracker.Wizard.Button.Delete = Hapus -AutoTracker.Wizard.Button.DeleteMore = Hapus Titik Selanjutnya -Button.Define.Tooltip = Tentukan fungsi kolom variabel yang ada -Calibration.Label.Point = titik -CalibrationStick.Hint = Mengatur panjang atau tarik hingga akhir untuk mengubah skala, atur sudut untuk ubah kemiringan -CalibrationStick.End.Hint = tarik untuk mengubah skala, shift+klik untuk kembali menandai -CalibrationStick.New.Name = kalibrasi tongkat -CalibrationTapeMeasure.New.Name = rekaman kalibrasi -CalibrationTapeMeasure.Readout.Magnitude.Hint = klik untuk masuk panjang dikenal dalam satuan dunia -CalibrationTapeMeasure.Hint = Mengatur panjang untuk mengubah skala, atur sudut untuk ubah kemiringan -DynamicSystem.Data.Description.0 = jarak relatif antara partikel -DynamicSystem.Data.Description.1 = sudut relatif -DynamicSystem.Data.Description.2 = kecepatan radial relatif -DynamicSystem.Data.Description.3 = kecepatan sudut relatif -ExportDataDialog.Subtitle.Table = Tabel Data -ExportDataDialog.Subtitle.Content = Sel -ExportDataDialog.Subtitle.Format = Format Nomor -ExportDataDialog.Subtitle.Delimiter = Pembatas -ExportDataDialog.Title = Ekspor Data -ExportDataDialog.Delimiter.Add = Tambah -ExportDataDialog.Delimiter.Remove = Hapus -ExportDataDialog.Content.AllCells = Semua Sel -ExportDataDialog.Content.SelectedCells = Sel Terpilih -ExportDataDialog.MenuItem.RemoveDelimiter = Hapus kustom pemisah -ExportDataDialog.Chooser.SaveData.Title = Simpan Data Seperti -ExportVideoDialog.Button.SaveAs = Simpan Sebagai -ExportVideoDialog.Button.FullSize = ukuran penuh -ExportVideoDialog.Button.DrawnSize = Seperti ditarik -ExportVideoDialog.Content.VideoOnly = Hanya video -ExportVideoDialog.Content.VideoAndGraphics = Video dan grafis -ExportVideoDialog.Content.GraphicsOnly = Hanya grafis -ExportVideoDialog.Title = Ekspor Video Klip -ExportVideoDialog.Label.ClipSettings = Pengaturan Klip -ExportVideoDialog.Subtitle.Size = Ukuran -ExportVideoDialog.Subtitle.Content = Konten -ExportVideoDialog.Subtitle.View = Pengamatan -ExportVideoDialog.Subtitle.Format = Format -ExportVideoDialog.Complete.Message1 = Video telah disimpan sebagai -ExportVideoDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ExportVideoDialog.Complete.Title = Ekspor Lengkap -ExportVideoDialog.VideoSize = ukuran video -ExportVideoDialog.MatSize = ukuran pita -ExportVideo.Dialog.HiddenPlots.Message = Plot harus terlihat penuh untuk ekspor . -ExportVideo.Dialog.HiddenPlots.Title = Pengamatan Tidak Lengkap -Footprint.DoubleTarget = Kepala Salib Ganda -Footprint.BoldDoubleTarget=Kepala salib ganda tebal -OffsetOrigin.MenuItem.Fixed = Koordinat Dunia Ditetapkan -ParticleModel.Dialog.Offscreen.Message1 = Beberapa Model langkah kosong karena mereka terlalu jauh dari layar . -ParticleModel.Dialog.Offscreen.Message2 = Untuk memperbaiki hal ini, ubah model atau atur ulang skala video . -ParticleModel.Dialog.Offscreen.Title = Diluar Batas -PrefsDialog.Tab.Configuration.Title = Konfigurasi -PrefsDialog.Memory.BorderTitle = Ukuran Memori -PrefsDialog.Tab.General.Title = Umum -PrefsDialog.RecentFiles.BorderTitle = Buka Menu Terbaru -PrefsDialog.Label.RecentSize = Hitung Berkas -PrefsDialog.Hints.BorderTitle = Petunjuk -PrefsDialog.Button.Relaunch = Peluncuran Ulang Sekarang -PrefsDialog.Button.ClearRecent = Batal -PrefsDialog.Checkbox.DefaultSize = Gunakan default -PrefsDialog.Checkbox.HintsOn = Tampilkan petunjuk secara default -PrefsDialog.Tab.Video.Title = Video -PrefsDialog.VideoPref.BorderTitle = Mesin Video -PrefsDialog.Button.Xuggle = Xuggle -PrefsDialog.Button.QT = QuickTime -PrefsDialog.Dialog.WebStart.Message = Pengaturan memori tidak tersedia saat menggunakan Web Start . -PrefsDialog.Dialog.WebStart.Title = Mode Web Start -PrefsDialog.LookFeel.BorderTitle = LnF -PrefsDialog.Language.BorderTitle = Bahasa -PrefsDialog.Upgrades.BorderTitle = Periksa Untuk Upgrade -PrefsDialog.Tab.Runtime.Title = Runtime -PrefsDialog.Tab.Display.Title = Tampilan -PrefsDialog.Language.Default = Default -PrefsDialog.Upgrades.Always = Setiap Saat -PrefsDialog.Upgrades.Weekly = Mingguan -PrefsDialog.Upgrades.Monthly = Bulanan -PrefsDialog.Upgrades.Never = Tidak pernah -PrefsDialog.Button.CheckForUpgrade = Periksa Sekarang -PrefsDialog.Xuggle.Speed.BorderTitle = Putar Ulang Video Xuggle -PrefsDialog.Xuggle.Slow = Halus (mungkin lambat) -PrefsDialog.Xuggle.Fast = Cepat (mungkin cepat) -PrefsDialog.CalibrationTool.BorderTitle = Alat Kalibrasi Standar -Protractor.Name = Busur Derajat -Protractor.New.Name = busur derajat -Protractor.Hint = tarik lengan untuk mengukur sudut -Protractor.Label.Angle = sudut -Protractor.Field.Angle.Tooltip = Sudut antara lengan busur derajat -Protractor.Vertex.Name = vertex -Protractor.Vertex.Hint = tarik untuk memindahkan vertex -Protractor.End.Name = akhir lengan -Protractor.End.Hint = tarik untuk memutar lengan -Protractor.Handle.Name = menangani -Protractor.Handle.Hint = tarik untuk memindahkan busur derajat -Protractor.Rotator.Name = pemutar -Protractor.Rotator.Hint = tarik untuk memutar busur derajat -Protractor.Readout.Name = pembacaan -Protractor.Readout.Hint = sudut antara lengan busur derajat -ProtractorFootprint.Circle3 = lingkaran kecil -ProtractorFootprint.Circle5 = lingkaran besar -ProtractorFootprint.Circle3Bold = lingkaran kecil tebal -ProtractorFootprint.Circle5Bold = lingkaran besar tebal -Stick.Name = Tongkat Kalibrasi -Stick.New.Name = tongkat kalibrasi -TableTrackView.MenuItem.Unformatted = Presisi Lengkap -TableTrackView.MenuItem.Formatted = Sebagai Terformat -TableTrackView.Menu.SetDelimiter = Atur Pembatas -TableTrackView.MenuItem.AddDelimiter = Tambah -TableTrackView.MenuItem.RemoveDelimiter = Hapus -TableTrackView.Dialog.CustomDelimiter.Message = Masukkan pembatas string baru: -TableTrackView.Dialog.CustomDelimiter.Title = Tambah Pembatas -TableTrackView.Header.Tooltip = Klik untuk menyortir atau klik ganda untuk memilih kolom -TableTrackView.MenuItem.CopySelectedData = Salin Data Dipilih -TableTrackView.Dialog.RemoveDelimiter.Message = Pilih pembatas untuk menghapus : -TableTrackView.Dialog.RemoveDelimiter.Title = Hapus Pembatas -TableTrackView.Radians.Tooltip = dalam radian -TableTrackView.Degrees.Tooltip = dalam derajat -TableTrackView.RadiansPerSecond.Tooltip = dalam radian/s -TableTrackView.DegreesPerSecond.Tooltip = dalam derajat/s -TableTrackView.RadiansPerSecondSquared.Tooltip = dalam radian/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip = dalam derajat/s^2 -TableTrackView.MenuItem.DeleteDataFunction = Hapus data Fungsi -TActions.Action.SaveFrame = Simpan Tabset Sebagai -TActions.AboutVideo = Properti -TActions.Dialog.AboutVideo.Title = Properti Video -TActions.Dialog.AboutVideo.Type = Tipe -TActions.Dialog.AboutVideo.Size = Dimensi -TActions.Dialog.AboutVideo.Length = Panjang -TActions.Dialog.AboutVideo.Frames = Frame -TActions.Dialog.AboutVideo.Seconds = detik -TActions.Dialog.AboutVideo.FrameRate = rerata frame -TActions.Dialog.AboutVideo.FramesPerSecond = fps -TActions.Dialog.AboutVideo.Path = Jalur -TActions.Action.ImportTRK =Berkas Tracker -TActions.Action.ProtractorVisible = Tampak -TapeMeasure.MenuItem.FixedLength = Panjang Tetap -TextTView.Label.NoTab = Klik "Halaman" untuk menambahkan teks dan halaman HTML di sini. -TextTView.NewTab.Text1 = Klik ganda untuk mengedit teks atau judul . Klik kanan untuk pilihan lainnya. -TextTView.NewTab.Text2 = Untuk menampilkan halaman HTML, masukkan url atau klik kanan untuk membuka file. -TextTView.NewTab.Title = TanpaNama -TextTView.Dialog.TabTitle.Title = Atur Nama -TextTView.MenuItem.OpenHTML = Buka HTML -TextTView.MenuItem.SetTitle = Atur Judul -TextTView.Button.NewTab = Baru -TextTView.TextEdit.Description = Teks -TFrame.Dialog.FileNotFound.Message = Berkas tidak dapat ditemukan. -TFrame.Dialog.FileNotFound.Title = Berkas Tidak Ditemukan -TFrame.View.Text = Tampilan Halaman -TFrame.View.Main = Pengamatan Utama -TMenuBar.Menu.OpenRecent = Buka Terbaru -TMenuBar.Menu.Import = Impor -TMenuBar.Menu.Export = Ekspor -TMenuBar.MenuItem.Video = Video -TMenuBar.MenuItem.Data = Berkas Data -TMenuBar.Menu.CopyObject = Salin Obyek -TMenuBar.MenuItem.Coords = Sistem Koordinat -TMenuBar.MenuItem.VideoClip = Video Clip -TMenuBar.Menu.MeasuringTools = Perangkat Pengukur -TMenuBar.Menu.AngleUnits = Satuan Sudut -TMenuBar.MenuItem.Degrees = Derajat -TMenuBar.MenuItem.Radians = Radian -Tracker.Dialog.NoXuggle.Title = Xuggle tidak ditemukan -Tracker.Dialog.NoXuggle.Message1 = Xuggle (mesin video cross-platform) tidak diinstal . -Tracker.Dialog.NoXuggle.Message2 = Download Xuggle dari http://www.xuggle.com/xuggler/downloads/ . -Tracker.Action.AboutXuggle = Perihal Xuggle -Tracker.Dialog.AboutXuggle.Title = Perihal Xuggle -Tracker.Dialog.AboutXuggle.Message.Version = Xuggle versi -Tracker.Dialog.AboutXuggle.Message.Home = Home Xuggle : -Tracker.Dialog.AboutXuggle.Message.Path = Jalur Xuggle.jar : -Tracker.Dialog.NoVideoEngine.Message1 = mesin video terinstal . Tanpa satu, Anda -Tracker.Dialog.NoVideoEngine.Message2 = hanya dapat membuka gambar (JPEG , PNG) dan animasi GIF . -Tracker.Dialog.NoVideoEngine.Message3 = Direkomendasikan: instal ulang Tracker dengan mesin video Xuggle . -Tracker.Dialog.NoVideoEngine.Title = Tidak Ada Mesin Video -Tracker.Dialog.NoXuggle.Message1 = Xuggle tidak bekerja dengan benar. Pastikan yang diperlukan -Tracker.Dialog.NoXuggle.Message2 = Berkas xuggle.jar berada di folder Tracker. Untuk rincian , -Tracker.Dialog.NoXuggle.Message3 = lihat Tracker_README.txt di folder Tracker -Tracker.Dialog.NoXuggle.Message4 = Untuk menginstal Xuggle, download installer Tracker terbaru dari -Tracker.Dialog.NoXuggle.Title = Xuggle Tidak Tersedia -Tracker.About.DefaultLocale = Bahasa default -Tracker.About.CurrentLanguage = Bahasa -Tracker.Dialog.InsufficientMemory.Title = Memori tidak cukup -Tracker.Dialog.InsufficientMemory.Message = ukuran memoriyang diminta terlalu besar . -TrackerIO.Dialog.TabMustBeSaved.Message1 = Tab -TrackerIO.Dialog.TabMustBeSaved.Message2 = harus disimpan sebagai berkas tracker untuk dimasukkan dalam tabset tersebut . -TrackerIO.Dialog.TabMustBeSaved.Message3 = Apakah Anda ingin menyimpannya? -TrackerIO.Dialog.TabMustBeSaved.Title = Tab belum disimpan -TrackerIO.Dialog.NoTabs.Message = Tidak ada tab untuk menghemat! -TrackerIO.Dialog.NoTabs.Title = Kosong Tabset -TrackerIO.Dialog.SaveTabset.Title = Simpan Tabset -TrackerIO.Dialog.SaveTab.Title = Simpan Tab -TrackerIO.Delimiter.Tab = Tab -TrackerIO.Delimiter.Space = Ruang -TrackerIO.Delimiter.Comma = Koma -TrackerIO.Delimiter.Semicolon = Titik koma -TrackerIO.VideoAndDataFileFilter.Description = Video dan berkas Tracker -TrackerPanel.Dialog.Version.Message1 = Anda membuka berkas yang dibuat dengan Tracker -TrackerPanel.Dialog.Version.Message2 = yang bisa merujuk ke -TrackerPanel.Dialog.Version.Message3 = fitur yang hilang di versi yang anda jalankan -TrackerPanel.Dialog.Version.Message4 = Versi terbaru tersedia di -TrackerPanel.Dialog.Version.Title = Versi Mismatch -TrackerPanel.Label.ModelStart = Frame Awal -TrackerPanel.Label.ModelEnd = Frame Akhir -TrackerPanel.Spinner.ModelStart.Tooltip = Mengatur frame awal untuk model ini -TrackerPanel.Spinner.ModelEnd.Tooltip = Mengatur frame akhir untuk model ini -TToolbar.Button.ProtractorVisible.Tooltip = Menampilkan atau menyembunyikan busur derajat -TToolbar.Button.AxesVisible.Tooltip = Menampilkan atau menyembunyikan sumbu koordinat -TToolBar.Button.TrackControl.Tooltip = Menampilkan atau menyembunyikan kontrol track -TTrack.Dialog.StepSizeWarning.Message1 = Perhatian: beberapa trek ditandai dengan ukuran langkah yang lebih besar dari satu, meninggalkan frame dilewati ditandai. -TTrack.Dialog.StepSizeWarning.Message2 = Mengubah ukuran langkah karena itu cenderung menghasilkan kesenjangan dalam kumpulan data. -TTrack.Dialog.StepSizeWarning.Message3 = kecepatan dan percepatan sekitar kesenjangan tidak dapat ditentukan sampai semua langkah yang ditandai. -TTrack.Dialog.StepSizeWarning.Title = Perhatian -TTrack.Dialog.SkippedStepWarning.Message1 = Perhatian: melewatkan langkah ketika menandai posisi meninggalkan kesenjangan dalam kumpulan data. -TTrack.Dialog.SkippedStepWarning.Title = Perhatian -TTrack.Dialog.SkippedStepWarning.Checkbox = Jangan tampilkan ini lagi -TTrack.Locked.Hint = terkunci -TTrack.AngleField.Radians.Tooltip = Sudut dalam radian -TTrack.AngleField.Degrees.Tooltip = Sudut dalam derajat -TTrack.AngleField.Popup.Radians = Beralih Untuk Radian -TTrack.AngleField.Popup.Degrees = Beralih ke Derajat -TTrackBar.Memory.Menu.SetSize = Atur ukuran memori -TTrackBar.Button.Version = Sekarang tersedia: versi -TTrackBar.Popup.MenuItem.Upgrade = Tingkatkan Sekarang -TTrackBar.Popup.MenuItem.Ignore = Abaikan -XuggleVideo.MenuItem.SmoothPlay = Bermain Halus (mungkin lambat) - -# Penambahan oleh Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name = Pita Kalibrasi -CircleFootprint.Circle = lingkaran -CircleFootprint.FilledCircle = lingkaran penuh -CircleFootprint.Dialog.Title = Lingkaran Jejak -CircleFootprint.Dialog.Label.Radius = Radius -CircleFootprint.Dialog.Checkbox.Bold = Bold -CircleFootprint.Dialog.Checkbox.CenterSpot = Pusat Spot -LineProfile.Hint.Marking = tikus tarik untuk menandai profil garis -PageTView.Button.Page = Halaman -PageTView.MenuItem.ClosePage = Tutup Halaman -PointMass.Hint.Marking = klik mouse untuk menandai, tekan tombol Enter untuk mengkloning langkah sebelumnya -PrefsDialog.Dialog.NewVersion.Title = Upgrade -PrefsDialog.Dialog.NewVersion.Message1 = Versi -PrefsDialog.Dialog.NewVersion.Message2 = sekarang tersedia di -PrefsDialog.Dialog.NewVersion.None.Message = Tidak ada versi baru yang tersedia saat ini . -RGBRegion.Hint.Marking = klik mouse untuk menandai pusat daerah -TMenuBar.MenuItem.Restore = Pulihkan Pengamatan -TrackControl.StretchVectors.None = Tidak ada peregangan -TViewChooser.Maximize.Tooltip = Maksimalkan pandangan ini -TViewChooser.Restore.Tooltip = Pulihkan pengamatan -Vector.Hint.Marking = tarik tetikus untuk menandai, tekan Enter untuk mengkloning langkah sebelumnya -WorldTView.Button.World = Dunia - -# Penambahan oleh Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle = Peringatan -PrefsDialog.Checkbox.WarnIfNoEngine = Tidak ada mesin video yang -PrefsDialog.Checkbox.WarnIfXuggleError = kesalahan non-fatal Xuggle -PropertiesDialog.Title = Properti -PropertiesDialog.Label.Author = Penulis -PropertiesDialog.Label.Contact = Kontak -TActions.Action.Properties = Properti -TActions.Action.OpenBrowser = Buka Peramban Pustaka -TFrame.Progress.Xuggle = Xuggle pemuatan frame -TFrame.Progress.ClickToCancel = (klik untuk membatalkan ) -TFrame.Dialog.StalledVideo.Title = Error Saat Memuat Video -TFrame.Dialog.StalledVideo.Message0 = video telah terhenti saat dimuat. Ini mungkin sementara. -TFrame.Dialog.StalledVideo.Message1 = Anda dapat memilih untuk menghentikan pemuatan sekarang atau terus menunggu. -TFrame.Dialog.StalledVideo.Message2 = Pilihan lain untuk membuka video ini meliputi: -TFrame.Dialog.StalledVideo.Message3 = 1. Gunakan perangkat lunak konversi video untuk mengubahnya menjadi format yang berbeda. -TFrame.Dialog.StalledVideo.Message4 = 2. Pilih QuickTime dalam file pemilih atau preferensi dialog . -TFrame.Dialog.StalledVideo.MessageMac = 2. Buka Tracker di Java VM 32-bit dan membukanya dengan QuickTime . -TFrame.Dialog.StalledVideo.Button.Stop = Berhenti -TFrame.Dialog.StalledVideo.Button.Wait = Tunggu -Tracker.Dialog.NoVideoEngine.Checkbox = Jangan tampilkan ini lagi -TrackerIO.ZipFileFilter.Description = Berkas ZIP (*.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1 = Xuggle telah mengalami kesalahan saat membuka video ini : -TrackerIO.Dialog.ErrorFFMPEG.Message2 = Tidak semua kesalahan adalah fatal. Untuk pesan kesalahan penuh, pilih Panduan | Log Pesan . -TrackerIO.Dialog.ErrorFFMPEG.Message3 = Jika Xuggle gagal, Anda mungkin dapat membuka video dengan QuickTime . -TrackerIO.Dialog.ErrorFFMPEG.MessageMac = Catatan: Pada Mac OSX ini membutuhkan menjalankan Tracker dala Java VMm 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title = Kesalahan Xuggle -TrackerIO.ErrorFFMPEG.LogMessage = Untuk lebih jelasnya, aktifkan peringatan Xuggle dalam preferensi dialog (Pembenahan | Preferensi ) . -TToolBar.Button.OpenBrowser.Tooltip = Buka Peramban Pustaka Digital OSP - -# Penambahan oleh Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title = Berkas Tidak Ditemukan -TFrame.Dialog.NoTRKInComPADRE.Message = Tidak ditemukan berkas Tracker dalam node - -# Penambahan oleh Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title = Partikel kinematik -DynamicParticle.Builder.Title = Partikel Dinamis (Cartesian) -DynamicParticlePolar.Builder.Title = Dinamis Partikel (Polar) -DynamicSystem.Builder.Title = Sistem Dinamis (internal) -PropertiesDialog.Button.CopyFilePath = Salin Berkas Tracker -PropertiesDialog.Button.CopyVideoPath = Salin Video Tracker -PropertiesDialog.Tab.TrackerFile = Berkas Tracker -PropertiesDialog.Tab.Metadata = Metadata -PropertiesDialog.Header.Property = Properti -PropertiesDialog.Header.Value = Nilai -TActions.Action.OpenURL = Buka URL -TActions.Dialog.OpenURL.Title = Buka URL -TActions.Dialog.OpenURL.Message = Masukkan URL video berbasis web, berkas Tracker atau berkas zip Tracker -TActions.Dialog.AboutVideo.Name = Nama - -# Penambahan oleh Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle = Berkas Tembolok Web -PrefsDialog.Button.ClearCache = Batal Semua - -# Penambahan oleh Doug Brown 2011-10-07 -PointMass.Remark.Hint = shift- klik untuk kembali menandai posisi disorot -PointMass.Remarking.Hint = klik mouse untuk menandai ulang posisi -PointMass.PositionSelected.Hint = tarik atau masukkan posisi pada toolbar -PointMass.VectorSelected.Hint = tarik untuk memindahkan -Vector.Remark.Hint = shift-klik untuk kembali menandai yang disorot tip -Vector.TipSelected.Hint = tarik atau masukkan komponen pada toolbar -Vector.HandleSelected.Hint = tarik untuk memindahkan -Vector.Remarking.Hint = klik mouse untuk kembali menandai tip -AutoTracker.Label.Search = Pencarian -AutoTracker.Label.Target = Target -AutoTracker.Label.Frame = Frame -AutoTracker.Label.Point = Titik -AutoTracker.Label.Template = Contoh -AutoTracker.Label.Track = Jalur -AutoTracker.Label.Match = Pengamatan -AutoTracker.Label.NoTemplate = Tidak ada Contoh -AutoTracker.Label.EvolutionRate = Tingkat Evolusi -AutoTracker.Label.Automark = Tandai Automatis -AutoTracker.Info.Instructions = Klik tombol Cari untuk mencari pertandingan di daerah pencarian ditampilkan. -AutoTracker.Info.KeyFrame.Instructions1 = Ini frame kunci untuk mendefinisikan contoh dan target yang ditampilkan. Klik tombol Cari untuk mencari contoh pengamatan. -AutoTracker.Info.KeyFrame.Instructions2 = Anda dapat menyeret daerah sasaran, contoh atau pencari untuk memindahkan atau mengubah ukurannya. -AutoTracker.Info.MouseOver.Instructions = Mouse kontrol atas untuk mempelajari lebih lanjut tentang pengaturan dan penyesuaian . -AutoTracker.Info.Mask1 = Contoh adalah gambar untuk dicocokkan. Dimulai dengan frame kunci dan berkembang untuk beradaptasi dengan perubahan bentuk dan warna. -AutoTracker.Info.Mask2 = Tingkat tandai automatik adalah skor pengamatan minimum yang diperlukan untuk otomatis menandai. -AutoTracker.Info.Mask.Instructions = Memindahkan atau mengubah ukuran template dengan menyeret pinggiran atau sudut pegangannya (bingkai kunci saja). Sesuaikan tingkat evolusi dan tingkat automark menggunakan pemintal. -AutoTracker.Info.Mask.Tip = Tingkat tandai automatik yang rendah dapat mengakibatkan pengamatan palsu - coba tingkatkan laju evolusi sebagai penggantinya. -AutoTracker.Info.Search = Area pencarian dipindai untuk pengamatan terbaik. -AutoTracker.Info.SearchOnAxis = Sumbu-x di daerah pencarian dipindai untuk pengamatan terbaik. -AutoTracker.Info.Search.Instructions = Pindahkan atau ubah ukuran area pencarian dengan menyeret pinggiran atau sudut pegangannya. Atur sumbu x dan pilihan tampak-depan dengan memeriksa kotak mereka. -AutoTracker.Info.Search.Tip = Daerah pencari tidak perlu besar dalam banyak kasus. Pilihan automatis tampak-depan untuk memindahkan area pencarian demi prediksi pengamatan posisi. -AutoTracker.Info.Target = Targetnya adalah titik di mana trek ditargetkan ditandai . -AutoTracker.Info.Target.Instructions = Pindahkan target dengan menyeretnya (frame kunci saja). Pilih trek yang ditargetkan dan titik dari daftar drop-down . -AutoTracker.Info.Title.Settings = Pengaturan -AutoTracker.Info.Title.Tip = Tip -AutoTracker.Info.SelectTrack = Silakan pilih atau membuat trek dan titik Anda ingin AutoTrack. -AutoTracker.Info.OutsideXAxis = Sumbu-x tidak melewati area pencarian. Pilihan Anda adalah : -AutoTracker.Info.NewKeyFrame = - langkah kembali dan mengubah tingkat evolusi atau pergeseran kontrol - klik untuk menentukan bingkai kunci baru -AutoTracker.Info.Replace = - menerima pertandingan -AutoTracker.Info.Keep = - melewatkan frame ini dan meninggalkan tidak berubah -AutoTracker.Info.PossibleReplace = Sebuah pertandingan yang mungkin ditampilkan . Pilihan Anda adalah : -AutoTracker.Wizard.Button.Accept = Terima -AutoTracker.Wizard.Button.Stop = Berhenti -AutoTracker.Wizard.Button.Skip = Loncat -AutoTracker.Wizard.Button.Replace = Ganti -AutoTracker.Wizard.Button.Keep = Penurunan -AutoTracker.Wizard.Button.Search = Pencarian -AutoTracker.Wizard.Button.SearchThis = Cari Ini -AutoTracker.Wizard.Button.SearchNext = Cari Berikutnya -AutoTracker.Wizard.Button.Delete = Hapus -AutoTracker.Wizard.Button.ShowKeyFrame = Tampilkan Frame Kunci -AutoTracker.Wizard.Button.DeleteKeyFrame = Hapus Frame Kunci -AutoTracker.Wizard.Checkbox.LookAhead = Lihat Dari Atas -AutoTracker.Wizard.Checkbox.XAxis = Hanya Sumbu X -AutoTracker.Wizard.Menuitem.DeleteThis = Titik ini -AutoTracker.Wizard.Menuitem.DeleteLater = Titik Selanjutnya -AutoTracker.Wizard.Menuitem.DeleteAll = Batal Semua -TToolBar.Button.AutoTracker.Tooltip = Menampilkan atau menyembunyikan autotracker -MainTView.Popup.MenuItem.ZoomIn = Perbesar -MainTView.Popup.MenuItem.ZoomOut = Perkecil -MainTView.Popup.MenuItem.ZoomToFit = Pembesaran Ditetapkan -TrackerIO.Dialog.DurationVaries.Title = Frame Durasi -TrackerIO.Dialog.DurationVaries.Message1 = Beberapa beda durasi frame dari lebih dari rata-rata -TrackerIO.Dialog.DurationVaries.Message2 = Untuk kecepatan dan percepatan akurat, Anda harus mengecualikan frame ini dari -TrackerIO.Dialog.DurationVaries.Message3 = perhitungan dengan menetapkan frame awal dan frame akhir dari klip video. -TrackerIO.Dialog.DurationVaries.Message4 = Pengecualian Untuk Frame : -TrackerIO.Dialog.DurationVaries.Message5 = Durasi rata-rata dan nilai frame jika dikesampingkan: -TFrame.Dialog.LibraryError.Title = Kesalahan -TFrame.Dialog.LibraryError.Message = Tidak ada sumber daya dapat diambil untuk node - -# Penambahan oleh Doug Brown 2011-12-01 -TTrack.Label.Unmarked = shift-klik untuk menandai -PrefsDialog.Label.Path = Jalur -PrefsDialog.Checkbox.ClearCacheOnExit = Hapus pada keluar -PrefsDialog.FileChooser.Title.Cache = Atur Tombolok -PrefsDialog.FileFilter.Directories = Direktori -Tracker.Action.AboutThreads = Perihal Thread -PrefsDialog.JRE.BorderTitle = Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE = Atur Java VM -PrefsDialog.FileFilter.JRE = Direktori dan Java VM -PrefsDialog.Version.BorderTitle = Tracker Versi -PrefsDialog.Version.Default = default -PrefsDialog.Tab.ClearCacheOnExit = Hapus pada keluar -PrefsDialog.Run.BorderTitle = Program Dieksekusi saat Startup -PrefsDialog.FileChooser.Title.Run = Pilih Berkas Executable -PrefsDialog.Button.Save = Simpan -Tracker.Readme = Tracker README -Tracker.Readme.NotFound = README file tidak ditemukan -Popup.MenuItem.Algorithm = Algoritma -AlgorithmDialog.Button.FiniteDifference = Hingga Perbedaan -AlgorithmDialog.Button.BounceDetect = Deteksi Pantulan -AlgorithmDialog.TitledBorder.Choose = Pilih algoritma yang digunakan untuk menghitung kecepatan dan percepatan: -AlgorithmDialog.Title = Algoritma -AlgorithmDialog.FiniteDifference.Message1 = ini adalah algoritma default. -AlgorithmDialog.FiniteDifference.Message2 = Velocity : v[i] = (x[i+1] - x[i-1]) / (2*dt ) -AlgorithmDialog.FiniteDifference.Message3 = Percepatan : a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2] ) / (7*dt^2) -AlgorithmDialog.BounceDetect.Message1 = Algoritma ini menghaluskan kecepatan dan percepatan, tetapi juga mendeteksi perubahan mendadak dalam kecepatan. -AlgorithmDialog.BounceDetect.Message2 = Perhatian: dapat menghasilkan artefak. Untuk informasi lebih lanjut, lihat : -TMenuBar.Menu.Diagnostics = Diagnostik - -# Penambahan oleh Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title = Berkas XML Tidak Valid -Tracker.Dialog.Invalid.Message = Berkas tidak dapat dibaca . -TrackPlottingPanel.Popup.Menu.CompareWith = Bandingkan Dengan -TrackerPanel.DataBuilder.TrackType.Unknown = TakDikenal -TrackerPanel.DataBuilder.Button.Load.Tooltip = Memuat fungsi Data dari berkas XML -TrackerPanel.DataBuilder.Button.Save.Tooltip = Simpan fungsi data dalam berkas XML -TrackerPanel.DataBuilder.Load.Title = Memuat Fungsi Data -TrackerPanel.DataBuilder.Load.Message = Pilih fungsi untuk dimuat : -TrackerPanel.DataBuilder.Save.Title = Simpan Fungsi Data -TrackerPanel.DataBuilder.Save.Message = Pilih fungsi untuk disimpan : -TrackerPanel.DataBuilder.Dialog.Load.Button.All = Memuat ke semua -TrackerPanel.DataBuilder.Dialog.Load.Button.Only = Memuat hanya -TrackerPanel.DataBuilder.Dialog.Load.Title = Seleksi Track -TrackerPanel.DataBuilder.Dialog.Load.Message = Apakah Anda ingin memuat fungsi untuk menjadi semua jenis trek -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title = Salah Tipe Track -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1 = Berkas mendefinisikan fungsi data untuk jenis track -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2 = Mereka tidak dapat dimuat ke dalam jenis -TrackerPanel.DataBuilder.Dialog.WrongType.Title = Salah Ketik -TrackerPanel.DataBuilder.Dialog.WrongType.Message = Berkas tidak mendefinisikan fungsi data. - -# Penambahan oleh Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1 = Klip Tracker telah disimpan sebagai -ExportTRKDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ExportTRKDialog.Complete.Title = Ekspor Lengkap -ExportTRKDialog.Title = Ekspor Klip Tracker -ExportTRKDialog.Message1 = Ini (1) ekspor klip video, (2) ubah data tab untuk mencocokkan video yang diekspor, dan (3) simpan tab dikonversi sebagai file Tracker baru. -ExportTRKDialog.Message2 = Tracker dan berkas video disimpan dalam direktori yang sama dengan nama yang sama tapi ekstensi berbeda. -TMenuBar.MenuItem.TabClip = Klip Tracker -TMenuBar.Menu.CalibrationTools = Alat Kalibrasi -TrackerIO.Dialog.DurationVaries.Button.SetClip = Pengaturan Direkomendasikan Klip -TrackerIO.Dialog.DurationVaries.Start = mulai -TrackerIO.Dialog.DurationVaries.End = akhir -TrackerIO.Dialog.DurationVaries.Recommended = Rekomendasi Clip - -# Penambahan oleh Doug Brown 2012-05-07 -AttachmentInspector.Title = Lampirkan Akhir -AttachmentInspector.Label.End = Akhir -AttachmentInspector.Label.Vertex = Vertex -AttachmentInspector.Header.PointName = Nama -AttachmentInspector.Header.AttachedTo = Lampirkan Untuk -ExportTRKDialog.Label.VideoFormat = Format Video -MeasuringTool.MenuItem.Attach = Lampirkan Akhir -PerspectiveTrack.Corner = sudut -PrefsDialog.LogLevel.BorderTitle = Startup Pesan Tingkat Log -Protractor.Data.Description.0 = waktu -Protractor.Data.Description.1 = busur derajat sudut -Protractor.Data.Description.2 = panjang lengan 1 -Protractor.Data.Description.3 = panjang lengan 2 -Protractor.Data.Description.4 = jumlah langkah -Protractor.Data.Description.5 = nomor rangka -TapeMeasure.Data.Description.0 = waktu -TapeMeasure.Data.Description.1 = panjang -TapeMeasure.Data.Description.2 = sudut diukur dari sumbu x + -TapeMeasure.Data.Description.3 = jumlah langkah -TapeMeasure.Data.Description.4 = nomor rangka - -# Penambahan oleh Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched = Pencarian tidak ditemukan -AutoTracker.Info.KeyFrame = Frame Kunci -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame = Kunci Frame Ini -AutoTracker.Wizard.Menuitem.DeleteThisMatch = Pengamatan Ini -AutoTracker.Wizard.Menuitem.DeleteLaterMatches = Pengamatan Se;anjutnya -PrefsDialog.Checkbox.64BitVM = 64-bit - -# Penambahan oleh Doug Brown 2012/11/20 -AutoTracker.Wizard.Title = Autotracker -Dialog.Button.Add = Tambah -Dialog.Button.Remove = Hapus -PrefsDialog.Button.ClearHost = Batal host -PrefsDialog.Button.ClearHost.Tooltip = menghapus semua berkas yang berhubungan dengan web host yang dipilih dari tembolok OSP -PrefsDialog.Button.ClearCache.Tooltip = menghapus semua berkas dari tembolok OSP -TActions.Action.SaveZip = Ekspor Tracker ZIP -ThumbnailDialog.Title = Ekspor Gambar kecil -ThumbnailDialog.Settings.Title = Pilihan Thumbnail -ThumbnailDialog.Label.CurrentImage = Gambar Lancar -ThumbnailDialog.Label.FrameNumber = frame -ThumbnailDialog.Label.StepNumber = langkah -ThumbnailDialog.View.VideoOnly = Hanya Video -ThumbnailDialog.View.MainView = Pengamatan Utama -ThumbnailDialog.View.WholeFrame = Seluruh Frame -ThumbnailDialog.Format.PNG = Gambar PNG -ThumbnailDialog.Format.JPG = Image JPEG -ThumbnailDialog.Chooser.SaveThumbnail.Title = Simpan Thumbnail -ThumbnailDialog.Subtitle.Image = Gambar -TMenuBar.MenuItem.Thumbnail = Gambar kecil -TToolBar.Button.SaveZip.Tooltip = Ekspor Tracker berkas ZIP -TTrack.MenuItem.DeletePoint = Hapus Langkah Dipilih -ZipResourceDialog.Title = Ekspor Tracker ZIP -ZipResourceDialog.Label.Format = Format -ZipResourceDialog.Label.Title = Nama -ZipResourceDialog.Label.Description = Keterangan -ZipResourceDialog.Label.Keywords = Kata Kunci -ZipResourceDialog.Label.Link = Link eksternal -ZipResourceDialog.Label.HTML = Sumber HTML -ZipResourceDialog.Complete.Message1 = Berkas Tracker ZIP telah disimpan sebagai -ZipResourceDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ZipResourceDialog.Complete.Title = Sukses -ZipResourceDialog.Border.Title.Documentation = Dokumentasi HTML -ZipResourceDialog.Border.Title.Video = Video -ZipResourceDialog.Border.Title.Thumbnail = Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title = Ekspor Tracker ZIP -ZipResourceDialog.FileChooser.AddFile.Title = Tambah Berkas untuk Tracker ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title = Buka berkas HTML -ZipResourceDialog.Button.AddFiles = Tambah Berkas -ZipResourceDialog.Button.ThumbnailSettings = Thumbnail Pilihan -ZipResourceDialog.Checkbox.TrimVideo = Potong untuk Klip -ZipResourceDialog.AddHTMLInfo.Title = Tambah Info Berkas HTML -ZipResourceDialog.AddHTMLInfo.Message1 = Apakah Anda ingin menambahkan berkas info HTML -ZipResourceDialog.AddHTMLInfo.Message2 = ke ZIP Tracker? -ZipResourceDialog.HTMLField.DefaultText = Jika tidak ditentukan, berkas akan dibuat dari awal -ZipResourceDialog.Dialog.AddFiles.Title = Tambah HTML dan Berkas PDF -ZipResourceDialog.Tooltip.HTML = Jalur ke berkas sumber HTML (jika tidak ada, berkas akan dibuat dari awal) -ZipResourceDialog.Tooltip.Author = Penulis sumber daya ini -ZipResourceDialog.Tooltip.Title = Nama Tampilan sumber ini (bukan nama file) -ZipResourceDialog.Tooltip.Description = Penjelasan yang berguna sumber daya ini -ZipResourceDialog.Tooltip.Keywords = Sebuah daftar kata kunci untuk mencari di browser DL -ZipResourceDialog.Tooltip.Contact = Penulis informasi kontak (institusi, e-mail, situs web, dll ) -ZipResourceDialog.Tooltip.Link = URL dari berkas HTML eksternal dengan informasi lebih lanjut tentang sumber daya ini -ZipResourceDialog.Tooltip.ThumbnailSettings = Mengubah tampilan thumbnail, ukuran atau jenis file -ZipResourceDialog.Tooltip.AddFiles = Tambah HTML dan berkas PDF ke ZIP Tracker -ZipResourceDialog.Tooltip.TrimVideo = Periksa untuk mengekspor klip video, hapus centang untuk menggunakan video asli -ZipResourceDialog.Tooltip.LoadHTML = Gunakan pemilih berkas untuk memuat file HTML Info - -# Penambahan oleh Doug Brown 2012/12/10 -PrefsDialog.Checkbox.32BitVM = 32-bit -PrefsDialog.Checkbox.WarnVariableDuration = Variabel durasi frame -PrefsDialog.Button.NoEngine = Tidak ada -PrefsDialog.Dialog.SwitchToQT.Message = Beralih ke QuickTime juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message = Beralih ke Xuggle juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message = Beralih ke Xuggle juga perubahan VM Java untuk 64-bit. -PrefsDialog.Dialog.SwitchVM.Title = Java VM Berubah -PrefsDialog.Dialog.SwitchTo32.Message = Beralih ke 32-bit Java VM juga mengubah mesin video QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message = Beralih ke 64-bit Java VM juga mengubah mesin video Xuggle. -PrefsDialog.Dialog.SwitchEngine.Title = Video Mesin Berubah -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1 = mesin ada video yang tersedia untuk 64-bit Java VM. Anda akan -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2 = masih dapat gambar terbuka (JPEG , PNG) dan animasi GIF. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question = Anda yakin ingin beralih ke VM 64-bit? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title = Tidak ada 64-bit Video Mesin -PrefsDialog.Dialog.No32bitVMXuggle.Message = A 32-bit Java VM harus diinstal sebelum Xuggle dapat digunakan. -PrefsDialog.Dialog.No32bitVMQT.Message = A 32-bit Java VM harus diinstal sebelum QuickTime dapat digunakan. -PrefsDialog.Dialog.No32bitVM.Message = Untuk informasi lebih lanjut, lihat Bantuan Tracker: Instalasi. -PrefsDialog.Dialog.No32bitVM.Title = Diperlukan VM 32-bit -PrefsDialog.Button.ShowHelpNow = Tampilkan Bantuan Sekarang -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant = TIDAK KONSTAN -TMenuBar.MenuItem.CheckFrameDurations = Pemeriksaan Durasi Frame -TMenuBar.MenuItem.ExportZIP = Tracker Zip -Tracker.Dialog.Install32BitVM.Message = Anda harus menginstal Java VM 32-bit sebelum mesin video dapat digunakan. -Tracker.Dialog.SwitchTo32BitVM.Message1 = Satu atau lebih mesin video terinstal tapi tidak tersedia karena mereka -Tracker.Dialog.SwitchTo32BitVM.Message2 = memerlukan Java VM 32-bit dan Anda sekarang sedang berjalan di VM 64-bit. -Tracker.Dialog.SwitchTo32BitVM.Question = Apakah Anda ingin meluncurkan kembali dengan VM 32 bit dan mesin default? -Tracker.Dialog.Button.RelaunchNow = Ya, peluncuran kembali sekarang -Tracker.Dialog.Button.ShowPrefs = Tidak, tapi melalui preferensi -Tracker.Dialog.Button.ContinueWithoutEngine = Tidak, lanjutkan tanpa video -Tracker.Dialog.EngineProblems.Message1 = Satu atau lebih mesin video terinstal tapi tidak bekerja . -Tracker.Dialog.EngineProblems.Message2 = Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang Xuggle atau QuickTime . -Tracker.Dialog.ReplaceXuggle.Message1 = Kami sarankan anda mengganti mesin video Xuggle anda saat ini -Tracker.Dialog.ReplaceXuggle.Message2 = Xuggle dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 -Tracker.Dialog.ReplaceXuggle.Message3 = atau di atasnya) dan memilih Xuggle dalam pilihan instalasi. -TrackerIO.Dialog.DurationIsConstant.Message = Semua durasi frame sama (fps konstan) . -TrackerIO.ZIPResourceFilter.Description = Tracker Berkas ZIP (*.TRZ) -TToolbar.Button.Desktop.Tooltip = Tampilan tambahan HTML dan atau dokumen PDF -ZipResourceDialog.BadModels.Message1 = Klip video tidak termasuk awal kerangka -ZipResourceDialog.BadModels.Message2 = berikut trek Partikel Model. Jika Anda memotong video yang -ZipResourceDialog.BadModels.Message3 = model TIDAK akan disertakan dalam diekspor Tracker ZIP. -ZipResourceDialog.BadModels.Question = Apakah Anda ingin melanjutkan dan membuang model? -ZipResourceDialog.BadModels.Title = Klip - Model Konflik -TMenuBar.MenuItem.EditVideoFrames = Muat Semua Gambar -TMenuBar.Dialog.RequiresMemory.Message1 = Semua gambar akan dimuat ke memori untuk respon lebih cepat dan pembenahan. -TMenuBar.Dialog.RequiresMemory.Message2 = Silakan periksa memori yang tersedia dan peluncuran dengan lebih jika diperlukan. -TMenuBar.Dialog.RequiresMemory.Title = Memori - -# Penambahan oleh Doug Brown 2013/01/25 -PointMass.Data.Description.PixelX = komponen pixel-x -PointMass.Data.Description.PixelY = komponen pixel-y -ExportVideoDialog.Content.DeinterlacedVideo = Video yang ter-deinterlace -ExportVideoDialog.Deinterlace.OddFirst = Isian negatif pertama -ExportVideoDialog.Deinterlace.EvenFirst = Kejadian lapangan pertama -ExportVideoDialog.Deinterlace.Dialog.Title = Isian orde ter-deinterlace -TFrame.Dialog.LibraryError.FileNotFound.Title = Berkas Tidak Ditemukan -TFrame.Dialog.LibraryError.FileNotFound.Message = Tidak dapat menemukan berkas -TrackerPanel.DataBuilder.Button.Autoload = Memuat automatik -TrackerPanel.DataBuilder.Button.Autoload.Tooltip = Mengelola automuat fungsi data -TrackerPanel.DataBuilder.Autoload.Title = Automuat Fungsi Data -TrackerPanel.DataBuilder.Autoload.Message = Pilih fungsi untuk automuat: -TrackerPanel.DataBuilder.Chooser.XMLFiles = Berkas XML -TrackerIO.Dialog.Open.Title = Buka -TToolbar.Button.Refresh.Popup.RefreshNow = Segarkan -TToolbar.Button.Refresh.Popup.AutoRefresh = Autosegar -TToolbar.Button.Refresh.Tooltip = Segarkan data dan pandangan - -# Penambahan oleh Doug Brown 2013/05/10 -CoordAxes.Origin.Label = posisi asal pixel +# This is the indonesian language tracker_in.properties file +# Translated by Wachid Qomaruddin 2013 + +Calibration.Name=Kalibrasi +Calibration.New.Name=Kalibrasi +CenterOfMass.Name=Pusat Massa +CenterOfMass.New.Name=Pusat Massa +CenterOfMass.MenuItem.Inspector=Pilih Massa +CenterOfMassInspector.Title=Pusat Mssa +CenterOfMassInspector.Border.Title=Pilih Massa +ConfigInspector.Border.Title=Pilih Item Yang Di Inginkan +ConfigInspector.Title=Preferensi +ConfigInspector.Button.SaveAsDefault=Simpan Sebagai Default +CoordAxes.Name=Sumbu Koordinat +CoordAxes.New.Name=Sumbu Koordinat +Dialog.Button.Cancel=Batal +Dialog.Button.OK=OK +Dialog.Button.Close=Tutup +Dialog.Button.All=Semua +Dialog.Button.None=Non +Dialog.Button.Copy=Salin +Dialog.Button.Update=Update +Dialog.Button.SelectAll=Pilih Semua +Footprint.Diamond=Berlian +Footprint.BoldDiamond=Berlian Tebal +Footprint.SolidDiamond=Berlian Tipis +Footprint.Triangle=Segitiga +Footprint.BoldTriangle=Segitiga Tebal +Footprint.SolidTriangle=Segitiga Tipis +Footprint.Circle=Lingkaran +Footprint.BoldCircle=Lingkaran Tebal +Footprint.SolidCircle=Lingkaran Tipis +Footprint.VerticalLine=Garis Vertikal +Footprint.BoldVerticalLine=Garis Vertikal Tebal +Footprint.HorizontalLine=Garis Horisontal +Footprint.BoldHorizontalLine=Garis Horisontal Tebal +Footprint.Crosshair=Salib +Footprint.BoldCrosshair=Salib Tebal +Footprint.SimpleAxes=Sumbu Sederhana +Footprint.BoldSimpleAxes=Sumbu Sederhana Tebal +Footprint.Spot=Noda +Footprint.Line=Garis +Footprint.BoldLine=Garis Tebal +Footprint.Outline=Garis Luar +Footprint.BoldOutline=Garis Luar Tebal +Footprint.Arrow=Anak Panah +Footprint.BoldArrow=Anak Panah Tebal +Footprint.DoubleArrow=Anak Panah Ganda +Footprint.BoldDoubleArrow=Anak Panah Ganda Tebal +Footprint.2xArrow=Anak Panah 2x +Footprint.Bold2xArrow=Anak Panah Tebal 2x +Footprint.4xArrow=Anak Panah 4x +Footprint.Bold4xArrow=Anak Panah Tebal 4x +Footprint.DashArrow=Anak Panah Terpisah +Footprint.BoldDashArrow=Anak Panah Terpisah Tebal +Footprint.BigArrow=Anak Panah Besar +Footprint.BigDashArrow=Anak Panah Besar Terpisah +LineProfile.Name=Profil Garis +LineProfile.New.Name=Profil +LineProfile.Data.Brightness=Ketajaman +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=Merah +LineProfile.Data.Green=Hijau +LineProfile.Data.Blue=Biru +LineProfile.Data.Weighting=Berat +MainTView.Popup.MenuItem.QTPlayer=Memainkan QuickTime +MainTView.Popup.MenuItem.Zoom=Pembesaran +MainTView.Popup.MenuItem.ToFit=Sesuai +OffsetOrigin.Name=Penyesuaian Awal +OffsetOrigin.New.Name=Penyesuaian +PlotTrackView.Button.PlotCount=Plot +PlotTrackView.Button.PlotCount.ToolTip=Pilih Bilangan Plot +PointMass.Name=Titik Massa +PointMass.New.Name=Massa +PointMass.MenuItem.VectorsToPosition=Vektor Posisi +PointMass.MenuItem.Velocity=Kecepatan +PointMass.MenuItem.Acceleration=Percepatan +Star.Name=Bintang +Star.New.Name=Bintang +TableTrackView.Action.CopyData=Salin Data +TableTrackView.Button.SelectTableData=Data +TableTrackView.Button.SelectTableData.ToolTip=Pilih Data +TableTrackView.Popup.MenuItem.Analyze=Analisis +TableTrackView.Dialog.Border.Title=Tunjukkan: +TActions.Action.Description=Deskripsi +TActions.Action.ClearTracks=Bersihkan +TActions.Action.NewTab=Tab Baru +TActions.Action.Copy=Salin +TActions.Action.Paste=Letakkan +TActions.Action.Open=Buka +TActions.Action.Close=Tutup +TActions.Action.Import=Impor +TActions.Action.Save=Simpan +TActions.Action.SaveAs=Simpan Sebagai +TActions.Action.Export=Ekspor +TActions.Action.CaptureVideo=Tangkap Video +TActions.Action.Delete=Hapus +TActions.Action.Config=Preferensi +TActions.Action.AxesVisible=Tampak +TActions.Action.TapeVisible=Tampak +TActions.Action.Print=Cetak +TActions.Action.ClearFilters=Bersihkan +TActions.Action.ImportVideo=Impor Video +TActions.Action.CloseVideo=Tutup Video +TActions.Action.CloseAll=Tutup Semua +TActions.Action.Exit=Keluar +TActions.Dialog.PrintError.Message=Terjadi Error Dalam Pencetakan +TActions.Dialog.PrintError.Title=Pencetakan Error +TActions.Dialog.Description.Title=Deskripsi: +TActions.Dialog.DeleteLockedTracks.Message=Lokasi trek yang sama.Bagaimanapun dihapus? +TActions.Dialog.DeleteLockedTracks.Title=Hapus Lokasi Trek? +TActions.Dialog.NewPointMass.Title=Titik Massa Baru +TapeMeasure.Name=Pita Pengukur +TapeMeasure.New.Name=Pita Pengukur +TapeMeasure.MenuItem.Fixed=Tetap +TFrame.View.Plot=Tampilan Plot +TFrame.View.Table=Tabel Plot +TFrame.View.World=Tampilan Objek +TFrame.View.Video=Tampilan Video +TFrame.Dialog.Help.Title=Panduan +TMenuBar.Menu.File=Berkas +TMenuBar.Menu.Edit=Pembenahan +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Trek +TMenuBar.Menu.Coords=Sumbu Koordinat +TMenuBar.Menu.Window=Jendela Trek +TMenuBar.Menu.Help=Info Tracker +TMenuBar.MenuItem.EditProperties=Properti +TMenuBar.MenuItem.VideoVisible=Ketampakan Video +TMenuBar.MenuItem.VideoFilters=Filter Video +TMenuBar.MenuItem.NewVideoFilter=Filter Video Baru +TMenuBar.MenuItem.NewTrack=Trek Baru +TMenuBar.MenuItem.CoordsLocked=Sumbu Koordinat Berlokasi +TMenuBar.MenuItem.CoordsFixedOrigin=Pastikan Sumbu Koordinat Awal +TMenuBar.MenuItem.CoordsFixedAngle=Pastikan Sumbu Koordinat Sudut +TMenuBar.MenuItem.CoordsFixedScale=Pastikan Sumbu Koordinat Skala +TMenuBar.MenuItem.CoordsRefFrame=Referensi Frame +TMenuBar.MenuItem.CoordsDefault=Default +TMenuBar.MenuItem.WindowRight=Tampilan Plot Pengetrekkan +TMenuBar.MenuItem.WindowBottom=Pengetrekkan Video Bawah +TMenuBar.MenuItem.PlayAllSteps=Mainkan semua Langkah +TMenuBar.MenuItem.Record=Rekam +TMenuBar.MenuItem.MatSize=Ukuran Tampilan Video +TMenuBar.MenuItem.Language=Pilihan Bahasa +TMenuBar.MenuItem.DeleteTrack=Hapus +TMenuBar.MenuItem.TrackerHelp=Panduan +TMenuBar.MenuItem.MessageLog=Kotak Pesan +TrackControl.Name=Kontrol Trek +TrackControl.Button.NewTrack=Trek Baru +TrackControl.Button.NewTrack.ToolTip=Membuat Trek Baru +TrackControl.Button.Trails.ToolTip=Rel Kereta +TrackControl.Button.Labels.ToolTip=Label +TrackControl.Button.StretchVectors.ToolTip=vektor lurus +TrackControl.Button.Accelerations.ToolTip=Percepatan +TrackControl.Button.Xmass.ToolTip=Multiplikasi Massa +TrackControl.Button.Vectors.ToolTip=Vektor +TrackControl.Button.Velocities.ToolTip=Kecepatan +TrackControl.Button.Properties.ToolTip=Properti +TrackControl.Button.Positions.ToolTip=Posisi +Tracker.Name=Tracker Video Analizer +Tracker.Popup.MenuItem.Snapshot=Potret +Tracker.Popup.MenuItem.Help=Panduan +Tracker.Cursor.Crosshair.Description=Krusor salib untuk menandai titik +Tracker.Action.AboutTracker=Perihal Tracker +Tracker.Dialog.AboutTracker.Title=Tracker +Tracker.Dialog.AboutTracker.Copyright=Alih Bahasa Tampilan Tracker oleh Wachid Qomaruddin, atas ijin Douglas Brown +Tracker.Dialog.AboutTracker.URL=http://www.cabrillo.edu/~dbrown/tracker/ +Tracker.Action.AboutJava=Perihal JAVA VM +Tracker.Dialog.AboutTrackerOSPorg=Open Source Physics (OSP) Project +Tracker.Dialog.AboutTrackerOSPurl=http://www.opensourcephysics.org/ +Tracker.Dialog.AboutJava.Title=Perihal JAVA VM +Tracker.Dialog.AboutJava.UnknownVersion=Versi Tidak Diketahui +Tracker.Dialog.AboutJava.Message=Versi JAVA VM +Tracker.Dialog.AboutJava.URL=Update JAVA di http://java.sun.com/javase/downloads/ +Tracker.Action.AboutQT=Perihal QuickTime +Tracker.Dialog.AboutQT.Title=Perihal QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=Versi QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versi QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=Alokasi path QTJava: +Tracker.Dialog.NoQT.Title=Tidak Ditemukan QTJava.zip +Tracker.Dialog.NoQT.Message1=QuickTime untuk Java tidak terlihat telah terinstal atau bukan versi yang diinginkan, Instal QuickTime v7 keatas, atau download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.NoQT.Message2=Jika anda ingin menganalisis QuickTime movie, silakan instal ulang QuickTime v7 keatas atau Instal iTunes v7 keatas. +Tracker.Dialog.NoQT.Message3=PENTING: QuickTime untuk JAVA Sun Microsystem harus dipilih ketika anda menginstal QuickTime. +Tracker.Dialog.UpdateQT.Title=Update QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Ditemukan Versi terbaru QuickTime.zip, silakan download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.UpdateQT.Message2=Anda ingin memperbaharui berkas keluaran? +Tracker.Dialog.CopyQT.Title=Salin QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime telah terinstal, tetapi sebelum menggunakan Tracker dan anda harus : +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip harus anda salin dari +Tracker.Dialog.CopyQT.Message3= ke +Tracker.Dialog.CopyQT.Message4= 2. Tracker harus direstart ulang. +Tracker.Dialog.CopyQT.Message5=Ada ingin menyalin QTJava.zip sekarang? +Tracker.Dialog.CopyFailed.Title=Penyalinan gagal. Periksa versi QuickTime anda. +Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Periksa QuickTime anda sekali lagi atau gunakan iTunes v7. Silakan download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.CopiedTo.Title=Proses penyalinan berhasil. Selamat!. +Tracker.Dialog.CopiedTo.Message1=QTJava.zip telah sukses di salin +Tracker.Dialog.CopiedTo.Message2=Tracker harus direstart ulang dan akan keluar sekarang. +Tracker.Splash.Loading=Dalam proses memuat, silakan tunggu +TrackerIO.Dialog.Import.Title=Impor +TrackerIO.Dialog.Import.Message=Pilih item untuk impor +TrackerIO.Dialog.ImportVideo.Title=Impor Video +TrackerIO.Dialog.Export.Title=Ekspor +TrackerIO.Dialog.Export.Message=Pilih item untuk ekspor +TrackerIO.Dialog.ReplaceFile.Title=Alokasi berkas keluaran? +TrackerIO.Dialog.ReplaceFile.Message=Sudah keluar. Anda ingin mengalokasi ulang berkas tersebut? +TrackerIO.Dialog.NotTrackerXML.Title=Tidak terbaca sebagai XML +TrackerIO.Dialog.NotTrackerXML.Message=Berkas tidak terbaca sebagai berkas bertipe XML. +TrackerIO.Dialog.BadVideo.Message=Video tidak dapat dibuka: +TrackerPanel.NewTab.Name=TanpaNama +TrackerPanel.Message.DragToMark=Shift-seret ke sasaran +TrackerPanel.Message.ClickToMark=Shift-klik ke sasaran +TrackerPanel.Dialog.LoadFailed.Title=Berkas tidak dapat dibuka +TrackerPanel.Dialog.LoadFailed.Message=Tidak dapat membuka berkas: +TrackerPanel.Dialog.SaveChanges.Title=Simpan Pengubahan +TrackerPanel.Dialog.SaveChanges.Message=Simpan pengubahan sebagai +TrackPlottingPanel.Popup.MenuItem.Lines=garis +TrackPlottingPanel.Popup.MenuItem.Points=Titik +TrackPlottingPanel.Popup.MenuItem.Scale=Skala +TrackPlottingPanel.Popup.MenuItem.Print=Cetak +TrackPlottingPanel.Popup.MenuItem.Measure=Skala yang sesuai +TrackPlottingPanel.Popup.MenuItem.Analyze=Analiser +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Di perbesar +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Di perkecil +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoskala +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Di perbesar seukuran box +TrackPlottingPanelInspector.Title=Skala +TrackPlottingPanelInspector.Label.Min=Minimum +TrackPlottingPanelInspector.Label.Max=Maksimum +TrackPlottingPanelInspector.Label.Auto=Automatis +TToolBar.Button.Footprint.Tooltip=Mengatur jejak +TToolBar.Dropdown.SelectedTrack.Tooltip=Seleksi Trek +TToolBar.Dropdown.SelectedTrack.None=Tidak Menyeleksi +TTrack.MenuItem.Delete=Hapus +TTrack.MenuItem.Color=Warna +TTrack.Dialog.Color.Title=Pilih Warna Trek +TTrack.MenuItem.Name=Nama +TTrack.MenuItem.Footprint=Jejak +TTrack.MenuItem.Description=Deskripsi +TTrack.MenuItem.Visible=Tampak +TTrack.MenuItem.TrailVisible=Ketampakan Jalur Trek +TTrack.MenuItem.Autostep=Melangkah Automatis +TTrack.MenuItem.MarkByDefault=Memulai Trek +TTrack.MenuItem.Locked=Terkunci +TTrack.MenuItem.Delete=Hapus +TTrack.Name.None=Tanpa nama +TTrack.Dialog.Description.Title=Deskripsi: +TTrack.Dialog.Name.Title=Nama +TTrack.Dialog.Name.Label=Nama: +TViewChooser.Button.Choose.Tooltip=Pilih Tampilan +Vector.Name=Vektor +Vector.New.Name=Vektor +Vector.MenuItem.ToOrigin=Asal mula +Vector.MenuItem.Label=Tampak label +VectorSum.Name=Vektor penjumlahan +VectorSum.New.Name=penjumlahan +VectorSum.MenuItem.Inspector=Pilih vektor +VectorSumInspector.Title=Vektor Penjumlahan +VectorSumInspector.Border.Title=Pilih Vektor +WorldTView.Popup.MenuItem.Projectile=Model Proyektil + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Model Partikel Analitik +AnalyticParticle.Inspector.Title=Model Partikel Analitik +AnalyticParticle.Property.InitialT=t +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=Radius 4 +CircleFootprint.Circle_6=Radius 6 +CircleFootprint.Circle_8=Radius 8 +DynamicParticle.Name=Model Partikel Dinamik +DynamicParticle.Inspector.Title=Model Partikel Dinamik +DynamicParticle.Property.ForceX=Fungsi x +DynamicParticle.Property.ForceY=Fungsi y +DynamicParticle.Property.InitialT=t +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Dipasti +ParticleModel.New.Name=Model +ParticleModel.MenuItem.InspectModel=Model +ParticleModel.Inspector.Button.Undo=Undo +ParticleModel.Inspector.Button.Redo=Redo +ParticleModel.Inspector.Button.Close=Tutup +ParticleModel.Inspector.Button.Help=Tolong +ParticleModel.Table.Initial.Border.Title=Judul +ParticleModel.Property.InitialT=Periode Awal + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=hanya X +Calibration.Axes.YOnly=hanya Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Pilih Sumbu Kalibrasi +Calibration.Label.Axes=Sumbu +Calibration.Dialog.InvalidCoordinates.Title=Koordinat Tidak Valid +Calibration.Dialog.InvalidCoordinates.Message=Titik tidak memiliki koordinat dunia yang sama. +Calibration.Dialog.InvalidXCoordinates.Message=Titik tidak memiliki koordinat-x dunia yang sama. +Calibration.Dialog.InvalidYCoordinates.Message=Titik tidak memiliki koordinat-x dunia yang sama. +SpectralLineFilter.Title=Spektrum Gas +SpectralLineFilter.H=Hidrogen +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Raksa atau Merkuri +TFrame.View.Unknown=Tampilan +TMenuBar.MenuItem.Undo=Undo +TMenuBar.MenuItem.Redo=Redo +TMenuBar.MenuItem.Replace=Relokasi +TMenuBar.Menu.AddImage=Impor Gambar +TMenuBar.MenuItem.AddBefore=Sebelum Frame Ini +TMenuBar.MenuItem.AddAfter=Setelah Frame Ini +TMenuBar.MenuItem.RemoveImage=Pindahkan Frame Ini +TMenuBar.Menu.Tools=Perangkat +TMenuBar.MenuItem.DataFunctionTool=Kolom Data +TMenuBar.MenuItem.DatasetTool=Analisis Data +TMenuBar.Menu.CopyImage=Salin Gambar +TMenuBar.MenuItem.CopyMainView=Tampilan Utama +TMenuBar.MenuItem.CopyFrame=Frame +TMenuBar.MenuItem.PrintFrame=Cetak Frame +TrackerIO.Dialog.AddImage.Title=Penambahan Gambar +TTrack.Dialog.Name.BadName=Nama ini sudah ada yang punya! Silakan cari nama lain. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=gaya total +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Grafik Data Trek +TableTView.Label.NoData=Tabel Data Trek +TrackerPanel.Message.NoData0=Lembar Analisis +TrackerPanel.Message.NoData1=Klik "Berkas" (pilih "Buka" atau Trek) untuk memulai pengetrekan. +WorldTView.Label.NoData=Pengamatan objek dari video atau trek terlihat di sini. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Pemecahan Masalah: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptif Multilangkah +DynamicParticle.Table.Initial.Border.Title=Nilai Awal +DynamicParticle.Table.Force.Border.Title=Fungsi Gaya (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Fungsi Posisi (t) + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Letakkan Gambar +TMenuBar.MenuItem.PasteAfter=Setelah Frame Ini +TMenuBar.MenuItem.PasteBefore=Sebelum Frame Ini +TMenuBar.MenuItem.PasteReplace=Relokasi Video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Memulai +Tracker.Splash.HelpMessage=Pengguna Baru? Pilih + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=Sudut +LineProfile.Checkbox.Rotates=Rotasi +LineProfile.Label.Spread=Lebar +RGBRegion.Name=Daerah RGB +RGBRegion.New.Name=Daerah +RGBRegion.MenuItem.Fixed=Pasti +RGBRegion.Label.Radius=Jejari +TTrack.Label.Step=Langkah + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=posisi nomor +LineProfile.Data.Description.1=posisi komponen x +LineProfile.Data.Description.2=posisi komponen y +LineProfile.Data.Description.3=Merah +LineProfile.Data.Description.4=Hijau +LineProfile.Data.Description.5=Biru +LineProfile.Data.Description.6=Persensif Kecerahan +LineProfile.Data.Description.7=Ketebalan garis +ParticleModel.MenuItem.TraceVisible=Pengetrekkan +ParticleModel.MenuItem.StepsVisible=Langkah +PointMass.Data.Description.0=waktu +PointMass.Data.Description.1=posisi komponen x +PointMass.Data.Description.2=posisi komponen y +PointMass.Data.Description.3=posisi magnitudo +PointMass.Data.Description.4=posisi sudut +PointMass.Data.Description.5=kecepatan komponen x +PointMass.Data.Description.6=kecepatan komponen y +PointMass.Data.Description.7=kecepatan magnitudo +PointMass.Data.Description.8=kecepatan sudut +PointMass.Data.Description.9=percepatan komponen x +PointMass.Data.Description.10=percepatan komponen y +PointMass.Data.Description.11=percepatan magnitudo +PointMass.Data.Description.12=percepatan sudut +PointMass.Data.Description.13=rotasi sudut +PointMass.Data.Description.14=kecepatan anguler +PointMass.Data.Description.15=percepatan anguler +PointMass.Data.Description.16=jumlah langkah +PointMass.Data.Description.17=jumlah frame +PointMass.Data.Description.18=momentum komponen x +PointMass.Data.Description.19=momentum komponen y +PointMass.Data.Description.20=momentum magnitudo +PointMass.Data.Description.21=momentum sudut +PointMass.Data.Description.22=energi kinetik +RGBRegion.Data.Description.0=waktu +RGBRegion.Data.Description.1=posisi komponen x +RGBRegion.Data.Description.2=posisi komponen y +RGBRegion.Data.Description.3=Merah +RGBRegion.Data.Description.4=Hijau +RGBRegion.Data.Description.5=Biru +RGBRegion.Data.Description.6=Persensif Kecerahan +RGBRegion.Data.Description.7=Penghitungan pixel +RGBRegion.Data.Description.8=jumlah langkah +RGBRegion.Data.Description.9=jumlah frame +TView.Menuitem.Define=Definisi +Vector.Data.Description.0=waktu +Vector.Data.Description.1=komponen x +Vector.Data.Description.2=komponen y +Vector.Data.Description.3=magnitudo +Vector.Data.Description.4=sudut +Vector.Data.Description.5=Ekor posisi komponen x +Vector.Data.Description.6=Ekor posisi komponen y +Vector.Data.Description.7=jumlah langkah +Vector.Data.Description.8=jumlah frame +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Massa partikel ini +ParticleModel.Parameter.InitialTime.Description=Waktu awal +AnalyticParticle.PositionFunction.X.Description=Posisi komponen x +AnalyticParticle.PositionFunction.Y.Description=Posisi komponen y +DynamicParticle.ForceFunction.X.Description=Gaya komponen x +DynamicParticle.ForceFunction.Y.Description=Gaya komponen y +DynamicParticle.Parameter.InitialX.Description=Posisi awal komponen x +DynamicParticle.Parameter.InitialY.Description=Posisi awal komponen y +DynamicParticle.Parameter.InitialVelocityX.Description=Kecepatan awal komponen x +DynamicParticle.Parameter.InitialVelocityY.Description=Kecepatan awal komponen y +TrackerPanel.ModelBuilder.Title=Pembangun Model +TrackerPanel.DataBuilder.Title=Pembangun Data +TrackControl.TrailMenu.NoTrail=Tidak Mengetrek +TrackControl.TrailMenu.ShortTrail=Tampilkan trek +TrackControl.TrailMenu.LongTrail=Trek Panjang +TrackControl.TrailMenu.FullTrail=Trek Penuh +TrackerPanel.ModelBuilder.Spinner.Tooltip=Pilih model sekarang +TrackerPanel.ModelBuilder.LineButton.Text=Model garis +TrackerPanel.ModelBuilder.LineButton.Tooltip=Mengatur model garis +ParticleModel.LineStyle.None=Tidak ada garis +ParticleModel.LineStyle.Connect=Langkah terhubung +ParticleModel.LineStyle.Smooth=Garis lembut +ModelFunctionPanel.Label=Model +AnalyticFunctionPanel.FunctionEditor.Border.Title=Fungsi Posisi +DynamicFunctionPanel.FunctionEditor.Border.Title=Fungsi Gaya + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Menampilkan Tabel Kolom +Tracker.About.ProjectOf=Proyek dari: +Tracker.About.TranslationBy=Translasi oleh: +Tracker.About.Translator=Wachid Qomaruddin +TMenuBar.Menu.SaveVideoAs=Simpan Klip Sebagai +TActions.SaveClipAs.ProgressMonitor.Message=Simpan klip sebagai +TActions.SaveClipAs.ProgressMonitor.Progress=Menyelesaikan + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sinkron +PlotTrackView.Checkbox.Synchronize.Tooltip=Menyamakan koordinat horisontal +RGBRegion.MenuItem.FixedRadius=Menetapkan Jari-Jari +Tracker.VideoZoom.Hint=Klik untuk memperbesar, klik+alt untuk memperkecil, klik ganda untuk menyesuaikan +Tracker.PlotZoomIn.Hint=tarik untuk memperbesar, klik ganda untuk autoskala +Tracker.PlotZoomOut.Hint=klik untuk memperkecil +Tracker.MenuItem.Hints=Tampilkan tanda +TapeMeasure.Label.Length=skala panjang +TapeMeasure.Label.TapeAngle=sudut dari koordinat x +TapeMeasure.Label.ArcAngle=arc +TrackerIO.Dialog.NotAnImage.Title=Tipe berkas salah +TrackerIO.Dialog.NotAnImage.Message1=Bukan gambar JPG atau GIF. +TrackerIO.Dialog.NotAnImage.Message2=Apa anda ingin melanjutkan? +TToolBar.Button.Zoom.Tooltip=Perangkat Pembesaran (shortcut: Z key) +TrackChooserTView.DropDown.Tooltip=Pilih trek +TapeMeasure.Field.ArcAngle.Tooltip=Sudut dari pita ke lengan +TapeMeasure.Field.TapeAngle.Tooltip=Sudut dari sumbu positif x ke pita +TapeMeasure.Field.Magnitude.Tooltip=Panjang pita dengan skala satuan nyata +TapeMeasure.Readout.Magnitude.Name=Panjang terbaca +TapeMeasure.Readout.Magnitude.Hint=Klik untuk mengatur skala +TapeMeasure.Readout.Angle.Name=Sudut terbaca +TapeMeasure.Readout.Angle.Hint=Klik untuk mengatur sudut +TapeMeasure.Arm.Name=lengan sudut +TapeMeasure.Arm.Hint=tarik untuk mengukur sudut, penyusutan untuk menutup +TapeMeasure.End.Name=akhir +TapeMeasure.End.Hint=tarik untuk mengukur jarak atau mengkalibrasi skala +TapeMeasure.Handle.Name=Pengendali +TapeMeasure.Handle.Hint=tarik untuk memindahkan pita +Vector.Tip.Name=tip +Vector.Tip.Hint=tarik atau masukkan koordinat untuk mengubah komponen +Vector.Handle.Name=tangkai pengendali +Vector.Handle.Hint=tarik untuk memindahkan vektor +Vector.ShortHandle.Hint=tarik untuk memindahkan, klik+alt untuk memilih tip +PointMass.Position.Name=posisi +PointMass.Position.Hint=tarik atau masukkan koordinat untuk mengubah posisi +PointMass.Velocity.Name=kecepatan +PointMass.Acceleration.Name=percepatan +PointMass.Vector.Hint=tarik untuk memindahkan +PointMass.Position.Locked.Hint=Klik untuk memilih--tidak dapat ditarik +CoordAxes.Handle.Name=koordinat x +CoordAxes.Handle.Hint=tarik untuk mengubah kemiringan +CoordAxes.Origin.Name=asal +CoordAxes.Origin.Hint=tarik untuk mengubah posisi +OffsetOrigin.Position.Name=posisi +OffsetOrigin.Position.Hint=tarik atau masukkan koordinat untuk memindahkan asal +Calibration.Point.Name=titik +Calibration.Point.Hint=tarik atau masukkan koordinat untuk mengubah sumbu dan skala +RGBRegion.Position.Name=posisi +RGBRegion.Position.Hint=tarik atau masukkan koordinat untuk mengubah posisi +LineProfile.End.Name=akhir +LineProfile.End.Hint=tarik untuk menyetel panjang garis +LineProfile.Handle.Name=Pengendali +LineProfile.Handle.Hint=tarik untuk memindahkan garis +PointMass.Hint=Mengatur massa pada toolbar +PointMass.Unmarked.Hint=, klik+shift untuk menandai posisi +TTrack.Unselected.Hint=klik untuk memilih atau mengatur properti +Vector.Unmarked.Hint=tarik+shift untuk menggambar vektor +OffsetOrigin.Unmarked.Hint=tarik+shift untuk menandai titik awal +Calibration.Unmarked.Hint=tarik+shift untuk menandai titik pertama +Calibration.Halfmarked.Hint=tarik+shift untuk menandai titik kedua +CenterOfMass.Empty.Hint=pilih massa untuk mendefinisikan sistem +VectorSum.Empty.Hint=pilih vektor untuk mendefinisikan jumlah +TapeMeasure.Hint=Mengatur panjang untuk mengubah skala, mengatur sudut untuk mengubah kemiringan sumbu x +CoordAxes.Hint=Mengatur sudut untuk mengubah kemiringan +ParticleModel.Hint=Mengatur massa pada toolbar, masukkan ekspresi pada Pembangun Model Animasi +RGBRegion.Hint=masukkan jari-jari untuk mengubah ukuran +RGBRegion.Unmarked.Hint=klik+shift untuk menandai posisi +TTrack.ImportVideo.Hint=impor video atau image untuk mengukur RGB +TTrack.Selected.Hint=Terpilih +LineProfile.Hint=masukkan penjalaran untuk mengubah lebar garis +LineProfile.Unmarked.Hint=tarik+shift untuk menggambar garis +LineProfile.Menu.Orientation=Orientasi +LineProfile.MenuItem.Horizontal=Horisontal +LineProfile.MenuItem.XAxis=Sepanjang koordinat X +Footprint.PositionVector=vektor +Footprint.BoldPositionVector=vektor tebal +Tracker.Startup.Hint=Tekan F1 untuk panduan +TrackerPanel.NoVideo.Hint=Buka melalui impor video atau gambar untuk dianalisa +TrackerPanel.CalibrateVideo.Hint=identifikasi fitur video dengan mengetahui panjang dan mengatur skala dengan menggunakan pita pengukur +TrackerPanel.NoTracks.Hint=membuat trek baru untuk fitur pengukuran dari video yang diperhatikan +TrackerPanel.SetClip.Hint=Mengatur atau meninjau klip video dalam inspektor klip +TrackerPanel.ShowAxes.Hint=Mengatur asal dan sudut sumbu koordinat +VideoPlayer.Step.Hint=langkah maju (jalan pintas: PageDown key) +VideoPlayer.Back.Hint=langkah balik (jalan pintas: PageUp key) +TrackerPanel.DVVideo.Hint=gunakan ukuran ulang filter untuk mengkoreksi penyimpangan dalam video berformat DV +TrackerIO.DataFileFilter.Description=Berkas Tracker +Tracker.Button.PDFHelp=Versi Cetak PDF +TToolbar.Button.TapeVisible.Tooltip=Pita Pengukur Dengan Lengan Sudut + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Kendali Trek +TMenuBar.MenuItem.Description=Catatan +TrackPlottingPanel.RightDrag.Hint=tarik+kanan untuk opsi +TMenuBar.MenuItem.DeleteSelectedPoint=Titik terpilih +TFrame.InfoDialog.SaveChanges.Title=Simpan Perubahan +TFrame.InfoDialog.SaveChanges.Message=Apa anda ingin menyipan pengubahan? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Kartesian +DynamicParticle.Editor.Button.Polar=Polar +DynamicParticle.Parameter.InitialR.Description=Jari-jari awal +DynamicParticle.Parameter.InitialTheta.Description=Sudut awal +DynamicParticle.Parameter.InitialVelocityR.Description=Kecepatan radian awal +DynamicParticle.Parameter.InitialOmega.Description=Kecepatan anguler awal +DynamicParticle.ForceFunction.R.Description=Komponen gaya radial +DynamicParticle.ForceFunction.Theta.Description=Komponen gaya tangensial +DynamicParticlePolar.Name=Model Partikel Dinamik (Polar) +DynamicTwoBody.Editor.Button.Particle1=Partikel 1 +DynamicTwoBody.Editor.Button.Particle2=Partikel 2 +DynamicTwoBody.Name=Model Dua Benda Dinamik +TMenuBar.Menu.DynamicParticle=Model Partikel Dinamik +TMenuBar.MenuItem.Cartesian=Kartesian +TMenuBar.MenuItem.Polar=Polar + +# Additions by Doug Brown 2009-06-18 +Tracker.About.Language=Indonesia + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotrek +Dialog.Button.Help=Panduan +AutoTracker.Wizard.Title=Autotrek: +AutoTracker.Wizard.Button.Reset=Ulang +AutoTracker.Wizard.Button.Back=Balik +AutoTracker.Wizard.Button.Next=Lanjut +AutoTracker.Wizard.Button.Accept=Harapkan +AutoTracker.Wizard.Button.Search=Cari +AutoTracker.Wizard.Button.Start=Mulai +AutoTracker.Wizard.Button.Pause=Jeda +AutoTracker.Wizard.Button.Skip=Lompati +AutoTracker.Label.Mask=Bayangan Topeng +AutoTracker.Label.Target=Target Offset +AutoTracker.Label.AcceptLevel=Terima Skor Diatas +AutoTracker.TabbedPane.TabTitle.Mask=1. Topeng +AutoTracker.TabbedPane.TabTitle.Target=2. Target +AutoTracker.TabbedPane.TabTitle.Settings=3. Harap +AutoTracker.TabbedPane.TabTitle.Search=4. Cari +AutoTracker.Info.GetStarted=Silakan klik fitur video yang ingin anda autotrek. +AutoTracker.Info.Mask1=Menentukan topeng untuk pengamatan setiap frame video. Pindahkan atau ubah ukuran topeng dengan menyeret atau menahan ditengah secara berturut-turut. +AutoTracker.Info.Mask2=Tip: Topeng sebenarnya tidak membutuhkan ruang petak yang besar untuk menampung objek. Fitur ini khas dan memuat tipe high-contrast untuk membangkitkan kinerja yang bagus. +AutoTracker.Info.MaskLocked1=Topeng digunakan dan terkunci. +AutoTracker.Info.MaskLocked2=Klik tombol ulang untuk menghapus semua langkah, lepaskan kuncian dan memulai lagi. +AutoTracker.Info.Target1=Target dimana langkah akan relatif bertopeng. Untuk pindah target dengan menyeret topeng. +AutoTracker.Info.Target2=Tip: Anda dapat menyesuaikan posisi target setelah semua langkah mendapat topeng. Keluaran langkah secara automatis akan bergerak terus bersama target. +AutoTracker.Info.TargetLocked=Target yang digunakan diikat untuk keluaran posisi langkah. Target bergerak maka seluruh langkah akan bergerak. +AutoTracker.Info.Settings1=Tingkatan skor teramati diterima menunjukan target akan bertopeng secara autormatis. +AutoTracker.Info.Settings2=Tip: kurangi penerimaan skor tingkatan membuat proses pemberian topeng menjadi lebih cepat tetapi penambahan skor berpeluang menghasilkan error. +AutoTracker.Info.Search1=Topeng persegi akan ditampilkan untuk mencari pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret atau menahan ditengah secara berturut-turut. +AutoTracker.Info.Search2=Tip: Area pencarian sebenarnya tidak membutuhkan ruang petak yang besar untuk menampung objek. Setelah menemukan area pertama pengamatan akan dilanjutkan ke area berikutnya, algoritma pencitraan mencari area untuk memprediksi posisi pengamatan. +AutoTracker.Info.Frame=Frame +AutoTracker.Info.Match=Pengamatan menampilkan penopengan automatis pada posisi target. +AutoTracker.Info.Possible=Pengamatan memungkinkan menemukan tampilan area pencarian. Pilihan anda adalah: +AutoTracker.Info.NoMatch=Pengamatan tidak menemukan tampilan area pencarian. Pilihan anda adalah: +AutoTracker.Info.Outside=Area pencarian diluar video atau gambar. Pilihan anda adalah: +AutoTracker.Info.Accepted=Pengamatan menampilkan nilai yang diharapkan pengguna. +AutoTracker.Info.MarkedByUser=Langkah diberi topeng secara manual oleh pengguna. +AutoTracker.Info.NoVideo=Pemberlakuan Autotrek membutuhkan video. Silakan impor video atau akhiri Autotrek ini. +AutoTracker.Info.Height=tinggi +AutoTracker.Info.Width=lebar +AutoTracker.Info.Accept=--Mengharapkan pengamatan +AutoTracker.Info.Retry=--Memindahkan area pencarian dan mencari lagi +AutoTracker.Info.Mark=--Klik+shift untuk memberi topeng dengan langkah manual +AutoTracker.Info.Skip=--Lompati frame ini dan melanjutkan pengetrekan +AutoTracker.Info.Reset=--Ulangi dan mulai lagi dengan topeng termodifikasi +AutoTracker.Info.MatchScore=Skor pengamatan +AutoTracker.Dialog.MaskLocked.Title=Topeng Terkunci +PointMass.Cursor.Autotrack.Description=Kursor Autotrek +VideoPlayer.StartFrame.Hint=Tarik untuk mengatur awal frame +VideoPlayer.EndFrame.Hint=Tarik untuk mengatur akhir frame +VideoPlayer.Slider.Hint=Tarik untuk memindai melalui video +FileDropHandler.Dialog.BadFile.Message=Tidak dapat memuat berkas. +FileDropHandler.Dialog.BadFile.Title=Berkas tidak diakui + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Terapkan +DynamicParticle.Dialog.Delete.Message=Penghapusan partikel yang akan dihilangkan dari sistem. Hapus semua? +DynamicParticle.Dialog.Delete.Title=Sistem Dinamik +DynamicParticle.System.In=dalam +DynamicSystem.Empty=kosong +DynamicSystem.Force.Name.Internal=internal +DynamicSystem.ForceFunction.R.Description=Komponen radial gaya internal +DynamicSystem.ForceFunction.Theta.Description=Komponen tangensial gaya internal +DynamicSystem.MenuItem.Inspector=Memilih Partikel +DynamicSystem.Name=Sistem Dua Benda Dinamik +DynamicSystem.New.Name=sistem +DynamicSystem.Parameter.Of=dari +DynamicSystem.Parameter.RelativeTo=relatif terhadap +DynamicSystem.Parameter.Name.Relative=relatif +DynamicSystem.Parameter.ParticleMass.Description=Massa +DynamicSystem.Parameter.Mass.Description=Total massa sistem +DynamicSystemInspector.Border.Title=Partikel +DynamicSystemInspector.Title=Sistem Dua Benda +DynamicSystemInspector.Button.Change=Ubah Ke... +DynamicSystemInspector.ParticleName.None=(non) +TMenuBar.MenuItem.Clone=Klon +TMenuBar.MenuItem.TwoBody=Sistem dua benda +TrackerPanel.DataBuilder.Dropdown.Tooltip=Trek terpilih saat ini +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sinkron Sumbu Vertikal +TrackControl.Button.Trace.ToolTip=Tampil atau sembunyi path +TToolBar.Button.Open.Tooltip=Buka video atau berkas tracker dalam tab baru +TToolBar.Button.Save.Tooltip=Simpan tab saat ini dalam berkas +TToolBar.Button.SelectTrack=Pilih +TToolBar.Button.SelectTrack.Tooltip=Memilih trek keluaran +TTrack.MenuItem.ClearSteps=Hapus Langkah +PointMass.MenuItem.Position=Posisi +TMenuBar.MenuItem.Empty=(Kosong) +TTrackBar.Button.Memory=Penggunaan memori: +TTrackBar.Button.Memory.Tooltip=Pemantau dan pengatur memori +TTrackBar.Memory.PopupItem.Launch1=Luncur +TTrackBar.Memory.PopupItem.Launch2=dengan memori +TButton.Track.ToolTip=Mengatur properti +Tracker.Dialog.OutOfMemory.Message1=Tracker telah diluar memori. +Tracker.Dialog.OutOfMemory.Message2=Klik tombol memori untuk opsi. +Tracker.Dialog.OutOfMemory.Title=Diluar Memori + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead = Lihat dari Atas +AutoTracker.Label.Original = Kunci Frame +AutoTracker.Label.NoMask = non +AutoTracker.Label.Rate = Penilaian: +AutoTracker.Info.Mask3 = Tip: template tidak perlu besar atau mencakup seluruh objek. Sebuah fitur yang unik dan termasuk tepi kontras tinggi umumnya bekerja terbaik. +AutoTracker.Wizard.Checkbox.XAxis = Hanya sumbu x +AutoTracker.Info.SearchOnAxis1 = Pencarian pemindaian di daerah sumbu-x untuk pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret pusatnya atau masing-masing pegangan. +AutoTracker.Info.PossibleOnAxis = Pengamatan tampilan yang mungkin ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: +AutoTracker.Info.NoMatchOnAxis = Tidak ada pengamatan yang ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: +AutoTracker.Info.RetryOnAxis = - memindahkan area pencarian atau sumbu x dan cari lagi +AutoTracker.Wizard.Button.Delete = Hapus +AutoTracker.Wizard.Button.DeleteMore = Hapus Titik Selanjutnya +Button.Define.Tooltip = Tentukan fungsi kolom variabel yang ada +Calibration.Label.Point = titik +CalibrationStick.Hint = Mengatur panjang atau tarik hingga akhir untuk mengubah skala, atur sudut untuk ubah kemiringan +CalibrationStick.End.Hint = tarik untuk mengubah skala, shift+klik untuk kembali menandai +CalibrationStick.New.Name = kalibrasi tongkat +CalibrationTapeMeasure.New.Name = rekaman kalibrasi +CalibrationTapeMeasure.Readout.Magnitude.Hint = klik untuk masuk panjang dikenal dalam satuan dunia +CalibrationTapeMeasure.Hint = Mengatur panjang untuk mengubah skala, atur sudut untuk ubah kemiringan +DynamicSystem.Data.Description.0 = jarak relatif antara partikel +DynamicSystem.Data.Description.1 = sudut relatif +DynamicSystem.Data.Description.2 = kecepatan radial relatif +DynamicSystem.Data.Description.3 = kecepatan sudut relatif +ExportDataDialog.Subtitle.Table = Tabel Data +ExportDataDialog.Subtitle.Content = Sel +ExportDataDialog.Subtitle.Format = Format Nomor +ExportDataDialog.Subtitle.Delimiter = Pembatas +ExportDataDialog.Title = Ekspor Data +ExportDataDialog.Delimiter.Add = Tambah +ExportDataDialog.Delimiter.Remove = Hapus +ExportDataDialog.Content.AllCells = Semua Sel +ExportDataDialog.Content.SelectedCells = Sel Terpilih +ExportDataDialog.MenuItem.RemoveDelimiter = Hapus kustom pemisah +ExportDataDialog.Chooser.SaveData.Title = Simpan Data Seperti +ExportVideoDialog.Button.SaveAs = Simpan Sebagai +ExportVideoDialog.Button.FullSize = ukuran penuh +ExportVideoDialog.Button.DrawnSize = Seperti ditarik +ExportVideoDialog.Content.VideoOnly = Hanya video +ExportVideoDialog.Content.VideoAndGraphics = Video dan grafis +ExportVideoDialog.Content.GraphicsOnly = Hanya grafis +ExportVideoDialog.Title = Ekspor Video Klip +ExportVideoDialog.Label.ClipSettings = Pengaturan Klip +ExportVideoDialog.Subtitle.Size = Ukuran +ExportVideoDialog.Subtitle.Content = Konten +ExportVideoDialog.Subtitle.View = Pengamatan +ExportVideoDialog.Subtitle.Format = Format +ExportVideoDialog.Complete.Message1 = Video telah disimpan sebagai +ExportVideoDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? +ExportVideoDialog.Complete.Title = Ekspor Lengkap +ExportVideoDialog.VideoSize = ukuran video +ExportVideoDialog.MatSize = ukuran pita +ExportVideo.Dialog.HiddenPlots.Message = Plot harus terlihat penuh untuk ekspor . +ExportVideo.Dialog.HiddenPlots.Title = Pengamatan Tidak Lengkap +Footprint.DoubleTarget = Kepala Salib Ganda +Footprint.BoldDoubleTarget=Kepala salib ganda tebal +OffsetOrigin.MenuItem.Fixed = Koordinat Dunia Ditetapkan +ParticleModel.Dialog.Offscreen.Message1 = Beberapa Model langkah kosong karena mereka terlalu jauh dari layar . +ParticleModel.Dialog.Offscreen.Message2 = Untuk memperbaiki hal ini, ubah model atau atur ulang skala video . +ParticleModel.Dialog.Offscreen.Title = Diluar Batas +PrefsDialog.Tab.Configuration.Title = Konfigurasi +PrefsDialog.Memory.BorderTitle = Ukuran Memori +PrefsDialog.Tab.General.Title = Umum +PrefsDialog.RecentFiles.BorderTitle = Buka Menu Terbaru +PrefsDialog.Label.RecentSize = Hitung Berkas +PrefsDialog.Hints.BorderTitle = Petunjuk +PrefsDialog.Button.Relaunch = Peluncuran Ulang Sekarang +PrefsDialog.Button.ClearRecent = Batal +PrefsDialog.Checkbox.DefaultSize = Gunakan default +PrefsDialog.Checkbox.HintsOn = Tampilkan petunjuk secara default +PrefsDialog.Tab.Video.Title = Video +PrefsDialog.VideoPref.BorderTitle = Mesin Video +PrefsDialog.Button.Xuggle = Xuggle +PrefsDialog.Button.QT = QuickTime +PrefsDialog.Dialog.WebStart.Message = Pengaturan memori tidak tersedia saat menggunakan Web Start . +PrefsDialog.Dialog.WebStart.Title = Mode Web Start +PrefsDialog.LookFeel.BorderTitle = LnF +PrefsDialog.Language.BorderTitle = Bahasa +PrefsDialog.Upgrades.BorderTitle = Periksa Untuk Upgrade +PrefsDialog.Tab.Runtime.Title = Runtime +PrefsDialog.Tab.Display.Title = Tampilan +PrefsDialog.Language.Default = Default +PrefsDialog.Upgrades.Always = Setiap Saat +PrefsDialog.Upgrades.Weekly = Mingguan +PrefsDialog.Upgrades.Monthly = Bulanan +PrefsDialog.Upgrades.Never = Tidak pernah +PrefsDialog.Button.CheckForUpgrade = Periksa Sekarang +PrefsDialog.Xuggle.Speed.BorderTitle = Putar Ulang Video Xuggle +PrefsDialog.Xuggle.Slow = Halus (mungkin lambat) +PrefsDialog.Xuggle.Fast = Cepat (mungkin cepat) +PrefsDialog.CalibrationTool.BorderTitle = Alat Kalibrasi Standar +Protractor.Name = Busur Derajat +Protractor.New.Name = busur derajat +Protractor.Hint = tarik lengan untuk mengukur sudut +Protractor.Label.Angle = sudut +Protractor.Field.Angle.Tooltip = Sudut antara lengan busur derajat +Protractor.Vertex.Name = vertex +Protractor.Vertex.Hint = tarik untuk memindahkan vertex +Protractor.End.Name = akhir lengan +Protractor.End.Hint = tarik untuk memutar lengan +Protractor.Handle.Name = menangani +Protractor.Handle.Hint = tarik untuk memindahkan busur derajat +Protractor.Rotator.Name = pemutar +Protractor.Rotator.Hint = tarik untuk memutar busur derajat +Protractor.Readout.Name = pembacaan +Protractor.Readout.Hint = sudut antara lengan busur derajat +ProtractorFootprint.Circle3 = lingkaran kecil +ProtractorFootprint.Circle5 = lingkaran besar +ProtractorFootprint.Circle3Bold = lingkaran kecil tebal +ProtractorFootprint.Circle5Bold = lingkaran besar tebal +Stick.Name = Tongkat Kalibrasi +Stick.New.Name = tongkat kalibrasi +TableTrackView.MenuItem.Unformatted = Presisi Lengkap +TableTrackView.MenuItem.Formatted = Sebagai Terformat +TableTrackView.Menu.SetDelimiter = Atur Pembatas +TableTrackView.MenuItem.AddDelimiter = Tambah +TableTrackView.MenuItem.RemoveDelimiter = Hapus +TableTrackView.Dialog.CustomDelimiter.Message = Masukkan pembatas string baru: +TableTrackView.Dialog.CustomDelimiter.Title = Tambah Pembatas +TableTrackView.Header.Tooltip = Klik untuk menyortir atau klik ganda untuk memilih kolom +TableTrackView.MenuItem.CopySelectedData = Salin Data Dipilih +TableTrackView.Dialog.RemoveDelimiter.Message = Pilih pembatas untuk menghapus : +TableTrackView.Dialog.RemoveDelimiter.Title = Hapus Pembatas +TableTrackView.Radians.Tooltip = dalam radian +TableTrackView.Degrees.Tooltip = dalam derajat +TableTrackView.RadiansPerSecond.Tooltip = dalam radian/s +TableTrackView.DegreesPerSecond.Tooltip = dalam derajat/s +TableTrackView.RadiansPerSecondSquared.Tooltip = dalam radian/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip = dalam derajat/s^2 +TableTrackView.MenuItem.DeleteDataFunction = Hapus data Fungsi +TActions.Action.SaveFrame = Simpan Tabset Sebagai +TActions.AboutVideo = Properti +TActions.Dialog.AboutVideo.Title = Properti Video +TActions.Dialog.AboutVideo.Type = Tipe +TActions.Dialog.AboutVideo.Size = Dimensi +TActions.Dialog.AboutVideo.Length = Panjang +TActions.Dialog.AboutVideo.Frames = Frame +TActions.Dialog.AboutVideo.Seconds = detik +TActions.Dialog.AboutVideo.FrameRate = rerata frame +TActions.Dialog.AboutVideo.FramesPerSecond = fps +TActions.Dialog.AboutVideo.Path = Jalur +TActions.Action.ImportTRK =Berkas Tracker +TActions.Action.ProtractorVisible = Tampak +TapeMeasure.MenuItem.FixedLength = Panjang Tetap +TextTView.Label.NoTab = Klik "Halaman" untuk menambahkan teks dan halaman HTML di sini. +TextTView.NewTab.Text1 = Klik ganda untuk mengedit teks atau judul . Klik kanan untuk pilihan lainnya. +TextTView.NewTab.Text2 = Untuk menampilkan halaman HTML, masukkan url atau klik kanan untuk membuka file. +TextTView.NewTab.Title = TanpaNama +TextTView.Dialog.TabTitle.Title = Atur Nama +TextTView.MenuItem.OpenHTML = Buka HTML +TextTView.MenuItem.SetTitle = Atur Judul +TextTView.Button.NewTab = Baru +TextTView.TextEdit.Description = Teks +TFrame.Dialog.FileNotFound.Message = Berkas tidak dapat ditemukan. +TFrame.Dialog.FileNotFound.Title = Berkas Tidak Ditemukan +TFrame.View.Text = Tampilan Halaman +TFrame.View.Main = Pengamatan Utama +TMenuBar.Menu.OpenRecent = Buka Terbaru +TMenuBar.Menu.Import = Impor +TMenuBar.Menu.Export = Ekspor +TMenuBar.MenuItem.Video = Video +TMenuBar.MenuItem.Data = Berkas Data +TMenuBar.Menu.CopyObject = Salin Obyek +TMenuBar.MenuItem.Coords = Sistem Koordinat +TMenuBar.MenuItem.VideoClip = Video Clip +TMenuBar.Menu.MeasuringTools = Perangkat Pengukur +TMenuBar.Menu.AngleUnits = Satuan Sudut +TMenuBar.MenuItem.Degrees = Derajat +TMenuBar.MenuItem.Radians = Radian +Tracker.Dialog.NoXuggle.Title = Xuggle tidak ditemukan +Tracker.Dialog.NoXuggle.Message1 = Xuggle (mesin video cross-platform) tidak diinstal . +Tracker.Dialog.NoXuggle.Message2 = Download Xuggle dari http://www.xuggle.com/xuggler/downloads/ . +Tracker.Action.AboutXuggle = Perihal Xuggle +Tracker.Dialog.AboutXuggle.Title = Perihal Xuggle +Tracker.Dialog.AboutXuggle.Message.Version = Xuggle versi +Tracker.Dialog.AboutXuggle.Message.Home = Home Xuggle : +Tracker.Dialog.AboutXuggle.Message.Path = Jalur Xuggle.jar : +Tracker.Dialog.NoVideoEngine.Message1 = mesin video terinstal . Tanpa satu, Anda +Tracker.Dialog.NoVideoEngine.Message2 = hanya dapat membuka gambar (JPEG , PNG) dan animasi GIF . +Tracker.Dialog.NoVideoEngine.Message3 = Direkomendasikan: instal ulang Tracker dengan mesin video Xuggle . +Tracker.Dialog.NoVideoEngine.Title = Tidak Ada Mesin Video +Tracker.Dialog.NoXuggle.Message1 = Xuggle tidak bekerja dengan benar. Pastikan yang diperlukan +Tracker.Dialog.NoXuggle.Message2 = Berkas xuggle.jar berada di folder Tracker. Untuk rincian , +Tracker.Dialog.NoXuggle.Message3 = lihat Tracker_README.txt di folder Tracker +Tracker.Dialog.NoXuggle.Message4 = Untuk menginstal Xuggle, download installer Tracker terbaru dari +Tracker.Dialog.NoXuggle.Title = Xuggle Tidak Tersedia +Tracker.About.DefaultLocale = Bahasa default +Tracker.About.CurrentLanguage = Bahasa +Tracker.Dialog.InsufficientMemory.Title = Memori tidak cukup +Tracker.Dialog.InsufficientMemory.Message = ukuran memoriyang diminta terlalu besar . +TrackerIO.Dialog.TabMustBeSaved.Message1 = Tab +TrackerIO.Dialog.TabMustBeSaved.Message2 = harus disimpan sebagai berkas tracker untuk dimasukkan dalam tabset tersebut . +TrackerIO.Dialog.TabMustBeSaved.Message3 = Apakah Anda ingin menyimpannya? +TrackerIO.Dialog.TabMustBeSaved.Title = Tab belum disimpan +TrackerIO.Dialog.NoTabs.Message = Tidak ada tab untuk menghemat! +TrackerIO.Dialog.NoTabs.Title = Kosong Tabset +TrackerIO.Dialog.SaveTabset.Title = Simpan Tabset +TrackerIO.Dialog.SaveTab.Title = Simpan Tab +TrackerIO.Delimiter.Tab = Tab +TrackerIO.Delimiter.Space = Ruang +TrackerIO.Delimiter.Comma = Koma +TrackerIO.Delimiter.Semicolon = Titik koma +TrackerIO.VideoAndDataFileFilter.Description = Video dan berkas Tracker +TrackerPanel.Dialog.Version.Message1 = Anda membuka berkas yang dibuat dengan Tracker +TrackerPanel.Dialog.Version.Message2 = yang bisa merujuk ke +TrackerPanel.Dialog.Version.Message3 = fitur yang hilang di versi yang anda jalankan +TrackerPanel.Dialog.Version.Message4 = Versi terbaru tersedia di +TrackerPanel.Dialog.Version.Title = Versi Mismatch +TrackerPanel.Label.ModelStart = Frame Awal +TrackerPanel.Label.ModelEnd = Frame Akhir +TrackerPanel.Spinner.ModelStart.Tooltip = Mengatur frame awal untuk model ini +TrackerPanel.Spinner.ModelEnd.Tooltip = Mengatur frame akhir untuk model ini +TToolbar.Button.ProtractorVisible.Tooltip = Menampilkan atau menyembunyikan busur derajat +TToolbar.Button.AxesVisible.Tooltip = Menampilkan atau menyembunyikan sumbu koordinat +TToolBar.Button.TrackControl.Tooltip = Menampilkan atau menyembunyikan kontrol track +TTrack.Dialog.StepSizeWarning.Message1 = Perhatian: beberapa trek ditandai dengan ukuran langkah yang lebih besar dari satu, meninggalkan frame dilewati ditandai. +TTrack.Dialog.StepSizeWarning.Message2 = Mengubah ukuran langkah karena itu cenderung menghasilkan kesenjangan dalam kumpulan data. +TTrack.Dialog.StepSizeWarning.Message3 = kecepatan dan percepatan sekitar kesenjangan tidak dapat ditentukan sampai semua langkah yang ditandai. +TTrack.Dialog.StepSizeWarning.Title = Perhatian +TTrack.Dialog.SkippedStepWarning.Message1 = Perhatian: melewatkan langkah ketika menandai posisi meninggalkan kesenjangan dalam kumpulan data. +TTrack.Dialog.SkippedStepWarning.Title = Perhatian +TTrack.Dialog.SkippedStepWarning.Checkbox = Jangan tampilkan ini lagi +TTrack.Locked.Hint = terkunci +TTrack.AngleField.Radians.Tooltip = Sudut dalam radian +TTrack.AngleField.Degrees.Tooltip = Sudut dalam derajat +TTrack.AngleField.Popup.Radians = Beralih Untuk Radian +TTrack.AngleField.Popup.Degrees = Beralih ke Derajat +TTrackBar.Memory.Menu.SetSize = Atur ukuran memori +TTrackBar.Button.Version = Sekarang tersedia: versi +TTrackBar.Popup.MenuItem.Upgrade = Tingkatkan Sekarang +TTrackBar.Popup.MenuItem.Ignore = Abaikan +XuggleVideo.MenuItem.SmoothPlay = Bermain Halus (mungkin lambat) + +# Penambahan oleh Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name = Pita Kalibrasi +CircleFootprint.Circle = lingkaran +CircleFootprint.FilledCircle = lingkaran penuh +CircleFootprint.Dialog.Title = Lingkaran Jejak +CircleFootprint.Dialog.Label.Radius = Radius +CircleFootprint.Dialog.Checkbox.Bold = Bold +CircleFootprint.Dialog.Checkbox.CenterSpot = Pusat Spot +LineProfile.Hint.Marking = tikus tarik untuk menandai profil garis +PageTView.Button.Page = Halaman +PageTView.MenuItem.ClosePage = Tutup Halaman +PointMass.Hint.Marking = klik mouse untuk menandai, tekan tombol Enter untuk mengkloning langkah sebelumnya +PrefsDialog.Dialog.NewVersion.Title = Upgrade +PrefsDialog.Dialog.NewVersion.Message1 = Versi +PrefsDialog.Dialog.NewVersion.Message2 = sekarang tersedia di +PrefsDialog.Dialog.NewVersion.None.Message = Tidak ada versi baru yang tersedia saat ini . +RGBRegion.Hint.Marking = klik mouse untuk menandai pusat daerah +TMenuBar.MenuItem.Restore = Pulihkan Pengamatan +TrackControl.StretchVectors.None = Tidak ada peregangan +TViewChooser.Maximize.Tooltip = Maksimalkan pandangan ini +TViewChooser.Restore.Tooltip = Pulihkan pengamatan +Vector.Hint.Marking = tarik tetikus untuk menandai, tekan Enter untuk mengkloning langkah sebelumnya +WorldTView.Button.World = Dunia + +# Penambahan oleh Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle = Peringatan +PrefsDialog.Checkbox.WarnIfNoEngine = Tidak ada mesin video yang +PrefsDialog.Checkbox.WarnIfXuggleError = kesalahan non-fatal Xuggle +PropertiesDialog.Title = Properti +PropertiesDialog.Label.Author = Penulis +PropertiesDialog.Label.Contact = Kontak +TActions.Action.Properties = Properti +TActions.Action.OpenBrowser = Buka Peramban Pustaka +TFrame.Progress.Xuggle = Xuggle pemuatan frame +TFrame.Progress.ClickToCancel = (klik untuk membatalkan ) +TFrame.Dialog.StalledVideo.Title = Error Saat Memuat Video +TFrame.Dialog.StalledVideo.Message0 = video telah terhenti saat dimuat. Ini mungkin sementara. +TFrame.Dialog.StalledVideo.Message1 = Anda dapat memilih untuk menghentikan pemuatan sekarang atau terus menunggu. +TFrame.Dialog.StalledVideo.Message2 = Pilihan lain untuk membuka video ini meliputi: +TFrame.Dialog.StalledVideo.Message3 = 1. Gunakan perangkat lunak konversi video untuk mengubahnya menjadi format yang berbeda. +TFrame.Dialog.StalledVideo.Message4 = 2. Pilih QuickTime dalam file pemilih atau preferensi dialog . +TFrame.Dialog.StalledVideo.MessageMac = 2. Buka Tracker di Java VM 32-bit dan membukanya dengan QuickTime . +TFrame.Dialog.StalledVideo.Button.Stop = Berhenti +TFrame.Dialog.StalledVideo.Button.Wait = Tunggu +Tracker.Dialog.NoVideoEngine.Checkbox = Jangan tampilkan ini lagi +TrackerIO.ZipFileFilter.Description = Berkas ZIP (*.zip) +TrackerIO.Dialog.ErrorFFMPEG.Message1 = Xuggle telah mengalami kesalahan saat membuka video ini : +TrackerIO.Dialog.ErrorFFMPEG.Message2 = Tidak semua kesalahan adalah fatal. Untuk pesan kesalahan penuh, pilih Panduan | Log Pesan . +TrackerIO.Dialog.ErrorFFMPEG.Message3 = Jika Xuggle gagal, Anda mungkin dapat membuka video dengan QuickTime . +TrackerIO.Dialog.ErrorFFMPEG.MessageMac = Catatan: Pada Mac OSX ini membutuhkan menjalankan Tracker dala Java VMm 32-bit. +TrackerIO.Dialog.ErrorFFMPEG.Title = Kesalahan Xuggle +TrackerIO.ErrorFFMPEG.LogMessage = Untuk lebih jelasnya, aktifkan peringatan Xuggle dalam preferensi dialog (Pembenahan | Preferensi ) . +TToolBar.Button.OpenBrowser.Tooltip = Buka Peramban Pustaka Digital OSP + +# Penambahan oleh Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title = Berkas Tidak Ditemukan +TFrame.Dialog.NoTRKInComPADRE.Message = Tidak ditemukan berkas Tracker dalam node + +# Penambahan oleh Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title = Partikel kinematik +DynamicParticle.Builder.Title = Partikel Dinamis (Cartesian) +DynamicParticlePolar.Builder.Title = Dinamis Partikel (Polar) +DynamicSystem.Builder.Title = Sistem Dinamis (internal) +PropertiesDialog.Button.CopyFilePath = Salin Berkas Tracker +PropertiesDialog.Button.CopyVideoPath = Salin Video Tracker +PropertiesDialog.Tab.TrackerFile = Berkas Tracker +PropertiesDialog.Tab.Metadata = Metadata +PropertiesDialog.Header.Property = Properti +PropertiesDialog.Header.Value = Nilai +TActions.Action.OpenURL = Buka URL +TActions.Dialog.OpenURL.Title = Buka URL +TActions.Dialog.OpenURL.Message = Masukkan URL video berbasis web, berkas Tracker atau berkas zip Tracker +TActions.Dialog.AboutVideo.Name = Nama + +# Penambahan oleh Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle = Berkas Tembolok Web +PrefsDialog.Button.ClearCache = Batal Semua + +# Penambahan oleh Doug Brown 2011-10-07 +PointMass.Remark.Hint = shift- klik untuk kembali menandai posisi disorot +PointMass.Remarking.Hint = klik mouse untuk menandai ulang posisi +PointMass.PositionSelected.Hint = tarik atau masukkan posisi pada toolbar +PointMass.VectorSelected.Hint = tarik untuk memindahkan +Vector.Remark.Hint = shift-klik untuk kembali menandai yang disorot tip +Vector.TipSelected.Hint = tarik atau masukkan komponen pada toolbar +Vector.HandleSelected.Hint = tarik untuk memindahkan +Vector.Remarking.Hint = klik mouse untuk kembali menandai tip +AutoTracker.Label.Search = Pencarian +AutoTracker.Label.Target = Target +AutoTracker.Label.Frame = Frame +AutoTracker.Label.Point = Titik +AutoTracker.Label.Template = Contoh +AutoTracker.Label.Track = Jalur +AutoTracker.Label.Match = Pengamatan +AutoTracker.Label.NoTemplate = Tidak ada Contoh +AutoTracker.Label.EvolutionRate = Tingkat Evolusi +AutoTracker.Label.Automark = Tandai Automatis +AutoTracker.Info.Instructions = Klik tombol Cari untuk mencari pertandingan di daerah pencarian ditampilkan. +AutoTracker.Info.KeyFrame.Instructions1 = Ini frame kunci untuk mendefinisikan contoh dan target yang ditampilkan. Klik tombol Cari untuk mencari contoh pengamatan. +AutoTracker.Info.KeyFrame.Instructions2 = Anda dapat menyeret daerah sasaran, contoh atau pencari untuk memindahkan atau mengubah ukurannya. +AutoTracker.Info.MouseOver.Instructions = Mouse kontrol atas untuk mempelajari lebih lanjut tentang pengaturan dan penyesuaian . +AutoTracker.Info.Mask1 = Contoh adalah gambar untuk dicocokkan. Dimulai dengan frame kunci dan berkembang untuk beradaptasi dengan perubahan bentuk dan warna. +AutoTracker.Info.Mask2 = Tingkat tandai automatik adalah skor pengamatan minimum yang diperlukan untuk otomatis menandai. +AutoTracker.Info.Mask.Instructions = Memindahkan atau mengubah ukuran template dengan menyeret pinggiran atau sudut pegangannya (bingkai kunci saja). Sesuaikan tingkat evolusi dan tingkat automark menggunakan pemintal. +AutoTracker.Info.Mask.Tip = Tingkat tandai automatik yang rendah dapat mengakibatkan pengamatan palsu - coba tingkatkan laju evolusi sebagai penggantinya. +AutoTracker.Info.Search = Area pencarian dipindai untuk pengamatan terbaik. +AutoTracker.Info.SearchOnAxis = Sumbu-x di daerah pencarian dipindai untuk pengamatan terbaik. +AutoTracker.Info.Search.Instructions = Pindahkan atau ubah ukuran area pencarian dengan menyeret pinggiran atau sudut pegangannya. Atur sumbu x dan pilihan tampak-depan dengan memeriksa kotak mereka. +AutoTracker.Info.Search.Tip = Daerah pencari tidak perlu besar dalam banyak kasus. Pilihan automatis tampak-depan untuk memindahkan area pencarian demi prediksi pengamatan posisi. +AutoTracker.Info.Target = Targetnya adalah titik di mana trek ditargetkan ditandai . +AutoTracker.Info.Target.Instructions = Pindahkan target dengan menyeretnya (frame kunci saja). Pilih trek yang ditargetkan dan titik dari daftar drop-down . +AutoTracker.Info.Title.Settings = Pengaturan +AutoTracker.Info.Title.Tip = Tip +AutoTracker.Info.SelectTrack = Silakan pilih atau membuat trek dan titik Anda ingin AutoTrack. +AutoTracker.Info.OutsideXAxis = Sumbu-x tidak melewati area pencarian. Pilihan Anda adalah : +AutoTracker.Info.NewKeyFrame = - langkah kembali dan mengubah tingkat evolusi atau pergeseran kontrol - klik untuk menentukan bingkai kunci baru +AutoTracker.Info.Replace = - menerima pertandingan +AutoTracker.Info.Keep = - melewatkan frame ini dan meninggalkan tidak berubah +AutoTracker.Info.PossibleReplace = Sebuah pertandingan yang mungkin ditampilkan . Pilihan Anda adalah : +AutoTracker.Wizard.Button.Accept = Terima +AutoTracker.Wizard.Button.Stop = Berhenti +AutoTracker.Wizard.Button.Skip = Loncat +AutoTracker.Wizard.Button.Replace = Ganti +AutoTracker.Wizard.Button.Keep = Penurunan +AutoTracker.Wizard.Button.Search = Pencarian +AutoTracker.Wizard.Button.SearchThis = Cari Ini +AutoTracker.Wizard.Button.SearchNext = Cari Berikutnya +AutoTracker.Wizard.Button.Delete = Hapus +AutoTracker.Wizard.Button.ShowKeyFrame = Tampilkan Frame Kunci +AutoTracker.Wizard.Button.DeleteKeyFrame = Hapus Frame Kunci +AutoTracker.Wizard.Checkbox.LookAhead = Lihat Dari Atas +AutoTracker.Wizard.Checkbox.XAxis = Hanya Sumbu X +AutoTracker.Wizard.Menuitem.DeleteThis = Titik ini +AutoTracker.Wizard.Menuitem.DeleteLater = Titik Selanjutnya +AutoTracker.Wizard.Menuitem.DeleteAll = Batal Semua +TToolBar.Button.AutoTracker.Tooltip = Menampilkan atau menyembunyikan autotracker +MainTView.Popup.MenuItem.ZoomIn = Perbesar +MainTView.Popup.MenuItem.ZoomOut = Perkecil +MainTView.Popup.MenuItem.ZoomToFit = Pembesaran Ditetapkan +TrackerIO.Dialog.DurationVaries.Title = Frame Durasi +TrackerIO.Dialog.DurationVaries.Message1 = Beberapa beda durasi frame dari lebih dari rata-rata +TrackerIO.Dialog.DurationVaries.Message2 = Untuk kecepatan dan percepatan akurat, Anda harus mengecualikan frame ini dari +TrackerIO.Dialog.DurationVaries.Message3 = perhitungan dengan menetapkan frame awal dan frame akhir dari klip video. +TrackerIO.Dialog.DurationVaries.Message4 = Pengecualian Untuk Frame : +TrackerIO.Dialog.DurationVaries.Message5 = Durasi rata-rata dan nilai frame jika dikesampingkan: +TFrame.Dialog.LibraryError.Title = Kesalahan +TFrame.Dialog.LibraryError.Message = Tidak ada sumber daya dapat diambil untuk node + +# Penambahan oleh Doug Brown 2011-12-01 +TTrack.Label.Unmarked = shift-klik untuk menandai +PrefsDialog.Label.Path = Jalur +PrefsDialog.Checkbox.ClearCacheOnExit = Hapus pada keluar +PrefsDialog.FileChooser.Title.Cache = Atur Tombolok +PrefsDialog.FileFilter.Directories = Direktori +Tracker.Action.AboutThreads = Perihal Thread +PrefsDialog.JRE.BorderTitle = Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE = Atur Java VM +PrefsDialog.FileFilter.JRE = Direktori dan Java VM +PrefsDialog.Version.BorderTitle = Tracker Versi +PrefsDialog.Version.Default = default +PrefsDialog.Tab.ClearCacheOnExit = Hapus pada keluar +PrefsDialog.Run.BorderTitle = Program Dieksekusi saat Startup +PrefsDialog.FileChooser.Title.Run = Pilih Berkas Executable +PrefsDialog.Button.Save = Simpan +Tracker.Readme = Tracker README +Tracker.Readme.NotFound = README file tidak ditemukan +Popup.MenuItem.Algorithm = Algoritma +AlgorithmDialog.Button.FiniteDifference = Hingga Perbedaan +AlgorithmDialog.Button.BounceDetect = Deteksi Pantulan +AlgorithmDialog.TitledBorder.Choose = Pilih algoritma yang digunakan untuk menghitung kecepatan dan percepatan: +AlgorithmDialog.Title = Algoritma +AlgorithmDialog.FiniteDifference.Message1 = ini adalah algoritma default. +AlgorithmDialog.FiniteDifference.Message2 = Velocity : v[i] = (x[i+1] - x[i-1]) / (2*dt ) +AlgorithmDialog.FiniteDifference.Message3 = Percepatan : a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2] ) / (7*dt^2) +AlgorithmDialog.BounceDetect.Message1 = Algoritma ini menghaluskan kecepatan dan percepatan, tetapi juga mendeteksi perubahan mendadak dalam kecepatan. +AlgorithmDialog.BounceDetect.Message2 = Perhatian: dapat menghasilkan artefak. Untuk informasi lebih lanjut, lihat : +TMenuBar.Menu.Diagnostics = Diagnostik + +# Penambahan oleh Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title = Berkas XML Tidak Valid +Tracker.Dialog.Invalid.Message = Berkas tidak dapat dibaca . +TrackPlottingPanel.Popup.Menu.CompareWith = Bandingkan Dengan +TrackerPanel.DataBuilder.TrackType.Unknown = TakDikenal +TrackerPanel.DataBuilder.Button.Load.Tooltip = Memuat fungsi Data dari berkas XML +TrackerPanel.DataBuilder.Button.Save.Tooltip = Simpan fungsi data dalam berkas XML +TrackerPanel.DataBuilder.Load.Title = Memuat Fungsi Data +TrackerPanel.DataBuilder.Load.Message = Pilih fungsi untuk dimuat : +TrackerPanel.DataBuilder.Save.Title = Simpan Fungsi Data +TrackerPanel.DataBuilder.Save.Message = Pilih fungsi untuk disimpan : +TrackerPanel.DataBuilder.Dialog.Load.Button.All = Memuat ke semua +TrackerPanel.DataBuilder.Dialog.Load.Button.Only = Memuat hanya +TrackerPanel.DataBuilder.Dialog.Load.Title = Seleksi Track +TrackerPanel.DataBuilder.Dialog.Load.Message = Apakah Anda ingin memuat fungsi untuk menjadi semua jenis trek +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title = Salah Tipe Track +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1 = Berkas mendefinisikan fungsi data untuk jenis track +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2 = Mereka tidak dapat dimuat ke dalam jenis +TrackerPanel.DataBuilder.Dialog.WrongType.Title = Salah Ketik +TrackerPanel.DataBuilder.Dialog.WrongType.Message = Berkas tidak mendefinisikan fungsi data. + +# Penambahan oleh Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1 = Klip Tracker telah disimpan sebagai +ExportTRKDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? +ExportTRKDialog.Complete.Title = Ekspor Lengkap +ExportTRKDialog.Title = Ekspor Klip Tracker +ExportTRKDialog.Message1 = Ini (1) ekspor klip video, (2) ubah data tab untuk mencocokkan video yang diekspor, dan (3) simpan tab dikonversi sebagai file Tracker baru. +ExportTRKDialog.Message2 = Tracker dan berkas video disimpan dalam direktori yang sama dengan nama yang sama tapi ekstensi berbeda. +TMenuBar.MenuItem.TabClip = Klip Tracker +TMenuBar.Menu.CalibrationTools = Alat Kalibrasi +TrackerIO.Dialog.DurationVaries.Button.SetClip = Pengaturan Direkomendasikan Klip +TrackerIO.Dialog.DurationVaries.Start = mulai +TrackerIO.Dialog.DurationVaries.End = akhir +TrackerIO.Dialog.DurationVaries.Recommended = Rekomendasi Clip + +# Penambahan oleh Doug Brown 2012-05-07 +AttachmentInspector.Title = Lampirkan Akhir +AttachmentInspector.Label.End = Akhir +AttachmentInspector.Label.Vertex = Vertex +AttachmentInspector.Header.PointName = Nama +AttachmentInspector.Header.AttachedTo = Lampirkan Untuk +ExportTRKDialog.Label.VideoFormat = Format Video +MeasuringTool.MenuItem.Attach = Lampirkan Akhir +PerspectiveTrack.Corner = sudut +PrefsDialog.LogLevel.BorderTitle = Startup Pesan Tingkat Log +Protractor.Data.Description.0 = waktu +Protractor.Data.Description.1 = busur derajat sudut +Protractor.Data.Description.2 = panjang lengan 1 +Protractor.Data.Description.3 = panjang lengan 2 +Protractor.Data.Description.4 = jumlah langkah +Protractor.Data.Description.5 = nomor rangka +TapeMeasure.Data.Description.0 = waktu +TapeMeasure.Data.Description.1 = panjang +TapeMeasure.Data.Description.2 = sudut diukur dari sumbu x + +TapeMeasure.Data.Description.3 = jumlah langkah +TapeMeasure.Data.Description.4 = nomor rangka + +# Penambahan oleh Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched = Pencarian tidak ditemukan +AutoTracker.Info.KeyFrame = Frame Kunci +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame = Kunci Frame Ini +AutoTracker.Wizard.Menuitem.DeleteThisMatch = Pengamatan Ini +AutoTracker.Wizard.Menuitem.DeleteLaterMatches = Pengamatan Se;anjutnya +PrefsDialog.Checkbox.64BitVM = 64-bit + +# Penambahan oleh Doug Brown 2012/11/20 +AutoTracker.Wizard.Title = Autotracker +Dialog.Button.Add = Tambah +Dialog.Button.Remove = Hapus +PrefsDialog.Button.ClearHost = Batal host +PrefsDialog.Button.ClearHost.Tooltip = menghapus semua berkas yang berhubungan dengan web host yang dipilih dari tembolok OSP +PrefsDialog.Button.ClearCache.Tooltip = menghapus semua berkas dari tembolok OSP +TActions.Action.SaveZip = Ekspor Tracker ZIP +ThumbnailDialog.Title = Ekspor Gambar kecil +ThumbnailDialog.Settings.Title = Pilihan Thumbnail +ThumbnailDialog.Label.CurrentImage = Gambar Lancar +ThumbnailDialog.Label.FrameNumber = frame +ThumbnailDialog.Label.StepNumber = langkah +ThumbnailDialog.View.VideoOnly = Hanya Video +ThumbnailDialog.View.MainView = Pengamatan Utama +ThumbnailDialog.View.WholeFrame = Seluruh Frame +ThumbnailDialog.Format.PNG = Gambar PNG +ThumbnailDialog.Format.JPG = Image JPEG +ThumbnailDialog.Chooser.SaveThumbnail.Title = Simpan Thumbnail +ThumbnailDialog.Subtitle.Image = Gambar +TMenuBar.MenuItem.Thumbnail = Gambar kecil +TToolBar.Button.SaveZip.Tooltip = Ekspor Tracker berkas ZIP +TTrack.MenuItem.DeletePoint = Hapus Langkah Dipilih +ZipResourceDialog.Title = Ekspor Tracker ZIP +ZipResourceDialog.Label.Format = Format +ZipResourceDialog.Label.Title = Nama +ZipResourceDialog.Label.Description = Keterangan +ZipResourceDialog.Label.Keywords = Kata Kunci +ZipResourceDialog.Label.Link = Link eksternal +ZipResourceDialog.Label.HTML = Sumber HTML +ZipResourceDialog.Complete.Message1 = Berkas Tracker ZIP telah disimpan sebagai +ZipResourceDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? +ZipResourceDialog.Complete.Title = Sukses +ZipResourceDialog.Border.Title.Documentation = Dokumentasi HTML +ZipResourceDialog.Border.Title.Video = Video +ZipResourceDialog.Border.Title.Thumbnail = Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title = Ekspor Tracker ZIP +ZipResourceDialog.FileChooser.AddFile.Title = Tambah Berkas untuk Tracker ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title = Buka berkas HTML +ZipResourceDialog.Button.AddFiles = Tambah Berkas +ZipResourceDialog.Button.ThumbnailSettings = Thumbnail Pilihan +ZipResourceDialog.Checkbox.TrimVideo = Potong untuk Klip +ZipResourceDialog.AddHTMLInfo.Title = Tambah Info Berkas HTML +ZipResourceDialog.AddHTMLInfo.Message1 = Apakah Anda ingin menambahkan berkas info HTML +ZipResourceDialog.AddHTMLInfo.Message2 = ke ZIP Tracker? +ZipResourceDialog.HTMLField.DefaultText = Jika tidak ditentukan, berkas akan dibuat dari awal +ZipResourceDialog.Dialog.AddFiles.Title = Tambah HTML dan Berkas PDF +ZipResourceDialog.Tooltip.HTML = Jalur ke berkas sumber HTML (jika tidak ada, berkas akan dibuat dari awal) +ZipResourceDialog.Tooltip.Author = Penulis sumber daya ini +ZipResourceDialog.Tooltip.Title = Nama Tampilan sumber ini (bukan nama file) +ZipResourceDialog.Tooltip.Description = Penjelasan yang berguna sumber daya ini +ZipResourceDialog.Tooltip.Keywords = Sebuah daftar kata kunci untuk mencari di browser DL +ZipResourceDialog.Tooltip.Contact = Penulis informasi kontak (institusi, e-mail, situs web, dll ) +ZipResourceDialog.Tooltip.Link = URL dari berkas HTML eksternal dengan informasi lebih lanjut tentang sumber daya ini +ZipResourceDialog.Tooltip.ThumbnailSettings = Mengubah tampilan thumbnail, ukuran atau jenis file +ZipResourceDialog.Tooltip.AddFiles = Tambah HTML dan berkas PDF ke ZIP Tracker +ZipResourceDialog.Tooltip.TrimVideo = Periksa untuk mengekspor klip video, hapus centang untuk menggunakan video asli +ZipResourceDialog.Tooltip.LoadHTML = Gunakan pemilih berkas untuk memuat file HTML Info + +# Penambahan oleh Doug Brown 2012/12/10 +PrefsDialog.Checkbox.32BitVM = 32-bit +PrefsDialog.Checkbox.WarnVariableDuration = Variabel durasi frame +PrefsDialog.Button.NoEngine = Tidak ada +PrefsDialog.Dialog.SwitchToQT.Message = Beralih ke QuickTime juga perubahan VM Java untuk 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message = Beralih ke Xuggle juga perubahan VM Java untuk 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message = Beralih ke Xuggle juga perubahan VM Java untuk 64-bit. +PrefsDialog.Dialog.SwitchVM.Title = Java VM Berubah +PrefsDialog.Dialog.SwitchTo32.Message = Beralih ke 32-bit Java VM juga mengubah mesin video QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message = Beralih ke 64-bit Java VM juga mengubah mesin video Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title = Video Mesin Berubah +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1 = mesin ada video yang tersedia untuk 64-bit Java VM. Anda akan +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2 = masih dapat gambar terbuka (JPEG , PNG) dan animasi GIF. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question = Anda yakin ingin beralih ke VM 64-bit? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title = Tidak ada 64-bit Video Mesin +PrefsDialog.Dialog.No32bitVMXuggle.Message = A 32-bit Java VM harus diinstal sebelum Xuggle dapat digunakan. +PrefsDialog.Dialog.No32bitVMQT.Message = A 32-bit Java VM harus diinstal sebelum QuickTime dapat digunakan. +PrefsDialog.Dialog.No32bitVM.Message = Untuk informasi lebih lanjut, lihat Bantuan Tracker: Instalasi. +PrefsDialog.Dialog.No32bitVM.Title = Diperlukan VM 32-bit +PrefsDialog.Button.ShowHelpNow = Tampilkan Bantuan Sekarang +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant = TIDAK KONSTAN +TMenuBar.MenuItem.CheckFrameDurations = Pemeriksaan Durasi Frame +TMenuBar.MenuItem.ExportZIP = Tracker Zip +Tracker.Dialog.Install32BitVM.Message = Anda harus menginstal Java VM 32-bit sebelum mesin video dapat digunakan. +Tracker.Dialog.SwitchTo32BitVM.Message1 = Satu atau lebih mesin video terinstal tapi tidak tersedia karena mereka +Tracker.Dialog.SwitchTo32BitVM.Message2 = memerlukan Java VM 32-bit dan Anda sekarang sedang berjalan di VM 64-bit. +Tracker.Dialog.SwitchTo32BitVM.Question = Apakah Anda ingin meluncurkan kembali dengan VM 32 bit dan mesin default? +Tracker.Dialog.Button.RelaunchNow = Ya, peluncuran kembali sekarang +Tracker.Dialog.Button.ShowPrefs = Tidak, tapi melalui preferensi +Tracker.Dialog.Button.ContinueWithoutEngine = Tidak, lanjutkan tanpa video +Tracker.Dialog.EngineProblems.Message1 = Satu atau lebih mesin video terinstal tapi tidak bekerja . +Tracker.Dialog.EngineProblems.Message2 = Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang Xuggle atau QuickTime . +Tracker.Dialog.ReplaceXuggle.Message1 = Kami sarankan anda mengganti mesin video Xuggle anda saat ini +Tracker.Dialog.ReplaceXuggle.Message2 = Xuggle dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 +Tracker.Dialog.ReplaceXuggle.Message3 = atau di atasnya) dan memilih Xuggle dalam pilihan instalasi. +TrackerIO.Dialog.DurationIsConstant.Message = Semua durasi frame sama (fps konstan) . +TrackerIO.ZIPResourceFilter.Description = Tracker Berkas ZIP (*.TRZ) +TToolbar.Button.Desktop.Tooltip = Tampilan tambahan HTML dan atau dokumen PDF +ZipResourceDialog.BadModels.Message1 = Klip video tidak termasuk awal kerangka +ZipResourceDialog.BadModels.Message2 = berikut trek Partikel Model. Jika Anda memotong video yang +ZipResourceDialog.BadModels.Message3 = model TIDAK akan disertakan dalam diekspor Tracker ZIP. +ZipResourceDialog.BadModels.Question = Apakah Anda ingin melanjutkan dan membuang model? +ZipResourceDialog.BadModels.Title = Klip - Model Konflik +TMenuBar.MenuItem.EditVideoFrames = Muat Semua Gambar +TMenuBar.Dialog.RequiresMemory.Message1 = Semua gambar akan dimuat ke memori untuk respon lebih cepat dan pembenahan. +TMenuBar.Dialog.RequiresMemory.Message2 = Silakan periksa memori yang tersedia dan peluncuran dengan lebih jika diperlukan. +TMenuBar.Dialog.RequiresMemory.Title = Memori + +# Penambahan oleh Doug Brown 2013/01/25 +PointMass.Data.Description.PixelX = komponen pixel-x +PointMass.Data.Description.PixelY = komponen pixel-y +ExportVideoDialog.Content.DeinterlacedVideo = Video yang ter-deinterlace +ExportVideoDialog.Deinterlace.OddFirst = Isian negatif pertama +ExportVideoDialog.Deinterlace.EvenFirst = Kejadian lapangan pertama +ExportVideoDialog.Deinterlace.Dialog.Title = Isian orde ter-deinterlace +TFrame.Dialog.LibraryError.FileNotFound.Title = Berkas Tidak Ditemukan +TFrame.Dialog.LibraryError.FileNotFound.Message = Tidak dapat menemukan berkas +TrackerPanel.DataBuilder.Button.Autoload = Memuat automatik +TrackerPanel.DataBuilder.Button.Autoload.Tooltip = Mengelola automuat fungsi data +TrackerPanel.DataBuilder.Autoload.Title = Automuat Fungsi Data +TrackerPanel.DataBuilder.Autoload.Message = Pilih fungsi untuk automuat: +TrackerPanel.DataBuilder.Chooser.XMLFiles = Berkas XML +TrackerIO.Dialog.Open.Title = Buka +TToolbar.Button.Refresh.Popup.RefreshNow = Segarkan +TToolbar.Button.Refresh.Popup.AutoRefresh = Autosegar +TToolbar.Button.Refresh.Tooltip = Segarkan data dan pandangan + +# Penambahan oleh Doug Brown 2013/05/10 +CoordAxes.Origin.Label = posisi asal pixel CoordAxes.Origin.Field.Tooltip = posisi asal diukur dari sudut kiri atas video \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties index 6bb59d6c..6bf84bda 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties @@ -1,1194 +1,1194 @@ -# This is the italian tracker.properties file -# Translated by Marco Ciampa 2007-2012 -# this file should be ISO-8859-1 encoded -# accented chars test: àèéìòùÀÈÉÌÒÙ -# -# Little list of terms usage: -# -# calibration stick/tape: asta/nastro di calibrazione -# world units: unità fisiche (contrapposte ai pixel...) -# automark: automarcatura -# handle: appiglio -# frame: quadro -# spinner: rotatore -# target: bersaglio -# -Calibration.Name=Paio di punti di calibrazione -Calibration.New.Name=calibrazione -CenterOfMass.Name=Centro di massa -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Selezione masse... -CenterOfMassInspector.Title=Centro di massa -CenterOfMassInspector.Border.Title=Selezione masse -ConfigInspector.Border.Title=Seleziona le voci desiderate -ConfigInspector.Title=Preferenze -ConfigInspector.Button.SaveAsDefault=Salva come predefinito -CoordAxes.Name=Assi -CoordAxes.New.Name=Assi -Dialog.Button.Cancel=Annulla -Dialog.Button.OK=OK -Dialog.Button.Close=Chiudi -Dialog.Button.All=Tutti -Dialog.Button.None=Nessuno -Dialog.Button.Copy=Copia -Dialog.Button.Update=Aggiorna -Dialog.Button.SelectAll=Seleziona tutto -Footprint.Diamond=diamante -Footprint.BoldDiamond=diamante grassetto -Footprint.SolidDiamond=diamante solido -Footprint.Triangle=triangolo -Footprint.BoldTriangle=triangolo grassetto -Footprint.SolidTriangle=triangolo solido -Footprint.Circle=cerchio -Footprint.BoldCircle=cerchio grassetto -Footprint.SolidCircle=cerchio solido -Footprint.VerticalLine=linea verticale -Footprint.BoldVerticalLine=linea verticale grassetto -Footprint.HorizontalLine=linea orizzontale -Footprint.BoldHorizontalLine=linea orizzontale grassetto -Footprint.Crosshair=crocino -Footprint.BoldCrosshair=crocino grassetto -Footprint.SimpleAxes=assi semplici -Footprint.BoldSimpleAxes=assi semplici grassetto -Footprint.Spot=punto -Footprint.Line=linea -Footprint.BoldLine=linea grassetto -Footprint.Outline=contorno -Footprint.BoldOutline=contorno grassetto -Footprint.Arrow=freccia -Footprint.BoldArrow=freccia grassetto -Footprint.DoubleArrow=doppia freccia -Footprint.BoldDoubleArrow=doppia freccia grassetto -Footprint.2xArrow=freccia 2x -Footprint.Bold2xArrow=freccia 2x grassetto -Footprint.4xArrow=freccia 4x -Footprint.Bold4xArrow=freccia 4x grassetto -Footprint.DashArrow=freccia tratteggiata -Footprint.BoldDashArrow=freccia tratteggiata grassetto -Footprint.BigArrow=freccia grande -Footprint.BigDashArrow=freccia grande tratteggiata -LineProfile.Name=Profilo linea -LineProfile.New.Name=profilo -LineProfile.Data.Brightness=luminosità -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=rosso -LineProfile.Data.Green=verde -LineProfile.Data.Blue=blu -LineProfile.Data.Weighting=conteggio -MainTView.Popup.MenuItem.QTPlayer=Player QuickTime -MainTView.Popup.MenuItem.Zoom=Zoom -MainTView.Popup.MenuItem.ToFit=Alla finestra -OffsetOrigin.Name=Origine spostamento -OffsetOrigin.New.Name=spostamento -PlotTrackView.Button.PlotCount=Punti -PlotTrackView.Button.PlotCount.ToolTip=Selezione numero di punti -PointMass.Name=Punto di massa -PointMass.New.Name=massa -PointMass.MenuItem.VectorsToPosition=Alla posizione -PointMass.MenuItem.Velocity=Velocità -PointMass.MenuItem.Acceleration=Accelerazione -Star.Name=Stella -Star.New.Name=stella -TableTrackView.Action.CopyData=Copia dati -TableTrackView.Button.SelectTableData=Dati -TableTrackView.Button.SelectTableData.ToolTip=Scegli dati -TableTrackView.Popup.MenuItem.Analyze=Analizza -TableTrackView.Dialog.Border.Title=Mostra: -TActions.Action.Description=Descrizione -TActions.Action.ClearTracks=Cancella -TActions.Action.NewTab=Nuova scheda -TActions.Action.Copy=Copia -TActions.Action.Paste=Incolla -TActions.Action.Open=Apri... -TActions.Action.Close=Chiudi -TActions.Action.Import=Importa... -TActions.Action.Save=Salva -TActions.Action.SaveAs=Salva come... -TActions.Action.Export=Esporta... -TActions.Action.CaptureVideo=Cattura video... -TActions.Action.Delete=Elimina -TActions.Action.Config=Preferenze... -TActions.Action.AxesVisible=Visibile -TActions.Action.TapeVisible=Visibile -TActions.Action.Print=Stampa... -TActions.Action.ClearFilters=Cancella -TActions.Action.ImportVideo=Importa... -TActions.Action.CloseVideo=Chiudi -TActions.Action.CloseAll=Chiudi tutto -TActions.Action.Exit=Esci -TActions.Dialog.PrintError.Message=Si è verificato un errore di stampa. -TActions.Dialog.PrintError.Title=Errore di stampa -TActions.Dialog.Description.Title=Descrizione: -TActions.Dialog.DeleteLockedTracks.Message=Alcune tracce sono bloccate. Eliminarle comunque? -TActions.Dialog.DeleteLockedTracks.Title=Eliminare le tracce bloccate? -TActions.Dialog.Description.Title=Descrizione: -TActions.Dialog.NewPointMass.Title=Nuovo punto di massa -TapeMeasure.Name=Metro a nastro -TapeMeasure.New.Name=Metro a nastro -TapeMeasure.MenuItem.Fixed=Fisso -TFrame.View.Plot=Vista grafico -TFrame.View.Table=Vista tabella -TFrame.View.World=Vista globale -TFrame.View.Video=Vista video -TFrame.Dialog.Help.Title=Manuale di Tracker -TMenuBar.Menu.File=File -TMenuBar.Menu.Edit=Modifica -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Tracce -TMenuBar.Menu.Coords=Coordinate -TMenuBar.Menu.Window=Finestra -TMenuBar.Menu.Help=Aiuto -TMenuBar.MenuItem.EditProperties=Proprietà... -TMenuBar.MenuItem.VideoVisible=Visibile -TMenuBar.MenuItem.VideoFilters=Filtri -TMenuBar.MenuItem.NewVideoFilter=Nuovo -TMenuBar.MenuItem.NewTrack=Nuovo -TMenuBar.MenuItem.CoordsLocked=Bloccato -TMenuBar.MenuItem.CoordsFixedOrigin=Origine fissa -TMenuBar.MenuItem.CoordsFixedAngle=Angolo fisso -TMenuBar.MenuItem.CoordsFixedScale=Scala fissa -TMenuBar.MenuItem.CoordsRefFrame=Quadro di riferimento -TMenuBar.MenuItem.CoordsDefault=Predefinito -TMenuBar.MenuItem.WindowRight=Vista destra -TMenuBar.MenuItem.WindowBottom=Vista dal basso -TMenuBar.MenuItem.PlayAllSteps=Esegui tutti i passi -TMenuBar.MenuItem.Record=Registra -TMenuBar.MenuItem.MatSize=Dimensione mat -TMenuBar.MenuItem.Language=Lingua -TMenuBar.MenuItem.DeleteTrack=Elimina -TMenuBar.MenuItem.TrackerHelp=Guida di Tracker... -TMenuBar.MenuItem.MessageLog=Log dei messaggi... -TrackControl.Name=Controllo traccia -TrackControl.Button.NewTrack=Nuovo -TrackControl.Button.NewTrack.ToolTip=Crea nuova traccia -TrackControl.Button.Trails.ToolTip=Guide -TrackControl.Button.Labels.ToolTip=Etichette -TrackControl.Button.StretchVectors.ToolTip=Stendi vettori -TrackControl.Button.Accelerations.ToolTip=Accelerazioni -TrackControl.Button.Xmass.ToolTip=Moltiplica per la massa -TrackControl.Button.Vectors.ToolTip=Vettori -TrackControl.Button.Velocities.ToolTip=Velocità -TrackControl.Button.Properties.ToolTip=Proprietà -TrackControl.Button.Positions.ToolTip=Posizioni -Tracker.Popup.MenuItem.Snapshot=Istantanea -Tracker.Popup.MenuItem.Help=Aiuto... -Tracker.Cursor.Crosshair.Description=Cursore a croce per marcare punti -Tracker.Action.AboutTracker=Informazioni su Tracker... -Tracker.Dialog.AboutTracker.Title=Informazioni su Tracker -Tracker.Action.AboutJava=Informazioni su Java... -Tracker.Dialog.AboutJava.Title=Informazioni su Java -Tracker.Dialog.AboutJava.UnknownVersion=sconosciuta -Tracker.Dialog.AboutJava.Message=Versione Java -Tracker.Action.AboutQT=Informazioni su QuickTime... -Tracker.Dialog.AboutQT.Title=Informazioni su QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=Versione QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versione QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=Percorso QTJava: -Tracker.Dialog.NoQT.Title=QTJava.zip non trovato -Tracker.Dialog.NoQT.Message1=QuickTime per Java non sembra sia installato. -Tracker.Dialog.NoQT.Message2=Se si desidera analizzare video formato QuickTime, reinstallare QuickTime. -Tracker.Dialog.NoQT.Message3=NOTA: QuickTime per Java DEVE ESSERE SELEZIONATO mentre si installa QuickTime. -Tracker.Dialog.UpdateQT.Title=Aggiornamento QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Una nuova versione di QTJava.zip è stata rilevata su -Tracker.Dialog.UpdateQT.Message2=Vuoi aggiornare i file esistenti? -Tracker.Dialog.CopyQT.Title=Copia QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime è installato, ma prima che Tracker possa usarlo: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip deve essere copiato da -Tracker.Dialog.CopyQT.Message3= a -Tracker.Dialog.CopyQT.Message4= 2. Tracker deve essere riavviato. -Tracker.Dialog.CopyQT.Message5=Vuoi copiare ora QTJava.zip? -Tracker.Dialog.CopyFailed.Title=Copia fallita -Tracker.Dialog.CopyFailed.Message=QTJava.zip non può essere copiato. -Tracker.Dialog.CopiedTo.Title=Copia avvenuta con successo -Tracker.Dialog.CopiedTo.Message1=QTJava.zip è stato copiato con successo su -Tracker.Dialog.CopiedTo.Message2=Tracker deve essere riavviato e ora terminerà. -Tracker.Splash.Loading=Caricamento -TrackerIO.Dialog.Import.Title=Importa -TrackerIO.Dialog.Import.Message=Seleziona elementi da importare -TrackerIO.Dialog.ImportVideo.Title=Importa Video -TrackerIO.Dialog.Export.Title=Esporta -TrackerIO.Dialog.Export.Message=Seleziona elementi da esportare -TrackerIO.Dialog.ReplaceFile.Title=Rimpiazzare il file esistente? -TrackerIO.Dialog.ReplaceFile.Message=esiste già. Vuoi sostituirlo? -TrackerIO.Dialog.NotTrackerXML.Title=XML errato -TrackerIO.Dialog.NotTrackerXML.Message=contiene dati xml di una diversa applicazione. -TrackerIO.Dialog.BadVideo.Message=Il video non può essere aperto: -TrackerPanel.NewTab.Name=Senza titolo -TrackerPanel.DragToMark.Hint=Maiusc-trascina per marcare -TrackerPanel.ClickToMark.Hint=Maiusc-clic per marcare -TrackerPanel.Dialog.LoadFailed.Title=File non caricato -TrackerPanel.Dialog.LoadFailed.Message=Il file non può essere caricato: -TrackerPanel.Dialog.SaveChanges.Title=Salva i cambiamenti -TrackerPanel.Dialog.SaveChanges.Message=Salva i cambiamenti su -TrackPlottingPanel.Popup.MenuItem.Lines=Linee -TrackPlottingPanel.Popup.MenuItem.Points=Punti -TrackPlottingPanel.Popup.MenuItem.Scale=Scala... -TrackPlottingPanel.Popup.MenuItem.Print=Stampa... -TrackPlottingPanel.Popup.MenuItem.Measure=Scala per aggiustamento -TrackPlottingPanel.Popup.MenuItem.Analyze=Analizza -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscala -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom al riquadro -TrackPlottingPanelInspector.Title=Scala -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Imposta dimensione -TToolBar.Dropdown.SelectedTrack.Tooltip=Seleziona traccia -TToolBar.Dropdown.SelectedTrack.None=nessuna selezione -TTrack.MenuItem.Delete=Cancella -TTrack.MenuItem.Color=Colore... -TTrack.Dialog.Color.Title=Scegli colore traccia -TTrack.MenuItem.Name=Nome... -TTrack.MenuItem.Footprint=Dimensione -TTrack.MenuItem.Description=Descrizione... -TTrack.MenuItem.Visible=Visibile -TTrack.MenuItem.TrailVisible=Trail Visible -TTrack.MenuItem.Autostep=Autostep -TTrack.MenuItem.MarkByDefault=Marca predefinito -TTrack.MenuItem.Locked=Bloccato -TTrack.MenuItem.Delete=Cancella -TTrack.Name.None=senza nome -TTrack.Dialog.Description.Title=Descrizione: -TTrack.Dialog.Name.Title=Imposta il nome -TTrack.Dialog.Name.Label=Nome: -TViewChooser.Button.Choose.Tooltip=Scegli una vista -Vector.Name=Vettore -Vector.New.Name=vettore -Vector.MenuItem.ToOrigin=All'origine -Vector.MenuItem.Label=Etichetta visibile -VectorSum.Name=Somma di vettori -VectorSum.New.Name=somma -VectorSum.MenuItem.Inspector=Seleziona vettori... -VectorSumInspector.Title=Somma di vettori -VectorSumInspector.Border.Title=Seleziona vettori -WorldTView.Popup.MenuItem.Projectile=Modello di proiettile - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Modello analitico di particella -AnalyticParticle.Inspector.Title=Modello analitico di particella -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=Raggio 4 -CircleFootprint.Circle_6=Raggio 6 -CircleFootprint.Circle_8=Raggio 8 -DynamicParticle.Name=Modello dinamico di particella -DynamicParticle.Inspector.Title=Modello dinamico di particella -DynamicParticle.Property.ForceX=forza x -DynamicParticle.Property.ForceY=forza y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Fisso -ParticleModel.New.Name=modello -ParticleModel.MenuItem.InspectModel=Modello... -ParticleModel.Inspector.Button.Undo=Annulla -ParticleModel.Inspector.Button.Redo=Ripeti -ParticleModel.Inspector.Button.Close=Chiudi -ParticleModel.Inspector.Button.Help=Aiuto - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=Solo X -Calibration.Axes.YOnly=Solo Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Seleziona assi di calibrazione -Calibration.Label.Axes=Assi -Calibration.Dialog.InvalidCoordinates.Title=Coordinate non valide -Calibration.Dialog.InvalidCoordinates.Message=I punti non possono avere le stesse coordinate globali. -Calibration.Dialog.InvalidXCoordinates.Message=I punti non possono avere le stesse coordinate x globali. -Calibration.Dialog.InvalidYCoordinates.Message=I punti non possono avere le stesse coordinate y globali. -SpectralLineFilter.Title=Spettro di gas -SpectralLineFilter.H=Idrogeno -SpectralLineFilter.He=Elio -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Mercurio -TFrame.View.Unknown=Vista -TMenuBar.MenuItem.Undo=Annulla -TMenuBar.MenuItem.Redo=Ripeti -TMenuBar.MenuItem.Replace=Rimpiazza... -TMenuBar.Menu.AddImage=Importa immagine -TMenuBar.MenuItem.AddBefore=Prima di questo quadro... -TMenuBar.MenuItem.AddAfter=Dopo questo quadro... -TMenuBar.MenuItem.RemoveImage=Rimuovi questo quadro -TMenuBar.Menu.Tools=Strumenti -TMenuBar.MenuItem.DataFunctionTool=Colonne dati... -TMenuBar.MenuItem.DatasetTool=Analisi dati... -TMenuBar.Menu.CopyImage=Copia immagine -TMenuBar.MenuItem.CopyMainView=Vista principale -TMenuBar.MenuItem.CopyFrame=Quadro -TMenuBar.MenuItem.PrintFrame=Stampa quadro... -TrackerIO.Dialog.AddImage.Title=Aggiungi immagine -TTrack.Dialog.Name.BadName=già preso! Scegli un altro nome. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=forza rete -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Questa è la vista grafici dei dati di traccia. -TableTView.Label.NoData=Questa è la vista tabella dei dati di traccia. -TrackerPanel.Message.NoData0=Questa è la vista principale di video e tracce. -TrackerPanel.Message.NoData1=Scegli File|Apri o Tracce|Nuovo per partire. -WorldTView.Label.NoData=Questa è la vista globale di video e tracce. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Risolutore: -DynamicParticle.Solver.Euler=Eulero -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adattivo multipasso -DynamicParticle.Table.Force.Border.Title=Funzioni forza (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Funzioni posizione (t) -ParticleModel.Table.Initial.Border.Title=Valori iniziali -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Incolla immagine -TMenuBar.MenuItem.PasteAfter=Dopo questo quadro -TMenuBar.MenuItem.PasteBefore=Prima di questo quadro -TMenuBar.MenuItem.PasteReplace=Rimpiazza video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Introduzione... -Tracker.Splash.HelpMessage=Nuovo utente? Scegli - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=angolo -LineProfile.Checkbox.Rotates=ruota -LineProfile.Label.Spread=diffuso -RGBRegion.Name=Regione RGB -RGBRegion.New.Name=regione -RGBRegion.MenuItem.Fixed=Fissi -RGBRegion.Label.Radius=raggio -TTrack.Label.Step=passo - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=numero posizione -LineProfile.Data.Description.1=componente-x posizione -LineProfile.Data.Description.2=componente-y posizione -LineProfile.Data.Description.3=rosso -LineProfile.Data.Description.4=verde -LineProfile.Data.Description.5=blu -LineProfile.Data.Description.6=luminosità percepita -LineProfile.Data.Description.7=spessore linea -ParticleModel.MenuItem.TraceVisible=Traccia visibile -ParticleModel.MenuItem.StepsVisible=Passi visibili -PointMass.Data.Description.0=tempo -PointMass.Data.Description.1=componente-x posizione -PointMass.Data.Description.2=componente-y posizione -PointMass.Data.Description.3=magnitudo posizione -PointMass.Data.Description.4=angolo posizione -PointMass.Data.Description.5=componente-x velocità -PointMass.Data.Description.6=componente-y velocità -PointMass.Data.Description.7=magnitudo velocità -PointMass.Data.Description.8=angolo velocità -PointMass.Data.Description.9=componente-x accelerazione -PointMass.Data.Description.10=componente-y accelerazione -PointMass.Data.Description.11=magnitudo accelerazione -PointMass.Data.Description.12=angolo accelerazione -PointMass.Data.Description.13=angolo rotazione -PointMass.Data.Description.14=velocità angolare -PointMass.Data.Description.15=accelerazione angolare -PointMass.Data.Description.16=nomero passo -PointMass.Data.Description.17=numero quadro -PointMass.Data.Description.18=componente-x momento -PointMass.Data.Description.19=componente-y momento -PointMass.Data.Description.20=magnitudo momento -PointMass.Data.Description.21=angolo momento -PointMass.Data.Description.22=energia cinetica -RGBRegion.Data.Description.0=tempo -RGBRegion.Data.Description.1=componente-x posizione -RGBRegion.Data.Description.2=componente-y posizione -RGBRegion.Data.Description.3=rosso -RGBRegion.Data.Description.4=verde -RGBRegion.Data.Description.5=blu -RGBRegion.Data.Description.6=luminosità percepita -RGBRegion.Data.Description.7=conteggio pixel -RGBRegion.Data.Description.8=numero passo -RGBRegion.Data.Description.9=numero quadro -TView.Menuitem.Define=Definisci... -Vector.Data.Description.0=tempo -Vector.Data.Description.1=componente-x -Vector.Data.Description.2=componente-y -Vector.Data.Description.3=magnitudo -Vector.Data.Description.4=angolo -Vector.Data.Description.5=componente-x posizione coda -Vector.Data.Description.6=componente-y posizione coda -Vector.Data.Description.7=numero passo -Vector.Data.Description.8=numero quadro -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Massa di questa particella -ParticleModel.Parameter.InitialTime.Description=Tempo iniziale -AnalyticParticle.PositionFunction.X.Description=Componente-x posizione -AnalyticParticle.PositionFunction.Y.Description=Componente-y posizione -DynamicParticle.ForceFunction.X.Description=Componente-x forza -DynamicParticle.ForceFunction.Y.Description=Componente-y forza -DynamicParticle.Parameter.InitialX.Description=Componente-x posizione iniziale -DynamicParticle.Parameter.InitialY.Description=Componente-y posizione iniziale -DynamicParticle.Parameter.InitialVelocityX.Description=Componente-x velocità iniziale -DynamicParticle.Parameter.InitialVelocityY.Description=Componente-y velocità iniziale -TrackerPanel.ModelBuilder.Title=Costruttore modello -TrackerPanel.DataBuilder.Title=Costruttore dati -TrackControl.TrailMenu.NoTrail=Nessuna traccia -TrackControl.TrailMenu.ShortTrail=Traccia corta -TrackControl.TrailMenu.LongTrail=Traccia lunga -TrackControl.TrailMenu.FullTrail=Traccia completa -TrackerPanel.ModelBuilder.Spinner.Tooltip=Modello attualmente selezionato -TrackerPanel.ModelBuilder.LineButton.Text=Stile linea -TrackerPanel.ModelBuilder.LineButton.Tooltip=Imposta stile linea -ParticleModel.LineStyle.None=Nessuna linea -ParticleModel.LineStyle.Connect=Passi connessi -ParticleModel.LineStyle.Smooth=Linea arrotondata -ModelFunctionPanel.Label=Modello -AnalyticFunctionPanel.FunctionEditor.Border.Title=Funzioni posizione -DynamicFunctionPanel.FunctionEditor.Border.Title=Funzioni forza -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Colonne tabella visibili -Tracker.About.ProjectOf=Un progetto di: -Tracker.About.TranslationBy=Traduzione di -Tracker.About.Translator=Marco Ciampa -TMenuBar.Menu.SaveVideoAs=Salva clip come -TActions.SaveClipAs.ProgressMonitor.Message=Salva la clip come -TActions.SaveClipAs.ProgressMonitor.Progress=Completato - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sincronizza -PlotTrackView.Checkbox.Synchronize.Tooltip=Sincronizza l'asse orizzontale -RGBRegion.MenuItem.FixedRadius=Raggio bloccato -Tracker.VideoZoom.Hint=clic per ingrandire, alt-clic per rimpicciolire, doppio-clic per auto -Tracker.PlotZoomIn.Hint=trascina per ingrandire, doppio-clic per auto -Tracker.PlotZoomOut.Hint=clic per rimpicciolire -Tracker.MenuItem.Hints=Mostra i suggerimenti -TapeMeasure.Label.Length=lunghezza scalata -TapeMeasure.Label.TapeAngle=angolo nastro -TapeMeasure.Label.ArcAngle=angolo goniometro -TrackerIO.Dialog.NotAnImage.Title=Tipo file non corretto -TrackerIO.Dialog.NotAnImage.Message1=non è un'immagine JPG o GIF. -TrackerIO.Dialog.NotAnImage.Message2=Continuare? -TToolBar.Button.Zoom.Tooltip=Strumento Zoom (scorciatoia: tasto Z) -TrackChooserTView.DropDown.Tooltip=Seleziona una traccia -TapeMeasure.Field.ArcAngle.Tooltip=Angolo dal nastro al braccio del goniometro -TapeMeasure.Field.TapeAngle.Tooltip=Angolo dall'asse x positivo al nastro -TapeMeasure.Field.Magnitude.Tooltip=Lunghezza del nastro in unità scalate -TapeMeasure.Readout.Magnitude.Name=lettura lunghezza -TapeMeasure.Readout.Magnitude.Hint=clic per impostare la scala -TapeMeasure.Readout.Angle.Name=lettura angolo -TapeMeasure.Readout.Angle.Hint=click per impostare l'angolo -TapeMeasure.Arm.Name=braccio goniometro -TapeMeasure.Arm.Hint=trascina per misurare gli angoli, accorcia per chiudere -TapeMeasure.End.Name=fine -TapeMeasure.End.Hint=trascina per misurare le distanze o per calibrare la scala -TapeMeasure.Handle.Name=appiglio -TapeMeasure.Handle.Hint=trascina per spostare il nastro -Vector.Tip.Name=suggerimento -Vector.Tip.Hint=trascina o inserisci le coordinate per cambiare i componenti -Vector.Handle.Name=appiglio -Vector.Handle.Hint=trascina per spostare il vettore -Vector.ShortHandle.Hint=trascina per spostare, alt-clic per il suggerimento di selezione -PointMass.Position.Name=posizione -PointMass.Position.Hint=trascina o inserisci le coordinate per cambiare la posizione -PointMass.Velocity.Name=velocità -PointMass.Acceleration.Name=accelerazione -PointMass.Vector.Hint=trascina per spostare -PointMass.Position.Locked.Hint=clic per selezionare--non può essere trascinato -CoordAxes.Handle.Name=asse+x -CoordAxes.Handle.Hint=trascina per cambiare inclinazione -CoordAxes.Origin.Name=origine -CoordAxes.Origin.Hint=trascina per cambiare posizione -OffsetOrigin.Position.Name=posizione -OffsetOrigin.Position.Hint=trascina o inserisci le coordinate per spostare l'origine -Calibration.Point.Name=punto -Calibration.Point.Hint=trascina o inserisci le coordinate per cambiare asse e scala -RGBRegion.Position.Name=posizione -RGBRegion.Position.Hint=trascina o inserisci le coordinate per cambiare posizione -LineProfile.End.Name=fine -LineProfile.End.Hint=trascina per regolare la lunghezza della linea -LineProfile.Handle.Name=appiglio -LineProfile.Handle.Hint=trascina per spostare la linea -PointMass.Hint=imposta la massa sulla barra degli strumenti -PointMass.Unmarked.Hint=, maiusc-clic per marcare le posizioni -TTrack.Unselected.Hint=clic per selezionare e/o impostare le proprietà -Vector.Unmarked.Hint=maiusc-trascina per disegnare i vettori -OffsetOrigin.Unmarked.Hint=maiusc-clic per marcare il punto di scostamento -Calibration.Unmarked.Hint=maiusc-clic per marcare il primo punto -Calibration.Halfmarked.Hint=maiusc-clic per marcare il secondo punto -CenterOfMass.Empty.Hint=seleziona le masse per definire il sistema -VectorSum.Empty.Hint=seleziona i vettori per definire la somma -TapeMeasure.Hint=imposta la lunghezza per cambiare la scala, imposta l'angolo per cambiare l'inclinazione dell'asse x -CoordAxes.Hint=imposta l'angolo per cambiare l'inclinazione -ParticleModel.Hint=imposta la massa sulla barra degli strumenti, inserisci le espressioni nel Model Builder per animare -RGBRegion.Hint=inserire il raggio per cambiare la dimensione -RGBRegion.Unmarked.Hint=maiusc-clic per marcare le posizioni -TTrack.ImportVideo.Hint=importa video o immagine per misurare l'RGB -TTrack.Selected.Hint=selezionato -LineProfile.Hint=inserire la diffusione per cambiare lo spessore linea -LineProfile.Unmarked.Hint=maiusc-trascina per disegnare la linea -LineProfile.Menu.Orientation=Orientazione -LineProfile.MenuItem.Horizontal=Orizzontale -LineProfile.MenuItem.XAxis=Lungo l'asse X -Footprint.PositionVector=vettore -Footprint.BoldPositionVector=vettore in grassetto -Tracker.Startup.Hint=guardare qui per i suggerimenti (o disabilitare i suggerimenti nel menu Aiuto), premere il tasto F1 in qualsiasi momento per la guida -TrackerPanel.NoVideo.Hint=apri o importa un video o immagine da analizzare -TrackerPanel.CalibrateVideo.Hint=identifica un particolare del video con lunghezza conosciuta e imposta la scala usando il nastro di misura -TrackerPanel.NoTracks.Hint=crea una nuova traccia per misurare i particolari interessanti del video -TrackerPanel.SetClip.Hint=imposta o revisiona le impostazioni dei clip video nel clip inspector -TrackerPanel.ShowAxes.Hint=imposta l'origine e l'angolo degli assi delle coordinate -VideoPlayer.Step.Hint=passo avanti (scorciatoia: tasto PagGiù) -VideoPlayer.Back.Hint=passo indietro (scorciatoia: tasto PagSu) -TrackerPanel.DVVideo.Hint=applica un filtro di ridimensionamento per correggere le distorsioni nei video in formato DV -TrackerIO.DataFileFilter.Description=File di Tracker -Tracker.Button.PDFHelp=Versione del PDF stampabile -TToolbar.Button.TapeVisible.Tooltip=Misura a nastro con il braccio del goniometro - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Controllo traccia -TMenuBar.MenuItem.Description=Note -TrackPlottingPanel.RightDrag.Hint=trascina-destro per le opzioni -TMenuBar.MenuItem.DeleteSelectedPoint=Punto selezionato -TFrame.InfoDialog.SaveChanges.Title=Salva i cambiamenti -TFrame.InfoDialog.SaveChanges.Message=Salvare i cambiamenti? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesiano -DynamicParticle.Editor.Button.Polar=Polare -DynamicParticle.Parameter.InitialR.Description=Raggio iniziale -DynamicParticle.Parameter.InitialTheta.Description=Angolo iniziale -DynamicParticle.Parameter.InitialVelocityR.Description=Velocità radiale iniziale -DynamicParticle.Parameter.InitialOmega.Description=Velocità angolare iniziale -DynamicParticle.ForceFunction.R.Description=Forza la componente radiale -DynamicParticle.ForceFunction.Theta.Description=Forza la componente tangenziale -DynamicParticlePolar.Name=Modello di particella dinamica (Polare) -DynamicTwoBody.Editor.Button.Particle1=Particella 1 -DynamicTwoBody.Editor.Button.Particle2=Particella 2 -DynamicTwoBody.Name=Modello dinamico a due corpi -TMenuBar.Menu.DynamicParticle=Modello di particella dinamica -TMenuBar.MenuItem.Cartesian=Cartesiano -TMenuBar.MenuItem.Polar=Polare - -# Additions by Doug Brown 2009-08-24 -Autotrack.Inspector.Title=Autotraccia -PointMass.MenuItem.Autotrack=Autotraccia... -Dialog.Button.Help=Aiuto -AutoTracker.Wizard.Button.Reset=Reimposta -AutoTracker.Wizard.Button.Back=Indietro -AutoTracker.Wizard.Button.Next=Prossimo -AutoTracker.Wizard.Button.Accept=Accetta -AutoTracker.Wizard.Button.Search=Cerca -AutoTracker.Wizard.Button.Start=Partenza -AutoTracker.Wizard.Button.Pause=Pausa -AutoTracker.Wizard.Button.Skip=Salta -AutoTracker.Label.Mask=Maschera immagine -AutoTracker.Label.Target=Scostamento bersaglio -AutoTracker.Label.AcceptLevel=Accetta i punti sopra -AutoTracker.TabbedPane.TabTitle.Mask=Maschera -AutoTracker.TabbedPane.TabTitle.Target=Bersaglio -AutoTracker.TabbedPane.TabTitle.Settings=Accetta -AutoTracker.TabbedPane.TabTitle.Search=Cerca -AutoTracker.Info.GetStarted=Fare clic sul particolare del video che si desidera autotracciare. -AutoTracker.Info.Mask1=La maschera deifinisce l'immagine da confrontare in ogni quadro video. Spostare o ridimensionare la maschera trascinandone rispettivamente il centro o l'appiglio. -AutoTracker.Info.Mask2=Suggerimento: la maschera non necessita di essere larga né di includere l'intero oggetto. Un particolare che sia unico e che abbia bordi ad elevato contrasto è generalmente una buona scelta. -AutoTracker.Info.MaskLocked1=La maschera è in uso ed è bloccata. -AutoTracker.Info.MaskLocked2=Fare clic sul pulsante Reimposta per cancellare tutti i passi, sbloccare la maschera e ricominciare. -AutoTracker.Info.Target1=Il bersaglio è dove i passi vengono marcati relativamente alla maschera. Spostare il bersaglio trascinandolo. -AutoTracker.Info.Target2=Suggerimento: è possibile regolare la posizione del bersaglio anche dopo aver marcato dei passi. I passi esistenti si muoveranno automaticamente con il bersaglio. -AutoTracker.Info.TargetLocked=Il bersaglio è in uso e legato alle posizioni dei passi esistenti. Spostandolo si sposteranno anche i passi. -AutoTracker.Info.Settings1=Verifica che i punteggi sopra il livello di accettazione mostrati siano marcati automaticamente. -AutoTracker.Info.Settings2=Suggerimento: riducendo il livello di accettazione si velocizza il processo di marcatura ma si aumenta la probabilità di introdurre degli errori. -AutoTracker.Info.Search1=Il rettangolo mostrato verrà ricercato per il miglior riscontro. Spostare o ridimensionare l'area di ricerca spostandone il centro o il suo appiglio. -AutoTracker.Info.Search2=Suggerimento: l'area di ricerca non necessita di essere larga. Dopo aver trovato i primi due riscontri, un algoritmo di ricerca predittivo sposta l'area di ricerca alle posizioni di riscontro estrapolate. -AutoTracker.Info.Frame=Quadro -AutoTracker.Info.Match=Il riscontro mostrato è stato automaticamente marcato alla posizione del bersaglio. -AutoTracker.Info.Possible=è stato trovato un possibile riscontro nell'area di ricerca mostrata. La vostra opinione è: -AutoTracker.Info.NoMatch=Non è stato trovato nessun riscontro nell'area di ricerca mostrata. La vostra opinione è: -AutoTracker.Info.Outside=L'area di ricerca è fuori dall'immagine. La vostra opinione è: -AutoTracker.Info.Accepted=Il riscontro mostrato è stato accettato dall'utente. -AutoTracker.Info.MarkedByUser=Il passo è stato marcato manualmente dall'utente. -AutoTracker.Info.NoVideo=L'autotracciamento richiede un video. Importare un video o chiudere questo autotracciatore. -AutoTracker.Info.Height=altezza -AutoTracker.Info.Width=larghezza -AutoTracker.Info.Accept=--accetta il riscontro -AutoTracker.Info.Retry=--sposta l'area di ricerca e cerca ancora -AutoTracker.Info.Mark=--maiusc-clic per marcare il passo manualmente -AutoTracker.Info.Skip=--salta questo quadro e continua il tracciamento -AutoTracker.Info.Reset=--reimposta e ricomincia con una maschera modificata -AutoTracker.Info.MatchScore=punteggio riscontro -AutoTracker.Dialog.MaskLocked.Title=Maschera bloccata -PointMass.Cursor.Autotrack.Description=Cursore autotracciamento -VideoPlayer.StartFrame.Hint=trascina per impostare il quadro di inizio -VideoPlayer.EndFrame.Hint=trascina per impostare il quadro di fine -VideoPlayer.Slider.Hint=trascina per scansionare attraverso il video -FileDropHandler.Dialog.BadFile.Message=impossibile da caricare. -FileDropHandler.Dialog.BadFile.Title=File non riconosciuto - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Applica -DynamicParticle.Dialog.Delete.Message=Cancellando questa particella la si rimuoverà da un sistema. Cancellare? -DynamicParticle.Dialog.Delete.Title=Sistema dinamico -DynamicParticle.System.In=in -DynamicSystem.Empty=vuoto -DynamicSystem.Force.Name.Internal=interno -DynamicSystem.ForceFunction.R.Description=Componente radiale della forza interna -DynamicSystem.ForceFunction.Theta.Description=Componente tangenziale della forza interna -DynamicSystem.MenuItem.Inspector=Seleziona le particelle... -DynamicSystem.Name=Sistema dinamico a due corpi -DynamicSystem.New.Name=sistema -DynamicSystem.Parameter.Of=di -DynamicSystem.Parameter.RelativeTo=relativo a -DynamicSystem.Parameter.Name.Relative=relativo -DynamicSystem.Parameter.ParticleMass.Description=Massa di -DynamicSystem.Parameter.Mass.Description=Massa totale di questo sistema -DynamicSystemInspector.Border.Title=Particella -DynamicSystemInspector.Title=Sistema a due corpi -DynamicSystemInspector.Button.Change=Cambia in ... -DynamicSystemInspector.ParticleName.None=(nessuna) -TMenuBar.MenuItem.Clone=Clona -TMenuBar.MenuItem.TwoBody=Sistema a due corpi -TrackerPanel.DataBuilder.Dropdown.Tooltip=Traccia attualmente selezionata -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sincronizza asse verticale -TrackControl.Button.Trace.ToolTip=Mostra o nascondi i tracciati -TToolBar.Button.Open.Tooltip=Apri un video o un file tracker in una nuova scheda -TToolBar.Button.Save.Tooltip=Salva la scheda attuale in un file -TToolBar.Button.SelectTrack=Seleziona -TToolBar.Button.SelectTrack.Tooltip=Seleziona una traccia esistente -TTrack.MenuItem.ClearSteps=Rimuovi i passi -PointMass.MenuItem.Position=Posizione -TMenuBar.MenuItem.Empty=(vuoto) -TTrackBar.Button.Memory=uso della memoria: -TTrackBar.Button.Memory.Tooltip=Monitora e gestisce la memoria -TTrackBar.Memory.PopupItem.Launch=Esegue Tracker con memoria -TButton.Track.ToolTip=Imposta le proprietà di -Tracker.Dialog.OutOfMemory.Message1=Tracker ha esaurito la memoria. -Tracker.Dialog.OutOfMemory.Message2=Fare clic sul pulsante della memoria per le opzioni. -Tracker.Dialog.OutOfMemory.Title=Memoria esaurita - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Previsione -AutoTracker.Label.Original=Iniziale -AutoTracker.Label.NoMask=no -AutoTracker.Label.Rate=Frequenza di evoluzione: -AutoTracker.Info.Mask3=Suggerimento: non è necessario che il modello sia grande né che includa completamente l'oggetto. In genere funziona bene un particolare univoco con bordi ben contrastati. -AutoTracker.Wizard.Checkbox.XAxis=Solo asse X -AutoTracker.Info.SearchOnAxis1=L'asse x all'interno del rettangolo mostrato, verrà scansionato per trovare la migliore corrispondenza. Spostare o ridimensionare l'area di ricerca trascinando rispettivamente il suo centro o il suo appiglio. -AutoTracker.Info.PossibleOnAxis=Nell'area di ricerca mostrata è stato trovato un possibile riscontro lungo l'asse x. Le possibilità sono: -AutoTracker.Info.NoMatchOnAxis=Nell'area di ricerca mostrata non è stato trovato alcun riscontro lungo l'asse x. Le possibilità sono: -AutoTracker.Info.RetryOnAxis=--spostare l'area di ricerca o l'asse x e cercare ancora -AutoTracker.Wizard.Button.Delete=Cancellare questo punto -AutoTracker.Wizard.Button.DeleteMore=Cancellare questo e tutti i punti successivi -Button.Define.Tooltip=Definire funzioni di variabili colonna esistenti -Calibration.Label.Point=punto -CalibrationStick.Hint=impostare la lunghezza o trascinare fino alla fine per cambiare scala, impostare l'angolo per cambiare pendenza dell'asse -CalibrationStick.End.Hint=trascinare per cambiare la scala -CalibrationStick.New.Name=asta di calibrazione -CalibrationTapeMeasure.New.Name=nastro di calibrazione -CalibrationTapeMeasure.Readout.Magnitude.Hint=fare clic per inserire una lunghezza nota in unità fisiche -CalibrationTapeMeasure.Hint=impostare la lunghezza per cambiare scala, impostare l'angolo per cambiare pendenza all'asse -DynamicSystem.Data.Description.0=distanza relativa tra particelle -DynamicSystem.Data.Description.1=angolo relativo -DynamicSystem.Data.Description.2=velocità radiale relativa -DynamicSystem.Data.Description.3=velocità angolare relativa -ExportDataDialog.Subtitle.Table=Tabella dati -ExportDataDialog.Subtitle.Content=Celle -ExportDataDialog.Subtitle.Format=Formato numero -ExportDataDialog.Subtitle.Delimiter=Delimitatore -ExportDataDialog.Title=Esporta dati -ExportDataDialog.Delimiter.Add=Aggiungi... -ExportDataDialog.Delimiter.Remove=Rimuovi... -ExportDataDialog.Content.AllCells=Tutte le celle -ExportDataDialog.Content.SelectedCells=Le celle selezionate -ExportDataDialog.MenuItem.RemoveDelimiter=Rimuovi delimitatore personalizzato -ExportDataDialog.Chooser.SaveData.Title=Salva i dati come -ExportVideoDialog.Button.SaveAs=Salva come... -ExportVideoDialog.Button.FullSize=Dimensione piena -ExportVideoDialog.Button.DrawnSize=Come disegnato -ExportVideoDialog.Content.VideoOnly=Solo video -ExportVideoDialog.Content.VideoAndGraphics=Video e grafica -ExportVideoDialog.Content.GraphicsOnly=Solo grafica -ExportVideoDialog.Title=Esporta spezzone video -ExportVideoDialog.Label.ClipSettings=Impostazioni spezzone video -ExportVideoDialog.Subtitle.Size=Dimensione -ExportVideoDialog.Subtitle.Content=Contenuto -ExportVideoDialog.Subtitle.View=Mostra -ExportVideoDialog.Subtitle.Format=Formato -ExportVideoDialog.Complete.Message1=Il video è stato salvato come -ExportVideoDialog.Complete.Message2=Aprirlo subito in Tracker? -ExportVideoDialog.Complete.Title=Esportazione completata -ExportVideoDialog.VideoSize=dim. video -ExportVideoDialog.MatSize=dim. mat -ExportVideo.Dialog.HiddenPlots.Message=I disegni devono essere completamente visibili per l'esportazione. -ExportVideo.Dialog.HiddenPlots.Title=Vista incompleta -Footprint.DoubleTarget=doppio crocino -Footprint.BoldDoubleTarget=doppio crocino grassetto -OffsetOrigin.MenuItem.Fixed=Coordinate fisiche fisse -ParticleModel.Dialog.Offscreen.Message1=Alcuni passi del modello sono vuoti perché sono troppo lontani dallo schermo. -ParticleModel.Dialog.Offscreen.Message2=Per sistemare, cambiare il modello o riscalare il video. -ParticleModel.Dialog.Offscreen.Title=Fuori dai limiti -PrefsDialog.Tab.Configuration.Title=Configurazione -PrefsDialog.Memory.BorderTitle=Dimensione memorie -PrefsDialog.Tab.General.Title=Altro -PrefsDialog.RecentFiles.BorderTitle=Menu aperti recentemente -PrefsDialog.Label.RecentSize=Conteggio file -PrefsDialog.Hints.BorderTitle=Suggerimenti -PrefsDialog.Button.Relaunch=Riavvia ora -PrefsDialog.Button.ClearRecent=Cancella -PrefsDialog.Checkbox.DefaultSize=Usa i predefiniti -PrefsDialog.Checkbox.HintsOn=Mostra i suggerimenti come predefinito -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Motore video -PrefsDialog.Button.Xuggle=Xuggle (raccomandato) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=La gestione della memoria non è disponibile usando Web Start. -PrefsDialog.Dialog.WebStart.Title=Modalità Web Start -PrefsDialog.LookFeel.BorderTitle=Aspetto -PrefsDialog.Language.BorderTitle=Lingua -PrefsDialog.Upgrades.BorderTitle=Controlla gli aggiornamenti -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=Schermo -PrefsDialog.Language.Default=predefinita -PrefsDialog.Upgrades.Always=Ogni volta -PrefsDialog.Upgrades.Weekly=Settimanalmente -PrefsDialog.Upgrades.Monthly=Mensilmente -PrefsDialog.Upgrades.Never=Mai -PrefsDialog.Button.CheckForUpgrade=Controlla ora -PrefsDialog.Xuggle.Speed.BorderTitle=Esecuzione video -PrefsDialog.Xuggle.Slow=Preciso (potrebbe essere lento) -PrefsDialog.Xuggle.Fast=Veloce (potrebbe andare a scatti) -PrefsDialog.CalibrationTool.BorderTitle=Strumento di calibrazione predefinito -Protractor.Name=Goniometro -Protractor.New.Name=goniometro -Protractor.Hint=allargare i braccetti per misurare gli angoli -Protractor.Label.Angle=angolo -Protractor.Field.Angle.Tooltip=angolo tra i braccetti del goniometro -Protractor.Vertex.Name=vertice -Protractor.Vertex.Hint=trascinare per spostare il vertice -Protractor.End.Name=cima del braccetto -Protractor.End.Hint=trascina per ruotare il braccetto -Protractor.Handle.Name=appiglio -Protractor.Handle.Hint=trascinare per spostare il goniometro -Protractor.Rotator.Name=rotatore -Protractor.Rotator.Hint=trascinare per ruotare il goniometro -Protractor.Readout.Name=lettura -Protractor.Readout.Hint=angolo tra braccetti del goniometro -ProtractorFootprint.Circle3=cerchio piccolo -ProtractorFootprint.Circle5=cerchio grande -ProtractorFootprint.Circle3Bold=cerchio piccolo grassetto -ProtractorFootprint.Circle5Bold=cerchio grande grassetto -Stick.Name=Asta di misura -Stick.New.Name=Asta di misura -TableTrackView.MenuItem.Unformatted=Precisione piena -TableTrackView.MenuItem.Formatted=Come formattato -TableTrackView.Menu.SetDelimiter=Imposta il delimitatore -TableTrackView.MenuItem.AddDelimiter=Aggiungi... -TableTrackView.MenuItem.RemoveDelimiter=Rimuovi... -TableTrackView.Dialog.CustomDelimiter.Message=Inserire una nuova stringa di delimitazione: -TableTrackView.Dialog.CustomDelimiter.Title=Aggiungi un delimitatore -TableTrackView.Header.Tooltip=Fare clic per ordinare o doppio clic per selezionare la colonna -TableTrackView.MenuItem.CopySelectedData=Copiare i dati selezionati -TableTrackView.Dialog.RemoveDelimiter.Message=Selezionare il delimitatore per rimuovere: -TableTrackView.Dialog.RemoveDelimiter.Title=Rimuovere il delimitatore -TableTrackView.Radians.Tooltip=in radianti -TableTrackView.Degrees.Tooltip=in gradi -TableTrackView.RadiansPerSecond.Tooltip=in radianti/s -TableTrackView.DegreesPerSecond.Tooltip=in gradi/s -TableTrackView.RadiansPerSecondSquared.Tooltip=in radianti/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=in gradi/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Cancella la funzione dati -TActions.Action.SaveFrame=Salva l'insieme dati come... -TActions.AboutVideo=Proprietà... -TActions.Dialog.AboutVideo.Title=Proprietà video -TActions.Dialog.AboutVideo.Type=Tipo -TActions.Dialog.AboutVideo.Size=Dimensioni -TActions.Dialog.AboutVideo.Length=Lunghezza -TActions.Dialog.AboutVideo.Frames=quadri -TActions.Dialog.AboutVideo.Seconds=secondi -TActions.Dialog.AboutVideo.FrameRate=Velocità quadri -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Percorso -TActions.Action.ImportTRK=File Tracker... -TActions.Action.ProtractorVisible=Visibile -TapeMeasure.MenuItem.FixedLength=Lunghezza fissa -TextTView.Label.NoTab=Mostra qui il testo e le pagine HTML. -TextTView.NewTab.Text1=Doppio clic per modificare il testo o il titolo. Tasto destro per altre opzioni. -TextTView.NewTab.Text2=Per mostrare una pagina HTML, inserire l'url o fare tasto destro con il mouse per aprire un file. -TextTView.NewTab.Title=Senzanome -TextTView.Dialog.TabTitle.Title=Imposta il titolo -TextTView.MenuItem.OpenHTML=Apri HTML... -TextTView.MenuItem.SetTitle=Imposta il titolo... -TextTView.Button.NewTab=Nuovo -TextTView.TextEdit.Description=Testo -TFrame.Dialog.FileNotFound.Message=Impossibile trovare il file: -TFrame.Dialog.FileNotFound.Title=File non trovato -TFrame.View.Text=Vista testo/HTML -TFrame.View.Main=Vista principale -TMenuBar.Menu.OpenRecent=Apri recenti -TMenuBar.Menu.Import=Importa -TMenuBar.Menu.Export=Esporta -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=File dati... -TMenuBar.Menu.CopyObject=Copia oggetto -TMenuBar.MenuItem.Coords=Sistema di coordinate -TMenuBar.MenuItem.VideoClip=Spezzone video -TMenuBar.Menu.MeasuringTools=Strumenti di misura -TMenuBar.Menu.AngleUnits=Unità angolari -TMenuBar.MenuItem.Degrees=Gradi -TMenuBar.MenuItem.Radians=Radianti -Tracker.Dialog.NoXuggle.Title=Xuggle non trovato -Tracker.Dialog.NoXuggle.Message1=Xuggle (motore vide multi piattaforma) non è installato. -Tracker.Dialog.NoXuggle.Message2=Scaricare Xuggle da http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Info su Xuggle... -Tracker.Dialog.AboutXuggle.Title=Info su Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Vesrione Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Home di Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Percorso di Xuggle: -Tracker.Dialog.NoVideoEngine.Message1=Nessun motore video trovato! Senza, Tracker può solo aprire immagini, -Tracker.Dialog.NoVideoEngine.Message2=sequenze di immagini, e gif animate. Per installare Xuggle, il motore -Tracker.Dialog.NoVideoEngine.Message3=video preferito di Tracker per tutte le piattaforme, scaricare -Tracker.Dialog.NoVideoEngine.Message4=l'ultima versione dell'installatore di Tracker da -Tracker.Dialog.NoVideoEngine.Title=Motore video mancante -Tracker.Dialog.NoXuggle.Message1=Xuggle, il motore video preferito di Tracker, non è installato. -Tracker.Dialog.NoXuggle.Message2=Per installare Xuggle, scaricare l'ultimo installatore di Tracker da -Tracker.Dialog.NoXuggle.Title=Xuggle mancante -Tracker.About.DefaultLocale=Locale predefinito -Tracker.About.CurrentLanguage=Lingua -Tracker.Dialog.InsufficientMemory.Title=Memoria insufficiente -Tracker.Dialog.InsufficientMemory.Message=La dimensione di memoria richiesta è troppo grande. -TrackerIO.Dialog.TabMustBeSaved.Message1=Scheda -TrackerIO.Dialog.TabMustBeSaved.Message2=deve essere salvata come un file tracker per essere inclusa nell'insieme delle schede. -TrackerIO.Dialog.TabMustBeSaved.Message3=Salvarla? -TrackerIO.Dialog.TabMustBeSaved.Title=Scheda non salvata -TrackerIO.Dialog.NoTabs.Message=Non ci sono schede da salvare! -TrackerIO.Dialog.NoTabs.Title=Insieme di schede vuoto -TrackerIO.Dialog.SaveTabset.Title=Salva l'insieme di schede -TrackerIO.Dialog.SaveTab.Title=Salva scheda -TrackerIO.Delimiter.Tab=Tabulatore -TrackerIO.Delimiter.Space=Spazio -TrackerIO.Delimiter.Comma=Virgola -TrackerIO.Delimiter.Semicolon=Puntoevirgola -TrackerIO.VideoAndDataFileFilter.Description=File video e Tracker -TrackerPanel.Dialog.Version.Message1=Si sta aprendo un file crato con Tracker -TrackerPanel.Dialog.Version.Message2=che potrebbe fare riferimento a comandi -TrackerPanel.Dialog.Version.Message3=mancanti nella attuale versione in uso -TrackerPanel.Dialog.Version.Message4=L'ultima versione di Tracker è disponibile su -TrackerPanel.Dialog.Version.Title=Versione non corretta -TrackerPanel.Label.ModelStart=Inizio -TrackerPanel.Label.ModelEnd=Fine -TrackerPanel.Spinner.ModelStart.Tooltip=Impostare il quadro iniziale di questo modello -TrackerPanel.Spinner.ModelEnd.Tooltip=Impostare il quadro finale di questo modello -TToolbar.Button.ProtractorVisible.Tooltip=Mostra o nascondi il goniometro -TToolbar.Button.AxesVisible.Tooltip=Mostra o nascondi gli assi delle coordinate -TToolBar.Button.TrackControl.Tooltip=Mostra o nascondi il controllo traccia -TTrack.Dialog.StepSizeWarning.Message1=Attenzione: alcune tracce sono stare marcate con una dimensione di passo maggiore di uno, lasciando i quadri saltati non marcati. -TTrack.Dialog.StepSizeWarning.Message2=Cambiando la dimensione del passo perciò porterà probabilmente ad avere delle lacune nell'insieme dei dati. -TTrack.Dialog.StepSizeWarning.Message3=Le velocità e accelerazioni attorno alle lacune non possono essere determinate se non sono stati marcati tutti i passi. -TTrack.Dialog.StepSizeWarning.Title=Attenzione -TTrack.Dialog.SkippedStepWarning.Message1=Attenzione: saltare passi durante la marcatura delle posizioni lascia delle lacune nell'insieme dei dati. -TTrack.Dialog.SkippedStepWarning.Title=Attenzione -TTrack.Dialog.SkippedStepWarning.Checkbox=Non mostrarlo più -TTrack.Locked.Hint=bloccato -TTrack.AngleField.Radians.Tooltip=angolo in radianti -TTrack.AngleField.Degrees.Tooltip=angolo in gradi -TTrack.AngleField.Popup.Radians=Passa ai radianti -TTrack.AngleField.Popup.Degrees=Passa ai gradi -TTrackBar.Memory.Menu.SetSize=Imposta la dimensione della memoria... -TTrackBar.Button.Version=Disponibile: versione -TTrackBar.Popup.MenuItem.Upgrade=Aggiorna ora... -TTrackBar.Popup.MenuItem.Ignore=Ignora -XuggleVideo.MenuItem.SmoothPlay=Esecuzione precisa (più essere lenta) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Nastro di calibrazione -CircleFootprint.Circle=cerchi -CircleFootprint.FilledCircle=cerchio pieno -CircleFootprint.Dialog.Title=Impronta del cerchio -CircleFootprint.Dialog.Label.Radius=Raggio -CircleFootprint.Dialog.Checkbox.Bold=Grassetto -CircleFootprint.Dialog.Checkbox.CenterSpot=Macchia centrale -LineProfile.Hint.Marking=trascinare il mouse per marcare il profilo della linea -PageTView.Button.Page=Pagina -PageTView.MenuItem.ClosePage=Chiudi pagina -PointMass.Hint.Marking=fare clic con il mouse per marcare un nuovo punto, premere Invio per clonare il passo precedente -PrefsDialog.Dialog.NewVersion.Title=Aggiornamenti -PrefsDialog.Dialog.NewVersion.Message1=Versione -PrefsDialog.Dialog.NewVersion.Message2=è disponibile su -PrefsDialog.Dialog.NewVersion.None.Message=Al momento non è disponibile nessuna nuova versione. -RGBRegion.Hint.Marking=fare clic con il mouse per marcare il centro della regione -TMenuBar.MenuItem.Restore=Ripristina le viste -TrackControl.StretchVectors.None=Non stirare -TViewChooser.Maximize.Tooltip=Massimizza questa vista -TViewChooser.Restore.Tooltip=Ripristina le viste -Vector.Hint.Marking=trascinare il mouse per marcare un nuovo vettore, premere Invio per clonare il passo precedente -WorldTView.Button.World=Fisiche - -# Additions by Doug Brown 2011-04-04 -LibraryBrowser.Title=Navigatore della libreria digitale di Tracker -LibraryBrowser.Label.Select=Selezionare una libreria o inserire un percorso: -PrefsDialog.NoVideoWarning.BorderTitle=Avvertimenti -PrefsDialog.Checkbox.WarnIfNoEngine=Nessun motore video -PrefsDialog.Checkbox.WarnIfXuggleError=Errore Xuggle -PropertiesDialog.Title=Proprietà -PropertiesDialog.Label.Author=Autore -PropertiesDialog.Label.Contact=Contatto -TActions.Action.Properties=Proprietà... -TActions.Action.OpenCatalog=Apri libreria... -TFrame.Progress.Xuggle=Apertura quadro Xuggle -TFrame.Progress.ClickToCancel=(clic per annullare) -Tracker.Catalog.Default=La mia libreria locale -Tracker.Dialog.NoVideoEngine.Checkbox=Non mostrarlo più -TrackerIO.ZipFileFilter.Description=File ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle ha riportato il seguente errore durante l'apertura di questo video: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Non tutti gli errori sono gravi. Per consultare la segnalazione completa degli errori, selezionare Aiuto|Registro messaggi. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Se Xuggle fallisce, si potrebbe poter aprire il video con QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Nota: su Mac OSX ciò richiede l'esecuzione di Tracker in una Java VM a 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Errore Xuggle -TToolBar.Button.OpenCatalog.Tooltip=Apre un catalogo di librerie digitali - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=File non trovato -TFrame.Dialog.NoTRKInComPADRE.Message=Nessun file Tracker è stato trovato per il nodo - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Particella cinematica -DynamicParticle.Builder.Title=Particella dinamica (Cartesiano) -DynamicParticlePolar.Builder.Title=Particella dinamica (Polare) -DynamicSystem.Builder.Title=Sistema dinamico (interno) -PropertiesDialog.Button.CopyFilePath=Copia il percorso file -PropertiesDialog.Button.CopyVideoPath=Copia il percorso video -PropertiesDialog.Tab.TrackerFile=File Tracker -PropertiesDialog.Tab.Metadata=Metadati -PropertiesDialog.Header.Property=Proprietà -PropertiesDialog.Header.Value=Valore -TActions.Action.OpenURL=Apri URL... -TActions.Dialog.OpenURL.Title=Apri URL -TActions.Dialog.OpenURL.Message=Inserire l'URL di un video web, file Tracker o file zip Tracker -TActions.Dialog.AboutVideo.Name=Nome - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=File web nella cache -PrefsDialog.Button.ClearCache=Pulisci - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, maius-clic per ri-marcare una posizione evidenziata -PointMass.Remarking.Hint=mouse clic per ri-marcare una posizione -PointMass.PositionSelected.Hint=trascinare o inserire una posizione sulla barra strumenti -PointMass.VectorSelected.Hint=trascinare per spostare -Vector.Remark.Hint=maius-clic per ri-marcare un suggerimento evidenziato -Vector.TipSelected.Hint=trascinare o inserire componenti nella barra strumenti -Vector.HandleSelected.Hint=trascinare per spostare -Vector.Remarking.Hint=mouse clic per ri-marcare un suggerimento -AutoTracker.Label.Search=Ricerca -AutoTracker.Label.Target=Bersaglio -AutoTracker.Label.Frame=Frame -AutoTracker.Label.Point=Punto -AutoTracker.Label.Template=Modello -AutoTracker.Label.Track=Traccia -AutoTracker.Label.Match=Corrispondenza -AutoTracker.Label.NoTemplate=Nessun modello -AutoTracker.Label.EvolutionRate=Frequenza di evoluzione -AutoTracker.Label.Automark=Automarcamento -AutoTracker.Info.Instructions=Fare clic su un pulsante di ricerca per trovare una corrispondenza nell'area di ricerca mostrata. -AutoTracker.Info.KeyFrame.Instructions1=Questo quadro chiave definisce modello e bersaglio mostrati. Fare clic su un pulsante di ricerca per trovare corrispondenze al modello. -AutoTracker.Info.KeyFrame.Instructions2=Si può trascinare bersaglio, modello o area di ricerca per spostarli o ridimensionarli. -AutoTracker.Info.MouseOver.Instructions=Spostare il mouse sopra i controlli per avere informazioni su impostazioni e regolazioni. -AutoTracker.Info.Mask1=Il modello è l'immagine da riscontrare. Comincia con un quadro chiave e si evolve per adattarsi ai cambiamenti di forma e colore. -AutoTracker.Info.Mask2=Il livello di automarcatura è il punteggio minimo di riscontro richiesto per la marcatura automatica. -AutoTracker.Info.Mask.Instructions=Sposta o ridimensiona il modello trascinandone i limiti o gli appigli angolari (solo quadri chiave). Regola la frequenza di evoluzione e i livelli di automarcatura usando i rotatori. -AutoTracker.Info.Mask.Tip=Bassi livelli di automarcatura possono provocare falsi positivi. Nel caso provare invece ad aumentare la frequenza di evoluzione. -AutoTracker.Info.Search=L'area di ricerca viene scansionata per il miglior riscontro. -AutoTracker.Info.SearchOnAxis=L'asse x nell'area di ricerca viene scansionato per il miglior riscontro. -AutoTracker.Info.Search.Instructions=Sposta o ridimensiona l'area di ricerca trascinandone i limiti o gli appigli angolari. Imposta l'asse x e le opzioni di previsione selezionandone le caselle corrispondenti. -AutoTracker.Info.Search.Tip=Spesso non è necessario che l'area di ricerca sia larga. L'opzione di previsione sposta automaticamente l'area di ricerca alle posizioni di riscontro predette. -AutoTracker.Info.Target=Il bersaglio è dove il punto di tracciamento mirato viene marcato. -AutoTracker.Info.Target.Instructions=Sposta il bersaglio trascinandolo (solo quadri chiave). Scegliere la traccia e punto bersagli dagli elenchi a discesa. -AutoTracker.Info.Title.Settings=Impostazioni -AutoTracker.Info.Title.Tip=Suggerimento -AutoTracker.Info.SelectTrack=Selezionare o creare la traccia e il punto che si desidera autotracciare. -AutoTracker.Info.OutsideXAxis=L'asse x non passa attraverso l'area di ricerca. Le scelte disponibili sono: -AutoTracker.Info.NewKeyFrame=--fare un passo indietro e cambiare la frequenza di evoluzione or maiusct-control-clic per definire un nuovo quadro chiave -AutoTracker.Info.Replace=--accettare il riscontro e rimpiazzare il punto esistente -AutoTracker.Info.Keep=--mantenere il punto esistente -AutoTracker.Info.PossibleReplace=È stato trovato un riscontro possibile per rimpiazzare il punto esistente. Le scelte possibili sono: -AutoTracker.Wizard.Button.Accept=Accetta -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=Salta -AutoTracker.Wizard.Button.Replace=Rimpiazza -AutoTracker.Wizard.Button.Keep=Mantieni -AutoTracker.Wizard.Button.Search=Cerca -AutoTracker.Wizard.Button.SearchThis=Cerca questo -AutoTracker.Wizard.Button.SearchNext=Cerca il prossimo -AutoTracker.Wizard.Button.Delete=Elimina -AutoTracker.Wizard.Button.ShowKeyFrame=Mostra il quadro chiave -AutoTracker.Wizard.Button.DeleteKeyFrame=Elimina il quadro chiave -AutoTracker.Wizard.Checkbox.LookAhead=Previsione -AutoTracker.Wizard.Checkbox.XAxis=Solo asse x -AutoTracker.Wizard.Menuitem.DeleteThis=Questo punto -AutoTracker.Wizard.Menuitem.DeleteLater=Punti successivi -AutoTracker.Wizard.Menuitem.DeleteAll=Tutti i punti -TToolBar.Button.AutoTracker.Tooltip=Mostra o nascondi l'autotracciatore -MainTView.Popup.MenuItem.ZoomIn=Zoom avanti -MainTView.Popup.MenuItem.ZoomOut=Zoom indietro -MainTView.Popup.MenuItem.ZoomToFit=Zoom intero -TrackerIO.Dialog.DurationVaries.Title=Durata quadro variabile -TrackerIO.Dialog.DurationVaries.Message1=Questo video include quadri con durate che differiscono dalla media più di -TrackerIO.Dialog.DurationVaries.Message2=Per ottenere velocità e accelerazioni accurate, è necessario escludere questi quadri dai -TrackerIO.Dialog.DurationVaries.Message3=calcoli impostando il quadro di inizio e quello di fine della clip video. -TrackerIO.Dialog.DurationVaries.Message4=Quadri da escludere: -TrackerIO.Dialog.DurationVaries.Message5=Durata media e velocità di quadro se esclusi: -TFrame.Dialog.LibraryError.Title=Errore -TFrame.Dialog.LibraryError.Message=Nessuna risorsa può essere caricata dal nodo - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=maiusc-clic per marcare -PrefsDialog.Label.Path=Percorso -PrefsDialog.Checkbox.ClearCacheOnExit=Cancella all'uscita -PrefsDialog.FileChooser.Title.Cache=Imposta cache -PrefsDialog.FileFilter.Directories=Directory -Tracker.Action.AboutThreads=Info sui threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Imposta Java VM -PrefsDialog.FileFilter.JRE=Directory e Java VMs -PrefsDialog.Version.BorderTitle=Versione di Tracker -PrefsDialog.Version.Default=predefinito -PrefsDialog.Tab.ClearCacheOnExit=Cancella all'uscita -PrefsDialog.Run.BorderTitle=Programmi da eseguire all'avvio -PrefsDialog.FileChooser.Title.Run=Selezione il file eseguibile -PrefsDialog.Button.Save=Salva -Tracker.Readme=LEGGIMI di Tracker -Tracker.Readme.NotFound=File LEGGIMI non trovato -Popup.MenuItem.Algorithm=Algoritmi... -AlgorithmDialog.Button.FiniteDifference=Differenze finite -AlgorithmDialog.Button.BounceDetect=Rilevamento rimbalzo -AlgorithmDialog.TitledBorder.Choose=Seleziona l'algoritmo usato per calcolare velocità e accelerazione: -AlgorithmDialog.Title=Algoritmi -AlgorithmDialog.FiniteDifference.Message1=Questo è l'algoritmo predefinito. -AlgorithmDialog.FiniteDifference.Message2=Velocità: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Accelerazione: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Questo algoritmo spiana velocità e accelerazioni ma rileva anche cambi improvvisi di velocità. -AlgorithmDialog.BounceDetect.Message2=Attenzione: può introdurre degli artefatti. Per ulteriori informazioni, consultare: -TMenuBar.Menu.Diagnostics=Diagnostici - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=XML non valido -Tracker.Dialog.Invalid.Message=Il file non può essere letto. -TrackPlottingPanel.Popup.Menu.CompareWith=Compara con -TrackerPanel.DataBuilder.TrackType.Unknown=sconosciuto -TrackerPanel.DataBuilder.Button.Load.Tooltip=Carica i dati delle funzioni da un file XML -TrackerPanel.DataBuilder.Button.Save.Tooltip=Salva i dati delle funzioni in un file XML -TrackerPanel.DataBuilder.Load.Title=Carica le funzioni dati -TrackerPanel.DataBuilder.Load.Message=Seleziona le funzioni da caricare: -TrackerPanel.DataBuilder.Save.Title=Salva le funzioni dati -TrackerPanel.DataBuilder.Save.Message=Seleziona le funzioni da salvare: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Carica dentro tutto -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Carica solo dentro -TrackerPanel.DataBuilder.Dialog.Load.Title=Traccia selezione -TrackerPanel.DataBuilder.Dialog.Load.Message=Caricare le funzioni in tutte le tracce di tipo -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Tipo di traccia non corretto -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Il file definisce le funzioni dati per il tipo traccia -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Non possono essere caricate nel tipo -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Tipo errato -TrackerPanel.DataBuilder.Dialog.WrongType.Message=Il file non definisce funzioni dati. -TToolbar.Button.Refresh=Aggiorna i dati e le viste - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=La risorsa ZIP è stata salvata come -ExportTRKDialog.Complete.Message2=Aprirla in Tracker? -ExportTRKDialog.Complete.Title=Esportazione completata -ExportTRKDialog.Title=Esporta risorse ZIP -ExportTRKDialog.Message1=Ciò (1) esporta la clip video, (2) converte i dati tabellari per farli corrispondere al video esportato, e (3) salva la tabella convertita come un nuovo file Tracker. -ExportTRKDialog.Message2=I file Tracker e video vengono salvati nella stessa directory con lo stesso nome ma con estensioni diverse. -TMenuBar.MenuItem.TabClip=Risorsa ZIP -TMenuBar.Menu.CalibrationTools=Strumenti di calibrazione -TrackerIO.Dialog.DurationVaries.Button.SetClip=Imposta la clip suggerita -TrackerIO.Dialog.DurationVaries.Start=inizio -TrackerIO.Dialog.DurationVaries.End=fine -TrackerIO.Dialog.DurationVaries.Recommended=Clip suggerita - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Unisci i capi -AttachmentInspector.Label.End=Capo -AttachmentInspector.Label.Vertex=Vertice -AttachmentInspector.Header.PointName=Nome -AttachmentInspector.Header.AttachedTo=Unisci a -ExportTRKDialog.Label.VideoFormat=Formato video -MeasuringTool.MenuItem.Attach=Unisci i capi... -PerspectiveTrack.Corner=angolo -PrefsDialog.LogLevel.BorderTitle=Livello di log del messaggio di avvio -Protractor.Data.Description.0=tempo -Protractor.Data.Description.1=angolo goniometro -Protractor.Data.Description.2=lunghezza braccio 1 -Protractor.Data.Description.3=lunghezza braccio 2 -Protractor.Data.Description.4=numero passo -Protractor.Data.Description.5=numero quadro -TapeMeasure.Data.Description.0=tempo -TapeMeasure.Data.Description.1=lunghezza -TapeMeasure.Data.Description.2=angolo misurato dall'asse x -TapeMeasure.Data.Description.3=numero passo -TapeMeasure.Data.Description.4=numero quadro - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=non ricercato -AutoTracker.Info.KeyFrame=Quadro chiave -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Questo quadro chiave -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Questa corrispondenza -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Corrispondenze successive -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracciatore -Dialog.Button.Add=Aggiungi -Dialog.Button.Remove=Rimuovi -PrefsDialog.Button.ClearHost=Elimina host -PrefsDialog.Button.ClearHost.Tooltip=elimina tutti i file associati con il selezionato host web dalla cache OSP -PrefsDialog.Button.ClearCache.Tooltip=elimina tutti i file dalla cache OSP -TActions.Action.SaveZip=Esporta risorsa ZIP -ThumbnailDialog.Title=Esporta immagine miniatura -ThumbnailDialog.Settings.Title=Opzioni miniatura -ThumbnailDialog.Label.CurrentImage=Immagine corrente -ThumbnailDialog.Label.FrameNumber=quadro -ThumbnailDialog.Label.StepNumber=passo -ThumbnailDialog.View.VideoOnly=Solo video -ThumbnailDialog.View.MainView=Vista principale -ThumbnailDialog.View.WholeFrame=Quadro intero -ThumbnailDialog.Format.PNG=Immagine PNG -ThumbnailDialog.Format.JPG=Immagine JPEG -ThumbnailDialog.Chooser.SaveThumbnail.Title=Salva miniatura -ThumbnailDialog.Subtitle.Image=Immagine -TMenuBar.MenuItem.Thumbnail=Immagine miniatura -TToolBar.Button.SaveZip.Tooltip=Esporta una risorsa ZIP per il navigatore libreria digitale OSP -TTrack.MenuItem.DeletePoint=Elimina passo selezionato -ZipResourceDialog.Title=Esporta risorsa ZIP -ZipResourceDialog.Label.Format=Formatta -ZipResourceDialog.Label.Title=Nome -ZipResourceDialog.Label.Description=Descrizione -ZipResourceDialog.Label.Keywords=Parole chiave -ZipResourceDialog.Label.Link=Collegamento esterno -ZipResourceDialog.Label.HTML=Sorgente HTML -ZipResourceDialog.Complete.Message1=La risorsa ZIP è stata salvata come -ZipResourceDialog.Complete.Message2=Aprirla ora in Tracker? -ZipResourceDialog.Complete.Title=Successo -ZipResourceDialog.Border.Title.Documentation=Documentazione HTML -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Miniatura -ZipResourceDialog.FileChooser.SaveZip.Title=Esporta risorsa ZIP -ZipResourceDialog.FileChooser.AddFile.Title=Aggiungi file alla risorsa ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title=Apri file HTML -ZipResourceDialog.Button.AddFiles=Aggiungi file -ZipResourceDialog.Button.ThumbnailSettings=Opzioni miniature -ZipResourceDialog.Checkbox.TrimVideo=Ritaglia alla clip -ZipResourceDialog.AddHTMLInfo.Title=Aggiungi un file di informazioni in HTML -ZipResourceDialog.AddHTMLInfo.Message1=Aggiungere il file di informazioni HTML -ZipResourceDialog.AddHTMLInfo.Message2=al file delle risorse ZIP? -ZipResourceDialog.HTMLField.DefaultText=Se non è stato specificato nulla, il file verrà creato da zero -ZipResourceDialog.Dialog.AddFiles.Title=Aggiungi file HTML e PDF -ZipResourceDialog.Tooltip.HTML=Percorso al file sorgente HTML (se assente, il file verrà creato da zero) -ZipResourceDialog.Tooltip.Author=Autori di questa risorsa -ZipResourceDialog.Tooltip.Title=Mostra il nome di questa risorsa (non il nome del file) -ZipResourceDialog.Tooltip.Description=Un'utile descrizione di questa risorsa -ZipResourceDialog.Tooltip.Keywords=Un elenco di parole chiave da cercare nel navigatore DL -ZipResourceDialog.Tooltip.Contact=Informazioni di contatto autore (Istituto, e-mail, sito web, ecc.) -ZipResourceDialog.Tooltip.Link=URL di un file esterno HTML con ulteriori informazioni su questa risorsa -ZipResourceDialog.Tooltip.ThumbnailSettings=Cambia la vista miniatura, dimensione o tipo di file -ZipResourceDialog.Tooltip.AddFiles=Aggiungi file HTML e PDF alla risorsa ZIP -ZipResourceDialog.Tooltip.TrimVideo=Seleziona per l'esportazione della clip video, deseleziona per usare il video originale -ZipResourceDialog.Tooltip.LoadHTML=Usa un navigatore file per caricare un file di informazioni HTML +# This is the italian tracker.properties file +# Translated by Marco Ciampa 2007-2012 +# this file should be ISO-8859-1 encoded +# accented chars test: àèéìòùÀÈÉÌÒÙ +# +# Little list of terms usage: +# +# calibration stick/tape: asta/nastro di calibrazione +# world units: unità fisiche (contrapposte ai pixel...) +# automark: automarcatura +# handle: appiglio +# frame: quadro +# spinner: rotatore +# target: bersaglio +# +Calibration.Name=Paio di punti di calibrazione +Calibration.New.Name=calibrazione +CenterOfMass.Name=Centro di massa +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Selezione masse... +CenterOfMassInspector.Title=Centro di massa +CenterOfMassInspector.Border.Title=Selezione masse +ConfigInspector.Border.Title=Seleziona le voci desiderate +ConfigInspector.Title=Preferenze +ConfigInspector.Button.SaveAsDefault=Salva come predefinito +CoordAxes.Name=Assi +CoordAxes.New.Name=Assi +Dialog.Button.Cancel=Annulla +Dialog.Button.OK=OK +Dialog.Button.Close=Chiudi +Dialog.Button.All=Tutti +Dialog.Button.None=Nessuno +Dialog.Button.Copy=Copia +Dialog.Button.Update=Aggiorna +Dialog.Button.SelectAll=Seleziona tutto +Footprint.Diamond=diamante +Footprint.BoldDiamond=diamante grassetto +Footprint.SolidDiamond=diamante solido +Footprint.Triangle=triangolo +Footprint.BoldTriangle=triangolo grassetto +Footprint.SolidTriangle=triangolo solido +Footprint.Circle=cerchio +Footprint.BoldCircle=cerchio grassetto +Footprint.SolidCircle=cerchio solido +Footprint.VerticalLine=linea verticale +Footprint.BoldVerticalLine=linea verticale grassetto +Footprint.HorizontalLine=linea orizzontale +Footprint.BoldHorizontalLine=linea orizzontale grassetto +Footprint.Crosshair=crocino +Footprint.BoldCrosshair=crocino grassetto +Footprint.SimpleAxes=assi semplici +Footprint.BoldSimpleAxes=assi semplici grassetto +Footprint.Spot=punto +Footprint.Line=linea +Footprint.BoldLine=linea grassetto +Footprint.Outline=contorno +Footprint.BoldOutline=contorno grassetto +Footprint.Arrow=freccia +Footprint.BoldArrow=freccia grassetto +Footprint.DoubleArrow=doppia freccia +Footprint.BoldDoubleArrow=doppia freccia grassetto +Footprint.2xArrow=freccia 2x +Footprint.Bold2xArrow=freccia 2x grassetto +Footprint.4xArrow=freccia 4x +Footprint.Bold4xArrow=freccia 4x grassetto +Footprint.DashArrow=freccia tratteggiata +Footprint.BoldDashArrow=freccia tratteggiata grassetto +Footprint.BigArrow=freccia grande +Footprint.BigDashArrow=freccia grande tratteggiata +LineProfile.Name=Profilo linea +LineProfile.New.Name=profilo +LineProfile.Data.Brightness=luminosità +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=rosso +LineProfile.Data.Green=verde +LineProfile.Data.Blue=blu +LineProfile.Data.Weighting=conteggio +MainTView.Popup.MenuItem.QTPlayer=Player QuickTime +MainTView.Popup.MenuItem.Zoom=Zoom +MainTView.Popup.MenuItem.ToFit=Alla finestra +OffsetOrigin.Name=Origine spostamento +OffsetOrigin.New.Name=spostamento +PlotTrackView.Button.PlotCount=Punti +PlotTrackView.Button.PlotCount.ToolTip=Selezione numero di punti +PointMass.Name=Punto di massa +PointMass.New.Name=massa +PointMass.MenuItem.VectorsToPosition=Alla posizione +PointMass.MenuItem.Velocity=Velocità +PointMass.MenuItem.Acceleration=Accelerazione +Star.Name=Stella +Star.New.Name=stella +TableTrackView.Action.CopyData=Copia dati +TableTrackView.Button.SelectTableData=Dati +TableTrackView.Button.SelectTableData.ToolTip=Scegli dati +TableTrackView.Popup.MenuItem.Analyze=Analizza +TableTrackView.Dialog.Border.Title=Mostra: +TActions.Action.Description=Descrizione +TActions.Action.ClearTracks=Cancella +TActions.Action.NewTab=Nuova scheda +TActions.Action.Copy=Copia +TActions.Action.Paste=Incolla +TActions.Action.Open=Apri... +TActions.Action.Close=Chiudi +TActions.Action.Import=Importa... +TActions.Action.Save=Salva +TActions.Action.SaveAs=Salva come... +TActions.Action.Export=Esporta... +TActions.Action.CaptureVideo=Cattura video... +TActions.Action.Delete=Elimina +TActions.Action.Config=Preferenze... +TActions.Action.AxesVisible=Visibile +TActions.Action.TapeVisible=Visibile +TActions.Action.Print=Stampa... +TActions.Action.ClearFilters=Cancella +TActions.Action.ImportVideo=Importa... +TActions.Action.CloseVideo=Chiudi +TActions.Action.CloseAll=Chiudi tutto +TActions.Action.Exit=Esci +TActions.Dialog.PrintError.Message=Si è verificato un errore di stampa. +TActions.Dialog.PrintError.Title=Errore di stampa +TActions.Dialog.Description.Title=Descrizione: +TActions.Dialog.DeleteLockedTracks.Message=Alcune tracce sono bloccate. Eliminarle comunque? +TActions.Dialog.DeleteLockedTracks.Title=Eliminare le tracce bloccate? +TActions.Dialog.Description.Title=Descrizione: +TActions.Dialog.NewPointMass.Title=Nuovo punto di massa +TapeMeasure.Name=Metro a nastro +TapeMeasure.New.Name=Metro a nastro +TapeMeasure.MenuItem.Fixed=Fisso +TFrame.View.Plot=Vista grafico +TFrame.View.Table=Vista tabella +TFrame.View.World=Vista globale +TFrame.View.Video=Vista video +TFrame.Dialog.Help.Title=Manuale di Tracker +TMenuBar.Menu.File=File +TMenuBar.Menu.Edit=Modifica +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Tracce +TMenuBar.Menu.Coords=Coordinate +TMenuBar.Menu.Window=Finestra +TMenuBar.Menu.Help=Aiuto +TMenuBar.MenuItem.EditProperties=Proprietà... +TMenuBar.MenuItem.VideoVisible=Visibile +TMenuBar.MenuItem.VideoFilters=Filtri +TMenuBar.MenuItem.NewVideoFilter=Nuovo +TMenuBar.MenuItem.NewTrack=Nuovo +TMenuBar.MenuItem.CoordsLocked=Bloccato +TMenuBar.MenuItem.CoordsFixedOrigin=Origine fissa +TMenuBar.MenuItem.CoordsFixedAngle=Angolo fisso +TMenuBar.MenuItem.CoordsFixedScale=Scala fissa +TMenuBar.MenuItem.CoordsRefFrame=Quadro di riferimento +TMenuBar.MenuItem.CoordsDefault=Predefinito +TMenuBar.MenuItem.WindowRight=Vista destra +TMenuBar.MenuItem.WindowBottom=Vista dal basso +TMenuBar.MenuItem.PlayAllSteps=Esegui tutti i passi +TMenuBar.MenuItem.Record=Registra +TMenuBar.MenuItem.MatSize=Dimensione mat +TMenuBar.MenuItem.Language=Lingua +TMenuBar.MenuItem.DeleteTrack=Elimina +TMenuBar.MenuItem.TrackerHelp=Guida di Tracker... +TMenuBar.MenuItem.MessageLog=Log dei messaggi... +TrackControl.Name=Controllo traccia +TrackControl.Button.NewTrack=Nuovo +TrackControl.Button.NewTrack.ToolTip=Crea nuova traccia +TrackControl.Button.Trails.ToolTip=Guide +TrackControl.Button.Labels.ToolTip=Etichette +TrackControl.Button.StretchVectors.ToolTip=Stendi vettori +TrackControl.Button.Accelerations.ToolTip=Accelerazioni +TrackControl.Button.Xmass.ToolTip=Moltiplica per la massa +TrackControl.Button.Vectors.ToolTip=Vettori +TrackControl.Button.Velocities.ToolTip=Velocità +TrackControl.Button.Properties.ToolTip=Proprietà +TrackControl.Button.Positions.ToolTip=Posizioni +Tracker.Popup.MenuItem.Snapshot=Istantanea +Tracker.Popup.MenuItem.Help=Aiuto... +Tracker.Cursor.Crosshair.Description=Cursore a croce per marcare punti +Tracker.Action.AboutTracker=Informazioni su Tracker... +Tracker.Dialog.AboutTracker.Title=Informazioni su Tracker +Tracker.Action.AboutJava=Informazioni su Java... +Tracker.Dialog.AboutJava.Title=Informazioni su Java +Tracker.Dialog.AboutJava.UnknownVersion=sconosciuta +Tracker.Dialog.AboutJava.Message=Versione Java +Tracker.Action.AboutQT=Informazioni su QuickTime... +Tracker.Dialog.AboutQT.Title=Informazioni su QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=Versione QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versione QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=Percorso QTJava: +Tracker.Dialog.NoQT.Title=QTJava.zip non trovato +Tracker.Dialog.NoQT.Message1=QuickTime per Java non sembra sia installato. +Tracker.Dialog.NoQT.Message2=Se si desidera analizzare video formato QuickTime, reinstallare QuickTime. +Tracker.Dialog.NoQT.Message3=NOTA: QuickTime per Java DEVE ESSERE SELEZIONATO mentre si installa QuickTime. +Tracker.Dialog.UpdateQT.Title=Aggiornamento QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Una nuova versione di QTJava.zip è stata rilevata su +Tracker.Dialog.UpdateQT.Message2=Vuoi aggiornare i file esistenti? +Tracker.Dialog.CopyQT.Title=Copia QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime è installato, ma prima che Tracker possa usarlo: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip deve essere copiato da +Tracker.Dialog.CopyQT.Message3= a +Tracker.Dialog.CopyQT.Message4= 2. Tracker deve essere riavviato. +Tracker.Dialog.CopyQT.Message5=Vuoi copiare ora QTJava.zip? +Tracker.Dialog.CopyFailed.Title=Copia fallita +Tracker.Dialog.CopyFailed.Message=QTJava.zip non può essere copiato. +Tracker.Dialog.CopiedTo.Title=Copia avvenuta con successo +Tracker.Dialog.CopiedTo.Message1=QTJava.zip è stato copiato con successo su +Tracker.Dialog.CopiedTo.Message2=Tracker deve essere riavviato e ora terminerà. +Tracker.Splash.Loading=Caricamento +TrackerIO.Dialog.Import.Title=Importa +TrackerIO.Dialog.Import.Message=Seleziona elementi da importare +TrackerIO.Dialog.ImportVideo.Title=Importa Video +TrackerIO.Dialog.Export.Title=Esporta +TrackerIO.Dialog.Export.Message=Seleziona elementi da esportare +TrackerIO.Dialog.ReplaceFile.Title=Rimpiazzare il file esistente? +TrackerIO.Dialog.ReplaceFile.Message=esiste già. Vuoi sostituirlo? +TrackerIO.Dialog.NotTrackerXML.Title=XML errato +TrackerIO.Dialog.NotTrackerXML.Message=contiene dati xml di una diversa applicazione. +TrackerIO.Dialog.BadVideo.Message=Il video non può essere aperto: +TrackerPanel.NewTab.Name=Senza titolo +TrackerPanel.DragToMark.Hint=Maiusc-trascina per marcare +TrackerPanel.ClickToMark.Hint=Maiusc-clic per marcare +TrackerPanel.Dialog.LoadFailed.Title=File non caricato +TrackerPanel.Dialog.LoadFailed.Message=Il file non può essere caricato: +TrackerPanel.Dialog.SaveChanges.Title=Salva i cambiamenti +TrackerPanel.Dialog.SaveChanges.Message=Salva i cambiamenti su +TrackPlottingPanel.Popup.MenuItem.Lines=Linee +TrackPlottingPanel.Popup.MenuItem.Points=Punti +TrackPlottingPanel.Popup.MenuItem.Scale=Scala... +TrackPlottingPanel.Popup.MenuItem.Print=Stampa... +TrackPlottingPanel.Popup.MenuItem.Measure=Scala per aggiustamento +TrackPlottingPanel.Popup.MenuItem.Analyze=Analizza +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscala +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom al riquadro +TrackPlottingPanelInspector.Title=Scala +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Imposta dimensione +TToolBar.Dropdown.SelectedTrack.Tooltip=Seleziona traccia +TToolBar.Dropdown.SelectedTrack.None=nessuna selezione +TTrack.MenuItem.Delete=Cancella +TTrack.MenuItem.Color=Colore... +TTrack.Dialog.Color.Title=Scegli colore traccia +TTrack.MenuItem.Name=Nome... +TTrack.MenuItem.Footprint=Dimensione +TTrack.MenuItem.Description=Descrizione... +TTrack.MenuItem.Visible=Visibile +TTrack.MenuItem.TrailVisible=Trail Visible +TTrack.MenuItem.Autostep=Autostep +TTrack.MenuItem.MarkByDefault=Marca predefinito +TTrack.MenuItem.Locked=Bloccato +TTrack.MenuItem.Delete=Cancella +TTrack.Name.None=senza nome +TTrack.Dialog.Description.Title=Descrizione: +TTrack.Dialog.Name.Title=Imposta il nome +TTrack.Dialog.Name.Label=Nome: +TViewChooser.Button.Choose.Tooltip=Scegli una vista +Vector.Name=Vettore +Vector.New.Name=vettore +Vector.MenuItem.ToOrigin=All'origine +Vector.MenuItem.Label=Etichetta visibile +VectorSum.Name=Somma di vettori +VectorSum.New.Name=somma +VectorSum.MenuItem.Inspector=Seleziona vettori... +VectorSumInspector.Title=Somma di vettori +VectorSumInspector.Border.Title=Seleziona vettori +WorldTView.Popup.MenuItem.Projectile=Modello di proiettile + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Modello analitico di particella +AnalyticParticle.Inspector.Title=Modello analitico di particella +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=Raggio 4 +CircleFootprint.Circle_6=Raggio 6 +CircleFootprint.Circle_8=Raggio 8 +DynamicParticle.Name=Modello dinamico di particella +DynamicParticle.Inspector.Title=Modello dinamico di particella +DynamicParticle.Property.ForceX=forza x +DynamicParticle.Property.ForceY=forza y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Fisso +ParticleModel.New.Name=modello +ParticleModel.MenuItem.InspectModel=Modello... +ParticleModel.Inspector.Button.Undo=Annulla +ParticleModel.Inspector.Button.Redo=Ripeti +ParticleModel.Inspector.Button.Close=Chiudi +ParticleModel.Inspector.Button.Help=Aiuto + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=Solo X +Calibration.Axes.YOnly=Solo Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Seleziona assi di calibrazione +Calibration.Label.Axes=Assi +Calibration.Dialog.InvalidCoordinates.Title=Coordinate non valide +Calibration.Dialog.InvalidCoordinates.Message=I punti non possono avere le stesse coordinate globali. +Calibration.Dialog.InvalidXCoordinates.Message=I punti non possono avere le stesse coordinate x globali. +Calibration.Dialog.InvalidYCoordinates.Message=I punti non possono avere le stesse coordinate y globali. +SpectralLineFilter.Title=Spettro di gas +SpectralLineFilter.H=Idrogeno +SpectralLineFilter.He=Elio +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Mercurio +TFrame.View.Unknown=Vista +TMenuBar.MenuItem.Undo=Annulla +TMenuBar.MenuItem.Redo=Ripeti +TMenuBar.MenuItem.Replace=Rimpiazza... +TMenuBar.Menu.AddImage=Importa immagine +TMenuBar.MenuItem.AddBefore=Prima di questo quadro... +TMenuBar.MenuItem.AddAfter=Dopo questo quadro... +TMenuBar.MenuItem.RemoveImage=Rimuovi questo quadro +TMenuBar.Menu.Tools=Strumenti +TMenuBar.MenuItem.DataFunctionTool=Colonne dati... +TMenuBar.MenuItem.DatasetTool=Analisi dati... +TMenuBar.Menu.CopyImage=Copia immagine +TMenuBar.MenuItem.CopyMainView=Vista principale +TMenuBar.MenuItem.CopyFrame=Quadro +TMenuBar.MenuItem.PrintFrame=Stampa quadro... +TrackerIO.Dialog.AddImage.Title=Aggiungi immagine +TTrack.Dialog.Name.BadName=già preso! Scegli un altro nome. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=forza rete +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Questa è la vista grafici dei dati di traccia. +TableTView.Label.NoData=Questa è la vista tabella dei dati di traccia. +TrackerPanel.Message.NoData0=Questa è la vista principale di video e tracce. +TrackerPanel.Message.NoData1=Scegli File|Apri o Tracce|Nuovo per partire. +WorldTView.Label.NoData=Questa è la vista globale di video e tracce. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Risolutore: +DynamicParticle.Solver.Euler=Eulero +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adattivo multipasso +DynamicParticle.Table.Force.Border.Title=Funzioni forza (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Funzioni posizione (t) +ParticleModel.Table.Initial.Border.Title=Valori iniziali +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Incolla immagine +TMenuBar.MenuItem.PasteAfter=Dopo questo quadro +TMenuBar.MenuItem.PasteBefore=Prima di questo quadro +TMenuBar.MenuItem.PasteReplace=Rimpiazza video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Introduzione... +Tracker.Splash.HelpMessage=Nuovo utente? Scegli + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=angolo +LineProfile.Checkbox.Rotates=ruota +LineProfile.Label.Spread=diffuso +RGBRegion.Name=Regione RGB +RGBRegion.New.Name=regione +RGBRegion.MenuItem.Fixed=Fissi +RGBRegion.Label.Radius=raggio +TTrack.Label.Step=passo + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=numero posizione +LineProfile.Data.Description.1=componente-x posizione +LineProfile.Data.Description.2=componente-y posizione +LineProfile.Data.Description.3=rosso +LineProfile.Data.Description.4=verde +LineProfile.Data.Description.5=blu +LineProfile.Data.Description.6=luminosità percepita +LineProfile.Data.Description.7=spessore linea +ParticleModel.MenuItem.TraceVisible=Traccia visibile +ParticleModel.MenuItem.StepsVisible=Passi visibili +PointMass.Data.Description.0=tempo +PointMass.Data.Description.1=componente-x posizione +PointMass.Data.Description.2=componente-y posizione +PointMass.Data.Description.3=magnitudo posizione +PointMass.Data.Description.4=angolo posizione +PointMass.Data.Description.5=componente-x velocità +PointMass.Data.Description.6=componente-y velocità +PointMass.Data.Description.7=magnitudo velocità +PointMass.Data.Description.8=angolo velocità +PointMass.Data.Description.9=componente-x accelerazione +PointMass.Data.Description.10=componente-y accelerazione +PointMass.Data.Description.11=magnitudo accelerazione +PointMass.Data.Description.12=angolo accelerazione +PointMass.Data.Description.13=angolo rotazione +PointMass.Data.Description.14=velocità angolare +PointMass.Data.Description.15=accelerazione angolare +PointMass.Data.Description.16=nomero passo +PointMass.Data.Description.17=numero quadro +PointMass.Data.Description.18=componente-x momento +PointMass.Data.Description.19=componente-y momento +PointMass.Data.Description.20=magnitudo momento +PointMass.Data.Description.21=angolo momento +PointMass.Data.Description.22=energia cinetica +RGBRegion.Data.Description.0=tempo +RGBRegion.Data.Description.1=componente-x posizione +RGBRegion.Data.Description.2=componente-y posizione +RGBRegion.Data.Description.3=rosso +RGBRegion.Data.Description.4=verde +RGBRegion.Data.Description.5=blu +RGBRegion.Data.Description.6=luminosità percepita +RGBRegion.Data.Description.7=conteggio pixel +RGBRegion.Data.Description.8=numero passo +RGBRegion.Data.Description.9=numero quadro +TView.Menuitem.Define=Definisci... +Vector.Data.Description.0=tempo +Vector.Data.Description.1=componente-x +Vector.Data.Description.2=componente-y +Vector.Data.Description.3=magnitudo +Vector.Data.Description.4=angolo +Vector.Data.Description.5=componente-x posizione coda +Vector.Data.Description.6=componente-y posizione coda +Vector.Data.Description.7=numero passo +Vector.Data.Description.8=numero quadro +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Massa di questa particella +ParticleModel.Parameter.InitialTime.Description=Tempo iniziale +AnalyticParticle.PositionFunction.X.Description=Componente-x posizione +AnalyticParticle.PositionFunction.Y.Description=Componente-y posizione +DynamicParticle.ForceFunction.X.Description=Componente-x forza +DynamicParticle.ForceFunction.Y.Description=Componente-y forza +DynamicParticle.Parameter.InitialX.Description=Componente-x posizione iniziale +DynamicParticle.Parameter.InitialY.Description=Componente-y posizione iniziale +DynamicParticle.Parameter.InitialVelocityX.Description=Componente-x velocità iniziale +DynamicParticle.Parameter.InitialVelocityY.Description=Componente-y velocità iniziale +TrackerPanel.ModelBuilder.Title=Costruttore modello +TrackerPanel.DataBuilder.Title=Costruttore dati +TrackControl.TrailMenu.NoTrail=Nessuna traccia +TrackControl.TrailMenu.ShortTrail=Traccia corta +TrackControl.TrailMenu.LongTrail=Traccia lunga +TrackControl.TrailMenu.FullTrail=Traccia completa +TrackerPanel.ModelBuilder.Spinner.Tooltip=Modello attualmente selezionato +TrackerPanel.ModelBuilder.LineButton.Text=Stile linea +TrackerPanel.ModelBuilder.LineButton.Tooltip=Imposta stile linea +ParticleModel.LineStyle.None=Nessuna linea +ParticleModel.LineStyle.Connect=Passi connessi +ParticleModel.LineStyle.Smooth=Linea arrotondata +ModelFunctionPanel.Label=Modello +AnalyticFunctionPanel.FunctionEditor.Border.Title=Funzioni posizione +DynamicFunctionPanel.FunctionEditor.Border.Title=Funzioni forza +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Colonne tabella visibili +Tracker.About.ProjectOf=Un progetto di: +Tracker.About.TranslationBy=Traduzione di +Tracker.About.Translator=Marco Ciampa +TMenuBar.Menu.SaveVideoAs=Salva clip come +TActions.SaveClipAs.ProgressMonitor.Message=Salva la clip come +TActions.SaveClipAs.ProgressMonitor.Progress=Completato + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sincronizza +PlotTrackView.Checkbox.Synchronize.Tooltip=Sincronizza l'asse orizzontale +RGBRegion.MenuItem.FixedRadius=Raggio bloccato +Tracker.VideoZoom.Hint=clic per ingrandire, alt-clic per rimpicciolire, doppio-clic per auto +Tracker.PlotZoomIn.Hint=trascina per ingrandire, doppio-clic per auto +Tracker.PlotZoomOut.Hint=clic per rimpicciolire +Tracker.MenuItem.Hints=Mostra i suggerimenti +TapeMeasure.Label.Length=lunghezza scalata +TapeMeasure.Label.TapeAngle=angolo nastro +TapeMeasure.Label.ArcAngle=angolo goniometro +TrackerIO.Dialog.NotAnImage.Title=Tipo file non corretto +TrackerIO.Dialog.NotAnImage.Message1=non è un'immagine JPG o GIF. +TrackerIO.Dialog.NotAnImage.Message2=Continuare? +TToolBar.Button.Zoom.Tooltip=Strumento Zoom (scorciatoia: tasto Z) +TrackChooserTView.DropDown.Tooltip=Seleziona una traccia +TapeMeasure.Field.ArcAngle.Tooltip=Angolo dal nastro al braccio del goniometro +TapeMeasure.Field.TapeAngle.Tooltip=Angolo dall'asse x positivo al nastro +TapeMeasure.Field.Magnitude.Tooltip=Lunghezza del nastro in unità scalate +TapeMeasure.Readout.Magnitude.Name=lettura lunghezza +TapeMeasure.Readout.Magnitude.Hint=clic per impostare la scala +TapeMeasure.Readout.Angle.Name=lettura angolo +TapeMeasure.Readout.Angle.Hint=click per impostare l'angolo +TapeMeasure.Arm.Name=braccio goniometro +TapeMeasure.Arm.Hint=trascina per misurare gli angoli, accorcia per chiudere +TapeMeasure.End.Name=fine +TapeMeasure.End.Hint=trascina per misurare le distanze o per calibrare la scala +TapeMeasure.Handle.Name=appiglio +TapeMeasure.Handle.Hint=trascina per spostare il nastro +Vector.Tip.Name=suggerimento +Vector.Tip.Hint=trascina o inserisci le coordinate per cambiare i componenti +Vector.Handle.Name=appiglio +Vector.Handle.Hint=trascina per spostare il vettore +Vector.ShortHandle.Hint=trascina per spostare, alt-clic per il suggerimento di selezione +PointMass.Position.Name=posizione +PointMass.Position.Hint=trascina o inserisci le coordinate per cambiare la posizione +PointMass.Velocity.Name=velocità +PointMass.Acceleration.Name=accelerazione +PointMass.Vector.Hint=trascina per spostare +PointMass.Position.Locked.Hint=clic per selezionare--non può essere trascinato +CoordAxes.Handle.Name=asse+x +CoordAxes.Handle.Hint=trascina per cambiare inclinazione +CoordAxes.Origin.Name=origine +CoordAxes.Origin.Hint=trascina per cambiare posizione +OffsetOrigin.Position.Name=posizione +OffsetOrigin.Position.Hint=trascina o inserisci le coordinate per spostare l'origine +Calibration.Point.Name=punto +Calibration.Point.Hint=trascina o inserisci le coordinate per cambiare asse e scala +RGBRegion.Position.Name=posizione +RGBRegion.Position.Hint=trascina o inserisci le coordinate per cambiare posizione +LineProfile.End.Name=fine +LineProfile.End.Hint=trascina per regolare la lunghezza della linea +LineProfile.Handle.Name=appiglio +LineProfile.Handle.Hint=trascina per spostare la linea +PointMass.Hint=imposta la massa sulla barra degli strumenti +PointMass.Unmarked.Hint=, maiusc-clic per marcare le posizioni +TTrack.Unselected.Hint=clic per selezionare e/o impostare le proprietà +Vector.Unmarked.Hint=maiusc-trascina per disegnare i vettori +OffsetOrigin.Unmarked.Hint=maiusc-clic per marcare il punto di scostamento +Calibration.Unmarked.Hint=maiusc-clic per marcare il primo punto +Calibration.Halfmarked.Hint=maiusc-clic per marcare il secondo punto +CenterOfMass.Empty.Hint=seleziona le masse per definire il sistema +VectorSum.Empty.Hint=seleziona i vettori per definire la somma +TapeMeasure.Hint=imposta la lunghezza per cambiare la scala, imposta l'angolo per cambiare l'inclinazione dell'asse x +CoordAxes.Hint=imposta l'angolo per cambiare l'inclinazione +ParticleModel.Hint=imposta la massa sulla barra degli strumenti, inserisci le espressioni nel Model Builder per animare +RGBRegion.Hint=inserire il raggio per cambiare la dimensione +RGBRegion.Unmarked.Hint=maiusc-clic per marcare le posizioni +TTrack.ImportVideo.Hint=importa video o immagine per misurare l'RGB +TTrack.Selected.Hint=selezionato +LineProfile.Hint=inserire la diffusione per cambiare lo spessore linea +LineProfile.Unmarked.Hint=maiusc-trascina per disegnare la linea +LineProfile.Menu.Orientation=Orientazione +LineProfile.MenuItem.Horizontal=Orizzontale +LineProfile.MenuItem.XAxis=Lungo l'asse X +Footprint.PositionVector=vettore +Footprint.BoldPositionVector=vettore in grassetto +Tracker.Startup.Hint=guardare qui per i suggerimenti (o disabilitare i suggerimenti nel menu Aiuto), premere il tasto F1 in qualsiasi momento per la guida +TrackerPanel.NoVideo.Hint=apri o importa un video o immagine da analizzare +TrackerPanel.CalibrateVideo.Hint=identifica un particolare del video con lunghezza conosciuta e imposta la scala usando il nastro di misura +TrackerPanel.NoTracks.Hint=crea una nuova traccia per misurare i particolari interessanti del video +TrackerPanel.SetClip.Hint=imposta o revisiona le impostazioni dei clip video nel clip inspector +TrackerPanel.ShowAxes.Hint=imposta l'origine e l'angolo degli assi delle coordinate +VideoPlayer.Step.Hint=passo avanti (scorciatoia: tasto PagGiù) +VideoPlayer.Back.Hint=passo indietro (scorciatoia: tasto PagSu) +TrackerPanel.DVVideo.Hint=applica un filtro di ridimensionamento per correggere le distorsioni nei video in formato DV +TrackerIO.DataFileFilter.Description=File di Tracker +Tracker.Button.PDFHelp=Versione del PDF stampabile +TToolbar.Button.TapeVisible.Tooltip=Misura a nastro con il braccio del goniometro + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Controllo traccia +TMenuBar.MenuItem.Description=Note +TrackPlottingPanel.RightDrag.Hint=trascina-destro per le opzioni +TMenuBar.MenuItem.DeleteSelectedPoint=Punto selezionato +TFrame.InfoDialog.SaveChanges.Title=Salva i cambiamenti +TFrame.InfoDialog.SaveChanges.Message=Salvare i cambiamenti? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesiano +DynamicParticle.Editor.Button.Polar=Polare +DynamicParticle.Parameter.InitialR.Description=Raggio iniziale +DynamicParticle.Parameter.InitialTheta.Description=Angolo iniziale +DynamicParticle.Parameter.InitialVelocityR.Description=Velocità radiale iniziale +DynamicParticle.Parameter.InitialOmega.Description=Velocità angolare iniziale +DynamicParticle.ForceFunction.R.Description=Forza la componente radiale +DynamicParticle.ForceFunction.Theta.Description=Forza la componente tangenziale +DynamicParticlePolar.Name=Modello di particella dinamica (Polare) +DynamicTwoBody.Editor.Button.Particle1=Particella 1 +DynamicTwoBody.Editor.Button.Particle2=Particella 2 +DynamicTwoBody.Name=Modello dinamico a due corpi +TMenuBar.Menu.DynamicParticle=Modello di particella dinamica +TMenuBar.MenuItem.Cartesian=Cartesiano +TMenuBar.MenuItem.Polar=Polare + +# Additions by Doug Brown 2009-08-24 +Autotrack.Inspector.Title=Autotraccia +PointMass.MenuItem.Autotrack=Autotraccia... +Dialog.Button.Help=Aiuto +AutoTracker.Wizard.Button.Reset=Reimposta +AutoTracker.Wizard.Button.Back=Indietro +AutoTracker.Wizard.Button.Next=Prossimo +AutoTracker.Wizard.Button.Accept=Accetta +AutoTracker.Wizard.Button.Search=Cerca +AutoTracker.Wizard.Button.Start=Partenza +AutoTracker.Wizard.Button.Pause=Pausa +AutoTracker.Wizard.Button.Skip=Salta +AutoTracker.Label.Mask=Maschera immagine +AutoTracker.Label.Target=Scostamento bersaglio +AutoTracker.Label.AcceptLevel=Accetta i punti sopra +AutoTracker.TabbedPane.TabTitle.Mask=Maschera +AutoTracker.TabbedPane.TabTitle.Target=Bersaglio +AutoTracker.TabbedPane.TabTitle.Settings=Accetta +AutoTracker.TabbedPane.TabTitle.Search=Cerca +AutoTracker.Info.GetStarted=Fare clic sul particolare del video che si desidera autotracciare. +AutoTracker.Info.Mask1=La maschera deifinisce l'immagine da confrontare in ogni quadro video. Spostare o ridimensionare la maschera trascinandone rispettivamente il centro o l'appiglio. +AutoTracker.Info.Mask2=Suggerimento: la maschera non necessita di essere larga né di includere l'intero oggetto. Un particolare che sia unico e che abbia bordi ad elevato contrasto è generalmente una buona scelta. +AutoTracker.Info.MaskLocked1=La maschera è in uso ed è bloccata. +AutoTracker.Info.MaskLocked2=Fare clic sul pulsante Reimposta per cancellare tutti i passi, sbloccare la maschera e ricominciare. +AutoTracker.Info.Target1=Il bersaglio è dove i passi vengono marcati relativamente alla maschera. Spostare il bersaglio trascinandolo. +AutoTracker.Info.Target2=Suggerimento: è possibile regolare la posizione del bersaglio anche dopo aver marcato dei passi. I passi esistenti si muoveranno automaticamente con il bersaglio. +AutoTracker.Info.TargetLocked=Il bersaglio è in uso e legato alle posizioni dei passi esistenti. Spostandolo si sposteranno anche i passi. +AutoTracker.Info.Settings1=Verifica che i punteggi sopra il livello di accettazione mostrati siano marcati automaticamente. +AutoTracker.Info.Settings2=Suggerimento: riducendo il livello di accettazione si velocizza il processo di marcatura ma si aumenta la probabilità di introdurre degli errori. +AutoTracker.Info.Search1=Il rettangolo mostrato verrà ricercato per il miglior riscontro. Spostare o ridimensionare l'area di ricerca spostandone il centro o il suo appiglio. +AutoTracker.Info.Search2=Suggerimento: l'area di ricerca non necessita di essere larga. Dopo aver trovato i primi due riscontri, un algoritmo di ricerca predittivo sposta l'area di ricerca alle posizioni di riscontro estrapolate. +AutoTracker.Info.Frame=Quadro +AutoTracker.Info.Match=Il riscontro mostrato è stato automaticamente marcato alla posizione del bersaglio. +AutoTracker.Info.Possible=è stato trovato un possibile riscontro nell'area di ricerca mostrata. La vostra opinione è: +AutoTracker.Info.NoMatch=Non è stato trovato nessun riscontro nell'area di ricerca mostrata. La vostra opinione è: +AutoTracker.Info.Outside=L'area di ricerca è fuori dall'immagine. La vostra opinione è: +AutoTracker.Info.Accepted=Il riscontro mostrato è stato accettato dall'utente. +AutoTracker.Info.MarkedByUser=Il passo è stato marcato manualmente dall'utente. +AutoTracker.Info.NoVideo=L'autotracciamento richiede un video. Importare un video o chiudere questo autotracciatore. +AutoTracker.Info.Height=altezza +AutoTracker.Info.Width=larghezza +AutoTracker.Info.Accept=--accetta il riscontro +AutoTracker.Info.Retry=--sposta l'area di ricerca e cerca ancora +AutoTracker.Info.Mark=--maiusc-clic per marcare il passo manualmente +AutoTracker.Info.Skip=--salta questo quadro e continua il tracciamento +AutoTracker.Info.Reset=--reimposta e ricomincia con una maschera modificata +AutoTracker.Info.MatchScore=punteggio riscontro +AutoTracker.Dialog.MaskLocked.Title=Maschera bloccata +PointMass.Cursor.Autotrack.Description=Cursore autotracciamento +VideoPlayer.StartFrame.Hint=trascina per impostare il quadro di inizio +VideoPlayer.EndFrame.Hint=trascina per impostare il quadro di fine +VideoPlayer.Slider.Hint=trascina per scansionare attraverso il video +FileDropHandler.Dialog.BadFile.Message=impossibile da caricare. +FileDropHandler.Dialog.BadFile.Title=File non riconosciuto + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Applica +DynamicParticle.Dialog.Delete.Message=Cancellando questa particella la si rimuoverà da un sistema. Cancellare? +DynamicParticle.Dialog.Delete.Title=Sistema dinamico +DynamicParticle.System.In=in +DynamicSystem.Empty=vuoto +DynamicSystem.Force.Name.Internal=interno +DynamicSystem.ForceFunction.R.Description=Componente radiale della forza interna +DynamicSystem.ForceFunction.Theta.Description=Componente tangenziale della forza interna +DynamicSystem.MenuItem.Inspector=Seleziona le particelle... +DynamicSystem.Name=Sistema dinamico a due corpi +DynamicSystem.New.Name=sistema +DynamicSystem.Parameter.Of=di +DynamicSystem.Parameter.RelativeTo=relativo a +DynamicSystem.Parameter.Name.Relative=relativo +DynamicSystem.Parameter.ParticleMass.Description=Massa di +DynamicSystem.Parameter.Mass.Description=Massa totale di questo sistema +DynamicSystemInspector.Border.Title=Particella +DynamicSystemInspector.Title=Sistema a due corpi +DynamicSystemInspector.Button.Change=Cambia in ... +DynamicSystemInspector.ParticleName.None=(nessuna) +TMenuBar.MenuItem.Clone=Clona +TMenuBar.MenuItem.TwoBody=Sistema a due corpi +TrackerPanel.DataBuilder.Dropdown.Tooltip=Traccia attualmente selezionata +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sincronizza asse verticale +TrackControl.Button.Trace.ToolTip=Mostra o nascondi i tracciati +TToolBar.Button.Open.Tooltip=Apri un video o un file tracker in una nuova scheda +TToolBar.Button.Save.Tooltip=Salva la scheda attuale in un file +TToolBar.Button.SelectTrack=Seleziona +TToolBar.Button.SelectTrack.Tooltip=Seleziona una traccia esistente +TTrack.MenuItem.ClearSteps=Rimuovi i passi +PointMass.MenuItem.Position=Posizione +TMenuBar.MenuItem.Empty=(vuoto) +TTrackBar.Button.Memory=uso della memoria: +TTrackBar.Button.Memory.Tooltip=Monitora e gestisce la memoria +TTrackBar.Memory.PopupItem.Launch=Esegue Tracker con memoria +TButton.Track.ToolTip=Imposta le proprietà di +Tracker.Dialog.OutOfMemory.Message1=Tracker ha esaurito la memoria. +Tracker.Dialog.OutOfMemory.Message2=Fare clic sul pulsante della memoria per le opzioni. +Tracker.Dialog.OutOfMemory.Title=Memoria esaurita + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Previsione +AutoTracker.Label.Original=Iniziale +AutoTracker.Label.NoMask=no +AutoTracker.Label.Rate=Frequenza di evoluzione: +AutoTracker.Info.Mask3=Suggerimento: non è necessario che il modello sia grande né che includa completamente l'oggetto. In genere funziona bene un particolare univoco con bordi ben contrastati. +AutoTracker.Wizard.Checkbox.XAxis=Solo asse X +AutoTracker.Info.SearchOnAxis1=L'asse x all'interno del rettangolo mostrato, verrà scansionato per trovare la migliore corrispondenza. Spostare o ridimensionare l'area di ricerca trascinando rispettivamente il suo centro o il suo appiglio. +AutoTracker.Info.PossibleOnAxis=Nell'area di ricerca mostrata è stato trovato un possibile riscontro lungo l'asse x. Le possibilità sono: +AutoTracker.Info.NoMatchOnAxis=Nell'area di ricerca mostrata non è stato trovato alcun riscontro lungo l'asse x. Le possibilità sono: +AutoTracker.Info.RetryOnAxis=--spostare l'area di ricerca o l'asse x e cercare ancora +AutoTracker.Wizard.Button.Delete=Cancellare questo punto +AutoTracker.Wizard.Button.DeleteMore=Cancellare questo e tutti i punti successivi +Button.Define.Tooltip=Definire funzioni di variabili colonna esistenti +Calibration.Label.Point=punto +CalibrationStick.Hint=impostare la lunghezza o trascinare fino alla fine per cambiare scala, impostare l'angolo per cambiare pendenza dell'asse +CalibrationStick.End.Hint=trascinare per cambiare la scala +CalibrationStick.New.Name=asta di calibrazione +CalibrationTapeMeasure.New.Name=nastro di calibrazione +CalibrationTapeMeasure.Readout.Magnitude.Hint=fare clic per inserire una lunghezza nota in unità fisiche +CalibrationTapeMeasure.Hint=impostare la lunghezza per cambiare scala, impostare l'angolo per cambiare pendenza all'asse +DynamicSystem.Data.Description.0=distanza relativa tra particelle +DynamicSystem.Data.Description.1=angolo relativo +DynamicSystem.Data.Description.2=velocità radiale relativa +DynamicSystem.Data.Description.3=velocità angolare relativa +ExportDataDialog.Subtitle.Table=Tabella dati +ExportDataDialog.Subtitle.Content=Celle +ExportDataDialog.Subtitle.Format=Formato numero +ExportDataDialog.Subtitle.Delimiter=Delimitatore +ExportDataDialog.Title=Esporta dati +ExportDataDialog.Delimiter.Add=Aggiungi... +ExportDataDialog.Delimiter.Remove=Rimuovi... +ExportDataDialog.Content.AllCells=Tutte le celle +ExportDataDialog.Content.SelectedCells=Le celle selezionate +ExportDataDialog.MenuItem.RemoveDelimiter=Rimuovi delimitatore personalizzato +ExportDataDialog.Chooser.SaveData.Title=Salva i dati come +ExportVideoDialog.Button.SaveAs=Salva come... +ExportVideoDialog.Button.FullSize=Dimensione piena +ExportVideoDialog.Button.DrawnSize=Come disegnato +ExportVideoDialog.Content.VideoOnly=Solo video +ExportVideoDialog.Content.VideoAndGraphics=Video e grafica +ExportVideoDialog.Content.GraphicsOnly=Solo grafica +ExportVideoDialog.Title=Esporta spezzone video +ExportVideoDialog.Label.ClipSettings=Impostazioni spezzone video +ExportVideoDialog.Subtitle.Size=Dimensione +ExportVideoDialog.Subtitle.Content=Contenuto +ExportVideoDialog.Subtitle.View=Mostra +ExportVideoDialog.Subtitle.Format=Formato +ExportVideoDialog.Complete.Message1=Il video è stato salvato come +ExportVideoDialog.Complete.Message2=Aprirlo subito in Tracker? +ExportVideoDialog.Complete.Title=Esportazione completata +ExportVideoDialog.VideoSize=dim. video +ExportVideoDialog.MatSize=dim. mat +ExportVideo.Dialog.HiddenPlots.Message=I disegni devono essere completamente visibili per l'esportazione. +ExportVideo.Dialog.HiddenPlots.Title=Vista incompleta +Footprint.DoubleTarget=doppio crocino +Footprint.BoldDoubleTarget=doppio crocino grassetto +OffsetOrigin.MenuItem.Fixed=Coordinate fisiche fisse +ParticleModel.Dialog.Offscreen.Message1=Alcuni passi del modello sono vuoti perché sono troppo lontani dallo schermo. +ParticleModel.Dialog.Offscreen.Message2=Per sistemare, cambiare il modello o riscalare il video. +ParticleModel.Dialog.Offscreen.Title=Fuori dai limiti +PrefsDialog.Tab.Configuration.Title=Configurazione +PrefsDialog.Memory.BorderTitle=Dimensione memorie +PrefsDialog.Tab.General.Title=Altro +PrefsDialog.RecentFiles.BorderTitle=Menu aperti recentemente +PrefsDialog.Label.RecentSize=Conteggio file +PrefsDialog.Hints.BorderTitle=Suggerimenti +PrefsDialog.Button.Relaunch=Riavvia ora +PrefsDialog.Button.ClearRecent=Cancella +PrefsDialog.Checkbox.DefaultSize=Usa i predefiniti +PrefsDialog.Checkbox.HintsOn=Mostra i suggerimenti come predefinito +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Motore video +PrefsDialog.Button.Xuggle=Xuggle (raccomandato) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=La gestione della memoria non è disponibile usando Web Start. +PrefsDialog.Dialog.WebStart.Title=Modalità Web Start +PrefsDialog.LookFeel.BorderTitle=Aspetto +PrefsDialog.Language.BorderTitle=Lingua +PrefsDialog.Upgrades.BorderTitle=Controlla gli aggiornamenti +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=Schermo +PrefsDialog.Language.Default=predefinita +PrefsDialog.Upgrades.Always=Ogni volta +PrefsDialog.Upgrades.Weekly=Settimanalmente +PrefsDialog.Upgrades.Monthly=Mensilmente +PrefsDialog.Upgrades.Never=Mai +PrefsDialog.Button.CheckForUpgrade=Controlla ora +PrefsDialog.Xuggle.Speed.BorderTitle=Esecuzione video +PrefsDialog.Xuggle.Slow=Preciso (potrebbe essere lento) +PrefsDialog.Xuggle.Fast=Veloce (potrebbe andare a scatti) +PrefsDialog.CalibrationTool.BorderTitle=Strumento di calibrazione predefinito +Protractor.Name=Goniometro +Protractor.New.Name=goniometro +Protractor.Hint=allargare i braccetti per misurare gli angoli +Protractor.Label.Angle=angolo +Protractor.Field.Angle.Tooltip=angolo tra i braccetti del goniometro +Protractor.Vertex.Name=vertice +Protractor.Vertex.Hint=trascinare per spostare il vertice +Protractor.End.Name=cima del braccetto +Protractor.End.Hint=trascina per ruotare il braccetto +Protractor.Handle.Name=appiglio +Protractor.Handle.Hint=trascinare per spostare il goniometro +Protractor.Rotator.Name=rotatore +Protractor.Rotator.Hint=trascinare per ruotare il goniometro +Protractor.Readout.Name=lettura +Protractor.Readout.Hint=angolo tra braccetti del goniometro +ProtractorFootprint.Circle3=cerchio piccolo +ProtractorFootprint.Circle5=cerchio grande +ProtractorFootprint.Circle3Bold=cerchio piccolo grassetto +ProtractorFootprint.Circle5Bold=cerchio grande grassetto +Stick.Name=Asta di misura +Stick.New.Name=Asta di misura +TableTrackView.MenuItem.Unformatted=Precisione piena +TableTrackView.MenuItem.Formatted=Come formattato +TableTrackView.Menu.SetDelimiter=Imposta il delimitatore +TableTrackView.MenuItem.AddDelimiter=Aggiungi... +TableTrackView.MenuItem.RemoveDelimiter=Rimuovi... +TableTrackView.Dialog.CustomDelimiter.Message=Inserire una nuova stringa di delimitazione: +TableTrackView.Dialog.CustomDelimiter.Title=Aggiungi un delimitatore +TableTrackView.Header.Tooltip=Fare clic per ordinare o doppio clic per selezionare la colonna +TableTrackView.MenuItem.CopySelectedData=Copiare i dati selezionati +TableTrackView.Dialog.RemoveDelimiter.Message=Selezionare il delimitatore per rimuovere: +TableTrackView.Dialog.RemoveDelimiter.Title=Rimuovere il delimitatore +TableTrackView.Radians.Tooltip=in radianti +TableTrackView.Degrees.Tooltip=in gradi +TableTrackView.RadiansPerSecond.Tooltip=in radianti/s +TableTrackView.DegreesPerSecond.Tooltip=in gradi/s +TableTrackView.RadiansPerSecondSquared.Tooltip=in radianti/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=in gradi/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Cancella la funzione dati +TActions.Action.SaveFrame=Salva l'insieme dati come... +TActions.AboutVideo=Proprietà... +TActions.Dialog.AboutVideo.Title=Proprietà video +TActions.Dialog.AboutVideo.Type=Tipo +TActions.Dialog.AboutVideo.Size=Dimensioni +TActions.Dialog.AboutVideo.Length=Lunghezza +TActions.Dialog.AboutVideo.Frames=quadri +TActions.Dialog.AboutVideo.Seconds=secondi +TActions.Dialog.AboutVideo.FrameRate=Velocità quadri +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Percorso +TActions.Action.ImportTRK=File Tracker... +TActions.Action.ProtractorVisible=Visibile +TapeMeasure.MenuItem.FixedLength=Lunghezza fissa +TextTView.Label.NoTab=Mostra qui il testo e le pagine HTML. +TextTView.NewTab.Text1=Doppio clic per modificare il testo o il titolo. Tasto destro per altre opzioni. +TextTView.NewTab.Text2=Per mostrare una pagina HTML, inserire l'url o fare tasto destro con il mouse per aprire un file. +TextTView.NewTab.Title=Senzanome +TextTView.Dialog.TabTitle.Title=Imposta il titolo +TextTView.MenuItem.OpenHTML=Apri HTML... +TextTView.MenuItem.SetTitle=Imposta il titolo... +TextTView.Button.NewTab=Nuovo +TextTView.TextEdit.Description=Testo +TFrame.Dialog.FileNotFound.Message=Impossibile trovare il file: +TFrame.Dialog.FileNotFound.Title=File non trovato +TFrame.View.Text=Vista testo/HTML +TFrame.View.Main=Vista principale +TMenuBar.Menu.OpenRecent=Apri recenti +TMenuBar.Menu.Import=Importa +TMenuBar.Menu.Export=Esporta +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=File dati... +TMenuBar.Menu.CopyObject=Copia oggetto +TMenuBar.MenuItem.Coords=Sistema di coordinate +TMenuBar.MenuItem.VideoClip=Spezzone video +TMenuBar.Menu.MeasuringTools=Strumenti di misura +TMenuBar.Menu.AngleUnits=Unità angolari +TMenuBar.MenuItem.Degrees=Gradi +TMenuBar.MenuItem.Radians=Radianti +Tracker.Dialog.NoXuggle.Title=Xuggle non trovato +Tracker.Dialog.NoXuggle.Message1=Xuggle (motore vide multi piattaforma) non è installato. +Tracker.Dialog.NoXuggle.Message2=Scaricare Xuggle da http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=Info su Xuggle... +Tracker.Dialog.AboutXuggle.Title=Info su Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Vesrione Xuggle +Tracker.Dialog.AboutXuggle.Message.Home=Home di Xuggle: +Tracker.Dialog.AboutXuggle.Message.Path=Percorso di Xuggle: +Tracker.Dialog.NoVideoEngine.Message1=Nessun motore video trovato! Senza, Tracker può solo aprire immagini, +Tracker.Dialog.NoVideoEngine.Message2=sequenze di immagini, e gif animate. Per installare Xuggle, il motore +Tracker.Dialog.NoVideoEngine.Message3=video preferito di Tracker per tutte le piattaforme, scaricare +Tracker.Dialog.NoVideoEngine.Message4=l'ultima versione dell'installatore di Tracker da +Tracker.Dialog.NoVideoEngine.Title=Motore video mancante +Tracker.Dialog.NoXuggle.Message1=Xuggle, il motore video preferito di Tracker, non è installato. +Tracker.Dialog.NoXuggle.Message2=Per installare Xuggle, scaricare l'ultimo installatore di Tracker da +Tracker.Dialog.NoXuggle.Title=Xuggle mancante +Tracker.About.DefaultLocale=Locale predefinito +Tracker.About.CurrentLanguage=Lingua +Tracker.Dialog.InsufficientMemory.Title=Memoria insufficiente +Tracker.Dialog.InsufficientMemory.Message=La dimensione di memoria richiesta è troppo grande. +TrackerIO.Dialog.TabMustBeSaved.Message1=Scheda +TrackerIO.Dialog.TabMustBeSaved.Message2=deve essere salvata come un file tracker per essere inclusa nell'insieme delle schede. +TrackerIO.Dialog.TabMustBeSaved.Message3=Salvarla? +TrackerIO.Dialog.TabMustBeSaved.Title=Scheda non salvata +TrackerIO.Dialog.NoTabs.Message=Non ci sono schede da salvare! +TrackerIO.Dialog.NoTabs.Title=Insieme di schede vuoto +TrackerIO.Dialog.SaveTabset.Title=Salva l'insieme di schede +TrackerIO.Dialog.SaveTab.Title=Salva scheda +TrackerIO.Delimiter.Tab=Tabulatore +TrackerIO.Delimiter.Space=Spazio +TrackerIO.Delimiter.Comma=Virgola +TrackerIO.Delimiter.Semicolon=Puntoevirgola +TrackerIO.VideoAndDataFileFilter.Description=File video e Tracker +TrackerPanel.Dialog.Version.Message1=Si sta aprendo un file crato con Tracker +TrackerPanel.Dialog.Version.Message2=che potrebbe fare riferimento a comandi +TrackerPanel.Dialog.Version.Message3=mancanti nella attuale versione in uso +TrackerPanel.Dialog.Version.Message4=L'ultima versione di Tracker è disponibile su +TrackerPanel.Dialog.Version.Title=Versione non corretta +TrackerPanel.Label.ModelStart=Inizio +TrackerPanel.Label.ModelEnd=Fine +TrackerPanel.Spinner.ModelStart.Tooltip=Impostare il quadro iniziale di questo modello +TrackerPanel.Spinner.ModelEnd.Tooltip=Impostare il quadro finale di questo modello +TToolbar.Button.ProtractorVisible.Tooltip=Mostra o nascondi il goniometro +TToolbar.Button.AxesVisible.Tooltip=Mostra o nascondi gli assi delle coordinate +TToolBar.Button.TrackControl.Tooltip=Mostra o nascondi il controllo traccia +TTrack.Dialog.StepSizeWarning.Message1=Attenzione: alcune tracce sono stare marcate con una dimensione di passo maggiore di uno, lasciando i quadri saltati non marcati. +TTrack.Dialog.StepSizeWarning.Message2=Cambiando la dimensione del passo perciò porterà probabilmente ad avere delle lacune nell'insieme dei dati. +TTrack.Dialog.StepSizeWarning.Message3=Le velocità e accelerazioni attorno alle lacune non possono essere determinate se non sono stati marcati tutti i passi. +TTrack.Dialog.StepSizeWarning.Title=Attenzione +TTrack.Dialog.SkippedStepWarning.Message1=Attenzione: saltare passi durante la marcatura delle posizioni lascia delle lacune nell'insieme dei dati. +TTrack.Dialog.SkippedStepWarning.Title=Attenzione +TTrack.Dialog.SkippedStepWarning.Checkbox=Non mostrarlo più +TTrack.Locked.Hint=bloccato +TTrack.AngleField.Radians.Tooltip=angolo in radianti +TTrack.AngleField.Degrees.Tooltip=angolo in gradi +TTrack.AngleField.Popup.Radians=Passa ai radianti +TTrack.AngleField.Popup.Degrees=Passa ai gradi +TTrackBar.Memory.Menu.SetSize=Imposta la dimensione della memoria... +TTrackBar.Button.Version=Disponibile: versione +TTrackBar.Popup.MenuItem.Upgrade=Aggiorna ora... +TTrackBar.Popup.MenuItem.Ignore=Ignora +XuggleVideo.MenuItem.SmoothPlay=Esecuzione precisa (più essere lenta) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Nastro di calibrazione +CircleFootprint.Circle=cerchi +CircleFootprint.FilledCircle=cerchio pieno +CircleFootprint.Dialog.Title=Impronta del cerchio +CircleFootprint.Dialog.Label.Radius=Raggio +CircleFootprint.Dialog.Checkbox.Bold=Grassetto +CircleFootprint.Dialog.Checkbox.CenterSpot=Macchia centrale +LineProfile.Hint.Marking=trascinare il mouse per marcare il profilo della linea +PageTView.Button.Page=Pagina +PageTView.MenuItem.ClosePage=Chiudi pagina +PointMass.Hint.Marking=fare clic con il mouse per marcare un nuovo punto, premere Invio per clonare il passo precedente +PrefsDialog.Dialog.NewVersion.Title=Aggiornamenti +PrefsDialog.Dialog.NewVersion.Message1=Versione +PrefsDialog.Dialog.NewVersion.Message2=è disponibile su +PrefsDialog.Dialog.NewVersion.None.Message=Al momento non è disponibile nessuna nuova versione. +RGBRegion.Hint.Marking=fare clic con il mouse per marcare il centro della regione +TMenuBar.MenuItem.Restore=Ripristina le viste +TrackControl.StretchVectors.None=Non stirare +TViewChooser.Maximize.Tooltip=Massimizza questa vista +TViewChooser.Restore.Tooltip=Ripristina le viste +Vector.Hint.Marking=trascinare il mouse per marcare un nuovo vettore, premere Invio per clonare il passo precedente +WorldTView.Button.World=Fisiche + +# Additions by Doug Brown 2011-04-04 +LibraryBrowser.Title=Navigatore della libreria digitale di Tracker +LibraryBrowser.Label.Select=Selezionare una libreria o inserire un percorso: +PrefsDialog.NoVideoWarning.BorderTitle=Avvertimenti +PrefsDialog.Checkbox.WarnIfNoEngine=Nessun motore video +PrefsDialog.Checkbox.WarnIfXuggleError=Errore Xuggle +PropertiesDialog.Title=Proprietà +PropertiesDialog.Label.Author=Autore +PropertiesDialog.Label.Contact=Contatto +TActions.Action.Properties=Proprietà... +TActions.Action.OpenCatalog=Apri libreria... +TFrame.Progress.Xuggle=Apertura quadro Xuggle +TFrame.Progress.ClickToCancel=(clic per annullare) +Tracker.Catalog.Default=La mia libreria locale +Tracker.Dialog.NoVideoEngine.Checkbox=Non mostrarlo più +TrackerIO.ZipFileFilter.Description=File ZIP +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle ha riportato il seguente errore durante l'apertura di questo video: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Non tutti gli errori sono gravi. Per consultare la segnalazione completa degli errori, selezionare Aiuto|Registro messaggi. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Se Xuggle fallisce, si potrebbe poter aprire il video con QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Nota: su Mac OSX ciò richiede l'esecuzione di Tracker in una Java VM a 32-bit. +TrackerIO.Dialog.ErrorFFMPEG.Title=Errore Xuggle +TToolBar.Button.OpenCatalog.Tooltip=Apre un catalogo di librerie digitali + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=File non trovato +TFrame.Dialog.NoTRKInComPADRE.Message=Nessun file Tracker è stato trovato per il nodo + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Particella cinematica +DynamicParticle.Builder.Title=Particella dinamica (Cartesiano) +DynamicParticlePolar.Builder.Title=Particella dinamica (Polare) +DynamicSystem.Builder.Title=Sistema dinamico (interno) +PropertiesDialog.Button.CopyFilePath=Copia il percorso file +PropertiesDialog.Button.CopyVideoPath=Copia il percorso video +PropertiesDialog.Tab.TrackerFile=File Tracker +PropertiesDialog.Tab.Metadata=Metadati +PropertiesDialog.Header.Property=Proprietà +PropertiesDialog.Header.Value=Valore +TActions.Action.OpenURL=Apri URL... +TActions.Dialog.OpenURL.Title=Apri URL +TActions.Dialog.OpenURL.Message=Inserire l'URL di un video web, file Tracker o file zip Tracker +TActions.Dialog.AboutVideo.Name=Nome + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=File web nella cache +PrefsDialog.Button.ClearCache=Pulisci + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, maius-clic per ri-marcare una posizione evidenziata +PointMass.Remarking.Hint=mouse clic per ri-marcare una posizione +PointMass.PositionSelected.Hint=trascinare o inserire una posizione sulla barra strumenti +PointMass.VectorSelected.Hint=trascinare per spostare +Vector.Remark.Hint=maius-clic per ri-marcare un suggerimento evidenziato +Vector.TipSelected.Hint=trascinare o inserire componenti nella barra strumenti +Vector.HandleSelected.Hint=trascinare per spostare +Vector.Remarking.Hint=mouse clic per ri-marcare un suggerimento +AutoTracker.Label.Search=Ricerca +AutoTracker.Label.Target=Bersaglio +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Punto +AutoTracker.Label.Template=Modello +AutoTracker.Label.Track=Traccia +AutoTracker.Label.Match=Corrispondenza +AutoTracker.Label.NoTemplate=Nessun modello +AutoTracker.Label.EvolutionRate=Frequenza di evoluzione +AutoTracker.Label.Automark=Automarcamento +AutoTracker.Info.Instructions=Fare clic su un pulsante di ricerca per trovare una corrispondenza nell'area di ricerca mostrata. +AutoTracker.Info.KeyFrame.Instructions1=Questo quadro chiave definisce modello e bersaglio mostrati. Fare clic su un pulsante di ricerca per trovare corrispondenze al modello. +AutoTracker.Info.KeyFrame.Instructions2=Si può trascinare bersaglio, modello o area di ricerca per spostarli o ridimensionarli. +AutoTracker.Info.MouseOver.Instructions=Spostare il mouse sopra i controlli per avere informazioni su impostazioni e regolazioni. +AutoTracker.Info.Mask1=Il modello è l'immagine da riscontrare. Comincia con un quadro chiave e si evolve per adattarsi ai cambiamenti di forma e colore. +AutoTracker.Info.Mask2=Il livello di automarcatura è il punteggio minimo di riscontro richiesto per la marcatura automatica. +AutoTracker.Info.Mask.Instructions=Sposta o ridimensiona il modello trascinandone i limiti o gli appigli angolari (solo quadri chiave). Regola la frequenza di evoluzione e i livelli di automarcatura usando i rotatori. +AutoTracker.Info.Mask.Tip=Bassi livelli di automarcatura possono provocare falsi positivi. Nel caso provare invece ad aumentare la frequenza di evoluzione. +AutoTracker.Info.Search=L'area di ricerca viene scansionata per il miglior riscontro. +AutoTracker.Info.SearchOnAxis=L'asse x nell'area di ricerca viene scansionato per il miglior riscontro. +AutoTracker.Info.Search.Instructions=Sposta o ridimensiona l'area di ricerca trascinandone i limiti o gli appigli angolari. Imposta l'asse x e le opzioni di previsione selezionandone le caselle corrispondenti. +AutoTracker.Info.Search.Tip=Spesso non è necessario che l'area di ricerca sia larga. L'opzione di previsione sposta automaticamente l'area di ricerca alle posizioni di riscontro predette. +AutoTracker.Info.Target=Il bersaglio è dove il punto di tracciamento mirato viene marcato. +AutoTracker.Info.Target.Instructions=Sposta il bersaglio trascinandolo (solo quadri chiave). Scegliere la traccia e punto bersagli dagli elenchi a discesa. +AutoTracker.Info.Title.Settings=Impostazioni +AutoTracker.Info.Title.Tip=Suggerimento +AutoTracker.Info.SelectTrack=Selezionare o creare la traccia e il punto che si desidera autotracciare. +AutoTracker.Info.OutsideXAxis=L'asse x non passa attraverso l'area di ricerca. Le scelte disponibili sono: +AutoTracker.Info.NewKeyFrame=--fare un passo indietro e cambiare la frequenza di evoluzione or maiusct-control-clic per definire un nuovo quadro chiave +AutoTracker.Info.Replace=--accettare il riscontro e rimpiazzare il punto esistente +AutoTracker.Info.Keep=--mantenere il punto esistente +AutoTracker.Info.PossibleReplace=È stato trovato un riscontro possibile per rimpiazzare il punto esistente. Le scelte possibili sono: +AutoTracker.Wizard.Button.Accept=Accetta +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=Salta +AutoTracker.Wizard.Button.Replace=Rimpiazza +AutoTracker.Wizard.Button.Keep=Mantieni +AutoTracker.Wizard.Button.Search=Cerca +AutoTracker.Wizard.Button.SearchThis=Cerca questo +AutoTracker.Wizard.Button.SearchNext=Cerca il prossimo +AutoTracker.Wizard.Button.Delete=Elimina +AutoTracker.Wizard.Button.ShowKeyFrame=Mostra il quadro chiave +AutoTracker.Wizard.Button.DeleteKeyFrame=Elimina il quadro chiave +AutoTracker.Wizard.Checkbox.LookAhead=Previsione +AutoTracker.Wizard.Checkbox.XAxis=Solo asse x +AutoTracker.Wizard.Menuitem.DeleteThis=Questo punto +AutoTracker.Wizard.Menuitem.DeleteLater=Punti successivi +AutoTracker.Wizard.Menuitem.DeleteAll=Tutti i punti +TToolBar.Button.AutoTracker.Tooltip=Mostra o nascondi l'autotracciatore +MainTView.Popup.MenuItem.ZoomIn=Zoom avanti +MainTView.Popup.MenuItem.ZoomOut=Zoom indietro +MainTView.Popup.MenuItem.ZoomToFit=Zoom intero +TrackerIO.Dialog.DurationVaries.Title=Durata quadro variabile +TrackerIO.Dialog.DurationVaries.Message1=Questo video include quadri con durate che differiscono dalla media più di +TrackerIO.Dialog.DurationVaries.Message2=Per ottenere velocità e accelerazioni accurate, è necessario escludere questi quadri dai +TrackerIO.Dialog.DurationVaries.Message3=calcoli impostando il quadro di inizio e quello di fine della clip video. +TrackerIO.Dialog.DurationVaries.Message4=Quadri da escludere: +TrackerIO.Dialog.DurationVaries.Message5=Durata media e velocità di quadro se esclusi: +TFrame.Dialog.LibraryError.Title=Errore +TFrame.Dialog.LibraryError.Message=Nessuna risorsa può essere caricata dal nodo + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=maiusc-clic per marcare +PrefsDialog.Label.Path=Percorso +PrefsDialog.Checkbox.ClearCacheOnExit=Cancella all'uscita +PrefsDialog.FileChooser.Title.Cache=Imposta cache +PrefsDialog.FileFilter.Directories=Directory +Tracker.Action.AboutThreads=Info sui threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Imposta Java VM +PrefsDialog.FileFilter.JRE=Directory e Java VMs +PrefsDialog.Version.BorderTitle=Versione di Tracker +PrefsDialog.Version.Default=predefinito +PrefsDialog.Tab.ClearCacheOnExit=Cancella all'uscita +PrefsDialog.Run.BorderTitle=Programmi da eseguire all'avvio +PrefsDialog.FileChooser.Title.Run=Selezione il file eseguibile +PrefsDialog.Button.Save=Salva +Tracker.Readme=LEGGIMI di Tracker +Tracker.Readme.NotFound=File LEGGIMI non trovato +Popup.MenuItem.Algorithm=Algoritmi... +AlgorithmDialog.Button.FiniteDifference=Differenze finite +AlgorithmDialog.Button.BounceDetect=Rilevamento rimbalzo +AlgorithmDialog.TitledBorder.Choose=Seleziona l'algoritmo usato per calcolare velocità e accelerazione: +AlgorithmDialog.Title=Algoritmi +AlgorithmDialog.FiniteDifference.Message1=Questo è l'algoritmo predefinito. +AlgorithmDialog.FiniteDifference.Message2=Velocità: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Accelerazione: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Questo algoritmo spiana velocità e accelerazioni ma rileva anche cambi improvvisi di velocità. +AlgorithmDialog.BounceDetect.Message2=Attenzione: può introdurre degli artefatti. Per ulteriori informazioni, consultare: +TMenuBar.Menu.Diagnostics=Diagnostici + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=XML non valido +Tracker.Dialog.Invalid.Message=Il file non può essere letto. +TrackPlottingPanel.Popup.Menu.CompareWith=Compara con +TrackerPanel.DataBuilder.TrackType.Unknown=sconosciuto +TrackerPanel.DataBuilder.Button.Load.Tooltip=Carica i dati delle funzioni da un file XML +TrackerPanel.DataBuilder.Button.Save.Tooltip=Salva i dati delle funzioni in un file XML +TrackerPanel.DataBuilder.Load.Title=Carica le funzioni dati +TrackerPanel.DataBuilder.Load.Message=Seleziona le funzioni da caricare: +TrackerPanel.DataBuilder.Save.Title=Salva le funzioni dati +TrackerPanel.DataBuilder.Save.Message=Seleziona le funzioni da salvare: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Carica dentro tutto +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Carica solo dentro +TrackerPanel.DataBuilder.Dialog.Load.Title=Traccia selezione +TrackerPanel.DataBuilder.Dialog.Load.Message=Caricare le funzioni in tutte le tracce di tipo +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Tipo di traccia non corretto +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Il file definisce le funzioni dati per il tipo traccia +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Non possono essere caricate nel tipo +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Tipo errato +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Il file non definisce funzioni dati. +TToolbar.Button.Refresh=Aggiorna i dati e le viste + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=La risorsa ZIP è stata salvata come +ExportTRKDialog.Complete.Message2=Aprirla in Tracker? +ExportTRKDialog.Complete.Title=Esportazione completata +ExportTRKDialog.Title=Esporta risorse ZIP +ExportTRKDialog.Message1=Ciò (1) esporta la clip video, (2) converte i dati tabellari per farli corrispondere al video esportato, e (3) salva la tabella convertita come un nuovo file Tracker. +ExportTRKDialog.Message2=I file Tracker e video vengono salvati nella stessa directory con lo stesso nome ma con estensioni diverse. +TMenuBar.MenuItem.TabClip=Risorsa ZIP +TMenuBar.Menu.CalibrationTools=Strumenti di calibrazione +TrackerIO.Dialog.DurationVaries.Button.SetClip=Imposta la clip suggerita +TrackerIO.Dialog.DurationVaries.Start=inizio +TrackerIO.Dialog.DurationVaries.End=fine +TrackerIO.Dialog.DurationVaries.Recommended=Clip suggerita + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Unisci i capi +AttachmentInspector.Label.End=Capo +AttachmentInspector.Label.Vertex=Vertice +AttachmentInspector.Header.PointName=Nome +AttachmentInspector.Header.AttachedTo=Unisci a +ExportTRKDialog.Label.VideoFormat=Formato video +MeasuringTool.MenuItem.Attach=Unisci i capi... +PerspectiveTrack.Corner=angolo +PrefsDialog.LogLevel.BorderTitle=Livello di log del messaggio di avvio +Protractor.Data.Description.0=tempo +Protractor.Data.Description.1=angolo goniometro +Protractor.Data.Description.2=lunghezza braccio 1 +Protractor.Data.Description.3=lunghezza braccio 2 +Protractor.Data.Description.4=numero passo +Protractor.Data.Description.5=numero quadro +TapeMeasure.Data.Description.0=tempo +TapeMeasure.Data.Description.1=lunghezza +TapeMeasure.Data.Description.2=angolo misurato dall'asse x +TapeMeasure.Data.Description.3=numero passo +TapeMeasure.Data.Description.4=numero quadro + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=non ricercato +AutoTracker.Info.KeyFrame=Quadro chiave +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Questo quadro chiave +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Questa corrispondenza +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Corrispondenze successive +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracciatore +Dialog.Button.Add=Aggiungi +Dialog.Button.Remove=Rimuovi +PrefsDialog.Button.ClearHost=Elimina host +PrefsDialog.Button.ClearHost.Tooltip=elimina tutti i file associati con il selezionato host web dalla cache OSP +PrefsDialog.Button.ClearCache.Tooltip=elimina tutti i file dalla cache OSP +TActions.Action.SaveZip=Esporta risorsa ZIP +ThumbnailDialog.Title=Esporta immagine miniatura +ThumbnailDialog.Settings.Title=Opzioni miniatura +ThumbnailDialog.Label.CurrentImage=Immagine corrente +ThumbnailDialog.Label.FrameNumber=quadro +ThumbnailDialog.Label.StepNumber=passo +ThumbnailDialog.View.VideoOnly=Solo video +ThumbnailDialog.View.MainView=Vista principale +ThumbnailDialog.View.WholeFrame=Quadro intero +ThumbnailDialog.Format.PNG=Immagine PNG +ThumbnailDialog.Format.JPG=Immagine JPEG +ThumbnailDialog.Chooser.SaveThumbnail.Title=Salva miniatura +ThumbnailDialog.Subtitle.Image=Immagine +TMenuBar.MenuItem.Thumbnail=Immagine miniatura +TToolBar.Button.SaveZip.Tooltip=Esporta una risorsa ZIP per il navigatore libreria digitale OSP +TTrack.MenuItem.DeletePoint=Elimina passo selezionato +ZipResourceDialog.Title=Esporta risorsa ZIP +ZipResourceDialog.Label.Format=Formatta +ZipResourceDialog.Label.Title=Nome +ZipResourceDialog.Label.Description=Descrizione +ZipResourceDialog.Label.Keywords=Parole chiave +ZipResourceDialog.Label.Link=Collegamento esterno +ZipResourceDialog.Label.HTML=Sorgente HTML +ZipResourceDialog.Complete.Message1=La risorsa ZIP è stata salvata come +ZipResourceDialog.Complete.Message2=Aprirla ora in Tracker? +ZipResourceDialog.Complete.Title=Successo +ZipResourceDialog.Border.Title.Documentation=Documentazione HTML +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Miniatura +ZipResourceDialog.FileChooser.SaveZip.Title=Esporta risorsa ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Aggiungi file alla risorsa ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Apri file HTML +ZipResourceDialog.Button.AddFiles=Aggiungi file +ZipResourceDialog.Button.ThumbnailSettings=Opzioni miniature +ZipResourceDialog.Checkbox.TrimVideo=Ritaglia alla clip +ZipResourceDialog.AddHTMLInfo.Title=Aggiungi un file di informazioni in HTML +ZipResourceDialog.AddHTMLInfo.Message1=Aggiungere il file di informazioni HTML +ZipResourceDialog.AddHTMLInfo.Message2=al file delle risorse ZIP? +ZipResourceDialog.HTMLField.DefaultText=Se non è stato specificato nulla, il file verrà creato da zero +ZipResourceDialog.Dialog.AddFiles.Title=Aggiungi file HTML e PDF +ZipResourceDialog.Tooltip.HTML=Percorso al file sorgente HTML (se assente, il file verrà creato da zero) +ZipResourceDialog.Tooltip.Author=Autori di questa risorsa +ZipResourceDialog.Tooltip.Title=Mostra il nome di questa risorsa (non il nome del file) +ZipResourceDialog.Tooltip.Description=Un'utile descrizione di questa risorsa +ZipResourceDialog.Tooltip.Keywords=Un elenco di parole chiave da cercare nel navigatore DL +ZipResourceDialog.Tooltip.Contact=Informazioni di contatto autore (Istituto, e-mail, sito web, ecc.) +ZipResourceDialog.Tooltip.Link=URL di un file esterno HTML con ulteriori informazioni su questa risorsa +ZipResourceDialog.Tooltip.ThumbnailSettings=Cambia la vista miniatura, dimensione o tipo di file +ZipResourceDialog.Tooltip.AddFiles=Aggiungi file HTML e PDF alla risorsa ZIP +ZipResourceDialog.Tooltip.TrimVideo=Seleziona per l'esportazione della clip video, deseleziona per usare il video originale +ZipResourceDialog.Tooltip.LoadHTML=Usa un navigatore file per caricare un file di informazioni HTML diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties index cd116df5..124453e4 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties @@ -1,1295 +1,1295 @@ -# This is the hebrew tracker.properties file -# Translated by (Amit Kenny), (date1/1/2014) -Calibration.Name=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05db\u05d9\u05d5\u05dc -Calibration.New.Name=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05db\u05d9\u05d5\u05dc -CenterOfMass.Name=\u05de\u05e8\u05db\u05d6 \u05de\u05e1\u05d4 -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4... -CenterOfMassInspector.Title=\u05de\u05e8\u05db\u05d6 \u05de\u05e1\u05d4 -CenterOfMassInspector.Border.Title=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4 -ConfigInspector.Border.Title=\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e8\u05e6\u05d5\u05d9\u05d5\u05ea -ConfigInspector.Title=\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea -ConfigInspector.Button.SaveAsDefault=\u05e9\u05de\u05d5\u05e8 \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -CoordAxes.Name=\u05e6\u05d9\u05e8\u05d9\u05dd -CoordAxes.New.Name=\u05e6\u05d9\u05e8\u05d9\u05dd -Dialog.Button.Cancel=\u05d1\u05d8\u05dc -Dialog.Button.OK=\u05d0\u05e9\u05e8 -Dialog.Button.Close=\u05e1\u05d2\u05d5\u05e8 -Dialog.Button.All=\u05d4\u05db\u05dc -Dialog.Button.None=\u05d0\u05e3-\u05d0\u05d7\u05d3 -Dialog.Button.Copy=\u05d4\u05e2\u05ea\u05e7 -Dialog.Button.Update=\u05e2\u05d3\u05db\u05df -Dialog.Button.SelectAll=\u05d1\u05d7\u05e8 \u05d4\u05db\u05dc -Footprint.Diamond=\u05d9\u05d4\u05dc\u05d5\u05dd -Footprint.BoldDiamond=\u05d9\u05d4\u05dc\u05d5\u05dd \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.SolidDiamond=\u05d9\u05d4\u05dc\u05d5\u05dd \u05de\u05d5\u05e6\u05e7 -Footprint.Triangle=\u05de\u05e9\u05d5\u05dc\u05e9 -Footprint.BoldTriangle=\u05de\u05e9\u05d5\u05dc\u05e9 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.SolidTriangle=\u05de\u05e9\u05d5\u05dc\u05e9 \u05de\u05d5\u05e6\u05e7 -Footprint.Circle=\u05e2\u05d9\u05d2\u05d5\u05dc -Footprint.BoldCircle=\u05e2\u05d9\u05d2\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.SolidCircle=\u05e2\u05d9\u05d2\u05d5\u05dc \u05de\u05d5\u05e6\u05e7 -Footprint.VerticalLine=\u05e7\u05d5 \u05d0\u05e0\u05db\u05d9 -Footprint.BoldVerticalLine=\u05e7\u05d5 \u05d0\u05e0\u05db\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.HorizontalLine=\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9 -Footprint.BoldHorizontalLine=\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.Crosshair=\u05e6\u05dc\u05d1 -Footprint.BoldCrosshair=\u05e6\u05dc\u05d1 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.SimpleAxes=\u05e6\u05d9\u05e8\u05d9\u05dd \u05e4\u05e9\u05d5\u05d8\u05d9\u05dd -Footprint.BoldSimpleAxes=\u05e6\u05d9\u05e8\u05d9\u05dd \u05e4\u05e9\u05d5\u05d8\u05d9\u05dd \u05de\u05d5\u05d3\u05d2\u05e9\u05d9\u05dd -Footprint.Spot=\u05e0\u05e7\u05d5\u05d3\u05d4 -Footprint.Line=\u05e7\u05d5 -Footprint.BoldLine=\u05e7\u05d5 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.Outline=\u05e7\u05d5 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 -Footprint.BoldOutline=\u05e7\u05d5 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.Arrow=\u05d7\u05e5 -Footprint.BoldArrow=\u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.DoubleArrow=\u05d7\u05e5 \u05db\u05e4\u05d5\u05dc -Footprint.BoldDoubleArrow=\u05d7\u05e5 \u05db\u05e4\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.2xArrow=2x \u05d7\u05e5 -Footprint.Bold2xArrow=2x \u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.4xArrow=4x \u05d7\u05e5 -Footprint.Bold4xArrow=4x \u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.DashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 -Footprint.BoldDashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 \u05de\u05d5\u05d3\u05d2\u05e9 -Footprint.BigArrow=\u05d7\u05e5 \u05d2\u05d3\u05d5\u05dc -Footprint.BigDashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 \u05d2\u05d3\u05d5\u05dc -LineProfile.Name=\u05e7\u05d5 \u05e4\u05e8\u05d5\u05e4\u05d9\u05dc -LineProfile.New.Name=\u05e4\u05e8\u05d5\u05e4\u05d9\u05dc -LineProfile.Data.Brightness=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea -LineProfile.Data.Pixel=\u05e4\u05d9\u05e7\u05e1\u05dc -LineProfile.Data.Red=\u05d0\u05d3\u05d5\u05dd -LineProfile.Data.Green=\u05d9\u05e8\u05d5\u05e7 -LineProfile.Data.Blue=\u05db\u05d7\u05d5\u05dc -LineProfile.Data.Weighting=\u05de\u05d5\u05e0\u05d4 -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=\u05d6\u05d5\u05dd -MainTView.Popup.MenuItem.ToFit=\u05dc\u05d4\u05ea\u05d0\u05d9\u05dd -OffsetOrigin.Name=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05d5\u05d6\u05d6\u05ea -OffsetOrigin.New.Name=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05d5\u05d6\u05d6\u05ea -PlotTrackView.Button.PlotCount=\u05d2\u05e8\u05e3 -PlotTrackView.Button.PlotCount.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05d5\u05e0\u05d4 \u05d2\u05e8\u05e3 -PointMass.Name=\u05e0\u05e7\u05d5\u05d3\u05ea \u05de\u05e1\u05d4 -PointMass.New.Name=\u05de\u05e1\u05d4 -PointMass.MenuItem.VectorsToPosition=\u05dc\u05de\u05d9\u05e7\u05d5\u05dd -PointMass.MenuItem.Velocity=\u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea -PointMass.MenuItem.Acceleration=\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea -Star.Name=\u05db\u05d5\u05db\u05d1 -Star.New.Name=\u05db\u05d5\u05db\u05d1 -TableTrackView.Action.CopyData=\u05d4\u05e2\u05ea\u05e7 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TableTrackView.Button.SelectTableData=\u05d8\u05d1\u05dc\u05d4 -TableTrackView.Button.SelectTableData.ToolTip=\u05d1\u05d7\u05e8 \u05e2\u05de\u05d5\u05d3\u05d5\u05ea -TableTrackView.Popup.MenuItem.Analyze=\u05e0\u05ea\u05d7... -TableTrackView.Dialog.Border.Title=\u05e0\u05e8\u05d0\u05d4: -TActions.Action.Description=\u05d4\u05e2\u05e8\u05d5\u05ea -TActions.Action.ClearTracks=\u05db\u05dc \u05d4\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd -TActions.Action.NewTab=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d7\u05d3\u05e9\u05d4 -TActions.Action.Copy=\u05d4\u05e2\u05ea\u05e7 -TActions.Action.Paste=\u05d4\u05d3\u05d1\u05e7 -TActions.Action.Open=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5... -TActions.Action.Close=\u05e1\u05d2\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -TActions.Action.Import=\u05d9\u05d1\u05d0... -TActions.Action.Save=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -TActions.Action.SaveAs=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d1\u05e9\u05dd... -TActions.Action.Export=\u05d9\u05e6\u05d0... -TActions.Action.CaptureVideo=\u05d4\u05e7\u05dc\u05d8 \u05d5\u05d9\u05d3\u05d0\u05d5... -TActions.Action.Delete=\u05de\u05d7\u05e7 -TActions.Action.Config=\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea... -TActions.Action.AxesVisible=\u05e0\u05e8\u05d0\u05d4 -TActions.Action.TapeVisible=\u05e0\u05e8\u05d0\u05d4 -TActions.Action.Print=\u05d4\u05d3\u05e4\u05e1... -TActions.Action.ClearFilters=\u05e0\u05e7\u05d4 -TActions.Action.ImportVideo=\u05d9\u05d1\u05d0... -TActions.Action.CloseVideo=\u05e1\u05d2\u05d5\u05e8 -TActions.Action.CloseAll=\u05e1\u05d2\u05d5\u05e8 \u05d0\u05ea \u05db\u05dc \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea -TActions.Action.Exit=\u05e6\u05d0 -TActions.Dialog.PrintError.Message=\u05d0\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05ea \u05d4\u05d3\u05e4\u05e1\u05d4. -TActions.Dialog.PrintError.Title=\u05e9\u05d2\u05d9\u05ea \u05d4\u05d3\u05e4\u05e1\u05d4 -TActions.Dialog.Description.Title=\u05d4\u05e2\u05e8\u05d5\u05ea: -TActions.Dialog.DeleteLockedTracks.Message=\u05e7\u05d9\u05d9\u05de\u05d9\u05dd \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e0\u05e2\u05d5\u05dc\u05d9\u05dd. \u05d4\u05d0\u05dd \u05dc\u05de\u05d7\u05d5\u05e7 \u05d1\u05db\u05dc \u05de\u05e7\u05e8\u05d4? -TActions.Dialog.DeleteLockedTracks.Title=\u05dc\u05de\u05d7\u05d5\u05e7 \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e0\u05e2\u05d5\u05dc\u05d9\u05dd? -TActions.Dialog.NewPointMass.Title=\u05e0\u05e7\u05d5\u05d3\u05ea \u05de\u05e1\u05d4 \u05d7\u05d3\u05e9\u05d4 -TapeMeasure.Name=\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 -TapeMeasure.New.Name=\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 -TapeMeasure.MenuItem.Fixed=\u05e7\u05d1\u05d5\u05e2 -TFrame.View.Plot=\u05d4\u05e6\u05d2\u05d4 \u05d2\u05e8\u05e4\u05d9\u05ea -TFrame.View.Table=\u05d4\u05e6\u05d2\u05ea \u05d8\u05d1\u05dc\u05d4 -TFrame.View.World=\u05d4\u05e6\u05d2\u05d4 \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea -TFrame.View.Video=\u05d4\u05e6\u05d2\u05ea \u05e1\u05e8\u05d8 -TFrame.Dialog.Help.Title=\u05e2\u05d6\u05e8\u05d4 -TMenuBar.Menu.File=\u05e7\u05d5\u05d1\u05e5 -TMenuBar.Menu.Edit=\u05e2\u05e8\u05d5\u05da -TMenuBar.Menu.Video=\u05e1\u05e8\u05d8 -TMenuBar.Menu.Tracks=\u05e2\u05e7\u05d1\u05d5\u05ea -TMenuBar.Menu.Coords=\u05de\u05e2\u05e8\u05db\u05ea \u05e6\u05d9\u05e8\u05d9\u05dd -TMenuBar.Menu.Window=\u05ea\u05e6\u05d5\u05d2\u05d5\u05ea -TMenuBar.Menu.Help=\u05e2\u05d6\u05e8\u05d4 -TMenuBar.MenuItem.EditProperties=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... -TMenuBar.MenuItem.VideoVisible=\u05e0\u05e8\u05d0\u05d4 -TMenuBar.MenuItem.VideoFilters=\u05de\u05e1\u05e0\u05e0\u05d9\u05dd -TMenuBar.MenuItem.NewVideoFilter=\u05d7\u05d3\u05e9 -TMenuBar.MenuItem.NewTrack=\u05d7\u05d3\u05e9 -TMenuBar.MenuItem.CoordsLocked=\u05e0\u05e2\u05d5\u05dc -TMenuBar.MenuItem.CoordsFixedOrigin=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05ea -TMenuBar.MenuItem.CoordsFixedAngle=\u05d6\u05d5\u05d9\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05ea -TMenuBar.MenuItem.CoordsFixedScale=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05de\u05e7\u05d5\u05d1\u05e2 -TMenuBar.MenuItem.CoordsRefFrame=\u05ea\u05de\u05d5\u05e0\u05ea \u05d9\u05d7\u05d5\u05e1 -TMenuBar.MenuItem.CoordsDefault=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -TMenuBar.MenuItem.WindowRight=\u05de\u05e8\u05d0\u05d4 \u05d9\u05de\u05e0\u05d9 -TMenuBar.MenuItem.WindowBottom=\u05de\u05e8\u05d0\u05d4 \u05ea\u05d7\u05ea\u05d5\u05df -TMenuBar.MenuItem.PlayAllSteps=\u05d4\u05e7\u05e8\u05df \u05d0\u05ea \u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd -TMenuBar.MenuItem.Record=\u05d4\u05e7\u05dc\u05d8 -TMenuBar.MenuItem.MatSize=Mat Size -TMenuBar.MenuItem.Language=\u05e9\u05e4\u05d4 -TMenuBar.MenuItem.DeleteTrack=\u05de\u05d7\u05e7 -TMenuBar.MenuItem.TrackerHelp=\u05e2\u05d6\u05e8\u05d4... -TMenuBar.MenuItem.MessageLog=\u05e8\u05d9\u05e9\u05d5\u05dd \u05de\u05e1\u05e8\u05d9\u05dd... -TrackControl.Name=\u05d1\u05e7\u05e8\u05ea \u05de\u05e2\u05e7\u05d1 -TrackControl.Button.NewTrack=\u05e6\u05d5\u05e8 -TrackControl.Button.NewTrack.ToolTip=\u05e6\u05d5\u05e8 \u05de\u05e2\u05e7\u05d1 \u05d7\u05d3\u05e9 -TrackControl.Button.Trails.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05de\u05e1\u05dc\u05d5\u05dc -TrackControl.Button.Labels.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05e1\u05e4\u05d5\u05e8 -TrackControl.Button.StretchVectors.ToolTip=\u05de\u05ea\u05d7 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd -TrackControl.Button.Accelerations.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8 \u05ea\u05d0\u05d5\u05e6\u05d4 -TrackControl.Button.Xmass.ToolTip=\u05d4\u05db\u05e4\u05dc \u05d5\u05e7\u05d8\u05d5\u05e8 \u05d1\u05de\u05e1\u05d4 -TrackControl.Button.Vectors.ToolTip=\u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd -TrackControl.Button.Velocities.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8 \u05de\u05d4\u05d9\u05e8\u05d5\u05ea -TrackControl.Button.Properties.ToolTip=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 -TrackControl.Button.Positions.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05d9\u05e7\u05d5\u05dd -Tracker.Popup.MenuItem.Snapshot=\u05e6\u05dc\u05dd... -Tracker.Popup.MenuItem.Help=\u05e2\u05d6\u05e8\u05d4... -Tracker.Cursor.Crosshair.Description=\u05e1\u05de\u05df \u05e6\u05dc\u05d1 -Tracker.Action.AboutTracker=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d8\u05e8\u05e7\u05e8... -Tracker.Dialog.AboutTracker.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d8\u05e8\u05e7\u05e8 -Tracker.Action.AboutJava=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4... -Tracker.Dialog.AboutJava.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4 -Tracker.Dialog.AboutJava.UnknownVersion=\u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2 -Tracker.Dialog.AboutJava.Message=\u05d2\u05e8\u05e1\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4 -Tracker.Action.AboutQT=\u05d0\u05d5\u05d3\u05d5\u05ea QuickTime... -Tracker.Dialog.AboutQT.Title=\u05d0\u05d5\u05d3\u05d5\u05ea QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=\u05d2\u05e8\u05e1\u05ea QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=\u05d2\u05e8\u05e1\u05ea QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: -Tracker.Dialog.NoQT.Title=QTJava.zip not found -Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. -Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. -Tracker.Dialog.UpdateQT.Title=\u05e2\u05d3\u05db\u05df QTJava.zip -Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at -Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? -Tracker.Dialog.CopyQT.Title=\u05d4\u05e2\u05ea\u05e7 QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from -Tracker.Dialog.CopyQT.Message3= to -Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. -Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? -Tracker.Dialog.CopyFailed.Title=\u05d4\u05e2\u05ea\u05e7\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4 -Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. -Tracker.Dialog.CopiedTo.Title=\u05d4\u05d5\u05e2\u05ea\u05e7 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4 -Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to -Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. -Tracker.Splash.Title=\u05d8\u05e8\u05e7\u05e8 -Tracker.Splash.CreatingFrame=Creating frame -Tracker.Splash.VersionMessage=\u05d2\u05e8\u05e1\u05d4 -Tracker.Splash.AddingPanel=\u05d4\u05d5\u05e1\u05e3 \u05dc\u05d5\u05d7 \u05de\u05e2\u05e7\u05d1 -Tracker.Splash.AddingTab=\u05d4\u05d5\u05e1\u05e3 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -Tracker.Splash.Loading=\u05d8\u05d5\u05e2\u05df -Tracker.Splash.Wait=\u05d8\u05d5\u05e2\u05df \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd, \u05d0\u05e0\u05d0 \u05d4\u05de\u05ea\u05df -Tracker.Splash.AddingAxes=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e6\u05d9\u05e8\u05d9\u05dd -Tracker.Splash.AddingMenuBar=\u05de\u05d5\u05e1\u05d9\u05e3 \u05de\u05e1\u05e4\u05e8 -Tracker.Splash.AddingViews=\u05de\u05d5\u05e1\u05d9\u05e3 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea -Tracker.Splash.AddingTape=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 -Tracker.Splash.AddingToolbar=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e1\u05e8\u05d2\u05dc \u05db\u05dc\u05d9\u05dd -TrackerIO.Dialog.Import.Title=\u05d9\u05d1\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 -TrackerIO.Dialog.Import.Message=\u05d1\u05d7\u05e8 \u05e4\u05e8\u05d9\u05d8 \u05dc\u05d9\u05d1\u05d5\u05d0 -TrackerIO.Dialog.ImportVideo.Title=\u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 -TrackerIO.Dialog.Export.Title=\u05d9\u05e6\u05d0 -TrackerIO.Dialog.Export.Message=\u05d1\u05d7\u05e8 \u05e4\u05e8\u05d9\u05d8 \u05dc\u05d9\u05e6\u05d5\u05d0 -TrackerIO.Dialog.ReplaceFile.Title=\u05dc\u05d4\u05d7\u05dc\u05d9\u05e3 \u05e7\u05d5\u05d1\u05e5 \u05e7\u05d9\u05d9\u05dd? -TrackerIO.Dialog.ReplaceFile.Message=\u05db\u05d1\u05e8 \u05e7\u05d9\u05d9\u05dd. \u05dc\u05d4\u05d7\u05dc\u05d9\u05e3? -TrackerIO.Dialog.NotTrackerXML.Title=XML \u05dc\u05d0 \u05ea\u05d5\u05d0\u05dd -TrackerIO.Dialog.NotTrackerXML.Message=\u05de\u05db\u05d9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 xml \u05dc\u05ea\u05d5\u05db\u05e0\u05d4 \u05d0\u05d7\u05e8\u05ea -TrackerIO.Dialog.BadVideo.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d9\u05e0\u05d5 \u05e1\u05d5\u05d2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05d6\u05d5\u05d4\u05d4: -TrackerIO.Dialog.BadVideo.Title=\u05e7\u05d5\u05d1\u05e5 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d1\u05dc\u05ea\u05d9 \u05de\u05d6\u05d5\u05d4\u05d4 -TrackerPanel.NewTab.Name=\u05dc\u05dc\u05d0 \u05e9\u05dd -TrackerPanel.DragToMark.Hint=Shift-\u05de\u05e9\u05d5\u05da \u05dc\u05e1\u05d9\u05de\u05d5\u05df -TrackerPanel.ClickToMark.Hint=Shift-\u05d4\u05e7\u05e9 \u05dc\u05e1\u05d9\u05de\u05d5\u05df -TrackerPanel.Dialog.LoadFailed.Title=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9 -TrackerPanel.Dialog.LoadFailed.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d9\u05e0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d7\u05d5\u05e7\u05d9 -TrackerPanel.Dialog.SaveChanges.Title=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd -TrackerPanel.Dialog.SaveChanges.Message=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05d0\u05dc -TrackPlottingPanel.Popup.MenuItem.Lines=\u05e7\u05d5\u05d5\u05d9\u05dd -TrackPlottingPanel.Popup.MenuItem.Points=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea -TrackPlottingPanel.Popup.MenuItem.Scale=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4... -TrackPlottingPanel.Popup.MenuItem.Print=\u05d4\u05d3\u05e4\u05e1... -TrackPlottingPanel.Popup.MenuItem.Measure=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 -TrackPlottingPanel.Popup.MenuItem.Analyze=\u05e0\u05ea\u05d7... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u05d4\u05ea\u05e7\u05e8\u05d1 -TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u05d4\u05ea\u05e8\u05d7\u05e7 -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u05d6\u05d5\u05dd \u05dc\u05de\u05e1\u05d2\u05e8\u05ea -TrackPlottingPanelInspector.Title=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 -TrackPlottingPanelInspector.Label.Min=\u05de\u05d9\u05e0\u05d9\u05de\u05d5\u05dd -TrackPlottingPanelInspector.Label.Max=\u05de\u05e7\u05e1\u05d9\u05de\u05d5\u05dd -TrackPlottingPanelInspector.Label.Auto=\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -TToolBar.Button.Footprint.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e2\u05e7\u05d1\u05d5\u05ea -TToolBar.Dropdown.SelectedTrack.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc -TToolBar.Dropdown.SelectedTrack.None=\u05d0\u05e3-\u05d0\u05d7\u05d3 -TTrack.MenuItem.Delete=\u05de\u05d7\u05e7 -TTrack.MenuItem.Color=\u05e6\u05d1\u05e2... -TTrack.Dialog.Color.Title=\u05d1\u05d7\u05e8 \u05e6\u05d1\u05e2 \u05de\u05e1\u05dc\u05d5\u05dc -TTrack.MenuItem.Name=\u05e9\u05dd... -TTrack.MenuItem.Footprint=\u05e2\u05e7\u05d1\u05d5\u05ea -TTrack.MenuItem.Description=\u05d4\u05e2\u05e8\u05d5\u05ea... -TTrack.MenuItem.Visible=\u05e0\u05e8\u05d0\u05d4 -TTrack.MenuItem.TrailVisible=\u05d4\u05e8\u05d0\u05d4 \u05de\u05e1\u05dc\u05d5\u05dc -TTrack.MenuItem.Autostep=\u05e6\u05e2\u05d3\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05d9\u05dd -TTrack.MenuItem.MarkByDefault=\u05e1\u05de\u05df \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -TTrack.MenuItem.Locked=\u05e0\u05e2\u05d5\u05dc -TTrack.MenuItem.Delete=\u05de\u05d7\u05e7 -TTrack.Name.None=\u05dc\u05dc\u05d0 \u05e9\u05dd -TTrack.Dialog.Description.Title=\u05d4\u05e2\u05e8\u05d5\u05ea: -TTrack.Dialog.Name.Title=\u05d4\u05d2\u05d3\u05e8 \u05e9\u05dd -TTrack.Dialog.Name.Label=\u05e9\u05dd: -TViewChooser.Button.Choose.Tooltip=\u05d1\u05d7\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d4 -Vector.Name=\u05d5\u05e7\u05d8\u05d5\u05e8 -Vector.New.Name=\u05d5\u05e7\u05d8\u05d5\u05e8 -Vector.MenuItem.ToOrigin=\u05dc\u05e8\u05d0\u05e9\u05d9\u05ea -Vector.MenuItem.Label=\u05d4\u05e6\u05d2 \u05ea\u05d5\u05d9\u05ea -VectorSum.Name=\u05e1\u05db\u05d5\u05dd \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9 -VectorSum.New.Name=\u05e1\u05db\u05d5\u05dd -VectorSum.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd... -VectorSumInspector.Title=\u05e1\u05db\u05d5\u05dd \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9 -VectorSumInspector.Border.Title=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd -WorldTView.Popup.MenuItem.Projectile=\u05de\u05e6\u05d1 \u05e7\u05dc\u05d9\u05e2 1 - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 1 -AnalyticParticle.Inspector.Title=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 1 -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=\u05e8\u05d3\u05d9\u05d5\u05e1 4 -CircleFootprint.Circle_6=\u05e8\u05d3\u05d9\u05d5\u05e1 6 -CircleFootprint.Circle_8=\u05e8\u05d3\u05d9\u05d5\u05e1 8 -DynamicParticle.Name=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 1 (\u05e7\u05e8\u05d8\u05d6\u05d9) -DynamicParticle.Inspector.Title=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 1 -DynamicParticle.Property.ForceX=\u05db\u05d7 x -DynamicParticle.Property.ForceY=\u05db\u05d7 y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=\u05de\u05e7\u05d5\u05dd \u05de\u05e7\u05d5\u05d1\u05e2 -ParticleModel.New.Name=\u05de\u05e6\u05d1l -ParticleModel.MenuItem.InspectModel=\u05d1\u05d5\u05e0\u05d4 \u05de\u05e6\u05d1 1 -ParticleModel.Inspector.Button.Undo=\u05d1\u05d8\u05dc -ParticleModel.Inspector.Button.Redo=\u05e9\u05d5\u05d1 -ParticleModel.Inspector.Button.Close=\u05e1\u05d2\u05d5\u05e8 -ParticleModel.Inspector.Button.Help=\u05e2\u05d6\u05e8\u05d4 - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=\u05e8\u05e7 X -Calibration.Axes.YOnly=\u05e8\u05e7 Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=\u05d1\u05d7\u05e8 \u05e6\u05d9\u05e8\u05d9 \u05db\u05d9\u05d5\u05dc -Calibration.Label.Axes=\u05e6\u05d9\u05e8\u05d9\u05dd -Calibration.Dialog.InvalidCoordinates.Title=\u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05dc\u05ea\u05d9 \u05d7\u05d5\u05e7\u05d9\u05d5\u05ea -Calibration.Dialog.InvalidCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea -Calibration.Dialog.InvalidXCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05d0\u05d5\u05ea\u05dd \u05e9\u05d9\u05e2\u05d5\u05e8\u05d9 x \u05d1\u05e7\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea -Calibration.Dialog.InvalidYCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05d0\u05d5\u05ea\u05dd \u05e9\u05d9\u05e2\u05d5\u05e8\u05d9 y \u05d1\u05e7\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea -SpectralLineFilter.Title=Gas Spectra -SpectralLineFilter.H=Hydrogen -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Mercury -TFrame.View.Unknown=\u05ea\u05e6\u05d5\u05d2\u05d4 -TMenuBar.MenuItem.Undo=\u05d1\u05d8\u05dc -TMenuBar.MenuItem.Redo=\u05e9\u05d5\u05d1 -TMenuBar.MenuItem.Replace=\u05d4\u05d7\u05dc\u05e3... -TMenuBar.Menu.AddImage=\u05d9\u05d1\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea -TMenuBar.MenuItem.AddBefore=\u05dc\u05e4\u05e0\u05d9 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5... -TMenuBar.MenuItem.AddAfter=\u05dc\u05d0\u05d7\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5... -TMenuBar.MenuItem.RemoveImage=\u05d4\u05e1\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 -TMenuBar.Menu.Tools=\u05db\u05dc\u05d9\u05dd -TMenuBar.MenuItem.DataFunctionTool=\u05d1\u05d5\u05e0\u05d4 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TMenuBar.MenuItem.DatasetTool=\u05db\u05dc\u05d9 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TMenuBar.Menu.CopyImage=\u05d4\u05e2\u05ea\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 -TMenuBar.MenuItem.CopyMainView=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea -TMenuBar.MenuItem.CopyFrame=\u05ea\u05de\u05d5\u05e0\u05d4 -TMenuBar.MenuItem.PrintFrame=\u05d4\u05d3\u05e4\u05e1... -TrackerIO.Dialog.AddImage.Title=\u05d9\u05d1\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea (\u05d1\u05d7\u05e8 \u05d0\u05d7\u05ea \u05d0\u05d5 \u05d9\u05d5\u05ea\u05e8) -TTrack.Dialog.Name.BadName=\u05d1\u05e9\u05d9\u05de\u05d5\u05e9. \u05d0\u05e0\u05d0 \u05d1\u05d7\u05e8 \u05e9\u05dd \u05d0\u05d7\u05e8 -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=\u05e1\u05da-\u05d4\u05db\u05dc \u05db\u05d7 -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d2\u05e8\u05e4\u05d9\u05ea \u05e9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 \u05de\u05e1\u05dc\u05d5\u05dc \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df -TableTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d8\u05d1\u05dc\u05d4 \u05e9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 \u05de\u05e1\u05dc\u05d5\u05dc \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df -TrackerPanel.Message.NoData0=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e8\u05d0\u05e9\u05d9\u05ea \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df -TrackerPanel.Message.NoData1=\u05d1\u05d7\u05e8 \u05e7\u05d5\u05d1\u05e5|\u05e4\u05ea\u05d7 \u05d0\u05d5 \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd|\u05d7\u05d3\u05e9 \u05dc\u05d4\u05ea\u05d7\u05dc\u05d4 -WorldTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05e9\u05dc \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=\u05e4\u05d5\u05ea\u05e8: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptive Multistep -DynamicParticle.Table.Force.Border.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05db\u05d7 (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05de\u05d9\u05e7\u05d5\u05dd (t) -ParticleModel.Table.Initial.Border.Title=\u05e2\u05e8\u05db\u05d9\u05dd \u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05d9\u05dd -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=\u05d4\u05d3\u05d1\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 -TMenuBar.MenuItem.PasteAfter=\u05dc\u05d0\u05d7\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 -TMenuBar.MenuItem.PasteBefore=\u05dc\u05e4\u05e0\u05d9 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 -TMenuBar.MenuItem.PasteReplace=\u05d4\u05d7\u05dc\u05e3 \u05e1\u05e8\u05d8 - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=\u05de\u05ea\u05d7\u05d9\u05dc\u05d9\u05dd... -Tracker.Splash.HelpMessage=\u05de\u05e9\u05ea\u05de\u05e9 \u05d7\u05d3\u05e9? \u05e8\u05d0\u05d4 -Tracker.Splash.Button.Help=\u05e2\u05d6\u05e8\u05d4 -Tracker.Splash.Button.OpenFile=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=\u05d6\u05d5\u05d9\u05ea \u05de\u05d4\u05d0\u05d5\u05e4\u05e7 -LineProfile.Checkbox.Rotates=\u05e1\u05d9\u05d1\u05d5\u05d1\u05d9\u05dd -LineProfile.Label.Spread=\u05e4\u05e8\u05d9\u05e9\u05d4 -RGBRegion.Name=\u05d0\u05d6\u05d5\u05e8 RGB Region -RGBRegion.New.Name=\u05d0\u05d6\u05d5\u05e8 -RGBRegion.MenuItem.Fixed=\u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05e7\u05d5\u05d1\u05e2 -RGBRegion.Label.Radius=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05e4\u05d9\u05e7\u05e1\u05dc -TTrack.Label.Step=\u05e6\u05e2\u05d3 - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=\u05de\u05e1\u05e4\u05d5\u05e8 \u05de\u05d9\u05e7\u05d5\u05dd -LineProfile.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -LineProfile.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -LineProfile.Data.Description.3=\u05d0\u05d3\u05d5\u05dd -LineProfile.Data.Description.4=\u05d9\u05e8\u05d5\u05e7 -LineProfile.Data.Description.5=\u05db\u05d7\u05d5\u05dc -LineProfile.Data.Description.6=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea \u05e0\u05ea\u05e4\u05e1\u05ea -LineProfile.Data.Description.7=\u05e2\u05d5\u05d1\u05d9 \u05e7\u05d5 -ParticleModel.MenuItem.TraceVisible=\u05de\u05e1\u05dc\u05d5\u05dc \u05e0\u05e8\u05d0\u05d4 -ParticleModel.MenuItem.StepsVisible=\u05e6\u05e2\u05d3 \u05e0\u05e8\u05d0\u05d4 -PointMass.Data.Description.0=\u05d6\u05de\u05df -PointMass.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -PointMass.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -PointMass.Data.Description.3=\u05d2\u05d5\u05d3\u05dc \u05de\u05d9\u05e7\u05d5\u05dd -PointMass.Data.Description.4=\u05d6\u05d5\u05d9\u05ea \u05de\u05d9\u05e7\u05d5\u05dd -PointMass.Data.Description.5=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d4\u05d9\u05e8\u05d5\u05ea -PointMass.Data.Description.6=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d4\u05d9\u05e8\u05d5\u05ea -PointMass.Data.Description.7=\u05d2\u05d5\u05d3\u05dc \u05de\u05d4\u05d9\u05e8\u05d5\u05ea -PointMass.Data.Description.8=\u05d6\u05d5\u05d9\u05ea \u05de\u05d4\u05d9\u05e8\u05d5\u05ea -PointMass.Data.Description.9=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05ea\u05d0\u05d5\u05e6\u05d4 -PointMass.Data.Description.10=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05ea\u05d0\u05d5\u05e6\u05d4 -PointMass.Data.Description.11=\u05d2\u05d5\u05d3\u05dc \u05ea\u05d0\u05d5\u05e6\u05d4 -PointMass.Data.Description.12=\u05d6\u05d5\u05d9\u05ea \u05ea\u05d0\u05d5\u05e6\u05d4 -PointMass.Data.Description.13=\u05d6\u05d5\u05d9\u05ea \u05e1\u05d9\u05d1\u05d5\u05d1 -PointMass.Data.Description.14=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea -PointMass.Data.Description.15=\u05ea\u05d0\u05d5\u05e6\u05d4 \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea -PointMass.Data.Description.16=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 -PointMass.Data.Description.17=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 -PointMass.Data.Description.18=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05ea\u05e0\u05e2 -PointMass.Data.Description.19=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05ea\u05e0\u05e2 -PointMass.Data.Description.20=\u05d2\u05d5\u05d3\u05dc \u05ea\u05e0\u05e2 -PointMass.Data.Description.21=\u05d6\u05d5\u05d9\u05ea \u05ea\u05e0\u05e2 -PointMass.Data.Description.22=\u05d0\u05e0\u05e8\u05d2\u05d9\u05d4 \u05e7\u05d9\u05e0\u05d8\u05d9\u05ea -RGBRegion.Data.Description.0=\u05d6\u05de\u05df -RGBRegion.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -RGBRegion.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -RGBRegion.Data.Description.3=\u05d0\u05d3\u05d5\u05dd -RGBRegion.Data.Description.4=\u05d9\u05e8\u05d5\u05e7 -RGBRegion.Data.Description.5=\u05db\u05d7\u05d5\u05dc -RGBRegion.Data.Description.6=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea \u05e0\u05ea\u05e4\u05e1\u05ea -RGBRegion.Data.Description.7=\u05de\u05d5\u05e0\u05d4 \u05e4\u05d9\u05e7\u05e1\u05dc\u05d9\u05dd -RGBRegion.Data.Description.8=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 -RGBRegion.Data.Description.9=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 -TView.Menuitem.Define=\u05d4\u05d2\u05d3\u05e8... -Vector.Data.Description.0=\u05d6\u05de\u05df -Vector.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x -Vector.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y -Vector.Data.Description.3=\u05d2\u05d5\u05d3\u05dc -Vector.Data.Description.4=\u05d6\u05d5\u05d9\u05ea -Vector.Data.Description.5=\u05de\u05d9\u05e7\u05d5\u05dd \u05d6\u05e0\u05d1, \u05e8\u05db\u05d9\u05d1 x -Vector.Data.Description.6=\u05de\u05d9\u05e7\u05d5\u05dd \u05d6\u05e0\u05d1, \u05e8\u05db\u05d9\u05d1 y -Vector.Data.Description.7=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 -Vector.Data.Description.8=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=\u05de\u05e1\u05ea \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d6\u05d4 -ParticleModel.Parameter.InitialTime.Description=\u05d6\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9 -AnalyticParticle.PositionFunction.X.Description=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -AnalyticParticle.PositionFunction.Y.Description=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd -DynamicParticle.ForceFunction.X.Description=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05db\u05d7 -DynamicParticle.ForceFunction.Y.Description=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05db\u05d7 -DynamicParticle.Parameter.InitialX.Description=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9, \u05e8\u05db\u05d9\u05d1 x -DynamicParticle.Parameter.InitialY.Description=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9, \u05e8\u05db\u05d9\u05d1 y -DynamicParticle.Parameter.InitialVelocityX.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea, \u05e8\u05db\u05d9\u05d1 x -DynamicParticle.Parameter.InitialVelocityY.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea, \u05e8\u05db\u05d9\u05d1 y -TrackerPanel.ModelBuilder.Title=\u05d1\u05d5\u05e0\u05d4 \u05de\u05d5\u05d3\u05dc\u05d9\u05dd -TrackerPanel.DataBuilder.Title=\u05d1\u05d5\u05e0\u05d4 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TrackControl.TrailMenu.NoTrail=\u05dc\u05dc\u05d0 \u05e2\u05e7\u05d1\u05d5\u05ea -TrackControl.TrailMenu.ShortTrail=\u05e2\u05e7\u05d1\u05d5\u05ea \u05e7\u05e6\u05e8\u05d9\u05dd -TrackControl.TrailMenu.LongTrail=\u05e2\u05e7\u05d1\u05d5\u05ea \u05d0\u05e8\u05d5\u05db\u05d9\u05dd -TrackControl.TrailMenu.FullTrail=\u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd -TrackerPanel.ModelBuilder.Spinner.Tooltip=\u05e2\u05d5\u05d1\u05d3 \u05d1\u05de\u05e6\u05d1 1 -TrackerPanel.ModelBuilder.LineButton.Text=\u05e1\u05d2\u05e0\u05d5\u05df \u05e7\u05d5 -TrackerPanel.ModelBuilder.LineButton.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e1\u05d2\u05e0\u05d5\u05df \u05e7\u05d5 -ParticleModel.LineStyle.None=\u05dc\u05dc\u05d0 \u05e7\u05d5 -ParticleModel.LineStyle.Connect=\u05d7\u05d1\u05e8 \u05e6\u05e2\u05d3\u05d9\u05dd -ParticleModel.LineStyle.Smooth=\u05e7\u05d5 \u05d7\u05dc\u05e7 -ModelFunctionPanel.Label=\u05de\u05e6\u05d11 -AnalyticFunctionPanel.FunctionEditor.Border.Title=\u05de\u05e9\u05d5\u05d5\u05d0\u05ea \u05de\u05d9\u05e7\u05d5\u05dd -DynamicFunctionPanel.FunctionEditor.Border.Title=\u05de\u05e9\u05d5\u05d5\u05d0\u05ea \u05db\u05d7 - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=\u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05d1\u05dc\u05d4 \u05e0\u05e8\u05d0\u05d5\u05ea -Tracker.About.ProjectOf=\u05e4\u05e8\u05d5\u05d9\u05d9\u05e7\u05d8 \u05e9\u05dc: -Tracker.About.TranslationBy=\u05ea\u05d5\u05e8\u05d2\u05dd \u05e2"\u05d9 -# following entry (Tracker.About.Translator) should be name(s) of translator(s) -Tracker.About.Translator=\u05e2\u05de\u05d9\u05ea \u05e7\u05e0\u05d9 -TMenuBar.Menu.SaveVideoAs=\u05e9\u05de\u05d5\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05db -TActions.SaveClipAs.ProgressMonitor.Message=\u05e9\u05d5\u05de\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05db -TActions.SaveClipAs.ProgressMonitor.Progress=\u05d4\u05d5\u05e9\u05dc\u05dd - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=\u05e1\u05d9\u05e0\u05db\u05e8\u05d5\u05e0\u05d9\u05d6\u05e6\u05d9\u05d4 -PlotTrackView.Checkbox.Synchronize.Tooltip=\u05e1\u05e0\u05db\u05e8\u05df \u05e6\u05d9\u05e8 \u05d0\u05d5\u05e4\u05e7\u05d9 -RGBRegion.MenuItem.FixedRadius=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05de\u05e7\u05d5\u05d1\u05e2 -Tracker.VideoZoom.Hint=\u05dc\u05d7\u05e5 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e7\u05e8\u05d1 \u05d0\u05d5 \u05dc\u05d4\u05ea\u05e8\u05d7\u05e7. \u05dc\u05d7\u05e5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd -Tracker.PlotZoomIn.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e7\u05e8\u05d1. \u05dc\u05d7\u05e5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05d1\u05d0\u05d5\u05e4\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -Tracker.PlotZoomOut.Hint=\u05dc\u05d7\u05e5 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e8\u05d7\u05e7 -Tracker.MenuItem.Hints=\u05d4\u05e8\u05d0\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd -TapeMeasure.Label.Length=\u05d0\u05d5\u05e8\u05da -TapeMeasure.Label.TapeAngle=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 x -TapeMeasure.Label.ArcAngle=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea -TrackerIO.Dialog.NotAnImage.Title=\u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 \u05e9\u05d2\u05d5\u05d9 -TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. -TrackerIO.Dialog.NotAnImage.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da? -TToolBar.Button.Zoom.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e8\u05d7\u05e7 \u05ea\u05e6\u05d5\u05d2\u05d4 -TrackChooserTView.DropDown.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc -TapeMeasure.Field.TapeAngle.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 \u05d4- x \u05dc\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 -TapeMeasure.Field.Magnitude.Tooltip=\u05d0\u05d5\u05e8\u05da \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05de\u05db\u05d5\u05d5\u05e0\u05d5\u05ea -TapeMeasure.Readout.Magnitude.Name=\u05d0\u05d5\u05e8\u05da -TapeMeasure.Readout.Magnitude.Hint=\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea -TapeMeasure.Readout.Angle.Name=\u05e7\u05e8\u05d9\u05d0\u05ea \u05d6\u05d5\u05d9\u05ea -TapeMeasure.Readout.Angle.Hint=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 \u05d4- x -TapeMeasure.End.Name=\u05e1\u05d5\u05e3 -TapeMeasure.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05de\u05e8\u05d7\u05e7 \u05d5\u05d6\u05d5\u05d9\u05ea. shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 -TapeMeasure.Handle.Name=\u05d9\u05d3\u05d9\u05ea -TapeMeasure.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 -Vector.Tip.Name=\u05d8\u05d9\u05e4 -Vector.Tip.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 -Vector.Handle.Name=\u05d9\u05d3\u05d9\u05ea -Vector.Handle.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 -Vector.ShortHandle.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4, alt \u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d1\u05d7\u05d5\u05e8 \u05d8\u05d9\u05e4 -PointMass.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd -PointMass.Position.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 -PointMass.Velocity.Name=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea -PointMass.Acceleration.Name=\u05ea\u05d0\u05d5\u05e6\u05d4 -PointMass.Vector.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 -PointMass.Position.Locked.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d2\u05e8\u05d5\u05e8 -CoordAxes.Handle.Name=\u05e6\u05d9\u05e8 x \u05d7\u05d9\u05d5\u05d1\u05d9 -CoordAxes.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 -CoordAxes.Origin.Name=\u05e8\u05d0\u05e9\u05d9\u05ea -CoordAxes.Origin.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05de\u05d9\u05e7\u05d5\u05dd -OffsetOrigin.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd -OffsetOrigin.Position.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05d4\u05e8\u05d0\u05e9\u05d9\u05ea -Calibration.Point.Name=\u05e0\u05e7\u05d5\u05d3\u05d4 -Calibration.Point.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e6\u05d9\u05e8\u05d9\u05dd \u05d5\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 -RGBRegion.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd -RGBRegion.Position.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05de\u05d9\u05e7\u05d5\u05dd -LineProfile.End.Name=\u05e1\u05d5\u05e3 -LineProfile.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05ea\u05d0\u05de\u05ea \u05d0\u05d5\u05e8\u05da \u05e7\u05d5 -LineProfile.Handle.Name=\u05d9\u05d3\u05d9\u05ea -LineProfile.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05d4\u05e7\u05d5 -PointMass.Hint=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e1\u05d4 \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd -PointMass.Unmarked.Hint=, shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df -TTrack.Unselected.Hint=\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d0\u05d5 \u05d4\u05d2\u05d3\u05e8\u05ea \u05ea\u05db\u05d5\u05e0\u05d5\u05ea -Vector.Unmarked.Hint=shift \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df -OffsetOrigin.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 -Calibration.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05e0\u05e7\u05d5\u05d3\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 -Calibration.Halfmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 -CenterOfMass.Empty.Hint=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e2\u05e8\u05db\u05ea -VectorSum.Empty.Hint=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05e1\u05db\u05d5\u05dd -TapeMeasure.Hint=\u05d2\u05e8\u05d5\u05e8 \u05e7\u05e6\u05d5\u05d5\u05ea \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05de\u05e8\u05d7\u05e7\u05d9\u05dd \u05d5\u05d6\u05d5\u05d9\u05d5\u05ea -CoordAxes.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 -ParticleModel.Hint=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e1\u05d4 \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd, \u05d4\u05db\u05e0\u05e1 \u05d1\u05d9\u05d8\u05d5\u05d9 \u05dc\u05d1\u05d5\u05e0\u05d4 \u05d4\u05de\u05d5\u05d3\u05dc\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05d0\u05e0\u05d9\u05de\u05e6\u05d9\u05d4 -RGBRegion.Hint=\u05d4\u05db\u05e0\u05e1 \u05e8\u05d3\u05d9\u05d5\u05e1 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05d4\u05d2\u05d5\u05d3\u05dc -RGBRegion.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d9\u05e7\u05d5\u05dd -TTrack.ImportVideo.Hint=\u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 \u05d0\u05d5 \u05ea\u05de\u05d5\u05e0\u05d4 \u05dc\u05de\u05d3\u05d9\u05d3\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd -TTrack.Selected.Hint=\u05e0\u05d1\u05d7\u05e8 -LineProfile.Hint=\u05d4\u05db\u05e0\u05e1 \u05e8\u05d9\u05d5\u05d5\u05d7 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e2\u05d5\u05d1\u05d9 \u05e7\u05d5 -LineProfile.Unmarked.Hint=shift \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e6\u05d9\u05d5\u05e8 \u05e7\u05d5 -LineProfile.Menu.Orientation=\u05db\u05d9\u05d5\u05d5\u05df -LineProfile.MenuItem.Horizontal=\u05d0\u05d5\u05e4\u05e7\u05d9 -LineProfile.MenuItem.XAxis=\u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4-X -Footprint.PositionVector=\u05d5\u05e7\u05d8\u05d5\u05e8 -Footprint.BoldPositionVector=\u05d5\u05e7\u05d8\u05d5\u05e8 \u05de\u05d5\u05d3\u05d2\u05e9 -Tracker.Startup.Hint=\u05d4\u05d1\u05d8 \u05e4\u05d4 \u05dc\u05e8\u05de\u05d6\u05d9\u05dd (\u05d0\u05d5 \u05db\u05d1\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd \u05d1\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05e2\u05d6\u05e8\u05d4), \u05dc\u05d7\u05e5 F1 \u05d1\u05db\u05dc \u05de\u05e6\u05d1 \u05dc\u05e7\u05d1\u05dc\u05ea \u05e2\u05d6\u05e8\u05d4 -TrackerPanel.NoVideo.Hint=\u05e4\u05ea\u05d7 \u05d0\u05d5 \u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 \u05dc\u05e0\u05d9\u05ea\u05d5\u05d7 -TrackerPanel.CalibrateVideo.Hint=\u05db\u05d9\u05d9\u05dc \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05db\u05dc\u05d9 \u05d4\u05db\u05d9\u05d5\u05dc -TrackerPanel.NoTracks.Hint=\u05e6\u05d5\u05e8 \u05de\u05e2\u05e7\u05d1 \u05d7\u05d3\u05e9 \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05d0\u05ea \u05d4\u05d3\u05d1\u05e8 \u05e9\u05de\u05e2\u05e0\u05d9\u05d9\u05df \u05d0\u05d5\u05ea\u05da -TrackerPanel.SetClip.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5 \u05d1\u05d7\u05df \u05d0\u05ea \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df -TrackerPanel.ShowAxes.Hint=\u05d4\u05d2\u05d3\u05e8 \u05e8\u05d0\u05e9\u05d9\u05ea \u05d5\u05d6\u05d5\u05d9\u05ea \u05dc\u05de\u05e2\u05e8\u05db\u05ea \u05d4\u05e6\u05d9\u05e8\u05d9\u05dd -VideoPlayer.Step.Hint=\u05e6\u05e2\u05d3 \u05e7\u05d3\u05d9\u05de\u05d4 (\u05e7\u05d9\u05e6\u05d5\u05e8: PageDown) -VideoPlayer.Back.Hint=\u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 (\u05e7\u05d9\u05e6\u05d5\u05e8: PageUp) -TrackerPanel.DVVideo.Hint=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05de\u05e1\u05e0\u05df \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc \u05dc\u05ea\u05d9\u05e7\u05d5\u05df \u05e2\u05d9\u05d5\u05d5\u05ea\u05d9\u05dd \u05d1\u05e1\u05e8\u05d8 \u05de\u05e1\u05d5\u05d2 DV -TrackerIO.DataFileFilter.Description=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 (.trk) -Tracker.Button.PDFHelp=\u05d2\u05e8\u05e1\u05ea PDF \u05dc\u05d4\u05d3\u05e4\u05e1\u05d4 -TToolbar.Button.TapeVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4, \u05d4\u05e1\u05ea\u05e8, \u05d0\u05d5 \u05e6\u05d5\u05e8 \u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=\u05d1\u05e7\u05e8\u05ea \u05de\u05e2\u05e7\u05d1 -TMenuBar.MenuItem.Description=\u05d4\u05e2\u05e8\u05d5\u05ea -TrackPlottingPanel.RightDrag.Hint=\u05dc\u05d7\u05e6\u05df \u05e2\u05db\u05d1\u05e8 \u05d9\u05de\u05e0\u05d9 \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea -TMenuBar.MenuItem.DeleteSelectedPoint=\u05e6\u05e2\u05d3 \u05e0\u05d1\u05d7\u05e8 -TFrame.InfoDialog.SaveChanges.Title=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd -TFrame.InfoDialog.SaveChanges.Message=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=\u05e7\u05e8\u05d8\u05d6\u05d9 -DynamicParticle.Editor.Button.Polar=\u05e4\u05d5\u05dc\u05e8\u05d9 -DynamicParticle.Parameter.InitialR.Description=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9 -DynamicParticle.Parameter.InitialTheta.Description=\u05d6\u05d5\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea -DynamicParticle.Parameter.InitialVelocityR.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea -DynamicParticle.Parameter.InitialOmega.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea -DynamicParticle.ForceFunction.R.Description=\u05e8\u05db\u05d9\u05d1 \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9 \u05e9\u05dc \u05d4\u05db\u05d7 -DynamicParticle.ForceFunction.Theta.Description=\u05e8\u05db\u05d9\u05d1 \u05de\u05e9\u05d9\u05e7\u05d9 \u05e9\u05dc \u05d4\u05db\u05d7 -DynamicParticlePolar.Name=\u05de\u05d5\u05d3\u05dc \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e4\u05d5\u05dc\u05e8\u05d9) -TMenuBar.Menu.DynamicParticle=\u05de\u05d5\u05d3\u05dc \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 -TMenuBar.MenuItem.Cartesian=\u05e7\u05e8\u05d8\u05d6\u05d9 -TMenuBar.MenuItem.Polar=\u05e4\u05d5\u05dc\u05e8\u05d9 - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotracker... -Dialog.Button.Help=\u05e2\u05d6\u05e8\u05d4 -AutoTracker.Wizard.Button.Reset=\u05de\u05d4\u05ea\u05d7\u05dc\u05d4 -AutoTracker.Wizard.Button.Back=\u05d0\u05d7\u05d5\u05e8\u05d4 -AutoTracker.Wizard.Button.Next=\u05e6\u05e2\u05d3 -AutoTracker.Wizard.Button.Accept=\u05d0\u05e9\u05e8 -AutoTracker.Wizard.Button.Search=\u05d7\u05e4\u05e9 -AutoTracker.Wizard.Button.Pause=\u05d3\u05d5\u05dd -AutoTracker.Wizard.Button.Skip=\u05d3\u05dc\u05d2 -AutoTracker.Label.Mask=\u05ea\u05d1\u05e0\u05d9\u05ea -AutoTracker.Label.AcceptLevel=\u05e2\u05e8\u05da \u05e1\u05e3 -AutoTracker.TabbedPane.TabTitle.Mask=\u05ea\u05d1\u05e0\u05d9\u05ea -AutoTracker.TabbedPane.TabTitle.Target=\u05de\u05d8\u05e8\u05d4 -AutoTracker.TabbedPane.TabTitle.Settings=\u05d0\u05e9\u05e8 -AutoTracker.TabbedPane.TabTitle.Search=\u05d7\u05e4\u05e9 -AutoTracker.Info.GetStarted=\u05dc\u05d9\u05e6\u05d5\u05e8 \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d7\u05d3\u05e9\u05d4, shift-control-\u05dc\u05d7\u05d9\u05e6\u05d4 \u05e2\u05dc \u05e4\u05e8\u05d9\u05d8 \u05d4\u05e8\u05e6\u05d5\u05d9 -AutoTracker.Info.Mask1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05de\u05d2\u05d3\u05d9\u05e8\u05d4 \u05d3\u05de\u05d5\u05ea \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05d1\u05db\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05e8\u05e6\u05e3 \u05d4\u05e1\u05e8\u05d8. -AutoTracker.Info.Mask2=\u05d4\u05d9\u05d0 \u05de\u05ea\u05e4\u05ea\u05d7\u05ea \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05d0\u05ea \u05e2\u05e6\u05de\u05d4 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9 \u05e6\u05d5\u05e8\u05d4 \u05d5\u05e6\u05d1\u05e2 \u05d1\u05de\u05e9\u05da \u05d4\u05d6\u05de\u05df. \u05e7\u05e6\u05d1 \u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d2\u05d1\u05d5\u05d4 \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d7\u05e8\u05d9 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05de\u05d4\u05d9\u05e8\u05d9\u05dd, \u05d0\u05da \u05e4\u05d7\u05d5\u05ea \u05de\u05d3\u05d5\u05d9\u05d9\u05e7 \u05dc\u05d0\u05d5\u05e8\u05da \u05d6\u05de\u05df. -AutoTracker.Info.MaskLocked1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05e0\u05e2\u05d5\u05dc\u05d4 \u05d5\u05d1\u05e9\u05d9\u05de\u05d5\u05e9 -AutoTracker.Info.MaskLocked2=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 "\u05de\u05d7\u05d3\u05e9" \u05db\u05d3\u05d9 \u05dc\u05e0\u05e7\u05d5\u05ea \u05d0\u05ea \u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd \u05d5\u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05de\u05d4\u05ea\u05d7\u05dc\u05d4 -AutoTracker.Info.Target1=\u05d4\u05de\u05d8\u05e8\u05d4 \u05de\u05e1\u05d5\u05de\u05e0\u05ea \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea \u05dc\u05e0\u05d9\u05e7\u05d5\u05d3 \u05de\u05e2\u05dc \u05d4\u05e1\u05e3 \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -AutoTracker.Info.Target2=\u05d8\u05d9\u05e4: \u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05d0\u05e4\u05d9\u05dc\u05d5 \u05dc\u05d0\u05d7\u05e8 \u05e9\u05d1\u05d9\u05e6\u05e2\u05ea \u05e6\u05e2\u05d3. \u05e6\u05e2\u05d3\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05d9\u05dd \u05d9\u05d6\u05d5\u05d6\u05d5 \u05de\u05e2\u05e6\u05de\u05dd \u05e2\u05dd \u05d4\u05de\u05d8\u05e8\u05d4. -AutoTracker.Info.TargetLocked=\u05d4\u05de\u05d8\u05e8\u05d4 \u05e7\u05d9\u05d9\u05de\u05ea \u05d5\u05e7\u05e9\u05d5\u05e8\u05d4 \u05dc\u05de\u05d9\u05e7\u05d5\u05dd \u05e6\u05e2\u05d3\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05d9\u05dd. \u05d4\u05d6\u05d6\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05ea\u05d6\u05d9\u05d6 \u05d2\u05dd \u05d0\u05ea \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd \u05d4\u05e7\u05d9\u05d9\u05de\u05d9\u05dd. -AutoTracker.Info.Settings1=\u05e0\u05d9\u05e7\u05d5\u05d3 \u05de\u05e2\u05d1\u05e8 \u05dc\u05e2\u05e8\u05da \u05d4\u05e1\u05e3 \u05de\u05e1\u05d5\u05de\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. -AutoTracker.Info.Settings2=\u05d8\u05d9\u05e4: \u05d4\u05d5\u05e8\u05d3\u05ea \u05e2\u05e8\u05da \u05d4\u05e1\u05e3 \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05de\u05d2\u05d3\u05d9\u05dc\u05d4 \u05d0\u05ea \u05d4\u05e1\u05d9\u05db\u05d5\u05d9 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05e9\u05d2\u05d5\u05d9. \u05e0\u05e1\u05d4 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea. -AutoTracker.Info.Search1=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05e7\u05e6\u05d5\u05d5\u05ea \u05e9\u05dc\u05d5 \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea \u05d1\u05d4\u05ea\u05d0\u05de\u05d4. -AutoTracker.Info.Search2=\u05d8\u05d9\u05e4: \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d1\u05d3\u05e8\u05da-\u05db\u05dc\u05dc \u05dc\u05d0 \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc. \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea "\u05d4\u05d1\u05d8 \u05e7\u05d3\u05d9\u05de\u05d4" \u05d7\u05d5\u05d6\u05d4 \u05d0\u05ea \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05d7\u05d3\u05e9 \u05d5\u05de\u05d6\u05d9\u05d6\u05d4 \u05d1\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. -AutoTracker.Info.Frame=\u05de\u05e1\u05d2\u05e8\u05ea -AutoTracker.Info.Match=\u05d4\u05d4\u05ea\u05d0\u05de\u05d4 \u05e1\u05d5\u05de\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. -AutoTracker.Info.Possible=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05e0\u05de\u05e6\u05d0\u05d4 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d4\u05de\u05d5\u05e6\u05d2. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: -AutoTracker.Info.NoMatch=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d4 \u05d4\u05ea\u05d0\u05de\u05d4 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: -AutoTracker.Info.Outside=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05de\u05d7\u05d5\u05e5 \u05dc\u05ea\u05de\u05d5\u05e0\u05d4. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: -AutoTracker.Info.Accepted=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d4\u05ea\u05e7\u05d1\u05dc\u05d4. -AutoTracker.Info.MarkedByUser=\u05d4\u05e6\u05e2\u05d3 \u05e1\u05d5\u05de\u05df \u05d9\u05d3\u05e0\u05d9\u05ea \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d4\u05de\u05e9\u05ea\u05de\u05e9. -AutoTracker.Info.NoVideo=\u05de\u05e2\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05d3\u05d5\u05e8\u05e9 \u05e1\u05e8\u05d8. -AutoTracker.Info.Height=\u05d2\u05d5\u05d1\u05d4 -AutoTracker.Info.Width=\u05e8\u05d5\u05d7\u05d1 -AutoTracker.Info.Accept=--\u05e7\u05d1\u05dc \u05d4\u05ea\u05d0\u05de\u05d4 -AutoTracker.Info.Retry=--\u05e9\u05e0\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d5\u05d7\u05e4\u05e9 \u05e9\u05d5\u05d1 -AutoTracker.Info.Mark=--shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d9\u05d3\u05e0\u05d9 -AutoTracker.Info.Skip=--\u05d3\u05dc\u05d2 \u05e2\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d5\u05d4\u05de\u05e9\u05da \u05dc\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05d1\u05d0\u05d4 -AutoTracker.Info.Reset=--\u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 \u05dc\u05ea\u05de\u05d5\u05e0\u05d4 \u05e9\u05e1\u05d5\u05de\u05e0\u05d4 \u05db\u05d4\u05dc\u05db\u05d4 \u05d5- shift-control \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e1\u05d2\u05e8\u05ea \u05d7\u05d3\u05e9\u05d4 -AutoTracker.Info.MatchScore=\u05e0\u05d9\u05e7\u05d5\u05d3 \u05d4\u05ea\u05d0\u05de\u05d4 -AutoTracker.Dialog.MaskLocked.Title=\u05ea\u05d1\u05e0\u05d9\u05ea \u05e0\u05e2\u05d5\u05dc\u05d4 -PointMass.Cursor.Autotrack.Description=\u05e1\u05de\u05df \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -VideoPlayer.StartFrame.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 -VideoPlayer.EndFrame.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 -VideoPlayer.Slider.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05e8\u05d5\u05e7 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df -FileDropHandler.Dialog.BadFile.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d8\u05e2\u05d5\u05df. -FileDropHandler.Dialog.BadFile.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05de\u05d6\u05d5\u05d4\u05d4 - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Apply -DynamicParticle.Dialog.Delete.Message=\u05de\u05d7\u05d9\u05e7\u05ea \u05d4\u05d7\u05dc\u05e7\u05d9\u05e7 \u05ea\u05d5\u05e6\u05d9\u05d0 \u05d0\u05d5\u05ea\u05d5 \u05de\u05d4\u05de\u05e2\u05e8\u05db\u05ea. \u05dc\u05de\u05d7\u05d5\u05e7 \u05d1\u05db\u05dc\u05d6\u05d0\u05ea? -DynamicParticle.Dialog.Delete.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea -DynamicParticle.System.In=\u05d1\u05ea\u05d5\u05da -DynamicSystem.Empty=\u05e8\u05d9\u05e7 -DynamicSystem.Force.Name.Internal=\u05e4\u05e0\u05d9\u05de\u05d9 -DynamicSystem.ForceFunction.R.Description=\u05e8\u05db\u05d9\u05d1 \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9 \u05e9\u05dc \u05db\u05d7 \u05e4\u05e0\u05d9\u05de\u05d9 -DynamicSystem.ForceFunction.Theta.Description=\u05e8\u05db\u05d9\u05d1 \u05de\u05e9\u05d9\u05e7\u05d9 \u05e9\u05dc \u05db\u05d7 \u05e4\u05e0\u05d9\u05de\u05d9 -DynamicSystem.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05d7\u05dc\u05e7\u05d9\u05e7... -DynamicSystem.Name=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea - \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd -DynamicSystem.New.Name=\u05de\u05e2\u05e8\u05db\u05ea -DynamicSystem.Parameter.Of=\u05e9\u05dc -DynamicSystem.Parameter.RelativeTo=\u05d9\u05d7\u05e1\u05d9\u05ea \u05d0\u05dc -DynamicSystem.Parameter.Name.Relative=\u05d9\u05d7\u05e1\u05d9 -DynamicSystem.Parameter.ParticleMass.Description=\u05de\u05e1\u05d4 \u05e9\u05dc -DynamicSystem.Parameter.Mass.Description=\u05e1\u05da-\u05db\u05dc \u05d4\u05de\u05e1\u05d4 \u05d1\u05de\u05e2\u05e8\u05db\u05ea -DynamicSystemInspector.Border.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 -DynamicSystemInspector.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd -DynamicSystemInspector.Button.Change=\u05e9\u05e0\u05d4 \u05dc... -DynamicSystemInspector.ParticleName.None=(\u05d0\u05e3-\u05d0\u05d7\u05d3) -TMenuBar.MenuItem.Clone=\u05e9\u05d1\u05d8 -TMenuBar.MenuItem.TwoBody=\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd -Tracker.Splash.Button.About=\u05d1\u05e7\u05e9\u05e8 -TrackerPanel.DataBuilder.Dropdown.Tooltip=\u05de\u05e1\u05dc\u05d5\u05dc \u05e0\u05d1\u05d7\u05e8 \u05e0\u05d5\u05db\u05d7\u05d9 -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\u05e1\u05e0\u05db\u05e8\u05df \u05e6\u05d9\u05e8 \u05d0\u05e0\u05db\u05d9 -TrackControl.Button.Trace.ToolTip=\u05d4\u05e8\u05d0\u05d4 \u05d0\u05d5 \u05d4\u05e1\u05ea\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc -TToolBar.Button.Open.Tooltip=\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d8 \u05d0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d1\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d7\u05d3\u05e9\u05d4 -TToolBar.Button.Save.Tooltip=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05d1\u05e7\u05d5\u05d1\u05e5 -TToolBar.Button.SelectTrack=\u05d1\u05d7\u05e8 -TToolBar.Button.SelectTrack.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc \u05e7\u05d9\u05d9\u05dd -TTrack.MenuItem.ClearSteps=\u05e0\u05e7\u05d4 \u05e6\u05e2\u05d3\u05d9\u05dd -PointMass.MenuItem.Position=\u05de\u05d9\u05e7\u05d5\u05dd -TMenuBar.MenuItem.Empty=(\u05e8\u05d9\u05e7) -TTrackBar.Button.Memory=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d1\u05e9\u05d9\u05de\u05d5\u05e9: -TTrackBar.Button.Memory.Tooltip=\u05e2\u05e7\u05d5\u05d1 \u05d5\u05e0\u05d4\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df -TTrackBar.Memory.PopupItem.Launch1=\u05e9\u05d2\u05e8 -TTrackBar.Memory.PopupItem.Launch2=\u05e2\u05dd \u05d6\u05d9\u05db\u05e8\u05d5\u05df -TButton.Track.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd \u05e9\u05dc -Tracker.Dialog.OutOfMemory.Message1=\u05dc\u05d8\u05e8\u05e7\u05e8 \u05e0\u05d2\u05de\u05e8 \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df :-( -Tracker.Dialog.OutOfMemory.Message2=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea -Tracker.Dialog.OutOfMemory.Title=\u05d0\u05d6\u05dc \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=\u05d4\u05d1\u05d8 \u05e7\u05d3\u05d9\u05de\u05d4 -AutoTracker.Label.Original=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 -AutoTracker.Label.NoMask=\u05d0\u05e3-\u05d0\u05d7\u05d3 -AutoTracker.Label.Rate=\u05e7\u05e6\u05d1: -AutoTracker.Info.Mask3=\u05d8\u05d9\u05e4: \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05dc\u05d0 \u05e6\u05e8\u05d9\u05db\u05d4 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc\u05d4 \u05d5\u05dc\u05d0 \u05e6\u05e8\u05d9\u05db\u05d4 \u05dc\u05db\u05dc\u05d5\u05dc \u05d0\u05ea \u05db\u05d5\u05dc \u05d4\u05d7\u05e4\u05e5. \u05e4\u05e8\u05d8 \u05de\u05d9\u05d5\u05d7\u05d3 \u05d5\u05d1\u05d5\u05dc\u05d8 \u05d1\u05d3\u05e8\u05dc-\u05db\u05dc\u05dc \u05e2\u05d5\u05d1\u05d3 \u05d4\u05db\u05d9 \u05d8\u05d5\u05d1. -AutoTracker.Wizard.Checkbox.XAxis=\u05e8\u05e7 \u05e6\u05d9\u05e8 x -AutoTracker.Info.SearchOnAxis1=\u05e6\u05d9\u05e8 \u05d4-x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4. \u05d4\u05d6\u05d6 \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e2"\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05e8\u05db\u05d6 \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea. -AutoTracker.Info.PossibleOnAxis=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05e0\u05de\u05e6\u05d0\u05d4 \u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4- x. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05df: -AutoTracker.Info.NoMatchOnAxis=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d4 \u05d4\u05ea\u05d0\u05de\u05d4 \u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4-x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05df: -AutoTracker.Info.RetryOnAxis=--\u05d4\u05d6\u05d6 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d0\u05d5 \u05e6\u05d9\u05e8 \u05d4- x \u05d5\u05d7\u05e4\u05e9 \u05e9\u05d5\u05d1 -AutoTracker.Wizard.Button.Delete=\u05de\u05d7\u05e7 -AutoTracker.Wizard.Button.DeleteMore=\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05d4\u05d1\u05d0\u05d5\u05ea -Button.Define.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05e2\u05de\u05d5\u05d3\u05ea \u05de\u05e9\u05ea\u05e0\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05ea -Calibration.Label.Point=\u05e0\u05e7\u05d5\u05d3\u05d4 -CalibrationStick.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05d0\u05d5 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, \u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05e9\u05d9\u05e4\u05d5\u05e2 -CalibrationStick.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 -CalibrationStick.New.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc -CalibrationTapeMeasure.New.Name=\u05e1\u05e8\u05d8 \u05db\u05d9\u05d5\u05dc -CalibrationTapeMeasure.Readout.Magnitude.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d4\u05db\u05e0\u05e1\u05ea \u05d0\u05d5\u05e8\u05da \u05d9\u05d3\u05d5\u05e2 \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea -CalibrationTapeMeasure.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, \u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 -DynamicSystem.Data.Description.0=\u05de\u05e8\u05d7\u05e7 \u05d9\u05d7\u05e1\u05d9 \u05d1\u05d9\u05df \u05d7\u05dc\u05e7\u05d9\u05e7\u05d9\u05dd -DynamicSystem.Data.Description.1=\u05d6\u05d5\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea -DynamicSystem.Data.Description.2=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea -DynamicSystem.Data.Description.3=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea -ExportDataDialog.Subtitle.Table=\u05d8\u05d1\u05dc\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -ExportDataDialog.Subtitle.Content=\u05ea\u05d0\u05d9\u05dd -ExportDataDialog.Subtitle.Format=\u05e2\u05d9\u05e6\u05d5\u05d1 \u05de\u05e1\u05e4\u05e8 -ExportDataDialog.Subtitle.Delimiter=\u05de\u05e7\u05d1\u05e5 -ExportDataDialog.Title=\u05d9\u05e6\u05d0 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -ExportDataDialog.Delimiter.Add=\u05d4\u05d5\u05e1\u05e3... -ExportDataDialog.Delimiter.Remove=\u05d4\u05e1\u05e8... -ExportDataDialog.Content.AllCells=\u05db\u05dc \u05d4\u05ea\u05d0\u05d9\u05dd -ExportDataDialog.Content.SelectedCells=\u05ea\u05d0\u05d9\u05dd \u05e9\u05e0\u05d1\u05d7\u05e8\u05d5 -ExportDataDialog.MenuItem.RemoveDelimiter=\u05d4\u05e1\u05e8 \u05de\u05e7\u05d1\u05e5 \u05de\u05d5\u05ea\u05d0\u05dd -ExportDataDialog.Chooser.SaveData.Title=\u05e9\u05de\u05d5\u05e8 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d1\u05e9\u05dd -ExportVideoDialog.Button.SaveAs=\u05e9\u05de\u05d5\u05e8 \u05d1\u05e9\u05dd -ExportVideoDialog.Button.FullSize=\u05d2\u05d5\u05d3\u05dc \u05de\u05dc\u05d0 -ExportVideoDialog.Button.DrawnSize=\u05db\u05de\u05e6\u05d5\u05d9\u05e8 -ExportVideoDialog.Content.VideoOnly=\u05e8\u05e7 \u05e1\u05e8\u05d8 -ExportVideoDialog.Content.VideoAndGraphics=\u05e1\u05e8\u05d8 \u05d5\u05d2\u05e8\u05e4\u05d9\u05dd -ExportVideoDialog.Content.GraphicsOnly=\u05e8\u05e7 \u05d2\u05e8\u05e4\u05d9\u05dd -ExportVideoDialog.Title=\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df -ExportVideoDialog.Label.ClipSettings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e1\u05e8\u05d8\u05d5\u05df -ExportVideoDialog.Subtitle.Size=\u05d2\u05d5\u05d3\u05dc -ExportVideoDialog.Subtitle.Content=\u05ea\u05d5\u05db\u05df -ExportVideoDialog.Subtitle.View=\u05ea\u05e6\u05d5\u05d2\u05d4 -ExportVideoDialog.Subtitle.Format=\u05e2\u05d9\u05e6\u05d5\u05d1 -ExportVideoDialog.Complete.Message1=\u05d4\u05e1\u05e8\u05d8 \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd -ExportVideoDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d6\u05d0\u05ea \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? -ExportVideoDialog.Complete.Title=\u05d9\u05e6\u05d5\u05d0 \u05d4\u05d5\u05e9\u05dc\u05dd -ExportVideoDialog.VideoSize=\u05d2\u05d5\u05d3\u05dc \u05e1\u05e8\u05d8 -ExportVideoDialog.MatSize=mat size -ExportVideo.Dialog.HiddenPlots.Message=\u05d4\u05ea\u05e8\u05e9\u05d9\u05dd \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05e8\u05d0\u05d5\u05ea \u05db\u05d5\u05dc\u05d5 \u05dc\u05e6\u05d5\u05e8\u05da \u05d9\u05e6\u05d5\u05d0 -ExportVideo.Dialog.HiddenPlots.Title=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d7\u05e1\u05e8\u05d4 -Footprint.DoubleTarget=\u05e6\u05dc\u05d1 \u05db\u05e4\u05d5\u05dc -Footprint.BoldDoubleTarget=\u05e6\u05dc\u05d1 \u05db\u05e4\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 -OffsetOrigin.MenuItem.Fixed=\u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05d5\u05ea -ParticleModel.Dialog.Offscreen.Message1=\u05d7\u05dc\u05e7 \u05de\u05e6\u05e2\u05d3\u05d9 \u05d4\u05de\u05d5\u05d3\u05dc \u05e8\u05d9\u05e7\u05d9\u05dd \u05db\u05d9 \u05d4\u05dd \u05e8\u05d7\u05d5\u05e7\u05d9\u05dd \u05de\u05d9\u05d3\u05d9 \u05de\u05d4\u05de\u05e1\u05da. -ParticleModel.Dialog.Offscreen.Message2=\u05db\u05d3\u05d9 \u05dc\u05ea\u05e7\u05df \u05d6\u05d0\u05ea \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d4\u05de\u05d5\u05d3\u05dc \u05d0\u05d5 \u05d0\u05ea \u05e7\u05e0\u05d4 \u05d4\u05de\u05d9\u05d3\u05d4 \u05e9\u05dc \u05d4\u05e1\u05e8\u05d8 -ParticleModel.Dialog.Offscreen.Title=\u05de\u05d7\u05d5\u05e5 \u05dc\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea -PrefsDialog.Tab.Configuration.Title=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea -PrefsDialog.Memory.BorderTitle=\u05d2\u05d5\u05d3\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df -PrefsDialog.Tab.General.Title=\u05db\u05dc\u05dc\u05d9 -PrefsDialog.RecentFiles.BorderTitle=\u05e4\u05ea\u05d7 \u05ea\u05e4\u05e8\u05d9\u05d8 \u05d0\u05d7\u05e8\u05d5\u05df -PrefsDialog.Label.RecentSize=\u05e1\u05e4\u05d9\u05e8\u05ea \u05e7\u05d1\u05e6\u05d9\u05dd -PrefsDialog.Hints.BorderTitle=\u05e8\u05de\u05d6\u05d9\u05dd -PrefsDialog.Button.Relaunch=\u05e9\u05d2\u05e8 \u05de\u05d7\u05d3\u05e9 \u05e2\u05db\u05e9\u05d9\u05d5 -PrefsDialog.Button.ClearRecent=\u05e0\u05e7\u05d4 -PrefsDialog.Checkbox.DefaultSize=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc -PrefsDialog.Checkbox.HintsOn=\u05d4\u05e8\u05d0\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -PrefsDialog.Tab.Video.Title=\u05e1\u05e8\u05d8 -PrefsDialog.VideoPref.BorderTitle=\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -PrefsDialog.Button.Xuggle=\u05e9\u05d5\u05d2\u05dc -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=\u05e0\u05d9\u05d4\u05d5\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df \u05db\u05d0\u05e9\u05e8 \u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1- Web Start. -PrefsDialog.Dialog.WebStart.Title=\u05de\u05e6\u05d1 Web Start -PrefsDialog.LookFeel.BorderTitle=\u05de\u05e8\u05d0\u05d4 \u05d5\u05de\u05e8\u05d2\u05e9 -PrefsDialog.Language.BorderTitle=\u05e9\u05e4\u05d4 -PrefsDialog.Upgrades.BorderTitle=\u05d1\u05d3\u05d5\u05e7 \u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd -PrefsDialog.Tab.Runtime.Title=\u05d4\u05e8\u05e6\u05d4 -PrefsDialog.Tab.Display.Title=\u05d4\u05e6\u05d2\u05d4 -PrefsDialog.Language.Default=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -PrefsDialog.Upgrades.Always=\u05db\u05dc-\u05e4\u05e2\u05dd -PrefsDialog.Upgrades.Weekly=\u05e9\u05d1\u05d5\u05e2\u05d9 -PrefsDialog.Upgrades.Monthly=\u05d7\u05d5\u05d3\u05e9\u05d9 -PrefsDialog.Upgrades.Never=\u05d0\u05e3-\u05e4\u05e2\u05dd -PrefsDialog.Button.CheckForUpgrade=\u05d1\u05d3\u05d5\u05e7 \u05e2\u05db\u05e9\u05d9\u05d5 -PrefsDialog.Xuggle.Speed.BorderTitle=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc -PrefsDialog.Xuggle.Slow=\u05d4\u05d7\u05dc\u05e7 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) -PrefsDialog.Xuggle.Fast=\u05de\u05d4\u05e8 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05e7\u05d5\u05e4\u05e6\u05e0\u05d9) -PrefsDialog.CalibrationTool.BorderTitle=\u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -Protractor.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea -Protractor.New.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea -Protractor.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05dc\u05de\u05d3\u05d9\u05d3\u05ea \u05d6\u05d5\u05d9\u05ea -Protractor.Label.Angle=\u05d6\u05d5\u05d9\u05ea -Protractor.Field.Angle.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05d9\u05df \u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea -Protractor.Vertex.Name=\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 -Protractor.Vertex.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05d4\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 -Protractor.End.Name=\u05e7\u05e6\u05d4 \u05d6\u05e8\u05d5\u05e2 -Protractor.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05d1\u05d5\u05d1 \u05d4\u05d6\u05e8\u05d5\u05e2 -Protractor.Handle.Name=\u05d9\u05d3\u05d9\u05ea -Protractor.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea -Protractor.Rotator.Name=\u05de\u05e1\u05d5\u05d1\u05d1 -Protractor.Rotator.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05d1\u05d5\u05d1 \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea -Protractor.Readout.Name=\u05e7\u05e8\u05d0 -Protractor.Readout.Hint=\u05d6\u05d5\u05d9\u05ea \u05d1\u05d9\u05df \u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea -ProtractorFootprint.Circle3=\u05de\u05e2\u05d2\u05dc \u05e7\u05d8\u05df -ProtractorFootprint.Circle5=\u05de\u05e2\u05d2\u05dc \u05d2\u05d3\u05d5\u05dc -ProtractorFootprint.Circle3Bold=\u05de\u05e2\u05d2\u05dc \u05e7\u05d8\u05df \u05db\u05e4\u05d5\u05dc -ProtractorFootprint.Circle5Bold=\u05de\u05e2\u05d2\u05dc \u05d2\u05d3\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 -Stick.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc -Stick.New.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc -TableTrackView.MenuItem.Unformatted=\u05d3\u05d9\u05d5\u05e7 \u05de\u05dc\u05d0 -TableTrackView.MenuItem.Formatted=\u05e2\u05dc-\u05e4\u05d9 \u05e2\u05d9\u05e6\u05d5\u05d1\u05d5 -TableTrackView.Menu.SetDelimiter=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e7\u05d1\u05e5 -TableTrackView.MenuItem.AddDelimiter=\u05d4\u05d5\u05e1\u05e3... -TableTrackView.MenuItem.RemoveDelimiter=\u05d4\u05e1\u05e8... -TableTrackView.Dialog.CustomDelimiter.Message=\u05d4\u05db\u05e0\u05e1 \u05de\u05d7\u05e8\u05d5\u05d6\u05ea \u05e7\u05d9\u05d1\u05d5\u05e5 \u05d7\u05d3\u05e9\u05d4: -TableTrackView.Dialog.CustomDelimiter.Title=\u05d4\u05d5\u05e1\u05e3 \u05de\u05e7\u05d1\u05e5 -TableTrackView.Header.Tooltip=\u05d4\u05e7\u05e9\u05d4 \u05dc\u05de\u05d9\u05d5\u05df, \u05d0\u05d5 \u05d4\u05e7\u05e9\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 -TableTrackView.MenuItem.CopySelectedData=\u05d4\u05e2\u05ea\u05e7 \u05ea\u05d0\u05d9\u05dd \u05e9\u05e0\u05d1\u05d7\u05e8\u05d5 -TableTrackView.Dialog.RemoveDelimiter.Message=\u05d1\u05d7\u05e8 \u05de\u05e7\u05d1\u05e5 \u05dc\u05d4\u05e1\u05e8\u05d4: -TableTrackView.Dialog.RemoveDelimiter.Title=\u05d4\u05e1\u05e8 \u05de\u05e7\u05d1\u05e5 -TableTrackView.Radians.Tooltip=\u05d1\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd -TableTrackView.Degrees.Tooltip=\u05d1\u05de\u05e2\u05dc\u05d5\u05ea -TableTrackView.RadiansPerSecond.Tooltip=\u05d1\u05e8\u05d3\u05d9\u05d0\u05df \u05dc\u05e9\u05e0\u05d9\u05d4 -TableTrackView.DegreesPerSecond.Tooltip=\u05d1\u05de\u05e2\u05dc\u05d5\u05ea \u05dc\u05e9\u05e0\u05d9\u05d4 -TableTrackView.RadiansPerSecondSquared.Tooltip=\u05d1- radians/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=\u05d1- degrees/s^2 -TableTrackView.MenuItem.DeleteDataFunction=\u05de\u05d7\u05e7 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TActions.Action.SaveFrame=\u05e9\u05de\u05d5\u05e8 \u05e7\u05d1\u05d5\u05e6\u05ea \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05d1\u05e9\u05dd... -TActions.AboutVideo=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... -TActions.Dialog.AboutVideo.Title=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05d5\u05d9\u05d3\u05d0\u05d5 -TActions.Dialog.AboutVideo.Type=\u05e1\u05d5\u05d2 -TActions.Dialog.AboutVideo.Size=\u05de\u05d9\u05de\u05d3\u05d9\u05dd -TActions.Dialog.AboutVideo.Length=\u05d0\u05d5\u05e8\u05da -TActions.Dialog.AboutVideo.Frames=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea -TActions.Dialog.AboutVideo.Seconds=\u05e9\u05e0\u05d9\u05d5\u05ea -TActions.Dialog.AboutVideo.FrameRate=\u05e7\u05e6\u05d1 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea -TActions.Dialog.AboutVideo.FramesPerSecond=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05dc\u05e9\u05e0\u05d9\u05d4 -TActions.Dialog.AboutVideo.Path=\u05de\u05d9\u05e7\u05d5\u05dd -TActions.Action.ImportTRK=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8... -TActions.Action.ProtractorVisible=\u05e0\u05e8\u05d0\u05d4 -TapeMeasure.MenuItem.FixedLength=\u05d0\u05d5\u05e8\u05da \u05e7\u05d1\u05d5\u05e2 -TextTView.Label.NoTab=\u05dc\u05d7\u05e5 "\u05d3\u05e3" \u05db\u05d3\u05d9 \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05db\u05d9\u05ea\u05d5\u05d1 \u05d5\u05d3\u05e4\u05d9 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. -TextTView.NewTab.Text1=\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05dc\u05e2\u05e8\u05d9\u05db\u05ea \u05db\u05d9\u05ea\u05d5\u05d1 \u05d5\u05db\u05d5\u05ea\u05e8\u05ea. \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d9\u05de\u05e0\u05d9\u05ea \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea. -TextTView.NewTab.Text2=\u05dc\u05d4\u05e6\u05d2\u05ea \u05d3\u05e3 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d4\u05db\u05e0\u05e1 \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d9\u05de\u05e0\u05d9\u05ea \u05dc\u05e4\u05ea\u05d9\u05d7\u05ea \u05e7\u05d5\u05d1\u05e5. -TextTView.NewTab.Title=\u05dc\u05dc\u05d0 \u05e9\u05dd -TextTView.Dialog.TabTitle.Title=\u05d4\u05d2\u05d3\u05e8 \u05db\u05d5\u05ea\u05e8\u05ea -TextTView.MenuItem.OpenHTML=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 \u05d3\u05e3 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8... -TextTView.MenuItem.SetTitle=\u05d4\u05d2\u05d3\u05e8 \u05db\u05d5\u05ea\u05e8\u05ea... -TextTView.Button.NewTab=\u05d7\u05d3\u05e9 -TextTView.TextEdit.Description=\u05db\u05d9\u05ea\u05d5\u05d1 -TFrame.Dialog.FileNotFound.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -TFrame.Dialog.FileNotFound.Title=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -TFrame.View.Text=\u05ea\u05e6\u05d5\u05d2\u05ea \u05e2\u05de\u05d5\u05d3 -TFrame.View.Main=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea -TMenuBar.Menu.OpenRecent=\u05e4\u05ea\u05d7 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd -TMenuBar.Menu.Import=\u05d9\u05d1\u05d0 -TMenuBar.Menu.Export=\u05d9\u05e6\u05d0 -TMenuBar.MenuItem.Video=\u05e1\u05e8\u05d8... -TMenuBar.MenuItem.Data=\u05e7\u05d5\u05d1\u05e5 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd... -TMenuBar.Menu.CopyObject=\u05d4\u05e2\u05ea\u05e7 \u05e4\u05e8\u05d9\u05d8 -TMenuBar.MenuItem.Coords=\u05de\u05e2\u05e8\u05db\u05ea \u05e6\u05d9\u05e8\u05d9\u05dd -TMenuBar.MenuItem.VideoClip=\u05e1\u05e8\u05d8\u05d5\u05df -TMenuBar.Menu.MeasuringTools=\u05db\u05dc\u05d9 \u05de\u05d3\u05d9\u05d3\u05d4 -TMenuBar.Menu.AngleUnits=\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea -TMenuBar.MenuItem.Degrees=\u05de\u05e2\u05dc\u05d5\u05ea -TMenuBar.MenuItem.Radians=\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd -Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc (\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05e6\u05d5\u05de\u05d3) \u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df. -Tracker.Dialog.NoXuggle.Message2=\u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05de- http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc... -Tracker.Dialog.AboutXuggle.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc -Tracker.Dialog.AboutXuggle.Message.Version=\u05d2\u05e8\u05e1\u05ea \u05e9\u05d5\u05d2\u05dc -Tracker.Dialog.AboutXuggle.Message.Home=\u05de\u05d9\u05e7\u05d5\u05dd \u05e9\u05d5\u05d2\u05dc: -Tracker.Dialog.AboutXuggle.Message.Path=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d1\u05e6\u05d9 jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc: -Tracker.Dialog.NoVideoEngine.Message1=\u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5. \u05dc\u05dc\u05d0 \u05de\u05e0\u05d5\u05e2 \u05d0\u05ea\u05d4 -Tracker.Dialog.NoVideoEngine.Message2=\u05d9\u05db\u05d5\u05dc \u05dc\u05e4\u05ea\u05d5\u05d7 \u05e8\u05e7 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea (JPEG, PNG) \u05d5\u05d4\u05e0\u05e4\u05e9\u05ea GIFs. -Tracker.Dialog.NoVideoEngine.Message3=\u05de\u05d5\u05de\u05dc\u05e5: \u05d4\u05ea\u05e7\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc. -Tracker.Dialog.NoVideoEngine.Title=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e2\u05d5\u05d1\u05d3 \u05db\u05e9\u05d5\u05e8\u05d4. \u05d1\u05d1\u05e7\u05e9\u05d4 \u05d1\u05d3\u05d5\u05e7 \u05e9\u05e7\u05d1\u05e6\u05d9 -Tracker.Dialog.NoXuggle.Message2=jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc \u05e0\u05de\u05e6\u05d0\u05d9\u05dd \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. \u05dc\u05e4\u05e8\u05d8\u05d9\u05dd, -Tracker.Dialog.NoXuggle.Message3=\u05e8\u05d0\u05d4 Tracker_README.txt \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. -Tracker.Dialog.NoXuggle.Message4=\u05dc\u05d4\u05ea\u05e7\u05e0\u05ea \u05e9\u05d5\u05d2\u05dc, \u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05de\u05ea\u05e7\u05d9\u05df \u05d8\u05e8\u05e7\u05e8 \u05d4\u05d0\u05d7\u05e8\u05d5\u05df -Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05d2\u05d9\u05e9 -Tracker.About.DefaultLocale=\u05de\u05d9\u05e7\u05d5\u05dd \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -Tracker.About.CurrentLanguage=\u05e9\u05e4\u05d4 -Tracker.Dialog.InsufficientMemory.Title=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05de\u05e1\u05e4\u05e7 -Tracker.Dialog.InsufficientMemory.Message=\u05d3\u05e8\u05d9\u05e9\u05ea \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d2\u05d3\u05d5\u05dc\u05d4 \u05de\u05d9\u05d3\u05d9 -TrackerIO.Dialog.TabMustBeSaved.Message1=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -TrackerIO.Dialog.TabMustBeSaved.Message2=\u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05e9\u05de\u05e8 \u05db\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d9\u05db\u05dc\u05dc \u05d1\u05de\u05e2\u05e8\u05da \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea -TrackerIO.Dialog.TabMustBeSaved.Message3=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05de\u05d5\u05e8 \u05d6\u05d0\u05ea? -TrackerIO.Dialog.TabMustBeSaved.Title=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05dc\u05d0 \u05e9\u05de\u05d5\u05e8\u05d4 -TrackerIO.Dialog.NoTabs.Message=\u05d0\u05d9\u05df \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05dc\u05e9\u05de\u05d5\u05e8! -TrackerIO.Dialog.NoTabs.Title=\u05de\u05e2\u05e8\u05da \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05e8\u05d9\u05e7 -TrackerIO.Dialog.SaveTabset.Title=\u05e9\u05de\u05d5\u05e8 \u05de\u05e2\u05e8\u05da \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea -TrackerIO.Dialog.SaveTab.Title=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -TrackerIO.Delimiter.Tab=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 -TrackerIO.Delimiter.Space=\u05e8\u05d5\u05d5\u05d7 -TrackerIO.Delimiter.Comma=\u05e4\u05e1\u05d9\u05e7 -TrackerIO.Delimiter.Semicolon=\u05e0\u05e7\u05d5\u05d3\u05d4-\u05e4\u05e1\u05d9\u05e7 -TrackerIO.VideoAndDataFileFilter.Description=\u05e1\u05e8\u05d8\u05d9\u05dd \u05d5\u05e7\u05d1\u05e6\u05d9 \u05d8\u05e8\u05e7\u05e8 -TrackerPanel.Dialog.Version.Message1=\u05d0\u05ea\u05d4 \u05e4\u05d5\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 \u05e9\u05e0\u05d5\u05e6\u05e8 \u05e2\u05dd \u05d8\u05e8\u05e7\u05e8 -TrackerPanel.Dialog.Version.Message2=\u05e9\u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05ea\u05d9\u05d7\u05e1 \u05d0\u05dc -TrackerPanel.Dialog.Version.Message3=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05dd \u05d1\u05d2\u05e8\u05e1\u05d4 \u05d1\u05d4 \u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05de\u05e9 -TrackerPanel.Dialog.Version.Message4=\u05d0\u05ea \u05d4\u05d2\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05e9\u05d9\u05d2 \u05d1 -TrackerPanel.Dialog.Version.Title=\u05d7\u05d5\u05e1\u05e8 \u05d4\u05ea\u05d0\u05de\u05ea \u05d2\u05e8\u05e1\u05d0\u05d5\u05ea -TrackerPanel.Label.ModelStart=\u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 -TrackerPanel.Label.ModelEnd=\u05ea\u05de\u05d5\u05e0\u05d4 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 -TrackerPanel.Spinner.ModelStart.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 \u05dc\u05de\u05d5\u05d3\u05dc \u05d6\u05d4 -TrackerPanel.Spinner.ModelEnd.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05dc\u05de\u05d5\u05d3\u05dc \u05d6\u05d4 -TToolbar.Button.ProtractorVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05d3-\u05d6\u05d5\u05d9\u05ea -TToolbar.Button.AxesVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05e6\u05d9\u05e8\u05d9\u05dd -TToolBar.Button.TrackControl.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d1\u05e7\u05e8\u05ea \u05e2\u05e7\u05d9\u05d1\u05d4 -TTrack.Dialog.StepSizeWarning.Message1=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05d7\u05dc\u05e7 \u05de\u05d4\u05e2\u05e7\u05d1\u05d5\u05ea \u05e1\u05d5\u05de\u05e0\u05d5 \u05d1\u05e6\u05e2\u05d3\u05d9\u05dd \u05d4\u05d2\u05d3\u05d5\u05dc\u05d9\u05dd \u05de-1, \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05e9\u05d3\u05d5\u05dc\u05d2\u05d5 \u05e0\u05e9\u05d0\u05e8\u05d5 \u05dc\u05dc\u05d0 \u05e1\u05d9\u05de\u05d5\u05df. -TTrack.Dialog.StepSizeWarning.Message2=\u05dc\u05db\u05df \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc \u05d4\u05e6\u05e2\u05d3 \u05e2\u05e9\u05d5\u05d9 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e4\u05e2\u05e8\u05d9\u05dd \u05d1\u05e8\u05e6\u05e3 \u05d4\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd. -TTrack.Dialog.StepSizeWarning.Message3=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d7\u05e9\u05d1 \u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05dc\u05d9\u05d3 \u05d4\u05e4\u05e2\u05e8 \u05e2\u05d3 \u05dc\u05d4\u05e9\u05dc\u05de\u05ea \u05d4\u05e6\u05e2\u05d3 \u05d4\u05d7\u05e1\u05e8. -TTrack.Dialog.StepSizeWarning.Title=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea -TTrack.Dialog.SkippedStepWarning.Message1=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05d3\u05d9\u05dc\u05d5\u05d2 \u05e2\u05dc \u05e9\u05dc\u05d1\u05d9\u05dd \u05d1\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d9\u05e7\u05d5\u05de\u05d9\u05dd \u05e2\u05dc\u05d5\u05dc \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e4\u05e2\u05e8\u05d9\u05dd \u05d1\u05e8\u05e6\u05e3 \u05d4\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd. -TTrack.Dialog.SkippedStepWarning.Title=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea -TTrack.Dialog.SkippedStepWarning.Checkbox=\u05d0\u05dc \u05ea\u05e8\u05d0\u05d4 \u05d6\u05d0\u05ea \u05e9\u05e0\u05d9\u05ea -TTrack.Locked.Hint=\u05e0\u05e2\u05d5\u05dc -TTrack.AngleField.Radians.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd -TTrack.AngleField.Degrees.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05de\u05e2\u05dc\u05d5\u05ea -TTrack.AngleField.Popup.Radians=\u05d4\u05d7\u05dc\u05e3 \u05dc\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd -TTrack.AngleField.Popup.Degrees=\u05d4\u05d7\u05dc\u05e3 \u05dc\u05de\u05e2\u05dc\u05d5\u05ea -TTrackBar.Memory.Menu.SetSize=\u05d4\u05d2\u05d3\u05e8 \u05d2\u05d5\u05d3\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df... -TTrackBar.Button.Version=\u05e2\u05db\u05e9\u05d9\u05d5 \u05d6\u05de\u05d9\u05df, \u05d2\u05e8\u05e1\u05d4 -TTrackBar.Popup.MenuItem.Upgrade=\u05e9\u05d3\u05e8\u05d2 \u05e2\u05db\u05e9\u05d9\u05d5... -TTrackBar.Popup.MenuItem.Ignore=\u05d4\u05ea\u05e2\u05dc\u05dd -XuggleVideo.MenuItem.SmoothPlay=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05d7\u05dc\u05e7\u05d4 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=\u05e1\u05e8\u05d8 \u05db\u05d9\u05d5\u05dc -CircleFootprint.Circle=\u05de\u05e2\u05d2\u05dc -CircleFootprint.FilledCircle=\u05de\u05e2\u05d2\u05dc \u05de\u05dc\u05d0 -CircleFootprint.Dialog.Title=\u05e2\u05e7\u05d1\u05d5\u05ea \u05de\u05e2\u05d2\u05dc -CircleFootprint.Dialog.Label.Radius=\u05e8\u05d3\u05d9\u05d5\u05e1 -CircleFootprint.Dialog.Checkbox.Bold=\u05de\u05d5\u05d3\u05d2\u05e9 -CircleFootprint.Dialog.Checkbox.CenterSpot=\u05de\u05e8\u05db\u05d6 -LineProfile.Hint.Marking=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05e4\u05e8\u05d5\u05e4\u05d9\u05dc \u05d4\u05e7\u05d5 -PageTView.Button.Page=\u05e2\u05de\u05d5\u05d3 -PageTView.MenuItem.ClosePage=\u05e1\u05d2\u05d5\u05e8 \u05e2\u05de\u05d5\u05d3 -PointMass.Hint.Marking=\u05d4\u05e7\u05e9 \u05e2\u05dd \u05d4\u05e2\u05db\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df, \u05d4\u05e7\u05e9 Enter \u05db\u05d3\u05d9 \u05dc\u05d7\u05d6\u05d5\u05e8 \u05e2\u05dc \u05d4\u05e6\u05e2\u05d3 \u05d4\u05e7\u05d5\u05d3\u05dd -PrefsDialog.Dialog.NewVersion.Title=\u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd -PrefsDialog.Dialog.NewVersion.Message1=\u05d2\u05e8\u05e1\u05d4 -PrefsDialog.Dialog.NewVersion.Message2=\u05e2\u05db\u05e9\u05d9\u05d5 \u05d6\u05de\u05d9\u05e0\u05d4 \u05d1 -PrefsDialog.Dialog.NewVersion.None.Message=\u05d0\u05d9\u05df \u05d2\u05e8\u05e1\u05d4 \u05d7\u05d3\u05e9\u05d4 \u05db\u05e8\u05d2\u05e2 -RGBRegion.Hint.Marking=\u05d4\u05e7\u05e9 \u05e2\u05dd \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05e8\u05db\u05d6 \u05d4\u05d0\u05d6\u05d5\u05e8 -TMenuBar.MenuItem.Restore=\u05e9\u05d7\u05d6\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea -TrackControl.StretchVectors.None=\u05dc\u05dc\u05d0 \u05de\u05ea\u05d9\u05d7\u05d4 -TViewChooser.Maximize.Tooltip=\u05de\u05e7\u05e1\u05dd \u05ea\u05e6\u05d5\u05d2\u05d4 \u05d6\u05d5 -TViewChooser.Restore.Tooltip=\u05e9\u05d7\u05d6\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea -Vector.Hint.Marking=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df, \u05d4\u05e7\u05e9 Enter \u05db\u05d3\u05d9 \u05dc\u05d7\u05d6\u05d5\u05e8 \u05e2\u05dc \u05d4\u05e6\u05e2\u05d3 \u05d4\u05e7\u05d5\u05d3\u05dd -WorldTView.Button.World=\u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=\u05d4\u05d6\u05d4\u05e8\u05d5\u05ea -PrefsDialog.Checkbox.WarnIfNoEngine=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -PrefsDialog.Checkbox.WarnIfXuggleError=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e7\u05d8\u05dc\u05e0\u05d9\u05ea -PropertiesDialog.Title=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd -PropertiesDialog.Label.Author=\u05d9\u05d5\u05e6\u05e8\u05d9\u05dd -PropertiesDialog.Label.Contact=\u05e7\u05e9\u05e8 -TActions.Action.Properties=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... -TActions.Action.OpenBrowser=\u05e4\u05ea\u05d7 \u05d3\u05e4\u05d3\u05e4\u05df \u05e1\u05e4\u05e8\u05d9\u05d5\u05ea... -TFrame.Progress.Xuggle=\u05e9\u05d5\u05d2\u05dc \u05d8\u05d5\u05e2\u05df \u05ea\u05de\u05d5\u05e0\u05d4 -TFrame.Progress.ClickToCancel=(\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d9\u05d8\u05d5\u05dc) -TFrame.Dialog.StalledVideo.Title=\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05e1\u05e8\u05d8 -TFrame.Dialog.StalledVideo.Message0=\u05d4\u05e1\u05e8\u05d8 \u05e0\u05e2\u05e6\u05e8 \u05d1\u05d6\u05de\u05df \u05d4\u05d8\u05e2\u05d9\u05e0\u05d4. \u05d6\u05d4 \u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05de\u05e0\u05d9. -TFrame.Dialog.StalledVideo.Message1=\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e2\u05e6\u05d5\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5 \u05d0\u05d5 \u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05dc\u05d4\u05de\u05ea\u05d9\u05df -TFrame.Dialog.StalledVideo.Message2=\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea \u05dc\u05e4\u05ea\u05d9\u05d7\u05ea \u05e1\u05e8\u05d8 \u05d6\u05d4: -TFrame.Dialog.StalledVideo.Message3=1. \u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05ea\u05d5\u05db\u05e0\u05ea \u05d4\u05de\u05e8\u05d4 \u05d1\u05db\u05d3\u05d9 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 \u05d4\u05e1\u05e8\u05d8 -TFrame.Dialog.StalledVideo.Message4=2. \u05d1\u05d7\u05e8 QuickTime \u05d1\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d5 \u05d1\u05ea\u05d9\u05d1\u05ea \u05d4\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea. -TFrame.Dialog.StalledVideo.MessageMac=2. \u05e4\u05ea\u05d7 \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05d1- 32-bit Java VM \u05d9\u05d7\u05d3 \u05e2\u05dd QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=\u05e2\u05e6\u05d5\u05e8 -TFrame.Dialog.StalledVideo.Button.Wait=\u05d4\u05de\u05ea\u05df -Tracker.Dialog.NoVideoEngine.Checkbox=\u05d0\u05dc \u05ea\u05e8\u05d0\u05d4 \u05d6\u05d0\u05ea \u05e9\u05e0\u05d9\u05ea -TrackerIO.ZipFileFilter.Description=\u05e7\u05d5\u05d1\u05e5 ZIP (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=\u05e9\u05d5\u05d2\u05dc \u05de\u05e6\u05d0\u05d4 \u05d0\u05ea \u05d4\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d4\u05d1\u05d0\u05d4 \u05d1\u05e2\u05ea \u05e4\u05ea\u05d9\u05d7\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5:: -TrackerIO.Dialog.ErrorFFMPEG.Message2=\u05dc\u05d0 \u05db\u05dc \u05d4\u05e9\u05d2\u05d9\u05d0\u05d5\u05ea \u05e7\u05d8\u05dc\u05e0\u05d9\u05d5\u05e5. \u05dc\u05de\u05e1\u05e8 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05de\u05dc\u05d0, \u05d1\u05d7\u05e8 \u05e2\u05d6\u05e8\u05d4|\u05d9\u05d5\u05de\u05df \u05de\u05e1\u05e8\u05d9\u05dd. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u05d0\u05dd \u05e9\u05d5\u05d2\u05dc \u05db\u05e9\u05dc, \u05d9\u05ea\u05db\u05df \u05e9\u05e0\u05d9\u05ea\u05df \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8 \u05e2\u05dd QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u05e9\u05d9\u05dd \u05dc\u05d1: \u05d1\u05de\u05e2\u05e8\u05db\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 OSX \u05e0\u05d3\u05e8\u05e9 \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05d1\u05ea\u05e6\u05d5\u05e8\u05ea 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc -TrackerIO.ErrorFFMPEG.LogMessage=\u05dc\u05e4\u05e8\u05d8\u05d9\u05dd \u05e0\u05d5\u05e1\u05e4\u05d9\u05dd, \u05d4\u05e4\u05e2\u05dc \u05d0\u05ea \u05d0\u05d6\u05d4\u05e8\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc \u05d1\u05ea\u05d9\u05d1\u05ea \u05d4\u05d3\u05d5-\u05e9\u05d9\u05d7 (\u05e2\u05e8\u05d5\u05da|\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea). -TToolBar.Button.OpenBrowser.Tooltip=\u05e4\u05ea\u05d7 \u05d0\u05ea \u05d3\u05e4\u05d3\u05e4\u05df \u05d4\u05e1\u05e4\u05e8\u05d9\u05d5\u05ea \u05d4\u05d3\u05d9\u05d2\u05d9\u05d8\u05dc\u05d9 OSP - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -TFrame.Dialog.NoTRKInComPADRE.Message=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05dc\u05e6\u05d5\u05de\u05ea - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 -DynamicParticle.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e7\u05e8\u05d8\u05d6\u05d9) -DynamicParticlePolar.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e4\u05d5\u05dc\u05e8\u05d9) -DynamicSystem.Builder.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea (\u05e4\u05e0\u05d9\u05de\u05d9\u05ea) -PropertiesDialog.Button.CopyFilePath=\u05d4\u05e2\u05ea\u05e7 \u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d5\u05d1\u05e5 -PropertiesDialog.Button.CopyVideoPath=\u05d4\u05e2\u05ea\u05e7 \u05de\u05d9\u05e7\u05d5\u05dd \u05e1\u05e8\u05d8 -PropertiesDialog.Tab.TrackerFile=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd -PropertiesDialog.Header.Value=\u05e2\u05e8\u05da -TActions.Action.OpenURL=\u05e4\u05ea\u05d7 URL... -TActions.Dialog.OpenURL.Title=\u05e4\u05ea\u05d7 URL -TActions.Dialog.OpenURL.Message=\u05d4\u05db\u05e0\u05e1 \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05e1\u05e8\u05d8 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8\u05d9, \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8, \u05d0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -TActions.Dialog.AboutVideo.Name=\u05e9\u05dd - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cached Web Files -PrefsDialog.Button.ClearCache=\u05e0\u05e7\u05d4 \u05d4\u05db\u05dc - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-\u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05de\u05d5\u05d3\u05d2\u05e9 -PointMass.Remarking.Hint=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05d7\u05d3\u05e9 -PointMass.PositionSelected.Hint=\u05d2\u05e8\u05d5\u05e8, \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05de\u05d9\u05e7\u05d5\u05dd \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd -PointMass.VectorSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 -Vector.Remark.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05d8\u05d9\u05e4 \u05d4\u05de\u05d5\u05d3\u05d2\u05e9 -Vector.TipSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05dc\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd -Vector.HandleSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 -Vector.Remarking.Hint=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05e2\u05db\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05d8\u05d9\u05e4 -AutoTracker.Label.Search=\u05d7\u05e4\u05e9 -AutoTracker.Label.Target=\u05de\u05d8\u05e8\u05d4 -AutoTracker.Label.Frame=\u05de\u05e1\u05d2\u05e8\u05ea -AutoTracker.Label.Point=\u05e0\u05e7\u05d5\u05d3\u05d4 -AutoTracker.Label.Template=\u05ea\u05d1\u05e0\u05d9\u05ea -AutoTracker.Label.Track=\u05e2\u05e7\u05d5\u05d1 -AutoTracker.Label.Match=\u05d4\u05ea\u05d0\u05dd -AutoTracker.Label.NoTemplate=\u05d0\u05d9\u05df \u05ea\u05d1\u05e0\u05d9\u05ea -AutoTracker.Label.EvolutionRate=\u05e7\u05e6\u05d1 \u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea -AutoTracker.Label.Automark=\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -AutoTracker.Info.Instructions=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0\u05d9\u05ea\u05d5\u05e8 \u05d4\u05ea\u05d0\u05de\u05d5\u05ea \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 -AutoTracker.Info.KeyFrame.Instructions1=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d6\u05d5 \u05de\u05d2\u05d3\u05d9\u05e8\u05d4 \u05d0\u05ea \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05d5\u05d4\u05de\u05d8\u05e8\u05d4. \u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0\u05d9\u05ea\u05d5\u05e8 \u05d4\u05ea\u05d0\u05de\u05d5\u05ea. -AutoTracker.Info.KeyFrame.Instructions2=\u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4, \u05ea\u05d1\u05e0\u05d9\u05ea, \u05d0\u05d5 \u05d0\u05d9\u05d6\u05d5\u05e8 \u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d4\u05d6\u05d9\u05d6 \u05d0\u05d5\u05ea\u05dd \u05d0\u05d5 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc\u05dd. -AutoTracker.Info.MouseOver.Instructions=\u05d4\u05e2\u05d1\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05de\u05e2\u05dc \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05dc\u05de\u05d5\u05d3 \u05d9\u05d5\u05ea\u05e8 \u05e2\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d5\u05d4\u05ea\u05d0\u05de\u05d5\u05ea. -AutoTracker.Info.Mask1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05d4\u05d9\u05d0 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4. \u05d4\u05d9\u05d0 \u05de\u05ea\u05d7\u05d9\u05dc\u05d4 \u05de\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 \u05d5\u05de\u05ea\u05e4\u05ea\u05d7\u05ea \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05d0\u05ea \u05e2\u05e6\u05de\u05d4 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9 \u05e6\u05d5\u05e8\u05d4 \u05d5\u05e6\u05d1\u05e2. -AutoTracker.Info.Mask2=\u05d3\u05e8\u05d2\u05ea \u05d4\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05d4\u05d9\u05d0 \u05e8\u05de\u05ea \u05d4\u05e0\u05d9\u05e7\u05d5\u05d3 \u05d4\u05de\u05d9\u05e0\u05d9\u05de\u05dc\u05d9\u05ea \u05d4\u05d3\u05e8\u05d5\u05e9\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9. -AutoTracker.Info.Mask.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05d5 \u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea \u05d5\u05d4\u05d6\u05d6\u05ea \u05d4\u05d9\u05d3\u05d9\u05ea (\u05dc\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 \u05d1\u05dc\u05d1\u05d3). \u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d5\u05d4\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05d8\u05d5\u05d5\u05d9\u05d9\u05df. -AutoTracker.Info.Mask.Tip=\u05d3\u05e8\u05d2\u05ea \u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05e0\u05de\u05d5\u05db\u05d4 \u05e2\u05e9\u05d5\u05d9\u05d4 \u05dc\u05d2\u05e8\u05d5\u05dd \u05dc\u05de\u05e6\u05d9\u05d0\u05ea \u05d4\u05ea\u05d0\u05d5\u05de\u05d5\u05ea \u05db\u05d5\u05d6\u05d1\u05d5\u05ea-- \u05dc\u05d7\u05d9\u05dc\u05d5\u05e4\u05d9\u05df \u05e0\u05e1\u05d4 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea. -AutoTracker.Info.Search=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. -AutoTracker.Info.SearchOnAxis=\u05e6\u05d9\u05e8 \u05d4- x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. -AutoTracker.Info.Search.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea. \u05d4\u05d2\u05d3\u05e8 \u05d0\u05ea \u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e6\u05d9\u05e8 x \u05d5\u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 \u05e2"\u05d9 \u05e1\u05d9\u05de\u05d5\u05e0\u05df. -AutoTracker.Info.Search.Tip=\u05d1\u05d3\u05e8\u05da \u05db\u05dc\u05dc, \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0 \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc. \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea \u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 \u05de\u05d6\u05d9\u05d6\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05e4\u05d9 \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05e6\u05e4\u05d5\u05d9 \u05e9\u05dc \u05d4\u05d4\u05ea\u05d0\u05de\u05d4. -AutoTracker.Info.Target=\u05d4\u05de\u05d8\u05e8\u05d4 \u05d4\u05d9\u05d0 \u05de\u05d9\u05e7\u05d5\u05dd \u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea. -AutoTracker.Info.Target.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05e2"\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea\u05d4 (\u05e8\u05e7 \u05d1\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7). \u05d1\u05d7\u05e8 \u05d0\u05ea \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea \u05de\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05d2\u05dc\u05d9\u05dc\u05d4. -AutoTracker.Info.Title.Settings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea -AutoTracker.Info.Title.Tip=\u05d8\u05d9\u05e4 -AutoTracker.Info.SelectTrack=\u05d1\u05d7\u05e8 \u05d0\u05d5 \u05e6\u05d5\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc \u05d0\u05d5 \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8\u05d9\u05d4\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. -AutoTracker.Info.OutsideXAxis=\u05e6\u05d9\u05e8 \u05d4- x \u05d0\u05d9\u05e0\u05d5 \u05e2\u05d5\u05d1\u05e8 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05df: -AutoTracker.Info.NewKeyFrame=--\u05dc\u05da \u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 \u05d5\u05e9\u05e0\u05d4 \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d0\u05d5 shift-control \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d7\u05d3\u05e9\u05d4 -AutoTracker.Info.Replace=--\u05e7\u05d1\u05dc \u05d0\u05ea \u05d4\u05d4\u05ea\u05d0\u05de\u05d4 -AutoTracker.Info.Keep=--\u05d3\u05dc\u05d2 \u05e2\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d5\u05d4\u05e9\u05d0\u05e8 \u05dc\u05dc\u05d0 \u05e9\u05d9\u05e0\u05d5\u05d9 -AutoTracker.Info.PossibleReplace=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05de\u05d5\u05e6\u05d2\u05ea. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05df: -AutoTracker.Wizard.Button.Accept=\u05e7\u05d1\u05dc -AutoTracker.Wizard.Button.Stop=\u05e2\u05e6\u05d5\u05e8 -AutoTracker.Wizard.Button.Skip=\u05d3\u05dc\u05d2 -AutoTracker.Wizard.Button.Replace=\u05d4\u05d7\u05dc\u05e3 -AutoTracker.Wizard.Button.Keep=\u05d3\u05d7\u05d4 -AutoTracker.Wizard.Button.Search=\u05d7\u05e4\u05e9 -AutoTracker.Wizard.Button.SearchThis=\u05d7\u05e4\u05e9 \u05d0\u05ea \u05d6\u05d4 -AutoTracker.Wizard.Button.SearchNext=\u05d7\u05e4\u05e9 \u05d0\u05ea \u05d4\u05d1\u05d0 -AutoTracker.Wizard.Button.Delete=\u05de\u05d7\u05e7 -AutoTracker.Wizard.Button.ShowKeyFrame=\u05d4\u05e8\u05d0\u05d4 \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 -AutoTracker.Wizard.Button.DeleteKeyFrame=\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 -AutoTracker.Wizard.Checkbox.LookAhead=\u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 -AutoTracker.Wizard.Checkbox.XAxis=\u05e8\u05e7 \u05e6\u05d9\u05e8 x -AutoTracker.Wizard.Menuitem.DeleteThis=\u05e0\u05e7\u05d5\u05d3\u05d4 \u05d6\u05d5 -AutoTracker.Wizard.Menuitem.DeleteLater=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05d4\u05d1\u05d0\u05d5\u05ea -AutoTracker.Wizard.Menuitem.DeleteAll=\u05e0\u05e7\u05d4 \u05d4\u05db\u05dc -TToolBar.Button.AutoTracker.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -MainTView.Popup.MenuItem.ZoomIn=\u05d4\u05ea\u05e7\u05e8\u05d1 -MainTView.Popup.MenuItem.ZoomOut=\u05d4\u05ea\u05e8\u05d7\u05e7 -MainTView.Popup.MenuItem.ZoomToFit=\u05de\u05e8\u05d7\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 -TrackerIO.Dialog.DurationVaries.Title=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 -TrackerIO.Dialog.DurationVaries.Message1=\u05d7\u05dc\u05e7 \u05de\u05de\u05e9\u05db\u05d9 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05e9\u05d5\u05e0\u05d9\u05dd \u05de\u05d0\u05d7\u05e8\u05d9\u05dd -TrackerIO.Dialog.DurationVaries.Message2=\u05dc\u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05de\u05d3\u05d5\u05d9\u05d9\u05e7\u05d5\u05ea, \u05e8\u05e6\u05d5\u05d9 \u05dc\u05d4\u05d5\u05e6\u05d9\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05d5 -TrackerIO.Dialog.DurationVaries.Message3=\u05de\u05d4\u05d7\u05d9\u05e9\u05d5\u05d1\u05d9\u05dd \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d4\u05d2\u05d3\u05e8\u05ea \u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 \u05d5\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc \u05d4\u05e1\u05e8\u05d8\u05d5\u05df. -TrackerIO.Dialog.DurationVaries.Message4=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05dc\u05d4\u05d5\u05e6\u05d0\u05d4: -TrackerIO.Dialog.DurationVaries.Message5=\u05de\u05e9\u05da \u05de\u05de\u05d5\u05e6\u05e2 \u05d5\u05e7\u05e6\u05d1 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dd \u05de\u05d5\u05e6\u05d9\u05d0\u05d9\u05dd: -TFrame.Dialog.LibraryError.Title=\u05e9\u05d2\u05d9\u05d0\u05d4 -TFrame.Dialog.LibraryError.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d8\u05e2\u05d5\u05df \u05de\u05e9\u05d0\u05d1\u05d9\u05dd \u05dc\u05e6\u05d5\u05de\u05ea - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df -PrefsDialog.Label.Path=\u05de\u05d9\u05e7\u05d5\u05dd -PrefsDialog.Checkbox.ClearCacheOnExit=\u05e0\u05e7\u05d4 \u05d1\u05d9\u05e6\u05d9\u05d0\u05d4 -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=\u05ea\u05d9\u05e7\u05d9\u05d5\u05ea -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=\u05d2\u05e8\u05e1\u05ea \u05d8\u05e8\u05e7\u05e8 -PrefsDialog.Version.Default=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc -PrefsDialog.Tab.ClearCacheOnExit=\u05e0\u05e7\u05d4 \u05d1\u05d9\u05e6\u05d9\u05d0\u05d4 -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=\u05e9\u05de\u05d5\u05e8 -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05de\u05d9\u05dd... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=\u05d1\u05d7\u05e8 \u05d0\u05ea \u05d4\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05dc\u05d7\u05d9\u05e9\u05d5\u05d1 \u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d4: -AlgorithmDialog.Title=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd -AlgorithmDialog.FiniteDifference.Message1=\u05d6\u05d4 \u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc. -AlgorithmDialog.FiniteDifference.Message2=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=\u05ea\u05d0\u05d5\u05e6\u05d4: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt^2) -AlgorithmDialog.BounceDetect.Message1=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05d6\u05d4 \u05de\u05d7\u05dc\u05d9\u05e7 \u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05d0\u05d1\u05dc \u05d2\u05dd \u05e8\u05d2\u05d9\u05e9 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05e4\u05ea\u05d0\u05d5\u05de\u05d9\u05d9\u05dd \u05d1\u05de\u05d4\u05d9\u05e8\u05d5\u05ea. -AlgorithmDialog.BounceDetect.Message2=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05e2\u05dc\u05d5\u05dc \u05dc\u05d9\u05e6\u05d5\u05e8 \u05ea\u05d5\u05e4\u05e2\u05d5\u05ea \u05d3\u05de\u05d4 (\u05d0\u05e8\u05d8\u05d9\u05e4\u05e7\u05d8). \u05dc\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3, \u05e8\u05d0\u05d4: -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e7\u05e8\u05d9\u05d0\u05d4. -TrackPlottingPanel.Popup.Menu.CompareWith=\u05d4\u05e9\u05d5\u05d5\u05d4 \u05e2\u05dd -TrackerPanel.DataBuilder.TrackType.Unknown=\u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2 -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=\u05d8\u05e2\u05df \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TrackerPanel.DataBuilder.Load.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05d8\u05e2\u05d9\u05e0\u05d4: -TrackerPanel.DataBuilder.Save.Title=\u05e9\u05de\u05d5\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd -TrackerPanel.DataBuilder.Save.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05e9\u05de\u05d9\u05e8\u05d4: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=\u05d8\u05e2\u05df \u05dc\u05d4\u05db\u05dc -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=\u05d8\u05e2\u05df \u05e8\u05e7 \u05d0\u05dc -TrackerPanel.DataBuilder.Dialog.Load.Title=\u05d1\u05d7\u05d9\u05e8\u05ea \u05e2\u05e7\u05d1\u05d5\u05ea -TrackerPanel.DataBuilder.Dialog.Load.Message=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d8\u05e2\u05d5\u05df \u05d0\u05ea \u05d4\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05dc\u05db\u05dc \u05e1\u05d5\u05d2\u05d9 \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea? -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=\u05e1\u05d5\u05d2 \u05e2\u05e7\u05d1\u05d5\u05ea \u05e9\u05d2\u05d5\u05d9 -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05de\u05d2\u05d3\u05d9\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05dc\u05e1\u05d5\u05d2 \u05e2\u05e7\u05d1\u05d5\u05ea -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=\u05d4\u05df \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d8\u05e2\u05df \u05dc\u05e1\u05d5\u05d2 -TrackerPanel.DataBuilder.Dialog.WrongType.Title=\u05e1\u05d5\u05d2 \u05e9\u05d2\u05d5\u05d9 -TrackerPanel.DataBuilder.Dialog.WrongType.Message=\u05d4\u05e7\u05d5\u05d1 \u05dc\u05d0 \u05de\u05d2\u05d3\u05d9\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=\u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd -ExportTRKDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d0\u05ea \u05d6\u05d4 \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? -ExportTRKDialog.Complete.Title=\u05d9\u05e6\u05d5\u05d0 \u05d4\u05d5\u05e9\u05dc\u05dd -ExportTRKDialog.Title=\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 -ExportTRKDialog.Message1=\u05d6\u05d4 (1) \u05dc\u05d9\u05e6\u05d0 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df , (2) \u05dc\u05d4\u05de\u05d9\u05e8 \u05d0 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05dc\u05e1\u05e8\u05d8\u05d5\u05df \u05d4\u05de\u05d9\u05d5\u05e6\u05d0, \u05d5- (3) \u05dc\u05e9\u05de\u05d5\u05e8 \u05d0\u05ea \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05db\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d7\u05d3\u05e9. -ExportTRKDialog.Message2=\u05e7\u05d5\u05d1\u05e6\u05d9 \u05d4\u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05d4\u05d8\u05e8\u05e7\u05e8 \u05e0\u05e9\u05de\u05e8\u05d9\u05dd \u05d1\u05d0\u05d5\u05ea\u05d5 \u05e9\u05dd \u05ea\u05d7\u05ea \u05e1\u05d9\u05d5\u05de\u05ea \u05e9\u05d5\u05e0\u05d4, \u05d1\u05d0\u05d5\u05ea\u05d4 \u05ea\u05d9\u05e7\u05d9\u05d4. -TMenuBar.MenuItem.TabClip=\u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 -TMenuBar.Menu.CalibrationTools=\u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc -TrackerIO.Dialog.DurationVaries.Button.SetClip=\u05d4\u05d2\u05d3\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05de\u05d5\u05de\u05dc\u05e5 -TrackerIO.Dialog.DurationVaries.Start=\u05d4\u05ea\u05d7\u05dc -TrackerIO.Dialog.DurationVaries.End=\u05e1\u05d9\u05d9\u05dd -TrackerIO.Dialog.DurationVaries.Recommended=\u05e1\u05e8\u05d8\u05d5\u05df \u05de\u05d5\u05de\u05dc\u05e5 - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05e6\u05d5\u05d5\u05ea -AttachmentInspector.Label.End=\u05e1\u05d5\u05e3 -AttachmentInspector.Label.Vertex=\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 -AttachmentInspector.Header.PointName=\u05e9\u05dd -AttachmentInspector.Header.AttachedTo=\u05e6\u05e8\u05e3 \u05d0\u05dc -ExportTRKDialog.Label.VideoFormat=\u05e7\u05d5\u05d1\u05e5 \u05d5\u05d9\u05d3\u05d0\u05d5 -MeasuringTool.MenuItem.Attach=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05e6\u05d5\u05d5\u05ea... -PerspectiveTrack.Corner=\u05e4\u05d9\u05e0\u05d4 -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=\u05d6\u05de\u05df -Protractor.Data.Description.1=\u05d6\u05d5\u05d9\u05ea \u05de\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea -Protractor.Data.Description.2=\u05d0\u05d5\u05e8\u05da \u05d6\u05e8\u05d5\u05e2 1 -Protractor.Data.Description.3=\u05d0\u05d5\u05e8\u05da \u05d6\u05e8\u05d5\u05e2 2 -Protractor.Data.Description.4=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 -Protractor.Data.Description.5=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 -TapeMeasure.Data.Description.0=\u05d6\u05de\u05df -TapeMeasure.Data.Description.1=\u05d0\u05d5\u05e8\u05da -TapeMeasure.Data.Description.2=\u05d6\u05d5\u05d9\u05ea \u05de\u05d7\u05dc\u05e7\u05d5 \u05d4\u05d7\u05d9\u05d5\u05d1\u05d9 \u05e9\u05dc \u05e6\u05d9\u05e8 \u05d4-x -TapeMeasure.Data.Description.3=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 -TapeMeasure.Data.Description.4=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=\u05d8\u05e8\u05dd \u05d7\u05d5\u05e4\u05e9 -AutoTracker.Info.KeyFrame=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d6\u05d5 -AutoTracker.Wizard.Menuitem.DeleteThisMatch=\u05d6\u05d4 \u05de\u05ea\u05d0\u05d9\u05dd -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=\u05d4\u05ea\u05d0\u05de\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e8\u05d5\u05ea -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=\u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -Dialog.Button.Add=\u05d4\u05d5\u05e1\u05e3 -Dialog.Button.Remove=\u05d4\u05e1\u05e8 -PrefsDialog.Button.ClearHost=\u05e0\u05e7\u05d4 \u05de\u05d0\u05e8\u05d7 -PrefsDialog.Button.ClearHost.Tooltip=\u05e0\u05e7\u05d4 \u05d0\u05ea \u05db\u05dc \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05de\u05e7\u05d5\u05e9\u05e8\u05d9\u05dd \u05dc\u05de\u05d0\u05e8\u05d7 OSP cache -PrefsDialog.Button.ClearCache.Tooltip=\u05de\u05d7\u05e7 \u05d0\u05ea \u05db\u05dc \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05de\u05d4- OSP cache -TActions.Action.SaveZip=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -ThumbnailDialog.Title=\u05d9\u05e6\u05d0 \u05ea\u05de\u05d5\u05e0\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 -ThumbnailDialog.Settings.Title=\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 -ThumbnailDialog.Label.CurrentImage=\u05ea\u05de\u05d5\u05e0\u05d4 \u05e0\u05d5\u05db\u05d7\u05d9\u05ea -ThumbnailDialog.Label.FrameNumber=\u05ea\u05de\u05d5\u05e0\u05d4 -ThumbnailDialog.Label.StepNumber=\u05e6\u05e2\u05d3 -ThumbnailDialog.View.VideoOnly=\u05e8\u05e7 \u05d5\u05d9\u05d3\u05d0\u05d5 -ThumbnailDialog.View.MainView=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea -ThumbnailDialog.View.WholeFrame=\u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05dc\u05d0\u05d4 -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=\u05e9\u05de\u05d5\u05e8 \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 -ThumbnailDialog.Subtitle.Image=\u05ea\u05de\u05d5\u05e0\u05d4 -TMenuBar.MenuItem.Thumbnail=\u05ea\u05de\u05d5\u05e0\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 -TToolBar.Button.SaveZip.Tooltip=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -TTrack.MenuItem.DeletePoint=\u05de\u05d7\u05e7 \u05e6\u05e2\u05d3 \u05e0\u05d1\u05d7\u05e8 -ZipResourceDialog.Title=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -ZipResourceDialog.Label.Format=\u05e1\u05d5\u05d2 -ZipResourceDialog.Label.Title=\u05e9\u05dd -ZipResourceDialog.Label.Description=\u05ea\u05d9\u05d0\u05d5\u05e8 -ZipResourceDialog.Label.Keywords=\u05de\u05d9\u05dc\u05d5\u05ea \u05de\u05e4\u05ea\u05d7 -ZipResourceDialog.Label.Link=\u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9\u05d9\u05dd -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd -ZipResourceDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d6\u05d0\u05ea \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? -ZipResourceDialog.Complete.Title=\u05d4\u05e6\u05dc\u05d7\u05d4 -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=\u05d5\u05d9\u05d3\u05d0\u05d5 -ZipResourceDialog.Border.Title.Thumbnail=\u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 -ZipResourceDialog.FileChooser.SaveZip.Title=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -ZipResourceDialog.FileChooser.AddFile.Title=\u05d4\u05d5\u05e1\u05e3 \u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) -ZipResourceDialog.FileChooser.OpenHTML.Title=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 HTML -ZipResourceDialog.Button.AddFiles=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd -ZipResourceDialog.Button.ThumbnailSettings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea -ZipResourceDialog.Checkbox.TrimVideo=\u05d7\u05ea\u05d5\u05da \u05dc\u05e1\u05e8\u05d8\u05d5\u05df -ZipResourceDialog.AddHTMLInfo.Title=\u05d4\u05d5\u05e1\u05e3 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05e7\u05d5\u05d1\u05e5 HTML -ZipResourceDialog.AddHTMLInfo.Message1=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05dc\u05e7\u05d5\u05d1\u05e5 HTML? -ZipResourceDialog.AddHTMLInfo.Message2=\u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd? -ZipResourceDialog.HTMLField.DefaultText=\u05d0\u05dd \u05dc\u05d0 \u05d4\u05d5\u05d2\u05d3\u05e8, \u05e7\u05d5\u05d1\u05e5 \u05d9\u05d9\u05d5\u05e6\u05e8 \u05de\u05d4\u05ea\u05d7\u05dc\u05d4 -ZipResourceDialog.Dialog.AddFiles.Title=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9 HTML \u05d5- PDF -ZipResourceDialog.Tooltip.HTML=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d5\u05d1\u05e5 \u05de\u05e7\u05d5\u05e8 HTML (\u05d0\u05dd \u05d0\u05d9\u05df \u05e7\u05d1\u05e6\u05d9\u05dd \u05d9\u05d9\u05d5\u05e6\u05e8\u05d5 \u05de\u05d4\u05ea\u05d7\u05dc\u05d4) -ZipResourceDialog.Tooltip.Author=\u05d9\u05d5\u05e6\u05e8 \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 -ZipResourceDialog.Tooltip.Title=\u05d4\u05e8\u05d0\u05d4 \u05e9\u05dd \u05de\u05e9\u05d0\u05d1 (\u05dc\u05d0 \u05e9\u05dd \u05e7\u05d5\u05d1\u05e5) -ZipResourceDialog.Tooltip.Description=\u05ea\u05d9\u05d0\u05d5\u05e8 \u05e9\u05d9\u05de\u05d5\u05e9\u05d9 \u05e9\u05dc \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 -ZipResourceDialog.Tooltip.Keywords=\u05e8\u05e9\u05d9\u05de\u05ea \u05de\u05d9\u05dc\u05d5\u05ea \u05de\u05e4\u05ea\u05d7 \u05dc\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d1\u05d3\u05e4\u05d3\u05e4\u05df -ZipResourceDialog.Tooltip.Contact=\u05e4\u05e8\u05d8\u05d9 \u05e7\u05e9\u05e8 \u05e9\u05dc \u05d4\u05d9\u05d5\u05e6\u05e8 (\u05de\u05d5\u05e1\u05d3, e-mail, \u05d0\u05ea\u05e8 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d5\u05db\u05d3\u05d5\u05de\u05d4...) -ZipResourceDialog.Tooltip.Link=\u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05e7\u05d5\u05d1\u05e5 HTML \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05e2\u05dd \u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 -ZipResourceDialog.Tooltip.ThumbnailSettings=\u05e9\u05e0\u05d4 \u05de\u05e8\u05d0\u05d4 \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2, \u05d2\u05d5\u05d3\u05dc \u05d0\u05d5 \u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 -ZipResourceDialog.Tooltip.AddFiles=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9 HTML \u05d5- PDF \u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd -ZipResourceDialog.Tooltip.TrimVideo=\u05e1\u05de\u05df \u05db\u05d3\u05d9 \u05dc\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df, \u05d0\u05dc \u05ea\u05e1\u05de\u05df \u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e1\u05e8\u05d8 \u05d4\u05de\u05e7\u05d5\u05e8\u05d9 -ZipResourceDialog.Tooltip.LoadHTML=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d1\u05d5\u05d7\u05e8 \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d8\u05e2\u05d5\u05df \u05de\u05d9\u05d3\u05e2 \u05de\u05e7\u05d5\u05d1\u05e5 HTML - -# Additions by Doug Brown 2012-12-10 -PrefsDialog.Checkbox.32BitVM=32-bit -PrefsDialog.Checkbox.WarnVariableDuration=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05e9\u05ea\u05e0\u05d4 -PrefsDialog.Button.NoEngine=\u05d0\u05e3-\u05d0\u05d7\u05d3 -PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. -PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed -PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. -PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. -PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. -PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. -PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required -PrefsDialog.Button.ShowHelpNow=\u05d4\u05e8\u05d0\u05d4 \u05e2\u05d6\u05e8\u05d4 \u05e2\u05db\u05e9\u05d9\u05d5 -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=\u05dc\u05d0 \u05e7\u05d1\u05d5\u05e2 -TMenuBar.MenuItem.CheckFrameDurations=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 -TMenuBar.MenuItem.ExportZIP=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (Zip) -Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. -Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they -Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. -Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? -Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now -Tracker.Dialog.Button.ShowPrefs=No, but show preferences -Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video -Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. -TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). -TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) -TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents -ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the -ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the -ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. -ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? -ZipResourceDialog.BadModels.Title=Clip-Model Conflicts -TMenuBar.MenuItem.EditVideoFrames=Load All Images -TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. -TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. -TMenuBar.Dialog.RequiresMemory.Title=Memory - -# Additions by Doug Brown 2013-01-25 -PointMass.Data.Description.PixelX=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05e4\u05d9\u05e7\u05e1\u05dc -PointMass.Data.Description.PixelY=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05e4\u05d9\u05e7\u05e1\u05dc -ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video -ExportVideoDialog.Deinterlace.OddFirst=\u05e9\u05d3\u05d5\u05ea \u05d0\u05d9-\u05d6\u05d5\u05d2\u05d9\u05d9\u05dd \u05e7\u05d5\u05d3\u05dd -ExportVideoDialog.Deinterlace.EvenFirst=\u05e9\u05d3\u05d5\u05ea \u05d6\u05d5\u05d2\u05d9\u05d9\u05dd \u05e7\u05d5\u05d3\u05dd -ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order -TFrame.Dialog.LibraryError.FileNotFound.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -TFrame.Dialog.LibraryError.FileNotFound.Message=\u05dc\u05d0 \u05de\u05e6\u05dc\u05d9\u05d7 \u05dc\u05de\u05e6\u05d5\u05d0 \u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 -TrackerPanel.DataBuilder.Button.Autoload=\u05d8\u05e2\u05d9\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea -TrackerPanel.DataBuilder.Button.Autoload.Tooltip=\u05e0\u05d4\u05dc \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d8\u05e2\u05d9\u05e0\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea -TrackerPanel.DataBuilder.Autoload.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d8\u05e2\u05d9\u05e0\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea -TrackerPanel.DataBuilder.Autoload.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05dc\u05d8\u05e2\u05d9\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea: -TrackerPanel.DataBuilder.Chooser.XMLFiles=\u05e7\u05d1\u05e6\u05d9 XML -TrackerIO.Dialog.Open.Title=\u05e4\u05ea\u05d7 -TToolbar.Button.Refresh.Popup.RefreshNow=\u05e8\u05e2\u05e0\u05df -TToolbar.Button.Refresh.Popup.AutoRefresh=\u05e8\u05e2\u05e0\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 -TToolbar.Button.Refresh.Tooltip=\u05e8\u05e2\u05e0\u05df \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d5\u05ea\u05e6\u05d5\u05d2\u05d5\u05ea - -# Additions by Doug Brown 2013-05-10 -CoordAxes.Origin.Label=\u05e4\u05d9\u05e7\u05e1\u05dc \u05e8\u05d0\u05e9\u05d9\u05ea -CoordAxes.Origin.Field.Tooltip=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05e8\u05d0\u05e9\u05d9\u05ea \u05e0\u05de\u05d3\u05d3 \u05de\u05d4\u05e4\u05d9\u05e0\u05d4 \u05d4\u05e9\u05de\u05d0\u05dc\u05d9\u05ea \u05d4\u05e2\u05dc\u05d9\u05d5\u05e0\u05d4 \u05e9\u05dc \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 - -# Additions by Doug Brown 2013-08-24 -MainTView.Popup.MenuItem.Select=\u05d1\u05d7\u05e8 \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea -MainTView.Popup.MenuItem.Deselect=\u05d1\u05d8\u05dc \u05d1\u05d7\u05d9\u05e8\u05ea \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea -ZipResourceDialog.Checkbox.PreviewThumbnail=\u05d4\u05e6\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4 -ZipResourceDialog.Dialog.BadFileName.Message=\u05e9\u05dd \u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc \u05dc\u05db\u05dc\u05d5\u05dc \u05d0\u05ea \u05d4\u05ea\u05d5\u05d5\u05d9\u05dd \u05d4\u05d1\u05d0\u05d9\u05dd: -ZipResourceDialog.Dialog.BadFileName.Title=\u05e9\u05dd \u05e7\u05d5\u05d1\u05e5 \u05d0\u05e1\u05d5\u05e8 -ZipResourceDialog.Dialog.ExportFailed.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d0 \u05d0\u05ea \u05e7\u05d5\u05d1\u05e5 \u05d4- ZIP. -ZipResourceDialog.Dialog.ExportFailed.Title=\u05d9\u05e6\u05d5\u05d0 \u05e0\u05db\u05e9\u05dc -PrefsDialog.Button.SetCache=Set Cache - -# Additions by Doug Brown 2013-12-17 -Tracker.StartLog=\u05d9\u05d5\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05d4 -Tracker.StartLog.NotFound=\u05d9\u05d5\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05d4 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -Tracker.Dialog.MemoryReduced.Title=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05de\u05d5\u05e2\u05d3\u05e3 \u05d4\u05d5\u05e4\u05d7\u05ea -Tracker.Dialog.MemoryReduced.Message1=\u05d8\u05e8\u05e7\u05e8 \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7 \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05e2\u05dd \u05d6\u05d9\u05db\u05e8\u05d5\u05df -Tracker.Dialog.MemoryReduced.Message2=\u05d0\u05d6 \u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05de\u05d5\u05e2\u05d3\u05e3 \u05d4\u05d5\u05e4\u05d7\u05ea \u05dc -Tracker.Dialog.MemoryReduced.Message3=\u05dc\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3 \u05e8\u05d0\u05d4 \u05e2\u05d6\u05e8\u05d4|\u05d3\u05d9\u05d0\u05d2\u05e0\u05d5\u05d6\u05d4|\u05d4\u05ea\u05d7\u05dc \u05d9\u05d5\u05de\u05df... -TrackPlottingPanel.Popup.MenuItem.ShowZero=\u05d4\u05e6\u05d2 -TableTrackView.Menu.TextColumn.Text=\u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05e7\u05e1\u05d8 -TableTrackView.Menu.TextColumn.Tooltip=\u05e0\u05d4\u05dc \u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05e7\u05e1\u05d8 \u05d4\u05e0\u05d9\u05ea\u05e0\u05d5\u05ea \u05dc\u05e2\u05e8\u05d9\u05db\u05d4 -TableTrackView.Action.CreateTextColumn.Text=\u05e6\u05d5\u05e8... -TableTrackView.Action.DeleteTextColumn.Text=\u05de\u05d7\u05e7 -TableTrackView.Action.RenameTextColumn.Text=\u05ea\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 -TableTrackView.Dialog.NameColumn.Message=\u05d4\u05db\u05e0\u05e1 \u05e9\u05dd \u05e2\u05de\u05d5\u05d3\u05d4. -TableTrackView.Dialog.NameColumn.TryAgain=\u05e9\u05dd \u05d6\u05d4 \u05db\u05d1\u05e8 \u05d1\u05e9\u05d9\u05de\u05d5\u05e9. -TableTrackView.Dialog.NameColumn.Title=\u05e2\u05de\u05d5\u05d3\u05ea \u05d8\u05e7\u05e1\u05d8 +# This is the hebrew tracker.properties file +# Translated by (Amit Kenny), (date1/1/2014) +Calibration.Name=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05db\u05d9\u05d5\u05dc +Calibration.New.Name=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05db\u05d9\u05d5\u05dc +CenterOfMass.Name=\u05de\u05e8\u05db\u05d6 \u05de\u05e1\u05d4 +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4... +CenterOfMassInspector.Title=\u05de\u05e8\u05db\u05d6 \u05de\u05e1\u05d4 +CenterOfMassInspector.Border.Title=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4 +ConfigInspector.Border.Title=\u05ea\u05db\u05d5\u05e0\u05d5\u05ea \u05e8\u05e6\u05d5\u05d9\u05d5\u05ea +ConfigInspector.Title=\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea +ConfigInspector.Button.SaveAsDefault=\u05e9\u05de\u05d5\u05e8 \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +CoordAxes.Name=\u05e6\u05d9\u05e8\u05d9\u05dd +CoordAxes.New.Name=\u05e6\u05d9\u05e8\u05d9\u05dd +Dialog.Button.Cancel=\u05d1\u05d8\u05dc +Dialog.Button.OK=\u05d0\u05e9\u05e8 +Dialog.Button.Close=\u05e1\u05d2\u05d5\u05e8 +Dialog.Button.All=\u05d4\u05db\u05dc +Dialog.Button.None=\u05d0\u05e3-\u05d0\u05d7\u05d3 +Dialog.Button.Copy=\u05d4\u05e2\u05ea\u05e7 +Dialog.Button.Update=\u05e2\u05d3\u05db\u05df +Dialog.Button.SelectAll=\u05d1\u05d7\u05e8 \u05d4\u05db\u05dc +Footprint.Diamond=\u05d9\u05d4\u05dc\u05d5\u05dd +Footprint.BoldDiamond=\u05d9\u05d4\u05dc\u05d5\u05dd \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.SolidDiamond=\u05d9\u05d4\u05dc\u05d5\u05dd \u05de\u05d5\u05e6\u05e7 +Footprint.Triangle=\u05de\u05e9\u05d5\u05dc\u05e9 +Footprint.BoldTriangle=\u05de\u05e9\u05d5\u05dc\u05e9 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.SolidTriangle=\u05de\u05e9\u05d5\u05dc\u05e9 \u05de\u05d5\u05e6\u05e7 +Footprint.Circle=\u05e2\u05d9\u05d2\u05d5\u05dc +Footprint.BoldCircle=\u05e2\u05d9\u05d2\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.SolidCircle=\u05e2\u05d9\u05d2\u05d5\u05dc \u05de\u05d5\u05e6\u05e7 +Footprint.VerticalLine=\u05e7\u05d5 \u05d0\u05e0\u05db\u05d9 +Footprint.BoldVerticalLine=\u05e7\u05d5 \u05d0\u05e0\u05db\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.HorizontalLine=\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9 +Footprint.BoldHorizontalLine=\u05e7\u05d5 \u05d0\u05d5\u05e4\u05e7\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.Crosshair=\u05e6\u05dc\u05d1 +Footprint.BoldCrosshair=\u05e6\u05dc\u05d1 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.SimpleAxes=\u05e6\u05d9\u05e8\u05d9\u05dd \u05e4\u05e9\u05d5\u05d8\u05d9\u05dd +Footprint.BoldSimpleAxes=\u05e6\u05d9\u05e8\u05d9\u05dd \u05e4\u05e9\u05d5\u05d8\u05d9\u05dd \u05de\u05d5\u05d3\u05d2\u05e9\u05d9\u05dd +Footprint.Spot=\u05e0\u05e7\u05d5\u05d3\u05d4 +Footprint.Line=\u05e7\u05d5 +Footprint.BoldLine=\u05e7\u05d5 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.Outline=\u05e7\u05d5 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 +Footprint.BoldOutline=\u05e7\u05d5 \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.Arrow=\u05d7\u05e5 +Footprint.BoldArrow=\u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.DoubleArrow=\u05d7\u05e5 \u05db\u05e4\u05d5\u05dc +Footprint.BoldDoubleArrow=\u05d7\u05e5 \u05db\u05e4\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.2xArrow=2x \u05d7\u05e5 +Footprint.Bold2xArrow=2x \u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.4xArrow=4x \u05d7\u05e5 +Footprint.Bold4xArrow=4x \u05d7\u05e5 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.DashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 +Footprint.BoldDashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 \u05de\u05d5\u05d3\u05d2\u05e9 +Footprint.BigArrow=\u05d7\u05e5 \u05d2\u05d3\u05d5\u05dc +Footprint.BigDashArrow=\u05d7\u05e5 \u05de\u05e7\u05d5\u05d5\u05e7\u05d5 \u05d2\u05d3\u05d5\u05dc +LineProfile.Name=\u05e7\u05d5 \u05e4\u05e8\u05d5\u05e4\u05d9\u05dc +LineProfile.New.Name=\u05e4\u05e8\u05d5\u05e4\u05d9\u05dc +LineProfile.Data.Brightness=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea +LineProfile.Data.Pixel=\u05e4\u05d9\u05e7\u05e1\u05dc +LineProfile.Data.Red=\u05d0\u05d3\u05d5\u05dd +LineProfile.Data.Green=\u05d9\u05e8\u05d5\u05e7 +LineProfile.Data.Blue=\u05db\u05d7\u05d5\u05dc +LineProfile.Data.Weighting=\u05de\u05d5\u05e0\u05d4 +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=\u05d6\u05d5\u05dd +MainTView.Popup.MenuItem.ToFit=\u05dc\u05d4\u05ea\u05d0\u05d9\u05dd +OffsetOrigin.Name=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05d5\u05d6\u05d6\u05ea +OffsetOrigin.New.Name=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05d5\u05d6\u05d6\u05ea +PlotTrackView.Button.PlotCount=\u05d2\u05e8\u05e3 +PlotTrackView.Button.PlotCount.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05d5\u05e0\u05d4 \u05d2\u05e8\u05e3 +PointMass.Name=\u05e0\u05e7\u05d5\u05d3\u05ea \u05de\u05e1\u05d4 +PointMass.New.Name=\u05de\u05e1\u05d4 +PointMass.MenuItem.VectorsToPosition=\u05dc\u05de\u05d9\u05e7\u05d5\u05dd +PointMass.MenuItem.Velocity=\u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea +PointMass.MenuItem.Acceleration=\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea +Star.Name=\u05db\u05d5\u05db\u05d1 +Star.New.Name=\u05db\u05d5\u05db\u05d1 +TableTrackView.Action.CopyData=\u05d4\u05e2\u05ea\u05e7 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TableTrackView.Button.SelectTableData=\u05d8\u05d1\u05dc\u05d4 +TableTrackView.Button.SelectTableData.ToolTip=\u05d1\u05d7\u05e8 \u05e2\u05de\u05d5\u05d3\u05d5\u05ea +TableTrackView.Popup.MenuItem.Analyze=\u05e0\u05ea\u05d7... +TableTrackView.Dialog.Border.Title=\u05e0\u05e8\u05d0\u05d4: +TActions.Action.Description=\u05d4\u05e2\u05e8\u05d5\u05ea +TActions.Action.ClearTracks=\u05db\u05dc \u05d4\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd +TActions.Action.NewTab=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d7\u05d3\u05e9\u05d4 +TActions.Action.Copy=\u05d4\u05e2\u05ea\u05e7 +TActions.Action.Paste=\u05d4\u05d3\u05d1\u05e7 +TActions.Action.Open=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5... +TActions.Action.Close=\u05e1\u05d2\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +TActions.Action.Import=\u05d9\u05d1\u05d0... +TActions.Action.Save=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +TActions.Action.SaveAs=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d1\u05e9\u05dd... +TActions.Action.Export=\u05d9\u05e6\u05d0... +TActions.Action.CaptureVideo=\u05d4\u05e7\u05dc\u05d8 \u05d5\u05d9\u05d3\u05d0\u05d5... +TActions.Action.Delete=\u05de\u05d7\u05e7 +TActions.Action.Config=\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea... +TActions.Action.AxesVisible=\u05e0\u05e8\u05d0\u05d4 +TActions.Action.TapeVisible=\u05e0\u05e8\u05d0\u05d4 +TActions.Action.Print=\u05d4\u05d3\u05e4\u05e1... +TActions.Action.ClearFilters=\u05e0\u05e7\u05d4 +TActions.Action.ImportVideo=\u05d9\u05d1\u05d0... +TActions.Action.CloseVideo=\u05e1\u05d2\u05d5\u05e8 +TActions.Action.CloseAll=\u05e1\u05d2\u05d5\u05e8 \u05d0\u05ea \u05db\u05dc \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea +TActions.Action.Exit=\u05e6\u05d0 +TActions.Dialog.PrintError.Message=\u05d0\u05e8\u05e2\u05d4 \u05e9\u05d2\u05d9\u05d0\u05ea \u05d4\u05d3\u05e4\u05e1\u05d4. +TActions.Dialog.PrintError.Title=\u05e9\u05d2\u05d9\u05ea \u05d4\u05d3\u05e4\u05e1\u05d4 +TActions.Dialog.Description.Title=\u05d4\u05e2\u05e8\u05d5\u05ea: +TActions.Dialog.DeleteLockedTracks.Message=\u05e7\u05d9\u05d9\u05de\u05d9\u05dd \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e0\u05e2\u05d5\u05dc\u05d9\u05dd. \u05d4\u05d0\u05dd \u05dc\u05de\u05d7\u05d5\u05e7 \u05d1\u05db\u05dc \u05de\u05e7\u05e8\u05d4? +TActions.Dialog.DeleteLockedTracks.Title=\u05dc\u05de\u05d7\u05d5\u05e7 \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e0\u05e2\u05d5\u05dc\u05d9\u05dd? +TActions.Dialog.NewPointMass.Title=\u05e0\u05e7\u05d5\u05d3\u05ea \u05de\u05e1\u05d4 \u05d7\u05d3\u05e9\u05d4 +TapeMeasure.Name=\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 +TapeMeasure.New.Name=\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 +TapeMeasure.MenuItem.Fixed=\u05e7\u05d1\u05d5\u05e2 +TFrame.View.Plot=\u05d4\u05e6\u05d2\u05d4 \u05d2\u05e8\u05e4\u05d9\u05ea +TFrame.View.Table=\u05d4\u05e6\u05d2\u05ea \u05d8\u05d1\u05dc\u05d4 +TFrame.View.World=\u05d4\u05e6\u05d2\u05d4 \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea +TFrame.View.Video=\u05d4\u05e6\u05d2\u05ea \u05e1\u05e8\u05d8 +TFrame.Dialog.Help.Title=\u05e2\u05d6\u05e8\u05d4 +TMenuBar.Menu.File=\u05e7\u05d5\u05d1\u05e5 +TMenuBar.Menu.Edit=\u05e2\u05e8\u05d5\u05da +TMenuBar.Menu.Video=\u05e1\u05e8\u05d8 +TMenuBar.Menu.Tracks=\u05e2\u05e7\u05d1\u05d5\u05ea +TMenuBar.Menu.Coords=\u05de\u05e2\u05e8\u05db\u05ea \u05e6\u05d9\u05e8\u05d9\u05dd +TMenuBar.Menu.Window=\u05ea\u05e6\u05d5\u05d2\u05d5\u05ea +TMenuBar.Menu.Help=\u05e2\u05d6\u05e8\u05d4 +TMenuBar.MenuItem.EditProperties=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... +TMenuBar.MenuItem.VideoVisible=\u05e0\u05e8\u05d0\u05d4 +TMenuBar.MenuItem.VideoFilters=\u05de\u05e1\u05e0\u05e0\u05d9\u05dd +TMenuBar.MenuItem.NewVideoFilter=\u05d7\u05d3\u05e9 +TMenuBar.MenuItem.NewTrack=\u05d7\u05d3\u05e9 +TMenuBar.MenuItem.CoordsLocked=\u05e0\u05e2\u05d5\u05dc +TMenuBar.MenuItem.CoordsFixedOrigin=\u05e8\u05d0\u05e9\u05d9\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05ea +TMenuBar.MenuItem.CoordsFixedAngle=\u05d6\u05d5\u05d9\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05ea +TMenuBar.MenuItem.CoordsFixedScale=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05de\u05e7\u05d5\u05d1\u05e2 +TMenuBar.MenuItem.CoordsRefFrame=\u05ea\u05de\u05d5\u05e0\u05ea \u05d9\u05d7\u05d5\u05e1 +TMenuBar.MenuItem.CoordsDefault=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +TMenuBar.MenuItem.WindowRight=\u05de\u05e8\u05d0\u05d4 \u05d9\u05de\u05e0\u05d9 +TMenuBar.MenuItem.WindowBottom=\u05de\u05e8\u05d0\u05d4 \u05ea\u05d7\u05ea\u05d5\u05df +TMenuBar.MenuItem.PlayAllSteps=\u05d4\u05e7\u05e8\u05df \u05d0\u05ea \u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd +TMenuBar.MenuItem.Record=\u05d4\u05e7\u05dc\u05d8 +TMenuBar.MenuItem.MatSize=Mat Size +TMenuBar.MenuItem.Language=\u05e9\u05e4\u05d4 +TMenuBar.MenuItem.DeleteTrack=\u05de\u05d7\u05e7 +TMenuBar.MenuItem.TrackerHelp=\u05e2\u05d6\u05e8\u05d4... +TMenuBar.MenuItem.MessageLog=\u05e8\u05d9\u05e9\u05d5\u05dd \u05de\u05e1\u05e8\u05d9\u05dd... +TrackControl.Name=\u05d1\u05e7\u05e8\u05ea \u05de\u05e2\u05e7\u05d1 +TrackControl.Button.NewTrack=\u05e6\u05d5\u05e8 +TrackControl.Button.NewTrack.ToolTip=\u05e6\u05d5\u05e8 \u05de\u05e2\u05e7\u05d1 \u05d7\u05d3\u05e9 +TrackControl.Button.Trails.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05de\u05e1\u05dc\u05d5\u05dc +TrackControl.Button.Labels.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05e1\u05e4\u05d5\u05e8 +TrackControl.Button.StretchVectors.ToolTip=\u05de\u05ea\u05d7 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd +TrackControl.Button.Accelerations.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8 \u05ea\u05d0\u05d5\u05e6\u05d4 +TrackControl.Button.Xmass.ToolTip=\u05d4\u05db\u05e4\u05dc \u05d5\u05e7\u05d8\u05d5\u05e8 \u05d1\u05de\u05e1\u05d4 +TrackControl.Button.Vectors.ToolTip=\u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd +TrackControl.Button.Velocities.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8 \u05de\u05d4\u05d9\u05e8\u05d5\u05ea +TrackControl.Button.Properties.ToolTip=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 +TrackControl.Button.Positions.ToolTip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05d9\u05e7\u05d5\u05dd +Tracker.Popup.MenuItem.Snapshot=\u05e6\u05dc\u05dd... +Tracker.Popup.MenuItem.Help=\u05e2\u05d6\u05e8\u05d4... +Tracker.Cursor.Crosshair.Description=\u05e1\u05de\u05df \u05e6\u05dc\u05d1 +Tracker.Action.AboutTracker=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d8\u05e8\u05e7\u05e8... +Tracker.Dialog.AboutTracker.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d8\u05e8\u05e7\u05e8 +Tracker.Action.AboutJava=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4... +Tracker.Dialog.AboutJava.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4 +Tracker.Dialog.AboutJava.UnknownVersion=\u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2 +Tracker.Dialog.AboutJava.Message=\u05d2\u05e8\u05e1\u05ea \u05d2'\u05d0\u05d5\u05d5\u05d4 +Tracker.Action.AboutQT=\u05d0\u05d5\u05d3\u05d5\u05ea QuickTime... +Tracker.Dialog.AboutQT.Title=\u05d0\u05d5\u05d3\u05d5\u05ea QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=\u05d2\u05e8\u05e1\u05ea QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=\u05d2\u05e8\u05e1\u05ea QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: +Tracker.Dialog.NoQT.Title=QTJava.zip not found +Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. +Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. +Tracker.Dialog.UpdateQT.Title=\u05e2\u05d3\u05db\u05df QTJava.zip +Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at +Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? +Tracker.Dialog.CopyQT.Title=\u05d4\u05e2\u05ea\u05e7 QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from +Tracker.Dialog.CopyQT.Message3= to +Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. +Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? +Tracker.Dialog.CopyFailed.Title=\u05d4\u05e2\u05ea\u05e7\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4 +Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. +Tracker.Dialog.CopiedTo.Title=\u05d4\u05d5\u05e2\u05ea\u05e7 \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4 +Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to +Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. +Tracker.Splash.Title=\u05d8\u05e8\u05e7\u05e8 +Tracker.Splash.CreatingFrame=Creating frame +Tracker.Splash.VersionMessage=\u05d2\u05e8\u05e1\u05d4 +Tracker.Splash.AddingPanel=\u05d4\u05d5\u05e1\u05e3 \u05dc\u05d5\u05d7 \u05de\u05e2\u05e7\u05d1 +Tracker.Splash.AddingTab=\u05d4\u05d5\u05e1\u05e3 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +Tracker.Splash.Loading=\u05d8\u05d5\u05e2\u05df +Tracker.Splash.Wait=\u05d8\u05d5\u05e2\u05df \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd, \u05d0\u05e0\u05d0 \u05d4\u05de\u05ea\u05df +Tracker.Splash.AddingAxes=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e6\u05d9\u05e8\u05d9\u05dd +Tracker.Splash.AddingMenuBar=\u05de\u05d5\u05e1\u05d9\u05e3 \u05de\u05e1\u05e4\u05e8 +Tracker.Splash.AddingViews=\u05de\u05d5\u05e1\u05d9\u05e3 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea +Tracker.Splash.AddingTape=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 +Tracker.Splash.AddingToolbar=\u05de\u05d5\u05e1\u05d9\u05e3 \u05e1\u05e8\u05d2\u05dc \u05db\u05dc\u05d9\u05dd +TrackerIO.Dialog.Import.Title=\u05d9\u05d1\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 +TrackerIO.Dialog.Import.Message=\u05d1\u05d7\u05e8 \u05e4\u05e8\u05d9\u05d8 \u05dc\u05d9\u05d1\u05d5\u05d0 +TrackerIO.Dialog.ImportVideo.Title=\u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 +TrackerIO.Dialog.Export.Title=\u05d9\u05e6\u05d0 +TrackerIO.Dialog.Export.Message=\u05d1\u05d7\u05e8 \u05e4\u05e8\u05d9\u05d8 \u05dc\u05d9\u05e6\u05d5\u05d0 +TrackerIO.Dialog.ReplaceFile.Title=\u05dc\u05d4\u05d7\u05dc\u05d9\u05e3 \u05e7\u05d5\u05d1\u05e5 \u05e7\u05d9\u05d9\u05dd? +TrackerIO.Dialog.ReplaceFile.Message=\u05db\u05d1\u05e8 \u05e7\u05d9\u05d9\u05dd. \u05dc\u05d4\u05d7\u05dc\u05d9\u05e3? +TrackerIO.Dialog.NotTrackerXML.Title=XML \u05dc\u05d0 \u05ea\u05d5\u05d0\u05dd +TrackerIO.Dialog.NotTrackerXML.Message=\u05de\u05db\u05d9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 xml \u05dc\u05ea\u05d5\u05db\u05e0\u05d4 \u05d0\u05d7\u05e8\u05ea +TrackerIO.Dialog.BadVideo.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d9\u05e0\u05d5 \u05e1\u05d5\u05d2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05d6\u05d5\u05d4\u05d4: +TrackerIO.Dialog.BadVideo.Title=\u05e7\u05d5\u05d1\u05e5 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d1\u05dc\u05ea\u05d9 \u05de\u05d6\u05d5\u05d4\u05d4 +TrackerPanel.NewTab.Name=\u05dc\u05dc\u05d0 \u05e9\u05dd +TrackerPanel.DragToMark.Hint=Shift-\u05de\u05e9\u05d5\u05da \u05dc\u05e1\u05d9\u05de\u05d5\u05df +TrackerPanel.ClickToMark.Hint=Shift-\u05d4\u05e7\u05e9 \u05dc\u05e1\u05d9\u05de\u05d5\u05df +TrackerPanel.Dialog.LoadFailed.Title=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05dc\u05d0 \u05d7\u05d5\u05e7\u05d9 +TrackerPanel.Dialog.LoadFailed.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d9\u05e0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d7\u05d5\u05e7\u05d9 +TrackerPanel.Dialog.SaveChanges.Title=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd +TrackerPanel.Dialog.SaveChanges.Message=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05d0\u05dc +TrackPlottingPanel.Popup.MenuItem.Lines=\u05e7\u05d5\u05d5\u05d9\u05dd +TrackPlottingPanel.Popup.MenuItem.Points=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea +TrackPlottingPanel.Popup.MenuItem.Scale=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4... +TrackPlottingPanel.Popup.MenuItem.Print=\u05d4\u05d3\u05e4\u05e1... +TrackPlottingPanel.Popup.MenuItem.Measure=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 +TrackPlottingPanel.Popup.MenuItem.Analyze=\u05e0\u05ea\u05d7... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u05d4\u05ea\u05e7\u05e8\u05d1 +TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u05d4\u05ea\u05e8\u05d7\u05e7 +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u05d6\u05d5\u05dd \u05dc\u05de\u05e1\u05d2\u05e8\u05ea +TrackPlottingPanelInspector.Title=\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 +TrackPlottingPanelInspector.Label.Min=\u05de\u05d9\u05e0\u05d9\u05de\u05d5\u05dd +TrackPlottingPanelInspector.Label.Max=\u05de\u05e7\u05e1\u05d9\u05de\u05d5\u05dd +TrackPlottingPanelInspector.Label.Auto=\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +TToolBar.Button.Footprint.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e2\u05e7\u05d1\u05d5\u05ea +TToolBar.Dropdown.SelectedTrack.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc +TToolBar.Dropdown.SelectedTrack.None=\u05d0\u05e3-\u05d0\u05d7\u05d3 +TTrack.MenuItem.Delete=\u05de\u05d7\u05e7 +TTrack.MenuItem.Color=\u05e6\u05d1\u05e2... +TTrack.Dialog.Color.Title=\u05d1\u05d7\u05e8 \u05e6\u05d1\u05e2 \u05de\u05e1\u05dc\u05d5\u05dc +TTrack.MenuItem.Name=\u05e9\u05dd... +TTrack.MenuItem.Footprint=\u05e2\u05e7\u05d1\u05d5\u05ea +TTrack.MenuItem.Description=\u05d4\u05e2\u05e8\u05d5\u05ea... +TTrack.MenuItem.Visible=\u05e0\u05e8\u05d0\u05d4 +TTrack.MenuItem.TrailVisible=\u05d4\u05e8\u05d0\u05d4 \u05de\u05e1\u05dc\u05d5\u05dc +TTrack.MenuItem.Autostep=\u05e6\u05e2\u05d3\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05d9\u05dd +TTrack.MenuItem.MarkByDefault=\u05e1\u05de\u05df \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +TTrack.MenuItem.Locked=\u05e0\u05e2\u05d5\u05dc +TTrack.MenuItem.Delete=\u05de\u05d7\u05e7 +TTrack.Name.None=\u05dc\u05dc\u05d0 \u05e9\u05dd +TTrack.Dialog.Description.Title=\u05d4\u05e2\u05e8\u05d5\u05ea: +TTrack.Dialog.Name.Title=\u05d4\u05d2\u05d3\u05e8 \u05e9\u05dd +TTrack.Dialog.Name.Label=\u05e9\u05dd: +TViewChooser.Button.Choose.Tooltip=\u05d1\u05d7\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d4 +Vector.Name=\u05d5\u05e7\u05d8\u05d5\u05e8 +Vector.New.Name=\u05d5\u05e7\u05d8\u05d5\u05e8 +Vector.MenuItem.ToOrigin=\u05dc\u05e8\u05d0\u05e9\u05d9\u05ea +Vector.MenuItem.Label=\u05d4\u05e6\u05d2 \u05ea\u05d5\u05d9\u05ea +VectorSum.Name=\u05e1\u05db\u05d5\u05dd \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9 +VectorSum.New.Name=\u05e1\u05db\u05d5\u05dd +VectorSum.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd... +VectorSumInspector.Title=\u05e1\u05db\u05d5\u05dd \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9 +VectorSumInspector.Border.Title=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd +WorldTView.Popup.MenuItem.Projectile=\u05de\u05e6\u05d1 \u05e7\u05dc\u05d9\u05e2 1 + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 1 +AnalyticParticle.Inspector.Title=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 1 +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=\u05e8\u05d3\u05d9\u05d5\u05e1 4 +CircleFootprint.Circle_6=\u05e8\u05d3\u05d9\u05d5\u05e1 6 +CircleFootprint.Circle_8=\u05e8\u05d3\u05d9\u05d5\u05e1 8 +DynamicParticle.Name=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 1 (\u05e7\u05e8\u05d8\u05d6\u05d9) +DynamicParticle.Inspector.Title=\u05de\u05e6\u05d1 \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 1 +DynamicParticle.Property.ForceX=\u05db\u05d7 x +DynamicParticle.Property.ForceY=\u05db\u05d7 y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=\u05de\u05e7\u05d5\u05dd \u05de\u05e7\u05d5\u05d1\u05e2 +ParticleModel.New.Name=\u05de\u05e6\u05d1l +ParticleModel.MenuItem.InspectModel=\u05d1\u05d5\u05e0\u05d4 \u05de\u05e6\u05d1 1 +ParticleModel.Inspector.Button.Undo=\u05d1\u05d8\u05dc +ParticleModel.Inspector.Button.Redo=\u05e9\u05d5\u05d1 +ParticleModel.Inspector.Button.Close=\u05e1\u05d2\u05d5\u05e8 +ParticleModel.Inspector.Button.Help=\u05e2\u05d6\u05e8\u05d4 + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=\u05e8\u05e7 X +Calibration.Axes.YOnly=\u05e8\u05e7 Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=\u05d1\u05d7\u05e8 \u05e6\u05d9\u05e8\u05d9 \u05db\u05d9\u05d5\u05dc +Calibration.Label.Axes=\u05e6\u05d9\u05e8\u05d9\u05dd +Calibration.Dialog.InvalidCoordinates.Title=\u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05dc\u05ea\u05d9 \u05d7\u05d5\u05e7\u05d9\u05d5\u05ea +Calibration.Dialog.InvalidCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05d6\u05d4\u05d5\u05ea +Calibration.Dialog.InvalidXCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05d0\u05d5\u05ea\u05dd \u05e9\u05d9\u05e2\u05d5\u05e8\u05d9 x \u05d1\u05e7\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea +Calibration.Dialog.InvalidYCoordinates.Message=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d5\u05ea \u05d1\u05e2\u05dc\u05d5\u05ea \u05d0\u05d5\u05ea\u05dd \u05e9\u05d9\u05e2\u05d5\u05e8\u05d9 y \u05d1\u05e7\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea +SpectralLineFilter.Title=Gas Spectra +SpectralLineFilter.H=Hydrogen +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Mercury +TFrame.View.Unknown=\u05ea\u05e6\u05d5\u05d2\u05d4 +TMenuBar.MenuItem.Undo=\u05d1\u05d8\u05dc +TMenuBar.MenuItem.Redo=\u05e9\u05d5\u05d1 +TMenuBar.MenuItem.Replace=\u05d4\u05d7\u05dc\u05e3... +TMenuBar.Menu.AddImage=\u05d9\u05d1\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea +TMenuBar.MenuItem.AddBefore=\u05dc\u05e4\u05e0\u05d9 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5... +TMenuBar.MenuItem.AddAfter=\u05dc\u05d0\u05d7\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5... +TMenuBar.MenuItem.RemoveImage=\u05d4\u05e1\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 +TMenuBar.Menu.Tools=\u05db\u05dc\u05d9\u05dd +TMenuBar.MenuItem.DataFunctionTool=\u05d1\u05d5\u05e0\u05d4 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TMenuBar.MenuItem.DatasetTool=\u05db\u05dc\u05d9 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TMenuBar.Menu.CopyImage=\u05d4\u05e2\u05ea\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 +TMenuBar.MenuItem.CopyMainView=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea +TMenuBar.MenuItem.CopyFrame=\u05ea\u05de\u05d5\u05e0\u05d4 +TMenuBar.MenuItem.PrintFrame=\u05d4\u05d3\u05e4\u05e1... +TrackerIO.Dialog.AddImage.Title=\u05d9\u05d1\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea (\u05d1\u05d7\u05e8 \u05d0\u05d7\u05ea \u05d0\u05d5 \u05d9\u05d5\u05ea\u05e8) +TTrack.Dialog.Name.BadName=\u05d1\u05e9\u05d9\u05de\u05d5\u05e9. \u05d0\u05e0\u05d0 \u05d1\u05d7\u05e8 \u05e9\u05dd \u05d0\u05d7\u05e8 +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=\u05e1\u05da-\u05d4\u05db\u05dc \u05db\u05d7 +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d2\u05e8\u05e4\u05d9\u05ea \u05e9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 \u05de\u05e1\u05dc\u05d5\u05dc \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df +TableTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d8\u05d1\u05dc\u05d4 \u05e9\u05dc \u05e0\u05ea\u05d5\u05e0\u05d9 \u05de\u05e1\u05dc\u05d5\u05dc \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df +TrackerPanel.Message.NoData0=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05e8\u05d0\u05e9\u05d9\u05ea \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df +TrackerPanel.Message.NoData1=\u05d1\u05d7\u05e8 \u05e7\u05d5\u05d1\u05e5|\u05e4\u05ea\u05d7 \u05d0\u05d5 \u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd|\u05d7\u05d3\u05e9 \u05dc\u05d4\u05ea\u05d7\u05dc\u05d4 +WorldTView.Label.NoData=\u05ea\u05e6\u05d5\u05d2\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05e9\u05dc \u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05de\u05e1\u05dc\u05d5\u05dc\u05d9\u05dd \u05ea\u05d5\u05e4\u05d9\u05e2 \u05db\u05d0\u05df. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=\u05e4\u05d5\u05ea\u05e8: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptive Multistep +DynamicParticle.Table.Force.Border.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05db\u05d7 (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05de\u05d9\u05e7\u05d5\u05dd (t) +ParticleModel.Table.Initial.Border.Title=\u05e2\u05e8\u05db\u05d9\u05dd \u05e8\u05d0\u05e9\u05d5\u05e0\u05d9\u05d9\u05dd +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=\u05d4\u05d3\u05d1\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 +TMenuBar.MenuItem.PasteAfter=\u05dc\u05d0\u05d7\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 +TMenuBar.MenuItem.PasteBefore=\u05dc\u05e4\u05e0\u05d9 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 +TMenuBar.MenuItem.PasteReplace=\u05d4\u05d7\u05dc\u05e3 \u05e1\u05e8\u05d8 + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=\u05de\u05ea\u05d7\u05d9\u05dc\u05d9\u05dd... +Tracker.Splash.HelpMessage=\u05de\u05e9\u05ea\u05de\u05e9 \u05d7\u05d3\u05e9? \u05e8\u05d0\u05d4 +Tracker.Splash.Button.Help=\u05e2\u05d6\u05e8\u05d4 +Tracker.Splash.Button.OpenFile=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=\u05d6\u05d5\u05d9\u05ea \u05de\u05d4\u05d0\u05d5\u05e4\u05e7 +LineProfile.Checkbox.Rotates=\u05e1\u05d9\u05d1\u05d5\u05d1\u05d9\u05dd +LineProfile.Label.Spread=\u05e4\u05e8\u05d9\u05e9\u05d4 +RGBRegion.Name=\u05d0\u05d6\u05d5\u05e8 RGB Region +RGBRegion.New.Name=\u05d0\u05d6\u05d5\u05e8 +RGBRegion.MenuItem.Fixed=\u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05e7\u05d5\u05d1\u05e2 +RGBRegion.Label.Radius=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05e4\u05d9\u05e7\u05e1\u05dc +TTrack.Label.Step=\u05e6\u05e2\u05d3 + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=\u05de\u05e1\u05e4\u05d5\u05e8 \u05de\u05d9\u05e7\u05d5\u05dd +LineProfile.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +LineProfile.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +LineProfile.Data.Description.3=\u05d0\u05d3\u05d5\u05dd +LineProfile.Data.Description.4=\u05d9\u05e8\u05d5\u05e7 +LineProfile.Data.Description.5=\u05db\u05d7\u05d5\u05dc +LineProfile.Data.Description.6=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea \u05e0\u05ea\u05e4\u05e1\u05ea +LineProfile.Data.Description.7=\u05e2\u05d5\u05d1\u05d9 \u05e7\u05d5 +ParticleModel.MenuItem.TraceVisible=\u05de\u05e1\u05dc\u05d5\u05dc \u05e0\u05e8\u05d0\u05d4 +ParticleModel.MenuItem.StepsVisible=\u05e6\u05e2\u05d3 \u05e0\u05e8\u05d0\u05d4 +PointMass.Data.Description.0=\u05d6\u05de\u05df +PointMass.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +PointMass.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +PointMass.Data.Description.3=\u05d2\u05d5\u05d3\u05dc \u05de\u05d9\u05e7\u05d5\u05dd +PointMass.Data.Description.4=\u05d6\u05d5\u05d9\u05ea \u05de\u05d9\u05e7\u05d5\u05dd +PointMass.Data.Description.5=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d4\u05d9\u05e8\u05d5\u05ea +PointMass.Data.Description.6=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d4\u05d9\u05e8\u05d5\u05ea +PointMass.Data.Description.7=\u05d2\u05d5\u05d3\u05dc \u05de\u05d4\u05d9\u05e8\u05d5\u05ea +PointMass.Data.Description.8=\u05d6\u05d5\u05d9\u05ea \u05de\u05d4\u05d9\u05e8\u05d5\u05ea +PointMass.Data.Description.9=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05ea\u05d0\u05d5\u05e6\u05d4 +PointMass.Data.Description.10=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05ea\u05d0\u05d5\u05e6\u05d4 +PointMass.Data.Description.11=\u05d2\u05d5\u05d3\u05dc \u05ea\u05d0\u05d5\u05e6\u05d4 +PointMass.Data.Description.12=\u05d6\u05d5\u05d9\u05ea \u05ea\u05d0\u05d5\u05e6\u05d4 +PointMass.Data.Description.13=\u05d6\u05d5\u05d9\u05ea \u05e1\u05d9\u05d1\u05d5\u05d1 +PointMass.Data.Description.14=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea +PointMass.Data.Description.15=\u05ea\u05d0\u05d5\u05e6\u05d4 \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea +PointMass.Data.Description.16=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 +PointMass.Data.Description.17=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 +PointMass.Data.Description.18=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05ea\u05e0\u05e2 +PointMass.Data.Description.19=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05ea\u05e0\u05e2 +PointMass.Data.Description.20=\u05d2\u05d5\u05d3\u05dc \u05ea\u05e0\u05e2 +PointMass.Data.Description.21=\u05d6\u05d5\u05d9\u05ea \u05ea\u05e0\u05e2 +PointMass.Data.Description.22=\u05d0\u05e0\u05e8\u05d2\u05d9\u05d4 \u05e7\u05d9\u05e0\u05d8\u05d9\u05ea +RGBRegion.Data.Description.0=\u05d6\u05de\u05df +RGBRegion.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +RGBRegion.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +RGBRegion.Data.Description.3=\u05d0\u05d3\u05d5\u05dd +RGBRegion.Data.Description.4=\u05d9\u05e8\u05d5\u05e7 +RGBRegion.Data.Description.5=\u05db\u05d7\u05d5\u05dc +RGBRegion.Data.Description.6=\u05d1\u05d4\u05d9\u05e8\u05d5\u05ea \u05e0\u05ea\u05e4\u05e1\u05ea +RGBRegion.Data.Description.7=\u05de\u05d5\u05e0\u05d4 \u05e4\u05d9\u05e7\u05e1\u05dc\u05d9\u05dd +RGBRegion.Data.Description.8=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 +RGBRegion.Data.Description.9=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 +TView.Menuitem.Define=\u05d4\u05d2\u05d3\u05e8... +Vector.Data.Description.0=\u05d6\u05de\u05df +Vector.Data.Description.1=\u05e8\u05db\u05d9\u05d1 x +Vector.Data.Description.2=\u05e8\u05db\u05d9\u05d1 y +Vector.Data.Description.3=\u05d2\u05d5\u05d3\u05dc +Vector.Data.Description.4=\u05d6\u05d5\u05d9\u05ea +Vector.Data.Description.5=\u05de\u05d9\u05e7\u05d5\u05dd \u05d6\u05e0\u05d1, \u05e8\u05db\u05d9\u05d1 x +Vector.Data.Description.6=\u05de\u05d9\u05e7\u05d5\u05dd \u05d6\u05e0\u05d1, \u05e8\u05db\u05d9\u05d1 y +Vector.Data.Description.7=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 +Vector.Data.Description.8=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=\u05de\u05e1\u05ea \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d6\u05d4 +ParticleModel.Parameter.InitialTime.Description=\u05d6\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9 +AnalyticParticle.PositionFunction.X.Description=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +AnalyticParticle.PositionFunction.Y.Description=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd +DynamicParticle.ForceFunction.X.Description=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05d4\u05db\u05d7 +DynamicParticle.ForceFunction.Y.Description=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05d4\u05db\u05d7 +DynamicParticle.Parameter.InitialX.Description=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9, \u05e8\u05db\u05d9\u05d1 x +DynamicParticle.Parameter.InitialY.Description=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9, \u05e8\u05db\u05d9\u05d1 y +DynamicParticle.Parameter.InitialVelocityX.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea, \u05e8\u05db\u05d9\u05d1 x +DynamicParticle.Parameter.InitialVelocityY.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea, \u05e8\u05db\u05d9\u05d1 y +TrackerPanel.ModelBuilder.Title=\u05d1\u05d5\u05e0\u05d4 \u05de\u05d5\u05d3\u05dc\u05d9\u05dd +TrackerPanel.DataBuilder.Title=\u05d1\u05d5\u05e0\u05d4 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TrackControl.TrailMenu.NoTrail=\u05dc\u05dc\u05d0 \u05e2\u05e7\u05d1\u05d5\u05ea +TrackControl.TrailMenu.ShortTrail=\u05e2\u05e7\u05d1\u05d5\u05ea \u05e7\u05e6\u05e8\u05d9\u05dd +TrackControl.TrailMenu.LongTrail=\u05e2\u05e7\u05d1\u05d5\u05ea \u05d0\u05e8\u05d5\u05db\u05d9\u05dd +TrackControl.TrailMenu.FullTrail=\u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd +TrackerPanel.ModelBuilder.Spinner.Tooltip=\u05e2\u05d5\u05d1\u05d3 \u05d1\u05de\u05e6\u05d1 1 +TrackerPanel.ModelBuilder.LineButton.Text=\u05e1\u05d2\u05e0\u05d5\u05df \u05e7\u05d5 +TrackerPanel.ModelBuilder.LineButton.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e1\u05d2\u05e0\u05d5\u05df \u05e7\u05d5 +ParticleModel.LineStyle.None=\u05dc\u05dc\u05d0 \u05e7\u05d5 +ParticleModel.LineStyle.Connect=\u05d7\u05d1\u05e8 \u05e6\u05e2\u05d3\u05d9\u05dd +ParticleModel.LineStyle.Smooth=\u05e7\u05d5 \u05d7\u05dc\u05e7 +ModelFunctionPanel.Label=\u05de\u05e6\u05d11 +AnalyticFunctionPanel.FunctionEditor.Border.Title=\u05de\u05e9\u05d5\u05d5\u05d0\u05ea \u05de\u05d9\u05e7\u05d5\u05dd +DynamicFunctionPanel.FunctionEditor.Border.Title=\u05de\u05e9\u05d5\u05d5\u05d0\u05ea \u05db\u05d7 + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=\u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05d1\u05dc\u05d4 \u05e0\u05e8\u05d0\u05d5\u05ea +Tracker.About.ProjectOf=\u05e4\u05e8\u05d5\u05d9\u05d9\u05e7\u05d8 \u05e9\u05dc: +Tracker.About.TranslationBy=\u05ea\u05d5\u05e8\u05d2\u05dd \u05e2"\u05d9 +# following entry (Tracker.About.Translator) should be name(s) of translator(s) +Tracker.About.Translator=\u05e2\u05de\u05d9\u05ea \u05e7\u05e0\u05d9 +TMenuBar.Menu.SaveVideoAs=\u05e9\u05de\u05d5\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05db +TActions.SaveClipAs.ProgressMonitor.Message=\u05e9\u05d5\u05de\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05db +TActions.SaveClipAs.ProgressMonitor.Progress=\u05d4\u05d5\u05e9\u05dc\u05dd + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=\u05e1\u05d9\u05e0\u05db\u05e8\u05d5\u05e0\u05d9\u05d6\u05e6\u05d9\u05d4 +PlotTrackView.Checkbox.Synchronize.Tooltip=\u05e1\u05e0\u05db\u05e8\u05df \u05e6\u05d9\u05e8 \u05d0\u05d5\u05e4\u05e7\u05d9 +RGBRegion.MenuItem.FixedRadius=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05de\u05e7\u05d5\u05d1\u05e2 +Tracker.VideoZoom.Hint=\u05dc\u05d7\u05e5 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e7\u05e8\u05d1 \u05d0\u05d5 \u05dc\u05d4\u05ea\u05e8\u05d7\u05e7. \u05dc\u05d7\u05e5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd +Tracker.PlotZoomIn.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e7\u05e8\u05d1. \u05dc\u05d7\u05e5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 \u05d1\u05d0\u05d5\u05e4\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +Tracker.PlotZoomOut.Hint=\u05dc\u05d7\u05e5 \u05db\u05d3\u05d9 \u05dc\u05d4\u05ea\u05e8\u05d7\u05e7 +Tracker.MenuItem.Hints=\u05d4\u05e8\u05d0\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd +TapeMeasure.Label.Length=\u05d0\u05d5\u05e8\u05da +TapeMeasure.Label.TapeAngle=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 x +TapeMeasure.Label.ArcAngle=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea +TrackerIO.Dialog.NotAnImage.Title=\u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 \u05e9\u05d2\u05d5\u05d9 +TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. +TrackerIO.Dialog.NotAnImage.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05de\u05e9\u05d9\u05da? +TToolBar.Button.Zoom.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e8\u05d7\u05e7 \u05ea\u05e6\u05d5\u05d2\u05d4 +TrackChooserTView.DropDown.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc +TapeMeasure.Field.TapeAngle.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 \u05d4- x \u05dc\u05e1\u05e8\u05d8 \u05de\u05d3\u05d9\u05d3\u05d4 +TapeMeasure.Field.Magnitude.Tooltip=\u05d0\u05d5\u05e8\u05da \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05de\u05db\u05d5\u05d5\u05e0\u05d5\u05ea +TapeMeasure.Readout.Magnitude.Name=\u05d0\u05d5\u05e8\u05da +TapeMeasure.Readout.Magnitude.Hint=\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea +TapeMeasure.Readout.Angle.Name=\u05e7\u05e8\u05d9\u05d0\u05ea \u05d6\u05d5\u05d9\u05ea +TapeMeasure.Readout.Angle.Hint=\u05d6\u05d5\u05d9\u05ea \u05de\u05e6\u05d9\u05e8 \u05d4- x +TapeMeasure.End.Name=\u05e1\u05d5\u05e3 +TapeMeasure.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05de\u05e8\u05d7\u05e7 \u05d5\u05d6\u05d5\u05d9\u05ea. shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 +TapeMeasure.Handle.Name=\u05d9\u05d3\u05d9\u05ea +TapeMeasure.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 +Vector.Tip.Name=\u05d8\u05d9\u05e4 +Vector.Tip.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 +Vector.Handle.Name=\u05d9\u05d3\u05d9\u05ea +Vector.Handle.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 +Vector.ShortHandle.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4, alt \u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d1\u05d7\u05d5\u05e8 \u05d8\u05d9\u05e4 +PointMass.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd +PointMass.Position.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 +PointMass.Velocity.Name=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea +PointMass.Acceleration.Name=\u05ea\u05d0\u05d5\u05e6\u05d4 +PointMass.Vector.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05d4 +PointMass.Position.Locked.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4. \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d2\u05e8\u05d5\u05e8 +CoordAxes.Handle.Name=\u05e6\u05d9\u05e8 x \u05d7\u05d9\u05d5\u05d1\u05d9 +CoordAxes.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 +CoordAxes.Origin.Name=\u05e8\u05d0\u05e9\u05d9\u05ea +CoordAxes.Origin.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05de\u05d9\u05e7\u05d5\u05dd +OffsetOrigin.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd +OffsetOrigin.Position.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05d4\u05e8\u05d0\u05e9\u05d9\u05ea +Calibration.Point.Name=\u05e0\u05e7\u05d5\u05d3\u05d4 +Calibration.Point.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e6\u05d9\u05e8\u05d9\u05dd \u05d5\u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4 +RGBRegion.Position.Name=\u05de\u05d9\u05e7\u05d5\u05dd +RGBRegion.Position.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05de\u05d9\u05e7\u05d5\u05dd +LineProfile.End.Name=\u05e1\u05d5\u05e3 +LineProfile.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05ea\u05d0\u05de\u05ea \u05d0\u05d5\u05e8\u05da \u05e7\u05d5 +LineProfile.Handle.Name=\u05d9\u05d3\u05d9\u05ea +LineProfile.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05d4\u05e7\u05d5 +PointMass.Hint=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e1\u05d4 \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd +PointMass.Unmarked.Hint=, shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df +TTrack.Unselected.Hint=\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 \u05d0\u05d5 \u05d4\u05d2\u05d3\u05e8\u05ea \u05ea\u05db\u05d5\u05e0\u05d5\u05ea +Vector.Unmarked.Hint=shift \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df +OffsetOrigin.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 +Calibration.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05e0\u05e7\u05d5\u05d3\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 +Calibration.Halfmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 +CenterOfMass.Empty.Hint=\u05d1\u05d7\u05e8 \u05de\u05e1\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e2\u05e8\u05db\u05ea +VectorSum.Empty.Hint=\u05d1\u05d7\u05e8 \u05d5\u05e7\u05d8\u05d5\u05e8\u05d9\u05dd \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05e1\u05db\u05d5\u05dd +TapeMeasure.Hint=\u05d2\u05e8\u05d5\u05e8 \u05e7\u05e6\u05d5\u05d5\u05ea \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05de\u05e8\u05d7\u05e7\u05d9\u05dd \u05d5\u05d6\u05d5\u05d9\u05d5\u05ea +CoordAxes.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 +ParticleModel.Hint=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e1\u05d4 \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd, \u05d4\u05db\u05e0\u05e1 \u05d1\u05d9\u05d8\u05d5\u05d9 \u05dc\u05d1\u05d5\u05e0\u05d4 \u05d4\u05de\u05d5\u05d3\u05dc\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05d0\u05e0\u05d9\u05de\u05e6\u05d9\u05d4 +RGBRegion.Hint=\u05d4\u05db\u05e0\u05e1 \u05e8\u05d3\u05d9\u05d5\u05e1 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05d4\u05d2\u05d5\u05d3\u05dc +RGBRegion.Unmarked.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d9\u05e7\u05d5\u05dd +TTrack.ImportVideo.Hint=\u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 \u05d0\u05d5 \u05ea\u05de\u05d5\u05e0\u05d4 \u05dc\u05de\u05d3\u05d9\u05d3\u05ea \u05e6\u05d1\u05e2\u05d9\u05dd +TTrack.Selected.Hint=\u05e0\u05d1\u05d7\u05e8 +LineProfile.Hint=\u05d4\u05db\u05e0\u05e1 \u05e8\u05d9\u05d5\u05d5\u05d7 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e2\u05d5\u05d1\u05d9 \u05e7\u05d5 +LineProfile.Unmarked.Hint=shift \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e6\u05d9\u05d5\u05e8 \u05e7\u05d5 +LineProfile.Menu.Orientation=\u05db\u05d9\u05d5\u05d5\u05df +LineProfile.MenuItem.Horizontal=\u05d0\u05d5\u05e4\u05e7\u05d9 +LineProfile.MenuItem.XAxis=\u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4-X +Footprint.PositionVector=\u05d5\u05e7\u05d8\u05d5\u05e8 +Footprint.BoldPositionVector=\u05d5\u05e7\u05d8\u05d5\u05e8 \u05de\u05d5\u05d3\u05d2\u05e9 +Tracker.Startup.Hint=\u05d4\u05d1\u05d8 \u05e4\u05d4 \u05dc\u05e8\u05de\u05d6\u05d9\u05dd (\u05d0\u05d5 \u05db\u05d1\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd \u05d1\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05e2\u05d6\u05e8\u05d4), \u05dc\u05d7\u05e5 F1 \u05d1\u05db\u05dc \u05de\u05e6\u05d1 \u05dc\u05e7\u05d1\u05dc\u05ea \u05e2\u05d6\u05e8\u05d4 +TrackerPanel.NoVideo.Hint=\u05e4\u05ea\u05d7 \u05d0\u05d5 \u05d9\u05d1\u05d0 \u05e1\u05e8\u05d8 \u05dc\u05e0\u05d9\u05ea\u05d5\u05d7 +TrackerPanel.CalibrateVideo.Hint=\u05db\u05d9\u05d9\u05dc \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05db\u05dc\u05d9 \u05d4\u05db\u05d9\u05d5\u05dc +TrackerPanel.NoTracks.Hint=\u05e6\u05d5\u05e8 \u05de\u05e2\u05e7\u05d1 \u05d7\u05d3\u05e9 \u05db\u05d3\u05d9 \u05dc\u05de\u05d3\u05d5\u05d3 \u05d0\u05ea \u05d4\u05d3\u05d1\u05e8 \u05e9\u05de\u05e2\u05e0\u05d9\u05d9\u05df \u05d0\u05d5\u05ea\u05da +TrackerPanel.SetClip.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5 \u05d1\u05d7\u05df \u05d0\u05ea \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df +TrackerPanel.ShowAxes.Hint=\u05d4\u05d2\u05d3\u05e8 \u05e8\u05d0\u05e9\u05d9\u05ea \u05d5\u05d6\u05d5\u05d9\u05ea \u05dc\u05de\u05e2\u05e8\u05db\u05ea \u05d4\u05e6\u05d9\u05e8\u05d9\u05dd +VideoPlayer.Step.Hint=\u05e6\u05e2\u05d3 \u05e7\u05d3\u05d9\u05de\u05d4 (\u05e7\u05d9\u05e6\u05d5\u05e8: PageDown) +VideoPlayer.Back.Hint=\u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 (\u05e7\u05d9\u05e6\u05d5\u05e8: PageUp) +TrackerPanel.DVVideo.Hint=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05de\u05e1\u05e0\u05df \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc \u05dc\u05ea\u05d9\u05e7\u05d5\u05df \u05e2\u05d9\u05d5\u05d5\u05ea\u05d9\u05dd \u05d1\u05e1\u05e8\u05d8 \u05de\u05e1\u05d5\u05d2 DV +TrackerIO.DataFileFilter.Description=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 (.trk) +Tracker.Button.PDFHelp=\u05d2\u05e8\u05e1\u05ea PDF \u05dc\u05d4\u05d3\u05e4\u05e1\u05d4 +TToolbar.Button.TapeVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4, \u05d4\u05e1\u05ea\u05e8, \u05d0\u05d5 \u05e6\u05d5\u05e8 \u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=\u05d1\u05e7\u05e8\u05ea \u05de\u05e2\u05e7\u05d1 +TMenuBar.MenuItem.Description=\u05d4\u05e2\u05e8\u05d5\u05ea +TrackPlottingPanel.RightDrag.Hint=\u05dc\u05d7\u05e6\u05df \u05e2\u05db\u05d1\u05e8 \u05d9\u05de\u05e0\u05d9 \u05d5\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea +TMenuBar.MenuItem.DeleteSelectedPoint=\u05e6\u05e2\u05d3 \u05e0\u05d1\u05d7\u05e8 +TFrame.InfoDialog.SaveChanges.Title=\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd +TFrame.InfoDialog.SaveChanges.Message=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05de\u05d5\u05e8 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=\u05e7\u05e8\u05d8\u05d6\u05d9 +DynamicParticle.Editor.Button.Polar=\u05e4\u05d5\u05dc\u05e8\u05d9 +DynamicParticle.Parameter.InitialR.Description=\u05e8\u05d3\u05d9\u05d5\u05e1 \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9 +DynamicParticle.Parameter.InitialTheta.Description=\u05d6\u05d5\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea +DynamicParticle.Parameter.InitialVelocityR.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea +DynamicParticle.Parameter.InitialOmega.Description=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea \u05d4\u05ea\u05d7\u05dc\u05ea\u05d9\u05ea +DynamicParticle.ForceFunction.R.Description=\u05e8\u05db\u05d9\u05d1 \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9 \u05e9\u05dc \u05d4\u05db\u05d7 +DynamicParticle.ForceFunction.Theta.Description=\u05e8\u05db\u05d9\u05d1 \u05de\u05e9\u05d9\u05e7\u05d9 \u05e9\u05dc \u05d4\u05db\u05d7 +DynamicParticlePolar.Name=\u05de\u05d5\u05d3\u05dc \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e4\u05d5\u05dc\u05e8\u05d9) +TMenuBar.Menu.DynamicParticle=\u05de\u05d5\u05d3\u05dc \u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 +TMenuBar.MenuItem.Cartesian=\u05e7\u05e8\u05d8\u05d6\u05d9 +TMenuBar.MenuItem.Polar=\u05e4\u05d5\u05dc\u05e8\u05d9 + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotracker... +Dialog.Button.Help=\u05e2\u05d6\u05e8\u05d4 +AutoTracker.Wizard.Button.Reset=\u05de\u05d4\u05ea\u05d7\u05dc\u05d4 +AutoTracker.Wizard.Button.Back=\u05d0\u05d7\u05d5\u05e8\u05d4 +AutoTracker.Wizard.Button.Next=\u05e6\u05e2\u05d3 +AutoTracker.Wizard.Button.Accept=\u05d0\u05e9\u05e8 +AutoTracker.Wizard.Button.Search=\u05d7\u05e4\u05e9 +AutoTracker.Wizard.Button.Pause=\u05d3\u05d5\u05dd +AutoTracker.Wizard.Button.Skip=\u05d3\u05dc\u05d2 +AutoTracker.Label.Mask=\u05ea\u05d1\u05e0\u05d9\u05ea +AutoTracker.Label.AcceptLevel=\u05e2\u05e8\u05da \u05e1\u05e3 +AutoTracker.TabbedPane.TabTitle.Mask=\u05ea\u05d1\u05e0\u05d9\u05ea +AutoTracker.TabbedPane.TabTitle.Target=\u05de\u05d8\u05e8\u05d4 +AutoTracker.TabbedPane.TabTitle.Settings=\u05d0\u05e9\u05e8 +AutoTracker.TabbedPane.TabTitle.Search=\u05d7\u05e4\u05e9 +AutoTracker.Info.GetStarted=\u05dc\u05d9\u05e6\u05d5\u05e8 \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d7\u05d3\u05e9\u05d4, shift-control-\u05dc\u05d7\u05d9\u05e6\u05d4 \u05e2\u05dc \u05e4\u05e8\u05d9\u05d8 \u05d4\u05e8\u05e6\u05d5\u05d9 +AutoTracker.Info.Mask1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05de\u05d2\u05d3\u05d9\u05e8\u05d4 \u05d3\u05de\u05d5\u05ea \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05d1\u05db\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05e8\u05e6\u05e3 \u05d4\u05e1\u05e8\u05d8. +AutoTracker.Info.Mask2=\u05d4\u05d9\u05d0 \u05de\u05ea\u05e4\u05ea\u05d7\u05ea \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05d0\u05ea \u05e2\u05e6\u05de\u05d4 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9 \u05e6\u05d5\u05e8\u05d4 \u05d5\u05e6\u05d1\u05e2 \u05d1\u05de\u05e9\u05da \u05d4\u05d6\u05de\u05df. \u05e7\u05e6\u05d1 \u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d2\u05d1\u05d5\u05d4 \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d7\u05e8\u05d9 \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05de\u05d4\u05d9\u05e8\u05d9\u05dd, \u05d0\u05da \u05e4\u05d7\u05d5\u05ea \u05de\u05d3\u05d5\u05d9\u05d9\u05e7 \u05dc\u05d0\u05d5\u05e8\u05da \u05d6\u05de\u05df. +AutoTracker.Info.MaskLocked1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05e0\u05e2\u05d5\u05dc\u05d4 \u05d5\u05d1\u05e9\u05d9\u05de\u05d5\u05e9 +AutoTracker.Info.MaskLocked2=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 "\u05de\u05d7\u05d3\u05e9" \u05db\u05d3\u05d9 \u05dc\u05e0\u05e7\u05d5\u05ea \u05d0\u05ea \u05db\u05dc \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd \u05d5\u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05de\u05d4\u05ea\u05d7\u05dc\u05d4 +AutoTracker.Info.Target1=\u05d4\u05de\u05d8\u05e8\u05d4 \u05de\u05e1\u05d5\u05de\u05e0\u05ea \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea \u05dc\u05e0\u05d9\u05e7\u05d5\u05d3 \u05de\u05e2\u05dc \u05d4\u05e1\u05e3 \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +AutoTracker.Info.Target2=\u05d8\u05d9\u05e4: \u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05d0\u05e4\u05d9\u05dc\u05d5 \u05dc\u05d0\u05d7\u05e8 \u05e9\u05d1\u05d9\u05e6\u05e2\u05ea \u05e6\u05e2\u05d3. \u05e6\u05e2\u05d3\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05d9\u05dd \u05d9\u05d6\u05d5\u05d6\u05d5 \u05de\u05e2\u05e6\u05de\u05dd \u05e2\u05dd \u05d4\u05de\u05d8\u05e8\u05d4. +AutoTracker.Info.TargetLocked=\u05d4\u05de\u05d8\u05e8\u05d4 \u05e7\u05d9\u05d9\u05de\u05ea \u05d5\u05e7\u05e9\u05d5\u05e8\u05d4 \u05dc\u05de\u05d9\u05e7\u05d5\u05dd \u05e6\u05e2\u05d3\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05d9\u05dd. \u05d4\u05d6\u05d6\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05ea\u05d6\u05d9\u05d6 \u05d2\u05dd \u05d0\u05ea \u05d4\u05e6\u05e2\u05d3\u05d9\u05dd \u05d4\u05e7\u05d9\u05d9\u05de\u05d9\u05dd. +AutoTracker.Info.Settings1=\u05e0\u05d9\u05e7\u05d5\u05d3 \u05de\u05e2\u05d1\u05e8 \u05dc\u05e2\u05e8\u05da \u05d4\u05e1\u05e3 \u05de\u05e1\u05d5\u05de\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. +AutoTracker.Info.Settings2=\u05d8\u05d9\u05e4: \u05d4\u05d5\u05e8\u05d3\u05ea \u05e2\u05e8\u05da \u05d4\u05e1\u05e3 \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05de\u05d2\u05d3\u05d9\u05dc\u05d4 \u05d0\u05ea \u05d4\u05e1\u05d9\u05db\u05d5\u05d9 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05e9\u05d2\u05d5\u05d9. \u05e0\u05e1\u05d4 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea. +AutoTracker.Info.Search1=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05e7\u05e6\u05d5\u05d5\u05ea \u05e9\u05dc\u05d5 \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea \u05d1\u05d4\u05ea\u05d0\u05de\u05d4. +AutoTracker.Info.Search2=\u05d8\u05d9\u05e4: \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d1\u05d3\u05e8\u05da-\u05db\u05dc\u05dc \u05dc\u05d0 \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc. \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea "\u05d4\u05d1\u05d8 \u05e7\u05d3\u05d9\u05de\u05d4" \u05d7\u05d5\u05d6\u05d4 \u05d0\u05ea \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05d7\u05d3\u05e9 \u05d5\u05de\u05d6\u05d9\u05d6\u05d4 \u05d1\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. +AutoTracker.Info.Frame=\u05de\u05e1\u05d2\u05e8\u05ea +AutoTracker.Info.Match=\u05d4\u05d4\u05ea\u05d0\u05de\u05d4 \u05e1\u05d5\u05de\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. +AutoTracker.Info.Possible=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05e0\u05de\u05e6\u05d0\u05d4 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d4\u05de\u05d5\u05e6\u05d2. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: +AutoTracker.Info.NoMatch=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d4 \u05d4\u05ea\u05d0\u05de\u05d4 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: +AutoTracker.Info.Outside=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05de\u05d7\u05d5\u05e5 \u05dc\u05ea\u05de\u05d5\u05e0\u05d4. \u05d1\u05d7\u05e8 \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea: +AutoTracker.Info.Accepted=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d4\u05ea\u05e7\u05d1\u05dc\u05d4. +AutoTracker.Info.MarkedByUser=\u05d4\u05e6\u05e2\u05d3 \u05e1\u05d5\u05de\u05df \u05d9\u05d3\u05e0\u05d9\u05ea \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d4\u05de\u05e9\u05ea\u05de\u05e9. +AutoTracker.Info.NoVideo=\u05de\u05e2\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05d3\u05d5\u05e8\u05e9 \u05e1\u05e8\u05d8. +AutoTracker.Info.Height=\u05d2\u05d5\u05d1\u05d4 +AutoTracker.Info.Width=\u05e8\u05d5\u05d7\u05d1 +AutoTracker.Info.Accept=--\u05e7\u05d1\u05dc \u05d4\u05ea\u05d0\u05de\u05d4 +AutoTracker.Info.Retry=--\u05e9\u05e0\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d5\u05d7\u05e4\u05e9 \u05e9\u05d5\u05d1 +AutoTracker.Info.Mark=--shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d9\u05d3\u05e0\u05d9 +AutoTracker.Info.Skip=--\u05d3\u05dc\u05d2 \u05e2\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d5\u05d4\u05de\u05e9\u05da \u05dc\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05d1\u05d0\u05d4 +AutoTracker.Info.Reset=--\u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 \u05dc\u05ea\u05de\u05d5\u05e0\u05d4 \u05e9\u05e1\u05d5\u05de\u05e0\u05d4 \u05db\u05d4\u05dc\u05db\u05d4 \u05d5- shift-control \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e1\u05d2\u05e8\u05ea \u05d7\u05d3\u05e9\u05d4 +AutoTracker.Info.MatchScore=\u05e0\u05d9\u05e7\u05d5\u05d3 \u05d4\u05ea\u05d0\u05de\u05d4 +AutoTracker.Dialog.MaskLocked.Title=\u05ea\u05d1\u05e0\u05d9\u05ea \u05e0\u05e2\u05d5\u05dc\u05d4 +PointMass.Cursor.Autotrack.Description=\u05e1\u05de\u05df \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +VideoPlayer.StartFrame.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 +VideoPlayer.EndFrame.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d2\u05d3\u05d9\u05e8 \u05d0\u05ea \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 +VideoPlayer.Slider.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05e8\u05d5\u05e7 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df +FileDropHandler.Dialog.BadFile.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d8\u05e2\u05d5\u05df. +FileDropHandler.Dialog.BadFile.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05de\u05d6\u05d5\u05d4\u05d4 + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Apply +DynamicParticle.Dialog.Delete.Message=\u05de\u05d7\u05d9\u05e7\u05ea \u05d4\u05d7\u05dc\u05e7\u05d9\u05e7 \u05ea\u05d5\u05e6\u05d9\u05d0 \u05d0\u05d5\u05ea\u05d5 \u05de\u05d4\u05de\u05e2\u05e8\u05db\u05ea. \u05dc\u05de\u05d7\u05d5\u05e7 \u05d1\u05db\u05dc\u05d6\u05d0\u05ea? +DynamicParticle.Dialog.Delete.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea +DynamicParticle.System.In=\u05d1\u05ea\u05d5\u05da +DynamicSystem.Empty=\u05e8\u05d9\u05e7 +DynamicSystem.Force.Name.Internal=\u05e4\u05e0\u05d9\u05de\u05d9 +DynamicSystem.ForceFunction.R.Description=\u05e8\u05db\u05d9\u05d1 \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9 \u05e9\u05dc \u05db\u05d7 \u05e4\u05e0\u05d9\u05de\u05d9 +DynamicSystem.ForceFunction.Theta.Description=\u05e8\u05db\u05d9\u05d1 \u05de\u05e9\u05d9\u05e7\u05d9 \u05e9\u05dc \u05db\u05d7 \u05e4\u05e0\u05d9\u05de\u05d9 +DynamicSystem.MenuItem.Inspector=\u05d1\u05d7\u05e8 \u05d7\u05dc\u05e7\u05d9\u05e7... +DynamicSystem.Name=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea - \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd +DynamicSystem.New.Name=\u05de\u05e2\u05e8\u05db\u05ea +DynamicSystem.Parameter.Of=\u05e9\u05dc +DynamicSystem.Parameter.RelativeTo=\u05d9\u05d7\u05e1\u05d9\u05ea \u05d0\u05dc +DynamicSystem.Parameter.Name.Relative=\u05d9\u05d7\u05e1\u05d9 +DynamicSystem.Parameter.ParticleMass.Description=\u05de\u05e1\u05d4 \u05e9\u05dc +DynamicSystem.Parameter.Mass.Description=\u05e1\u05da-\u05db\u05dc \u05d4\u05de\u05e1\u05d4 \u05d1\u05de\u05e2\u05e8\u05db\u05ea +DynamicSystemInspector.Border.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 +DynamicSystemInspector.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd +DynamicSystemInspector.Button.Change=\u05e9\u05e0\u05d4 \u05dc... +DynamicSystemInspector.ParticleName.None=(\u05d0\u05e3-\u05d0\u05d7\u05d3) +TMenuBar.MenuItem.Clone=\u05e9\u05d1\u05d8 +TMenuBar.MenuItem.TwoBody=\u05de\u05e2\u05e8\u05db\u05ea \u05e9\u05e0\u05d9 \u05d2\u05d5\u05e4\u05d9\u05dd +Tracker.Splash.Button.About=\u05d1\u05e7\u05e9\u05e8 +TrackerPanel.DataBuilder.Dropdown.Tooltip=\u05de\u05e1\u05dc\u05d5\u05dc \u05e0\u05d1\u05d7\u05e8 \u05e0\u05d5\u05db\u05d7\u05d9 +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\u05e1\u05e0\u05db\u05e8\u05df \u05e6\u05d9\u05e8 \u05d0\u05e0\u05db\u05d9 +TrackControl.Button.Trace.ToolTip=\u05d4\u05e8\u05d0\u05d4 \u05d0\u05d5 \u05d4\u05e1\u05ea\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc +TToolBar.Button.Open.Tooltip=\u05e4\u05ea\u05d7 \u05e1\u05e8\u05d8 \u05d0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d1\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05d7\u05d3\u05e9\u05d4 +TToolBar.Button.Save.Tooltip=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05e0\u05d5\u05db\u05d7\u05d9\u05ea \u05d1\u05e7\u05d5\u05d1\u05e5 +TToolBar.Button.SelectTrack=\u05d1\u05d7\u05e8 +TToolBar.Button.SelectTrack.Tooltip=\u05d1\u05d7\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc \u05e7\u05d9\u05d9\u05dd +TTrack.MenuItem.ClearSteps=\u05e0\u05e7\u05d4 \u05e6\u05e2\u05d3\u05d9\u05dd +PointMass.MenuItem.Position=\u05de\u05d9\u05e7\u05d5\u05dd +TMenuBar.MenuItem.Empty=(\u05e8\u05d9\u05e7) +TTrackBar.Button.Memory=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d1\u05e9\u05d9\u05de\u05d5\u05e9: +TTrackBar.Button.Memory.Tooltip=\u05e2\u05e7\u05d5\u05d1 \u05d5\u05e0\u05d4\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df +TTrackBar.Memory.PopupItem.Launch1=\u05e9\u05d2\u05e8 +TTrackBar.Memory.PopupItem.Launch2=\u05e2\u05dd \u05d6\u05d9\u05db\u05e8\u05d5\u05df +TButton.Track.ToolTip=\u05d4\u05d2\u05d3\u05e8 \u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd \u05e9\u05dc +Tracker.Dialog.OutOfMemory.Message1=\u05dc\u05d8\u05e8\u05e7\u05e8 \u05e0\u05d2\u05de\u05e8 \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df :-( +Tracker.Dialog.OutOfMemory.Message2=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea +Tracker.Dialog.OutOfMemory.Title=\u05d0\u05d6\u05dc \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=\u05d4\u05d1\u05d8 \u05e7\u05d3\u05d9\u05de\u05d4 +AutoTracker.Label.Original=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 +AutoTracker.Label.NoMask=\u05d0\u05e3-\u05d0\u05d7\u05d3 +AutoTracker.Label.Rate=\u05e7\u05e6\u05d1: +AutoTracker.Info.Mask3=\u05d8\u05d9\u05e4: \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05dc\u05d0 \u05e6\u05e8\u05d9\u05db\u05d4 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc\u05d4 \u05d5\u05dc\u05d0 \u05e6\u05e8\u05d9\u05db\u05d4 \u05dc\u05db\u05dc\u05d5\u05dc \u05d0\u05ea \u05db\u05d5\u05dc \u05d4\u05d7\u05e4\u05e5. \u05e4\u05e8\u05d8 \u05de\u05d9\u05d5\u05d7\u05d3 \u05d5\u05d1\u05d5\u05dc\u05d8 \u05d1\u05d3\u05e8\u05dc-\u05db\u05dc\u05dc \u05e2\u05d5\u05d1\u05d3 \u05d4\u05db\u05d9 \u05d8\u05d5\u05d1. +AutoTracker.Wizard.Checkbox.XAxis=\u05e8\u05e7 \u05e6\u05d9\u05e8 x +AutoTracker.Info.SearchOnAxis1=\u05e6\u05d9\u05e8 \u05d4-x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4. \u05d4\u05d6\u05d6 \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e2"\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05e8\u05db\u05d6 \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea. +AutoTracker.Info.PossibleOnAxis=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05e0\u05de\u05e6\u05d0\u05d4 \u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4- x. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05df: +AutoTracker.Info.NoMatchOnAxis=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0\u05d4 \u05d4\u05ea\u05d0\u05de\u05d4 \u05dc\u05d0\u05d5\u05e8\u05da \u05e6\u05d9\u05e8 \u05d4-x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e9\u05dc\u05da \u05d4\u05df: +AutoTracker.Info.RetryOnAxis=--\u05d4\u05d6\u05d6 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d0\u05d5 \u05e6\u05d9\u05e8 \u05d4- x \u05d5\u05d7\u05e4\u05e9 \u05e9\u05d5\u05d1 +AutoTracker.Wizard.Button.Delete=\u05de\u05d7\u05e7 +AutoTracker.Wizard.Button.DeleteMore=\u05de\u05d7\u05e7 \u05d0\u05ea \u05d4\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05d4\u05d1\u05d0\u05d5\u05ea +Button.Define.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05e2\u05de\u05d5\u05d3\u05ea \u05de\u05e9\u05ea\u05e0\u05d9\u05dd \u05e7\u05d9\u05d9\u05de\u05ea +Calibration.Label.Point=\u05e0\u05e7\u05d5\u05d3\u05d4 +CalibrationStick.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05d0\u05d5 \u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, \u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05e9\u05d9\u05e4\u05d5\u05e2 +CalibrationStick.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 +CalibrationStick.New.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc +CalibrationTapeMeasure.New.Name=\u05e1\u05e8\u05d8 \u05db\u05d9\u05d5\u05dc +CalibrationTapeMeasure.Readout.Magnitude.Hint=\u05dc\u05d7\u05e5 \u05dc\u05d4\u05db\u05e0\u05e1\u05ea \u05d0\u05d5\u05e8\u05da \u05d9\u05d3\u05d5\u05e2 \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea +CalibrationTapeMeasure.Hint=\u05d4\u05d2\u05d3\u05e8 \u05d0\u05d5\u05e8\u05da \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e7\u05e0\u05d4-\u05de\u05d9\u05d3\u05d4, \u05d4\u05d2\u05d3\u05e8 \u05d6\u05d5\u05d9\u05ea \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9 \u05e9\u05d9\u05e4\u05d5\u05e2 +DynamicSystem.Data.Description.0=\u05de\u05e8\u05d7\u05e7 \u05d9\u05d7\u05e1\u05d9 \u05d1\u05d9\u05df \u05d7\u05dc\u05e7\u05d9\u05e7\u05d9\u05dd +DynamicSystem.Data.Description.1=\u05d6\u05d5\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea +DynamicSystem.Data.Description.2=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05e8\u05d3\u05d9\u05d0\u05dc\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea +DynamicSystem.Data.Description.3=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea\u05d9\u05ea \u05d9\u05d7\u05e1\u05d9\u05ea +ExportDataDialog.Subtitle.Table=\u05d8\u05d1\u05dc\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +ExportDataDialog.Subtitle.Content=\u05ea\u05d0\u05d9\u05dd +ExportDataDialog.Subtitle.Format=\u05e2\u05d9\u05e6\u05d5\u05d1 \u05de\u05e1\u05e4\u05e8 +ExportDataDialog.Subtitle.Delimiter=\u05de\u05e7\u05d1\u05e5 +ExportDataDialog.Title=\u05d9\u05e6\u05d0 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +ExportDataDialog.Delimiter.Add=\u05d4\u05d5\u05e1\u05e3... +ExportDataDialog.Delimiter.Remove=\u05d4\u05e1\u05e8... +ExportDataDialog.Content.AllCells=\u05db\u05dc \u05d4\u05ea\u05d0\u05d9\u05dd +ExportDataDialog.Content.SelectedCells=\u05ea\u05d0\u05d9\u05dd \u05e9\u05e0\u05d1\u05d7\u05e8\u05d5 +ExportDataDialog.MenuItem.RemoveDelimiter=\u05d4\u05e1\u05e8 \u05de\u05e7\u05d1\u05e5 \u05de\u05d5\u05ea\u05d0\u05dd +ExportDataDialog.Chooser.SaveData.Title=\u05e9\u05de\u05d5\u05e8 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d1\u05e9\u05dd +ExportVideoDialog.Button.SaveAs=\u05e9\u05de\u05d5\u05e8 \u05d1\u05e9\u05dd +ExportVideoDialog.Button.FullSize=\u05d2\u05d5\u05d3\u05dc \u05de\u05dc\u05d0 +ExportVideoDialog.Button.DrawnSize=\u05db\u05de\u05e6\u05d5\u05d9\u05e8 +ExportVideoDialog.Content.VideoOnly=\u05e8\u05e7 \u05e1\u05e8\u05d8 +ExportVideoDialog.Content.VideoAndGraphics=\u05e1\u05e8\u05d8 \u05d5\u05d2\u05e8\u05e4\u05d9\u05dd +ExportVideoDialog.Content.GraphicsOnly=\u05e8\u05e7 \u05d2\u05e8\u05e4\u05d9\u05dd +ExportVideoDialog.Title=\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df +ExportVideoDialog.Label.ClipSettings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05e1\u05e8\u05d8\u05d5\u05df +ExportVideoDialog.Subtitle.Size=\u05d2\u05d5\u05d3\u05dc +ExportVideoDialog.Subtitle.Content=\u05ea\u05d5\u05db\u05df +ExportVideoDialog.Subtitle.View=\u05ea\u05e6\u05d5\u05d2\u05d4 +ExportVideoDialog.Subtitle.Format=\u05e2\u05d9\u05e6\u05d5\u05d1 +ExportVideoDialog.Complete.Message1=\u05d4\u05e1\u05e8\u05d8 \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd +ExportVideoDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d6\u05d0\u05ea \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? +ExportVideoDialog.Complete.Title=\u05d9\u05e6\u05d5\u05d0 \u05d4\u05d5\u05e9\u05dc\u05dd +ExportVideoDialog.VideoSize=\u05d2\u05d5\u05d3\u05dc \u05e1\u05e8\u05d8 +ExportVideoDialog.MatSize=mat size +ExportVideo.Dialog.HiddenPlots.Message=\u05d4\u05ea\u05e8\u05e9\u05d9\u05dd \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05e8\u05d0\u05d5\u05ea \u05db\u05d5\u05dc\u05d5 \u05dc\u05e6\u05d5\u05e8\u05da \u05d9\u05e6\u05d5\u05d0 +ExportVideo.Dialog.HiddenPlots.Title=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05d7\u05e1\u05e8\u05d4 +Footprint.DoubleTarget=\u05e6\u05dc\u05d1 \u05db\u05e4\u05d5\u05dc +Footprint.BoldDoubleTarget=\u05e6\u05dc\u05d1 \u05db\u05e4\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 +OffsetOrigin.MenuItem.Fixed=\u05e7\u05d5\u05d0\u05d5\u05e8\u05d3\u05d9\u05e0\u05d8\u05d5\u05ea \u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea \u05de\u05e7\u05d5\u05d1\u05e2\u05d5\u05ea +ParticleModel.Dialog.Offscreen.Message1=\u05d7\u05dc\u05e7 \u05de\u05e6\u05e2\u05d3\u05d9 \u05d4\u05de\u05d5\u05d3\u05dc \u05e8\u05d9\u05e7\u05d9\u05dd \u05db\u05d9 \u05d4\u05dd \u05e8\u05d7\u05d5\u05e7\u05d9\u05dd \u05de\u05d9\u05d3\u05d9 \u05de\u05d4\u05de\u05e1\u05da. +ParticleModel.Dialog.Offscreen.Message2=\u05db\u05d3\u05d9 \u05dc\u05ea\u05e7\u05df \u05d6\u05d0\u05ea \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d4\u05de\u05d5\u05d3\u05dc \u05d0\u05d5 \u05d0\u05ea \u05e7\u05e0\u05d4 \u05d4\u05de\u05d9\u05d3\u05d4 \u05e9\u05dc \u05d4\u05e1\u05e8\u05d8 +ParticleModel.Dialog.Offscreen.Title=\u05de\u05d7\u05d5\u05e5 \u05dc\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea +PrefsDialog.Tab.Configuration.Title=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea +PrefsDialog.Memory.BorderTitle=\u05d2\u05d5\u05d3\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df +PrefsDialog.Tab.General.Title=\u05db\u05dc\u05dc\u05d9 +PrefsDialog.RecentFiles.BorderTitle=\u05e4\u05ea\u05d7 \u05ea\u05e4\u05e8\u05d9\u05d8 \u05d0\u05d7\u05e8\u05d5\u05df +PrefsDialog.Label.RecentSize=\u05e1\u05e4\u05d9\u05e8\u05ea \u05e7\u05d1\u05e6\u05d9\u05dd +PrefsDialog.Hints.BorderTitle=\u05e8\u05de\u05d6\u05d9\u05dd +PrefsDialog.Button.Relaunch=\u05e9\u05d2\u05e8 \u05de\u05d7\u05d3\u05e9 \u05e2\u05db\u05e9\u05d9\u05d5 +PrefsDialog.Button.ClearRecent=\u05e0\u05e7\u05d4 +PrefsDialog.Checkbox.DefaultSize=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc +PrefsDialog.Checkbox.HintsOn=\u05d4\u05e8\u05d0\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +PrefsDialog.Tab.Video.Title=\u05e1\u05e8\u05d8 +PrefsDialog.VideoPref.BorderTitle=\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 +PrefsDialog.Button.Xuggle=\u05e9\u05d5\u05d2\u05dc +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=\u05e0\u05d9\u05d4\u05d5\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df \u05db\u05d0\u05e9\u05e8 \u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1- Web Start. +PrefsDialog.Dialog.WebStart.Title=\u05de\u05e6\u05d1 Web Start +PrefsDialog.LookFeel.BorderTitle=\u05de\u05e8\u05d0\u05d4 \u05d5\u05de\u05e8\u05d2\u05e9 +PrefsDialog.Language.BorderTitle=\u05e9\u05e4\u05d4 +PrefsDialog.Upgrades.BorderTitle=\u05d1\u05d3\u05d5\u05e7 \u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd +PrefsDialog.Tab.Runtime.Title=\u05d4\u05e8\u05e6\u05d4 +PrefsDialog.Tab.Display.Title=\u05d4\u05e6\u05d2\u05d4 +PrefsDialog.Language.Default=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +PrefsDialog.Upgrades.Always=\u05db\u05dc-\u05e4\u05e2\u05dd +PrefsDialog.Upgrades.Weekly=\u05e9\u05d1\u05d5\u05e2\u05d9 +PrefsDialog.Upgrades.Monthly=\u05d7\u05d5\u05d3\u05e9\u05d9 +PrefsDialog.Upgrades.Never=\u05d0\u05e3-\u05e4\u05e2\u05dd +PrefsDialog.Button.CheckForUpgrade=\u05d1\u05d3\u05d5\u05e7 \u05e2\u05db\u05e9\u05d9\u05d5 +PrefsDialog.Xuggle.Speed.BorderTitle=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc +PrefsDialog.Xuggle.Slow=\u05d4\u05d7\u05dc\u05e7 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) +PrefsDialog.Xuggle.Fast=\u05de\u05d4\u05e8 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05e7\u05d5\u05e4\u05e6\u05e0\u05d9) +PrefsDialog.CalibrationTool.BorderTitle=\u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +Protractor.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea +Protractor.New.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea +Protractor.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05dc\u05de\u05d3\u05d9\u05d3\u05ea \u05d6\u05d5\u05d9\u05ea +Protractor.Label.Angle=\u05d6\u05d5\u05d9\u05ea +Protractor.Field.Angle.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05d9\u05df \u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea +Protractor.Vertex.Name=\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 +Protractor.Vertex.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05d4\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 +Protractor.End.Name=\u05e7\u05e6\u05d4 \u05d6\u05e8\u05d5\u05e2 +Protractor.End.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05d1\u05d5\u05d1 \u05d4\u05d6\u05e8\u05d5\u05e2 +Protractor.Handle.Name=\u05d9\u05d3\u05d9\u05ea +Protractor.Handle.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05d4\u05d6\u05d6\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea +Protractor.Rotator.Name=\u05de\u05e1\u05d5\u05d1\u05d1 +Protractor.Rotator.Hint=\u05d2\u05e8\u05d5\u05e8 \u05dc\u05e1\u05d9\u05d1\u05d5\u05d1 \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea +Protractor.Readout.Name=\u05e7\u05e8\u05d0 +Protractor.Readout.Hint=\u05d6\u05d5\u05d9\u05ea \u05d1\u05d9\u05df \u05d6\u05e8\u05d5\u05e2\u05d5\u05ea \u05de\u05d3-\u05d4\u05d6\u05d5\u05d9\u05ea +ProtractorFootprint.Circle3=\u05de\u05e2\u05d2\u05dc \u05e7\u05d8\u05df +ProtractorFootprint.Circle5=\u05de\u05e2\u05d2\u05dc \u05d2\u05d3\u05d5\u05dc +ProtractorFootprint.Circle3Bold=\u05de\u05e2\u05d2\u05dc \u05e7\u05d8\u05df \u05db\u05e4\u05d5\u05dc +ProtractorFootprint.Circle5Bold=\u05de\u05e2\u05d2\u05dc \u05d2\u05d3\u05d5\u05dc \u05de\u05d5\u05d3\u05d2\u05e9 +Stick.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc +Stick.New.Name=\u05de\u05d5\u05d8 \u05db\u05d9\u05d5\u05dc +TableTrackView.MenuItem.Unformatted=\u05d3\u05d9\u05d5\u05e7 \u05de\u05dc\u05d0 +TableTrackView.MenuItem.Formatted=\u05e2\u05dc-\u05e4\u05d9 \u05e2\u05d9\u05e6\u05d5\u05d1\u05d5 +TableTrackView.Menu.SetDelimiter=\u05d4\u05d2\u05d3\u05e8 \u05de\u05e7\u05d1\u05e5 +TableTrackView.MenuItem.AddDelimiter=\u05d4\u05d5\u05e1\u05e3... +TableTrackView.MenuItem.RemoveDelimiter=\u05d4\u05e1\u05e8... +TableTrackView.Dialog.CustomDelimiter.Message=\u05d4\u05db\u05e0\u05e1 \u05de\u05d7\u05e8\u05d5\u05d6\u05ea \u05e7\u05d9\u05d1\u05d5\u05e5 \u05d7\u05d3\u05e9\u05d4: +TableTrackView.Dialog.CustomDelimiter.Title=\u05d4\u05d5\u05e1\u05e3 \u05de\u05e7\u05d1\u05e5 +TableTrackView.Header.Tooltip=\u05d4\u05e7\u05e9\u05d4 \u05dc\u05de\u05d9\u05d5\u05df, \u05d0\u05d5 \u05d4\u05e7\u05e9\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05dc\u05d1\u05d7\u05d9\u05e8\u05d4 +TableTrackView.MenuItem.CopySelectedData=\u05d4\u05e2\u05ea\u05e7 \u05ea\u05d0\u05d9\u05dd \u05e9\u05e0\u05d1\u05d7\u05e8\u05d5 +TableTrackView.Dialog.RemoveDelimiter.Message=\u05d1\u05d7\u05e8 \u05de\u05e7\u05d1\u05e5 \u05dc\u05d4\u05e1\u05e8\u05d4: +TableTrackView.Dialog.RemoveDelimiter.Title=\u05d4\u05e1\u05e8 \u05de\u05e7\u05d1\u05e5 +TableTrackView.Radians.Tooltip=\u05d1\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd +TableTrackView.Degrees.Tooltip=\u05d1\u05de\u05e2\u05dc\u05d5\u05ea +TableTrackView.RadiansPerSecond.Tooltip=\u05d1\u05e8\u05d3\u05d9\u05d0\u05df \u05dc\u05e9\u05e0\u05d9\u05d4 +TableTrackView.DegreesPerSecond.Tooltip=\u05d1\u05de\u05e2\u05dc\u05d5\u05ea \u05dc\u05e9\u05e0\u05d9\u05d4 +TableTrackView.RadiansPerSecondSquared.Tooltip=\u05d1- radians/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=\u05d1- degrees/s^2 +TableTrackView.MenuItem.DeleteDataFunction=\u05de\u05d7\u05e7 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TActions.Action.SaveFrame=\u05e9\u05de\u05d5\u05e8 \u05e7\u05d1\u05d5\u05e6\u05ea \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05d1\u05e9\u05dd... +TActions.AboutVideo=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... +TActions.Dialog.AboutVideo.Title=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9 \u05d5\u05d9\u05d3\u05d0\u05d5 +TActions.Dialog.AboutVideo.Type=\u05e1\u05d5\u05d2 +TActions.Dialog.AboutVideo.Size=\u05de\u05d9\u05de\u05d3\u05d9\u05dd +TActions.Dialog.AboutVideo.Length=\u05d0\u05d5\u05e8\u05da +TActions.Dialog.AboutVideo.Frames=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea +TActions.Dialog.AboutVideo.Seconds=\u05e9\u05e0\u05d9\u05d5\u05ea +TActions.Dialog.AboutVideo.FrameRate=\u05e7\u05e6\u05d1 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea +TActions.Dialog.AboutVideo.FramesPerSecond=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05dc\u05e9\u05e0\u05d9\u05d4 +TActions.Dialog.AboutVideo.Path=\u05de\u05d9\u05e7\u05d5\u05dd +TActions.Action.ImportTRK=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8... +TActions.Action.ProtractorVisible=\u05e0\u05e8\u05d0\u05d4 +TapeMeasure.MenuItem.FixedLength=\u05d0\u05d5\u05e8\u05da \u05e7\u05d1\u05d5\u05e2 +TextTView.Label.NoTab=\u05dc\u05d7\u05e5 "\u05d3\u05e3" \u05db\u05d3\u05d9 \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05db\u05d9\u05ea\u05d5\u05d1 \u05d5\u05d3\u05e4\u05d9 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8. +TextTView.NewTab.Text1=\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05e4\u05d5\u05dc\u05d4 \u05dc\u05e2\u05e8\u05d9\u05db\u05ea \u05db\u05d9\u05ea\u05d5\u05d1 \u05d5\u05db\u05d5\u05ea\u05e8\u05ea. \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d9\u05de\u05e0\u05d9\u05ea \u05dc\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea. +TextTView.NewTab.Text2=\u05dc\u05d4\u05e6\u05d2\u05ea \u05d3\u05e3 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d4\u05db\u05e0\u05e1 \u05db\u05ea\u05d5\u05d1\u05ea \u05d0\u05d5 \u05dc\u05d7\u05d9\u05e6\u05d4 \u05d9\u05de\u05e0\u05d9\u05ea \u05dc\u05e4\u05ea\u05d9\u05d7\u05ea \u05e7\u05d5\u05d1\u05e5. +TextTView.NewTab.Title=\u05dc\u05dc\u05d0 \u05e9\u05dd +TextTView.Dialog.TabTitle.Title=\u05d4\u05d2\u05d3\u05e8 \u05db\u05d5\u05ea\u05e8\u05ea +TextTView.MenuItem.OpenHTML=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 \u05d3\u05e3 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8... +TextTView.MenuItem.SetTitle=\u05d4\u05d2\u05d3\u05e8 \u05db\u05d5\u05ea\u05e8\u05ea... +TextTView.Button.NewTab=\u05d7\u05d3\u05e9 +TextTView.TextEdit.Description=\u05db\u05d9\u05ea\u05d5\u05d1 +TFrame.Dialog.FileNotFound.Message=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +TFrame.Dialog.FileNotFound.Title=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +TFrame.View.Text=\u05ea\u05e6\u05d5\u05d2\u05ea \u05e2\u05de\u05d5\u05d3 +TFrame.View.Main=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea +TMenuBar.Menu.OpenRecent=\u05e4\u05ea\u05d7 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d9\u05dd +TMenuBar.Menu.Import=\u05d9\u05d1\u05d0 +TMenuBar.Menu.Export=\u05d9\u05e6\u05d0 +TMenuBar.MenuItem.Video=\u05e1\u05e8\u05d8... +TMenuBar.MenuItem.Data=\u05e7\u05d5\u05d1\u05e5 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd... +TMenuBar.Menu.CopyObject=\u05d4\u05e2\u05ea\u05e7 \u05e4\u05e8\u05d9\u05d8 +TMenuBar.MenuItem.Coords=\u05de\u05e2\u05e8\u05db\u05ea \u05e6\u05d9\u05e8\u05d9\u05dd +TMenuBar.MenuItem.VideoClip=\u05e1\u05e8\u05d8\u05d5\u05df +TMenuBar.Menu.MeasuringTools=\u05db\u05dc\u05d9 \u05de\u05d3\u05d9\u05d3\u05d4 +TMenuBar.Menu.AngleUnits=\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea +TMenuBar.MenuItem.Degrees=\u05de\u05e2\u05dc\u05d5\u05ea +TMenuBar.MenuItem.Radians=\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd +Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc (\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05e6\u05d5\u05de\u05d3) \u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df. +Tracker.Dialog.NoXuggle.Message2=\u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05de- http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc... +Tracker.Dialog.AboutXuggle.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc +Tracker.Dialog.AboutXuggle.Message.Version=\u05d2\u05e8\u05e1\u05ea \u05e9\u05d5\u05d2\u05dc +Tracker.Dialog.AboutXuggle.Message.Home=\u05de\u05d9\u05e7\u05d5\u05dd \u05e9\u05d5\u05d2\u05dc: +Tracker.Dialog.AboutXuggle.Message.Path=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d1\u05e6\u05d9 jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc: +Tracker.Dialog.NoVideoEngine.Message1=\u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5. \u05dc\u05dc\u05d0 \u05de\u05e0\u05d5\u05e2 \u05d0\u05ea\u05d4 +Tracker.Dialog.NoVideoEngine.Message2=\u05d9\u05db\u05d5\u05dc \u05dc\u05e4\u05ea\u05d5\u05d7 \u05e8\u05e7 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea (JPEG, PNG) \u05d5\u05d4\u05e0\u05e4\u05e9\u05ea GIFs. +Tracker.Dialog.NoVideoEngine.Message3=\u05de\u05d5\u05de\u05dc\u05e5: \u05d4\u05ea\u05e7\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc. +Tracker.Dialog.NoVideoEngine.Title=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 +Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e2\u05d5\u05d1\u05d3 \u05db\u05e9\u05d5\u05e8\u05d4. \u05d1\u05d1\u05e7\u05e9\u05d4 \u05d1\u05d3\u05d5\u05e7 \u05e9\u05e7\u05d1\u05e6\u05d9 +Tracker.Dialog.NoXuggle.Message2=jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc \u05e0\u05de\u05e6\u05d0\u05d9\u05dd \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. \u05dc\u05e4\u05e8\u05d8\u05d9\u05dd, +Tracker.Dialog.NoXuggle.Message3=\u05e8\u05d0\u05d4 Tracker_README.txt \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. +Tracker.Dialog.NoXuggle.Message4=\u05dc\u05d4\u05ea\u05e7\u05e0\u05ea \u05e9\u05d5\u05d2\u05dc, \u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05de\u05ea\u05e7\u05d9\u05df \u05d8\u05e8\u05e7\u05e8 \u05d4\u05d0\u05d7\u05e8\u05d5\u05df +Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05d2\u05d9\u05e9 +Tracker.About.DefaultLocale=\u05de\u05d9\u05e7\u05d5\u05dd \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +Tracker.About.CurrentLanguage=\u05e9\u05e4\u05d4 +Tracker.Dialog.InsufficientMemory.Title=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05de\u05e1\u05e4\u05e7 +Tracker.Dialog.InsufficientMemory.Message=\u05d3\u05e8\u05d9\u05e9\u05ea \u05d4\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d2\u05d3\u05d5\u05dc\u05d4 \u05de\u05d9\u05d3\u05d9 +TrackerIO.Dialog.TabMustBeSaved.Message1=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +TrackerIO.Dialog.TabMustBeSaved.Message2=\u05d7\u05d9\u05d9\u05d1 \u05dc\u05d4\u05d9\u05e9\u05de\u05e8 \u05db\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d9\u05db\u05dc\u05dc \u05d1\u05de\u05e2\u05e8\u05da \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea +TrackerIO.Dialog.TabMustBeSaved.Message3=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05de\u05d5\u05e8 \u05d6\u05d0\u05ea? +TrackerIO.Dialog.TabMustBeSaved.Title=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05dc\u05d0 \u05e9\u05de\u05d5\u05e8\u05d4 +TrackerIO.Dialog.NoTabs.Message=\u05d0\u05d9\u05df \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05dc\u05e9\u05de\u05d5\u05e8! +TrackerIO.Dialog.NoTabs.Title=\u05de\u05e2\u05e8\u05da \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea \u05e8\u05d9\u05e7 +TrackerIO.Dialog.SaveTabset.Title=\u05e9\u05de\u05d5\u05e8 \u05de\u05e2\u05e8\u05da \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d5\u05ea +TrackerIO.Dialog.SaveTab.Title=\u05e9\u05de\u05d5\u05e8 \u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +TrackerIO.Delimiter.Tab=\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 +TrackerIO.Delimiter.Space=\u05e8\u05d5\u05d5\u05d7 +TrackerIO.Delimiter.Comma=\u05e4\u05e1\u05d9\u05e7 +TrackerIO.Delimiter.Semicolon=\u05e0\u05e7\u05d5\u05d3\u05d4-\u05e4\u05e1\u05d9\u05e7 +TrackerIO.VideoAndDataFileFilter.Description=\u05e1\u05e8\u05d8\u05d9\u05dd \u05d5\u05e7\u05d1\u05e6\u05d9 \u05d8\u05e8\u05e7\u05e8 +TrackerPanel.Dialog.Version.Message1=\u05d0\u05ea\u05d4 \u05e4\u05d5\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 \u05e9\u05e0\u05d5\u05e6\u05e8 \u05e2\u05dd \u05d8\u05e8\u05e7\u05e8 +TrackerPanel.Dialog.Version.Message2=\u05e9\u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05ea\u05d9\u05d7\u05e1 \u05d0\u05dc +TrackerPanel.Dialog.Version.Message3=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd \u05d7\u05e1\u05e8\u05d9\u05dd \u05d1\u05d2\u05e8\u05e1\u05d4 \u05d1\u05d4 \u05d0\u05ea\u05d4 \u05de\u05e9\u05ea\u05de\u05e9 +TrackerPanel.Dialog.Version.Message4=\u05d0\u05ea \u05d4\u05d2\u05e8\u05e1\u05d4 \u05d4\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e0\u05d9\u05ea\u05df \u05dc\u05d4\u05e9\u05d9\u05d2 \u05d1 +TrackerPanel.Dialog.Version.Title=\u05d7\u05d5\u05e1\u05e8 \u05d4\u05ea\u05d0\u05de\u05ea \u05d2\u05e8\u05e1\u05d0\u05d5\u05ea +TrackerPanel.Label.ModelStart=\u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 +TrackerPanel.Label.ModelEnd=\u05ea\u05de\u05d5\u05e0\u05d4 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 +TrackerPanel.Spinner.ModelStart.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 \u05dc\u05de\u05d5\u05d3\u05dc \u05d6\u05d4 +TrackerPanel.Spinner.ModelEnd.Tooltip=\u05d4\u05d2\u05d3\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 \u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05dc\u05de\u05d5\u05d3\u05dc \u05d6\u05d4 +TToolbar.Button.ProtractorVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05de\u05d3-\u05d6\u05d5\u05d9\u05ea +TToolbar.Button.AxesVisible.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05e6\u05d9\u05e8\u05d9\u05dd +TToolBar.Button.TrackControl.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05d1\u05e7\u05e8\u05ea \u05e2\u05e7\u05d9\u05d1\u05d4 +TTrack.Dialog.StepSizeWarning.Message1=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05d7\u05dc\u05e7 \u05de\u05d4\u05e2\u05e7\u05d1\u05d5\u05ea \u05e1\u05d5\u05de\u05e0\u05d5 \u05d1\u05e6\u05e2\u05d3\u05d9\u05dd \u05d4\u05d2\u05d3\u05d5\u05dc\u05d9\u05dd \u05de-1, \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05e9\u05d3\u05d5\u05dc\u05d2\u05d5 \u05e0\u05e9\u05d0\u05e8\u05d5 \u05dc\u05dc\u05d0 \u05e1\u05d9\u05de\u05d5\u05df. +TTrack.Dialog.StepSizeWarning.Message2=\u05dc\u05db\u05df \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc \u05d4\u05e6\u05e2\u05d3 \u05e2\u05e9\u05d5\u05d9 \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e4\u05e2\u05e8\u05d9\u05dd \u05d1\u05e8\u05e6\u05e3 \u05d4\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd. +TTrack.Dialog.StepSizeWarning.Message3=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d7\u05e9\u05d1 \u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05dc\u05d9\u05d3 \u05d4\u05e4\u05e2\u05e8 \u05e2\u05d3 \u05dc\u05d4\u05e9\u05dc\u05de\u05ea \u05d4\u05e6\u05e2\u05d3 \u05d4\u05d7\u05e1\u05e8. +TTrack.Dialog.StepSizeWarning.Title=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea +TTrack.Dialog.SkippedStepWarning.Message1=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05d3\u05d9\u05dc\u05d5\u05d2 \u05e2\u05dc \u05e9\u05dc\u05d1\u05d9\u05dd \u05d1\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d9\u05e7\u05d5\u05de\u05d9\u05dd \u05e2\u05dc\u05d5\u05dc \u05dc\u05d9\u05e6\u05d5\u05e8 \u05e4\u05e2\u05e8\u05d9\u05dd \u05d1\u05e8\u05e6\u05e3 \u05d4\u05e0\u05ea\u05d5\u05e0\u05d9\u05dd. +TTrack.Dialog.SkippedStepWarning.Title=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea +TTrack.Dialog.SkippedStepWarning.Checkbox=\u05d0\u05dc \u05ea\u05e8\u05d0\u05d4 \u05d6\u05d0\u05ea \u05e9\u05e0\u05d9\u05ea +TTrack.Locked.Hint=\u05e0\u05e2\u05d5\u05dc +TTrack.AngleField.Radians.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd +TTrack.AngleField.Degrees.Tooltip=\u05d6\u05d5\u05d9\u05ea \u05d1\u05de\u05e2\u05dc\u05d5\u05ea +TTrack.AngleField.Popup.Radians=\u05d4\u05d7\u05dc\u05e3 \u05dc\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd +TTrack.AngleField.Popup.Degrees=\u05d4\u05d7\u05dc\u05e3 \u05dc\u05de\u05e2\u05dc\u05d5\u05ea +TTrackBar.Memory.Menu.SetSize=\u05d4\u05d2\u05d3\u05e8 \u05d2\u05d5\u05d3\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df... +TTrackBar.Button.Version=\u05e2\u05db\u05e9\u05d9\u05d5 \u05d6\u05de\u05d9\u05df, \u05d2\u05e8\u05e1\u05d4 +TTrackBar.Popup.MenuItem.Upgrade=\u05e9\u05d3\u05e8\u05d2 \u05e2\u05db\u05e9\u05d9\u05d5... +TTrackBar.Popup.MenuItem.Ignore=\u05d4\u05ea\u05e2\u05dc\u05dd +XuggleVideo.MenuItem.SmoothPlay=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05d7\u05dc\u05e7\u05d4 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=\u05e1\u05e8\u05d8 \u05db\u05d9\u05d5\u05dc +CircleFootprint.Circle=\u05de\u05e2\u05d2\u05dc +CircleFootprint.FilledCircle=\u05de\u05e2\u05d2\u05dc \u05de\u05dc\u05d0 +CircleFootprint.Dialog.Title=\u05e2\u05e7\u05d1\u05d5\u05ea \u05de\u05e2\u05d2\u05dc +CircleFootprint.Dialog.Label.Radius=\u05e8\u05d3\u05d9\u05d5\u05e1 +CircleFootprint.Dialog.Checkbox.Bold=\u05de\u05d5\u05d3\u05d2\u05e9 +CircleFootprint.Dialog.Checkbox.CenterSpot=\u05de\u05e8\u05db\u05d6 +LineProfile.Hint.Marking=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05e4\u05e8\u05d5\u05e4\u05d9\u05dc \u05d4\u05e7\u05d5 +PageTView.Button.Page=\u05e2\u05de\u05d5\u05d3 +PageTView.MenuItem.ClosePage=\u05e1\u05d2\u05d5\u05e8 \u05e2\u05de\u05d5\u05d3 +PointMass.Hint.Marking=\u05d4\u05e7\u05e9 \u05e2\u05dd \u05d4\u05e2\u05db\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df, \u05d4\u05e7\u05e9 Enter \u05db\u05d3\u05d9 \u05dc\u05d7\u05d6\u05d5\u05e8 \u05e2\u05dc \u05d4\u05e6\u05e2\u05d3 \u05d4\u05e7\u05d5\u05d3\u05dd +PrefsDialog.Dialog.NewVersion.Title=\u05e2\u05d3\u05db\u05d5\u05e0\u05d9\u05dd +PrefsDialog.Dialog.NewVersion.Message1=\u05d2\u05e8\u05e1\u05d4 +PrefsDialog.Dialog.NewVersion.Message2=\u05e2\u05db\u05e9\u05d9\u05d5 \u05d6\u05de\u05d9\u05e0\u05d4 \u05d1 +PrefsDialog.Dialog.NewVersion.None.Message=\u05d0\u05d9\u05df \u05d2\u05e8\u05e1\u05d4 \u05d7\u05d3\u05e9\u05d4 \u05db\u05e8\u05d2\u05e2 +RGBRegion.Hint.Marking=\u05d4\u05e7\u05e9 \u05e2\u05dd \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05e8\u05db\u05d6 \u05d4\u05d0\u05d6\u05d5\u05e8 +TMenuBar.MenuItem.Restore=\u05e9\u05d7\u05d6\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea +TrackControl.StretchVectors.None=\u05dc\u05dc\u05d0 \u05de\u05ea\u05d9\u05d7\u05d4 +TViewChooser.Maximize.Tooltip=\u05de\u05e7\u05e1\u05dd \u05ea\u05e6\u05d5\u05d2\u05d4 \u05d6\u05d5 +TViewChooser.Restore.Tooltip=\u05e9\u05d7\u05d6\u05e8 \u05ea\u05e6\u05d5\u05d2\u05d5\u05ea +Vector.Hint.Marking=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df, \u05d4\u05e7\u05e9 Enter \u05db\u05d3\u05d9 \u05dc\u05d7\u05d6\u05d5\u05e8 \u05e2\u05dc \u05d4\u05e6\u05e2\u05d3 \u05d4\u05e7\u05d5\u05d3\u05dd +WorldTView.Button.World=\u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\u05d9\u05ea\u05d9\u05d5\u05ea + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=\u05d4\u05d6\u05d4\u05e8\u05d5\u05ea +PrefsDialog.Checkbox.WarnIfNoEngine=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 +PrefsDialog.Checkbox.WarnIfXuggleError=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e7\u05d8\u05dc\u05e0\u05d9\u05ea +PropertiesDialog.Title=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd +PropertiesDialog.Label.Author=\u05d9\u05d5\u05e6\u05e8\u05d9\u05dd +PropertiesDialog.Label.Contact=\u05e7\u05e9\u05e8 +TActions.Action.Properties=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... +TActions.Action.OpenBrowser=\u05e4\u05ea\u05d7 \u05d3\u05e4\u05d3\u05e4\u05df \u05e1\u05e4\u05e8\u05d9\u05d5\u05ea... +TFrame.Progress.Xuggle=\u05e9\u05d5\u05d2\u05dc \u05d8\u05d5\u05e2\u05df \u05ea\u05de\u05d5\u05e0\u05d4 +TFrame.Progress.ClickToCancel=(\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d9\u05d8\u05d5\u05dc) +TFrame.Dialog.StalledVideo.Title=\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05e1\u05e8\u05d8 +TFrame.Dialog.StalledVideo.Message0=\u05d4\u05e1\u05e8\u05d8 \u05e0\u05e2\u05e6\u05e8 \u05d1\u05d6\u05de\u05df \u05d4\u05d8\u05e2\u05d9\u05e0\u05d4. \u05d6\u05d4 \u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05de\u05e0\u05d9. +TFrame.Dialog.StalledVideo.Message1=\u05d0\u05e4\u05e9\u05e8 \u05dc\u05e2\u05e6\u05d5\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5 \u05d0\u05d5 \u05dc\u05d4\u05de\u05e9\u05d9\u05da \u05dc\u05d4\u05de\u05ea\u05d9\u05df +TFrame.Dialog.StalledVideo.Message2=\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e0\u05d5\u05e1\u05e4\u05d5\u05ea \u05dc\u05e4\u05ea\u05d9\u05d7\u05ea \u05e1\u05e8\u05d8 \u05d6\u05d4: +TFrame.Dialog.StalledVideo.Message3=1. \u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05ea\u05d5\u05db\u05e0\u05ea \u05d4\u05de\u05e8\u05d4 \u05d1\u05db\u05d3\u05d9 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 \u05d4\u05e1\u05e8\u05d8 +TFrame.Dialog.StalledVideo.Message4=2. \u05d1\u05d7\u05e8 QuickTime \u05d1\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05d5 \u05d1\u05ea\u05d9\u05d1\u05ea \u05d4\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea. +TFrame.Dialog.StalledVideo.MessageMac=2. \u05e4\u05ea\u05d7 \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05d1- 32-bit Java VM \u05d9\u05d7\u05d3 \u05e2\u05dd QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=\u05e2\u05e6\u05d5\u05e8 +TFrame.Dialog.StalledVideo.Button.Wait=\u05d4\u05de\u05ea\u05df +Tracker.Dialog.NoVideoEngine.Checkbox=\u05d0\u05dc \u05ea\u05e8\u05d0\u05d4 \u05d6\u05d0\u05ea \u05e9\u05e0\u05d9\u05ea +TrackerIO.ZipFileFilter.Description=\u05e7\u05d5\u05d1\u05e5 ZIP (.zip) +TrackerIO.Dialog.ErrorFFMPEG.Message1=\u05e9\u05d5\u05d2\u05dc \u05de\u05e6\u05d0\u05d4 \u05d0\u05ea \u05d4\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d4\u05d1\u05d0\u05d4 \u05d1\u05e2\u05ea \u05e4\u05ea\u05d9\u05d7\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5:: +TrackerIO.Dialog.ErrorFFMPEG.Message2=\u05dc\u05d0 \u05db\u05dc \u05d4\u05e9\u05d2\u05d9\u05d0\u05d5\u05ea \u05e7\u05d8\u05dc\u05e0\u05d9\u05d5\u05e5. \u05dc\u05de\u05e1\u05e8 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05de\u05dc\u05d0, \u05d1\u05d7\u05e8 \u05e2\u05d6\u05e8\u05d4|\u05d9\u05d5\u05de\u05df \u05de\u05e1\u05e8\u05d9\u05dd. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u05d0\u05dd \u05e9\u05d5\u05d2\u05dc \u05db\u05e9\u05dc, \u05d9\u05ea\u05db\u05df \u05e9\u05e0\u05d9\u05ea\u05df \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8 \u05e2\u05dd QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u05e9\u05d9\u05dd \u05dc\u05d1: \u05d1\u05de\u05e2\u05e8\u05db\u05ea \u05d4\u05e4\u05e2\u05dc\u05d4 OSX \u05e0\u05d3\u05e8\u05e9 \u05dc\u05d4\u05e4\u05e2\u05d9\u05dc \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05d1\u05ea\u05e6\u05d5\u05e8\u05ea 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc +TrackerIO.ErrorFFMPEG.LogMessage=\u05dc\u05e4\u05e8\u05d8\u05d9\u05dd \u05e0\u05d5\u05e1\u05e4\u05d9\u05dd, \u05d4\u05e4\u05e2\u05dc \u05d0\u05ea \u05d0\u05d6\u05d4\u05e8\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc \u05d1\u05ea\u05d9\u05d1\u05ea \u05d4\u05d3\u05d5-\u05e9\u05d9\u05d7 (\u05e2\u05e8\u05d5\u05da|\u05d4\u05e2\u05d3\u05e4\u05d5\u05ea). +TToolBar.Button.OpenBrowser.Tooltip=\u05e4\u05ea\u05d7 \u05d0\u05ea \u05d3\u05e4\u05d3\u05e4\u05df \u05d4\u05e1\u05e4\u05e8\u05d9\u05d5\u05ea \u05d4\u05d3\u05d9\u05d2\u05d9\u05d8\u05dc\u05d9 OSP + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +TFrame.Dialog.NoTRKInComPADRE.Message=\u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05dc\u05e6\u05d5\u05de\u05ea + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05e7\u05d9\u05e0\u05de\u05d8\u05d9 +DynamicParticle.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e7\u05e8\u05d8\u05d6\u05d9) +DynamicParticlePolar.Builder.Title=\u05d7\u05dc\u05e7\u05d9\u05e7 \u05d3\u05d9\u05e0\u05de\u05d9 (\u05e4\u05d5\u05dc\u05e8\u05d9) +DynamicSystem.Builder.Title=\u05de\u05e2\u05e8\u05db\u05ea \u05d3\u05d9\u05e0\u05de\u05d9\u05ea (\u05e4\u05e0\u05d9\u05de\u05d9\u05ea) +PropertiesDialog.Button.CopyFilePath=\u05d4\u05e2\u05ea\u05e7 \u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d5\u05d1\u05e5 +PropertiesDialog.Button.CopyVideoPath=\u05d4\u05e2\u05ea\u05e7 \u05de\u05d9\u05e7\u05d5\u05dd \u05e1\u05e8\u05d8 +PropertiesDialog.Tab.TrackerFile=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd +PropertiesDialog.Header.Value=\u05e2\u05e8\u05da +TActions.Action.OpenURL=\u05e4\u05ea\u05d7 URL... +TActions.Dialog.OpenURL.Title=\u05e4\u05ea\u05d7 URL +TActions.Dialog.OpenURL.Message=\u05d4\u05db\u05e0\u05e1 \u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05e1\u05e8\u05d8 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8\u05d9, \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8, \u05d0\u05d5 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +TActions.Dialog.AboutVideo.Name=\u05e9\u05dd + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cached Web Files +PrefsDialog.Button.ClearCache=\u05e0\u05e7\u05d4 \u05d4\u05db\u05dc + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-\u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05de\u05d7\u05d3\u05e9 \u05e9\u05dc \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05de\u05d5\u05d3\u05d2\u05e9 +PointMass.Remarking.Hint=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05e2\u05db\u05d1\u05e8 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05de\u05d7\u05d3\u05e9 +PointMass.PositionSelected.Hint=\u05d2\u05e8\u05d5\u05e8, \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05de\u05d9\u05e7\u05d5\u05dd \u05d1\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd +PointMass.VectorSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 +Vector.Remark.Hint=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05d8\u05d9\u05e4 \u05d4\u05de\u05d5\u05d3\u05d2\u05e9 +Vector.TipSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05d0\u05d5 \u05d4\u05db\u05e0\u05e1 \u05e8\u05db\u05d9\u05d1\u05d9\u05dd \u05dc\u05e1\u05e8\u05d2\u05dc \u05d4\u05db\u05dc\u05d9\u05dd +Vector.HandleSelected.Hint=\u05d2\u05e8\u05d5\u05e8 \u05db\u05d3\u05d9 \u05dc\u05d4\u05d6\u05d9\u05d6 +Vector.Remarking.Hint=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05d4\u05e2\u05db\u05d1\u05e8 \u05db\u05d3\u05d9 \u05dc\u05e1\u05de\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d4\u05d8\u05d9\u05e4 +AutoTracker.Label.Search=\u05d7\u05e4\u05e9 +AutoTracker.Label.Target=\u05de\u05d8\u05e8\u05d4 +AutoTracker.Label.Frame=\u05de\u05e1\u05d2\u05e8\u05ea +AutoTracker.Label.Point=\u05e0\u05e7\u05d5\u05d3\u05d4 +AutoTracker.Label.Template=\u05ea\u05d1\u05e0\u05d9\u05ea +AutoTracker.Label.Track=\u05e2\u05e7\u05d5\u05d1 +AutoTracker.Label.Match=\u05d4\u05ea\u05d0\u05dd +AutoTracker.Label.NoTemplate=\u05d0\u05d9\u05df \u05ea\u05d1\u05e0\u05d9\u05ea +AutoTracker.Label.EvolutionRate=\u05e7\u05e6\u05d1 \u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea +AutoTracker.Label.Automark=\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +AutoTracker.Info.Instructions=\u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0\u05d9\u05ea\u05d5\u05e8 \u05d4\u05ea\u05d0\u05de\u05d5\u05ea \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 +AutoTracker.Info.KeyFrame.Instructions1=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d6\u05d5 \u05de\u05d2\u05d3\u05d9\u05e8\u05d4 \u05d0\u05ea \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05d5\u05d4\u05de\u05d8\u05e8\u05d4. \u05dc\u05d7\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0\u05d9\u05ea\u05d5\u05e8 \u05d4\u05ea\u05d0\u05de\u05d5\u05ea. +AutoTracker.Info.KeyFrame.Instructions2=\u05d0\u05ea\u05d4 \u05d9\u05db\u05d5\u05dc \u05dc\u05d2\u05e8\u05d5\u05e8 \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4, \u05ea\u05d1\u05e0\u05d9\u05ea, \u05d0\u05d5 \u05d0\u05d9\u05d6\u05d5\u05e8 \u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d4\u05d6\u05d9\u05d6 \u05d0\u05d5\u05ea\u05dd \u05d0\u05d5 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc\u05dd. +AutoTracker.Info.MouseOver.Instructions=\u05d4\u05e2\u05d1\u05e8 \u05d0\u05ea \u05d4\u05e2\u05db\u05d1\u05e8 \u05de\u05e2\u05dc \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05dc\u05de\u05d5\u05d3 \u05d9\u05d5\u05ea\u05e8 \u05e2\u05dc \u05d4\u05d2\u05d3\u05e8\u05d5\u05ea \u05d5\u05d4\u05ea\u05d0\u05de\u05d5\u05ea. +AutoTracker.Info.Mask1=\u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05d4\u05d9\u05d0 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4. \u05d4\u05d9\u05d0 \u05de\u05ea\u05d7\u05d9\u05dc\u05d4 \u05de\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 \u05d5\u05de\u05ea\u05e4\u05ea\u05d7\u05ea \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05d0\u05ea \u05e2\u05e6\u05de\u05d4 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9 \u05e6\u05d5\u05e8\u05d4 \u05d5\u05e6\u05d1\u05e2. +AutoTracker.Info.Mask2=\u05d3\u05e8\u05d2\u05ea \u05d4\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05d4\u05d9\u05d0 \u05e8\u05de\u05ea \u05d4\u05e0\u05d9\u05e7\u05d5\u05d3 \u05d4\u05de\u05d9\u05e0\u05d9\u05de\u05dc\u05d9\u05ea \u05d4\u05d3\u05e8\u05d5\u05e9\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9. +AutoTracker.Info.Mask.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05d5 \u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d4\u05ea\u05d1\u05e0\u05d9\u05ea \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea \u05d5\u05d4\u05d6\u05d6\u05ea \u05d4\u05d9\u05d3\u05d9\u05ea (\u05dc\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7 \u05d1\u05dc\u05d1\u05d3). \u05d4\u05ea\u05d0\u05dd \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d5\u05d4\u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05e9\u05d9\u05de\u05d5\u05e9 \u05d1\u05d8\u05d5\u05d5\u05d9\u05d9\u05df. +AutoTracker.Info.Mask.Tip=\u05d3\u05e8\u05d2\u05ea \u05e1\u05d9\u05de\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 \u05e0\u05de\u05d5\u05db\u05d4 \u05e2\u05e9\u05d5\u05d9\u05d4 \u05dc\u05d2\u05e8\u05d5\u05dd \u05dc\u05de\u05e6\u05d9\u05d0\u05ea \u05d4\u05ea\u05d0\u05d5\u05de\u05d5\u05ea \u05db\u05d5\u05d6\u05d1\u05d5\u05ea-- \u05dc\u05d7\u05d9\u05dc\u05d5\u05e4\u05d9\u05df \u05e0\u05e1\u05d4 \u05dc\u05e9\u05e0\u05d5\u05ea \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea. +AutoTracker.Info.Search=\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. +AutoTracker.Info.SearchOnAxis=\u05e6\u05d9\u05e8 \u05d4- x \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e0\u05e1\u05e8\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 \u05de\u05d9\u05d8\u05d1\u05d9\u05ea. +AutoTracker.Info.Search.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05d5 \u05e9\u05e0\u05d4 \u05d0\u05ea \u05d2\u05d5\u05d3\u05dc \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea \u05d4\u05d2\u05d1\u05d5\u05dc\u05d5\u05ea \u05d0\u05d5 \u05d4\u05d9\u05d3\u05d9\u05ea. \u05d4\u05d2\u05d3\u05e8 \u05d0\u05ea \u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05e6\u05d9\u05e8 x \u05d5\u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 \u05e2"\u05d9 \u05e1\u05d9\u05de\u05d5\u05e0\u05df. +AutoTracker.Info.Search.Tip=\u05d1\u05d3\u05e8\u05da \u05db\u05dc\u05dc, \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05d0 \u05e6\u05e8\u05d9\u05da \u05dc\u05d4\u05d9\u05d5\u05ea \u05d2\u05d3\u05d5\u05dc. \u05d0\u05e4\u05e9\u05e8\u05d5\u05ea \u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 \u05de\u05d6\u05d9\u05d6\u05d4 \u05d0\u05ea \u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9 \u05dc\u05e4\u05d9 \u05d4\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05e6\u05e4\u05d5\u05d9 \u05e9\u05dc \u05d4\u05d4\u05ea\u05d0\u05de\u05d4. +AutoTracker.Info.Target=\u05d4\u05de\u05d8\u05e8\u05d4 \u05d4\u05d9\u05d0 \u05de\u05d9\u05e7\u05d5\u05dd \u05e1\u05d9\u05de\u05d5\u05df \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea. +AutoTracker.Info.Target.Instructions=\u05d4\u05d6\u05d6 \u05d0\u05ea \u05d4\u05de\u05d8\u05e8\u05d4 \u05e2"\u05d9 \u05d2\u05e8\u05d9\u05e8\u05ea\u05d4 (\u05e8\u05e7 \u05d1\u05de\u05e1\u05d2\u05e8\u05ea \u05d4\u05de\u05e4\u05ea\u05d7). \u05d1\u05d7\u05e8 \u05d0\u05ea \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea \u05de\u05ea\u05e4\u05e8\u05d9\u05d8 \u05d4\u05d2\u05dc\u05d9\u05dc\u05d4. +AutoTracker.Info.Title.Settings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea +AutoTracker.Info.Title.Tip=\u05d8\u05d9\u05e4 +AutoTracker.Info.SelectTrack=\u05d1\u05d7\u05e8 \u05d0\u05d5 \u05e6\u05d5\u05e8 \u05de\u05e1\u05dc\u05d5\u05dc \u05d0\u05d5 \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e2\u05e7\u05d5\u05d1 \u05d0\u05d7\u05e8\u05d9\u05d4\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea. +AutoTracker.Info.OutsideXAxis=\u05e6\u05d9\u05e8 \u05d4- x \u05d0\u05d9\u05e0\u05d5 \u05e2\u05d5\u05d1\u05e8 \u05d1\u05d0\u05d6\u05d5\u05e8 \u05d4\u05d7\u05d9\u05e4\u05d5\u05e9. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05df: +AutoTracker.Info.NewKeyFrame=--\u05dc\u05da \u05e6\u05e2\u05d3 \u05d0\u05d7\u05d5\u05e8\u05d4 \u05d5\u05e9\u05e0\u05d4 \u05d0\u05ea \u05e7\u05e6\u05d1 \u05d4\u05d4\u05ea\u05e4\u05ea\u05d7\u05d5\u05ea \u05d0\u05d5 shift-control \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05d4\u05d2\u05d3\u05e8\u05ea \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d7\u05d3\u05e9\u05d4 +AutoTracker.Info.Replace=--\u05e7\u05d1\u05dc \u05d0\u05ea \u05d4\u05d4\u05ea\u05d0\u05de\u05d4 +AutoTracker.Info.Keep=--\u05d3\u05dc\u05d2 \u05e2\u05dc \u05ea\u05de\u05d5\u05e0\u05d4 \u05d6\u05d5 \u05d5\u05d4\u05e9\u05d0\u05e8 \u05dc\u05dc\u05d0 \u05e9\u05d9\u05e0\u05d5\u05d9 +AutoTracker.Info.PossibleReplace=\u05d4\u05ea\u05d0\u05de\u05d4 \u05d0\u05e4\u05e9\u05e8\u05d9\u05ea \u05de\u05d5\u05e6\u05d2\u05ea. \u05d4\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d4\u05df: +AutoTracker.Wizard.Button.Accept=\u05e7\u05d1\u05dc +AutoTracker.Wizard.Button.Stop=\u05e2\u05e6\u05d5\u05e8 +AutoTracker.Wizard.Button.Skip=\u05d3\u05dc\u05d2 +AutoTracker.Wizard.Button.Replace=\u05d4\u05d7\u05dc\u05e3 +AutoTracker.Wizard.Button.Keep=\u05d3\u05d7\u05d4 +AutoTracker.Wizard.Button.Search=\u05d7\u05e4\u05e9 +AutoTracker.Wizard.Button.SearchThis=\u05d7\u05e4\u05e9 \u05d0\u05ea \u05d6\u05d4 +AutoTracker.Wizard.Button.SearchNext=\u05d7\u05e4\u05e9 \u05d0\u05ea \u05d4\u05d1\u05d0 +AutoTracker.Wizard.Button.Delete=\u05de\u05d7\u05e7 +AutoTracker.Wizard.Button.ShowKeyFrame=\u05d4\u05e8\u05d0\u05d4 \u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 +AutoTracker.Wizard.Button.DeleteKeyFrame=\u05de\u05d7\u05e7 \u05ea\u05de\u05d5\u05e0\u05d4 +AutoTracker.Wizard.Checkbox.LookAhead=\u05e6\u05e4\u05d4 \u05e7\u05d3\u05d9\u05de\u05d4 +AutoTracker.Wizard.Checkbox.XAxis=\u05e8\u05e7 \u05e6\u05d9\u05e8 x +AutoTracker.Wizard.Menuitem.DeleteThis=\u05e0\u05e7\u05d5\u05d3\u05d4 \u05d6\u05d5 +AutoTracker.Wizard.Menuitem.DeleteLater=\u05e0\u05e7\u05d5\u05d3\u05d5\u05ea \u05d4\u05d1\u05d0\u05d5\u05ea +AutoTracker.Wizard.Menuitem.DeleteAll=\u05e0\u05e7\u05d4 \u05d4\u05db\u05dc +TToolBar.Button.AutoTracker.Tooltip=\u05d4\u05e8\u05d0\u05d4/\u05d4\u05e1\u05ea\u05e8 \u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +MainTView.Popup.MenuItem.ZoomIn=\u05d4\u05ea\u05e7\u05e8\u05d1 +MainTView.Popup.MenuItem.ZoomOut=\u05d4\u05ea\u05e8\u05d7\u05e7 +MainTView.Popup.MenuItem.ZoomToFit=\u05de\u05e8\u05d7\u05e7 \u05dc\u05d4\u05ea\u05d0\u05de\u05d4 +TrackerIO.Dialog.DurationVaries.Title=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 +TrackerIO.Dialog.DurationVaries.Message1=\u05d7\u05dc\u05e7 \u05de\u05de\u05e9\u05db\u05d9 \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 \u05e9\u05d5\u05e0\u05d9\u05dd \u05de\u05d0\u05d7\u05e8\u05d9\u05dd +TrackerIO.Dialog.DurationVaries.Message2=\u05dc\u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05de\u05d3\u05d5\u05d9\u05d9\u05e7\u05d5\u05ea, \u05e8\u05e6\u05d5\u05d9 \u05dc\u05d4\u05d5\u05e6\u05d9\u05d0 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05d5 +TrackerIO.Dialog.DurationVaries.Message3=\u05de\u05d4\u05d7\u05d9\u05e9\u05d5\u05d1\u05d9\u05dd \u05e2\u05dc-\u05d9\u05d3\u05d9 \u05d4\u05d2\u05d3\u05e8\u05ea \u05ea\u05de\u05d5\u05e0\u05d4 \u05e8\u05d0\u05e9\u05d5\u05e0\u05d4 \u05d5\u05d0\u05d7\u05e8\u05d5\u05e0\u05d4 \u05e9\u05dc \u05d4\u05e1\u05e8\u05d8\u05d5\u05df. +TrackerIO.Dialog.DurationVaries.Message4=\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05dc\u05d4\u05d5\u05e6\u05d0\u05d4: +TrackerIO.Dialog.DurationVaries.Message5=\u05de\u05e9\u05da \u05de\u05de\u05d5\u05e6\u05e2 \u05d5\u05e7\u05e6\u05d1 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dd \u05de\u05d5\u05e6\u05d9\u05d0\u05d9\u05dd: +TFrame.Dialog.LibraryError.Title=\u05e9\u05d2\u05d9\u05d0\u05d4 +TFrame.Dialog.LibraryError.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d8\u05e2\u05d5\u05df \u05de\u05e9\u05d0\u05d1\u05d9\u05dd \u05dc\u05e6\u05d5\u05de\u05ea + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift \u05d5\u05dc\u05d7\u05d9\u05e6\u05d4 \u05dc\u05e1\u05d9\u05de\u05d5\u05df +PrefsDialog.Label.Path=\u05de\u05d9\u05e7\u05d5\u05dd +PrefsDialog.Checkbox.ClearCacheOnExit=\u05e0\u05e7\u05d4 \u05d1\u05d9\u05e6\u05d9\u05d0\u05d4 +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=\u05ea\u05d9\u05e7\u05d9\u05d5\u05ea +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=\u05d2\u05e8\u05e1\u05ea \u05d8\u05e8\u05e7\u05e8 +PrefsDialog.Version.Default=\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc +PrefsDialog.Tab.ClearCacheOnExit=\u05e0\u05e7\u05d4 \u05d1\u05d9\u05e6\u05d9\u05d0\u05d4 +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=\u05e9\u05de\u05d5\u05e8 +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05de\u05d9\u05dd... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=\u05d1\u05d7\u05e8 \u05d0\u05ea \u05d4\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05dc\u05d7\u05d9\u05e9\u05d5\u05d1 \u05de\u05d4\u05d9\u05e8\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d4: +AlgorithmDialog.Title=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd +AlgorithmDialog.FiniteDifference.Message1=\u05d6\u05d4 \u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05d1\u05e8\u05d9\u05e8\u05ea \u05d4\u05de\u05d7\u05d3\u05dc. +AlgorithmDialog.FiniteDifference.Message2=\u05de\u05d4\u05d9\u05e8\u05d5\u05ea: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=\u05ea\u05d0\u05d5\u05e6\u05d4: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt^2) +AlgorithmDialog.BounceDetect.Message1=\u05d0\u05dc\u05d2\u05d5\u05e8\u05d9\u05ea\u05dd \u05d6\u05d4 \u05de\u05d7\u05dc\u05d9\u05e7 \u05de\u05d4\u05d9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d5\u05ea\u05d0\u05d5\u05e6\u05d5\u05ea \u05d0\u05d1\u05dc \u05d2\u05dd \u05e8\u05d2\u05d9\u05e9 \u05dc\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05e4\u05ea\u05d0\u05d5\u05de\u05d9\u05d9\u05dd \u05d1\u05de\u05d4\u05d9\u05e8\u05d5\u05ea. +AlgorithmDialog.BounceDetect.Message2=\u05d6\u05d4\u05d9\u05e8\u05d5\u05ea: \u05e2\u05dc\u05d5\u05dc \u05dc\u05d9\u05e6\u05d5\u05e8 \u05ea\u05d5\u05e4\u05e2\u05d5\u05ea \u05d3\u05de\u05d4 (\u05d0\u05e8\u05d8\u05d9\u05e4\u05e7\u05d8). \u05dc\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3, \u05e8\u05d0\u05d4: +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05e7\u05e8\u05d9\u05d0\u05d4. +TrackPlottingPanel.Popup.Menu.CompareWith=\u05d4\u05e9\u05d5\u05d5\u05d4 \u05e2\u05dd +TrackerPanel.DataBuilder.TrackType.Unknown=\u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2 +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=\u05d8\u05e2\u05df \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TrackerPanel.DataBuilder.Load.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05d8\u05e2\u05d9\u05e0\u05d4: +TrackerPanel.DataBuilder.Save.Title=\u05e9\u05de\u05d5\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd +TrackerPanel.DataBuilder.Save.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05dc\u05e9\u05de\u05d9\u05e8\u05d4: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=\u05d8\u05e2\u05df \u05dc\u05d4\u05db\u05dc +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=\u05d8\u05e2\u05df \u05e8\u05e7 \u05d0\u05dc +TrackerPanel.DataBuilder.Dialog.Load.Title=\u05d1\u05d7\u05d9\u05e8\u05ea \u05e2\u05e7\u05d1\u05d5\u05ea +TrackerPanel.DataBuilder.Dialog.Load.Message=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d8\u05e2\u05d5\u05df \u05d0\u05ea \u05d4\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05dc\u05db\u05dc \u05e1\u05d5\u05d2\u05d9 \u05d4\u05e2\u05e7\u05d1\u05d5\u05ea? +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=\u05e1\u05d5\u05d2 \u05e2\u05e7\u05d1\u05d5\u05ea \u05e9\u05d2\u05d5\u05d9 +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=\u05d4\u05e7\u05d5\u05d1\u05e5 \u05de\u05d2\u05d3\u05d9\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05dc\u05e1\u05d5\u05d2 \u05e2\u05e7\u05d1\u05d5\u05ea +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=\u05d4\u05df \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc\u05d5\u05ea \u05dc\u05d4\u05d9\u05d8\u05e2\u05df \u05dc\u05e1\u05d5\u05d2 +TrackerPanel.DataBuilder.Dialog.WrongType.Title=\u05e1\u05d5\u05d2 \u05e9\u05d2\u05d5\u05d9 +TrackerPanel.DataBuilder.Dialog.WrongType.Message=\u05d4\u05e7\u05d5\u05d1 \u05dc\u05d0 \u05de\u05d2\u05d3\u05d9\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=\u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd +ExportTRKDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d0\u05ea \u05d6\u05d4 \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? +ExportTRKDialog.Complete.Title=\u05d9\u05e6\u05d5\u05d0 \u05d4\u05d5\u05e9\u05dc\u05dd +ExportTRKDialog.Title=\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 +ExportTRKDialog.Message1=\u05d6\u05d4 (1) \u05dc\u05d9\u05e6\u05d0 \u05d0\u05ea \u05d4\u05e1\u05e8\u05d8\u05d5\u05df , (2) \u05dc\u05d4\u05de\u05d9\u05e8 \u05d0 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05dc\u05d4\u05ea\u05d0\u05d9\u05dd \u05dc\u05e1\u05e8\u05d8\u05d5\u05df \u05d4\u05de\u05d9\u05d5\u05e6\u05d0, \u05d5- (3) \u05dc\u05e9\u05de\u05d5\u05e8 \u05d0\u05ea \u05d4\u05db\u05e8\u05d8\u05d9\u05e1\u05d9\u05d4 \u05db\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05d7\u05d3\u05e9. +ExportTRKDialog.Message2=\u05e7\u05d5\u05d1\u05e6\u05d9 \u05d4\u05d5\u05d9\u05d3\u05d0\u05d5 \u05d5\u05d4\u05d8\u05e8\u05e7\u05e8 \u05e0\u05e9\u05de\u05e8\u05d9\u05dd \u05d1\u05d0\u05d5\u05ea\u05d5 \u05e9\u05dd \u05ea\u05d7\u05ea \u05e1\u05d9\u05d5\u05de\u05ea \u05e9\u05d5\u05e0\u05d4, \u05d1\u05d0\u05d5\u05ea\u05d4 \u05ea\u05d9\u05e7\u05d9\u05d4. +TMenuBar.MenuItem.TabClip=\u05e1\u05e8\u05d8\u05d5\u05df \u05d8\u05e8\u05e7\u05e8 +TMenuBar.Menu.CalibrationTools=\u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc +TrackerIO.Dialog.DurationVaries.Button.SetClip=\u05d4\u05d2\u05d3\u05e8 \u05e1\u05e8\u05d8\u05d5\u05df \u05de\u05d5\u05de\u05dc\u05e5 +TrackerIO.Dialog.DurationVaries.Start=\u05d4\u05ea\u05d7\u05dc +TrackerIO.Dialog.DurationVaries.End=\u05e1\u05d9\u05d9\u05dd +TrackerIO.Dialog.DurationVaries.Recommended=\u05e1\u05e8\u05d8\u05d5\u05df \u05de\u05d5\u05de\u05dc\u05e5 + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05e6\u05d5\u05d5\u05ea +AttachmentInspector.Label.End=\u05e1\u05d5\u05e3 +AttachmentInspector.Label.Vertex=\u05e7\u05d5\u05d3\u05e7\u05d5\u05d3 +AttachmentInspector.Header.PointName=\u05e9\u05dd +AttachmentInspector.Header.AttachedTo=\u05e6\u05e8\u05e3 \u05d0\u05dc +ExportTRKDialog.Label.VideoFormat=\u05e7\u05d5\u05d1\u05e5 \u05d5\u05d9\u05d3\u05d0\u05d5 +MeasuringTool.MenuItem.Attach=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05e6\u05d5\u05d5\u05ea... +PerspectiveTrack.Corner=\u05e4\u05d9\u05e0\u05d4 +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=\u05d6\u05de\u05df +Protractor.Data.Description.1=\u05d6\u05d5\u05d9\u05ea \u05de\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea +Protractor.Data.Description.2=\u05d0\u05d5\u05e8\u05da \u05d6\u05e8\u05d5\u05e2 1 +Protractor.Data.Description.3=\u05d0\u05d5\u05e8\u05da \u05d6\u05e8\u05d5\u05e2 2 +Protractor.Data.Description.4=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 +Protractor.Data.Description.5=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 +TapeMeasure.Data.Description.0=\u05d6\u05de\u05df +TapeMeasure.Data.Description.1=\u05d0\u05d5\u05e8\u05da +TapeMeasure.Data.Description.2=\u05d6\u05d5\u05d9\u05ea \u05de\u05d7\u05dc\u05e7\u05d5 \u05d4\u05d7\u05d9\u05d5\u05d1\u05d9 \u05e9\u05dc \u05e6\u05d9\u05e8 \u05d4-x +TapeMeasure.Data.Description.3=\u05de\u05e1\u05e4\u05e8 \u05e6\u05e2\u05d3 +TapeMeasure.Data.Description.4=\u05de\u05e1\u05e4\u05e8 \u05ea\u05de\u05d5\u05e0\u05d4 + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=\u05d8\u05e8\u05dd \u05d7\u05d5\u05e4\u05e9 +AutoTracker.Info.KeyFrame=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=\u05de\u05e1\u05d2\u05e8\u05ea \u05de\u05e4\u05ea\u05d7 \u05d6\u05d5 +AutoTracker.Wizard.Menuitem.DeleteThisMatch=\u05d6\u05d4 \u05de\u05ea\u05d0\u05d9\u05dd +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=\u05d4\u05ea\u05d0\u05de\u05d5\u05ea \u05de\u05d0\u05d5\u05d7\u05e8\u05d5\u05ea +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=\u05e2\u05d5\u05e7\u05d1 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +Dialog.Button.Add=\u05d4\u05d5\u05e1\u05e3 +Dialog.Button.Remove=\u05d4\u05e1\u05e8 +PrefsDialog.Button.ClearHost=\u05e0\u05e7\u05d4 \u05de\u05d0\u05e8\u05d7 +PrefsDialog.Button.ClearHost.Tooltip=\u05e0\u05e7\u05d4 \u05d0\u05ea \u05db\u05dc \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05de\u05e7\u05d5\u05e9\u05e8\u05d9\u05dd \u05dc\u05de\u05d0\u05e8\u05d7 OSP cache +PrefsDialog.Button.ClearCache.Tooltip=\u05de\u05d7\u05e7 \u05d0\u05ea \u05db\u05dc \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05de\u05d4- OSP cache +TActions.Action.SaveZip=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +ThumbnailDialog.Title=\u05d9\u05e6\u05d0 \u05ea\u05de\u05d5\u05e0\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 +ThumbnailDialog.Settings.Title=\u05d0\u05e4\u05e9\u05e8\u05d5\u05d9\u05d5\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 +ThumbnailDialog.Label.CurrentImage=\u05ea\u05de\u05d5\u05e0\u05d4 \u05e0\u05d5\u05db\u05d7\u05d9\u05ea +ThumbnailDialog.Label.FrameNumber=\u05ea\u05de\u05d5\u05e0\u05d4 +ThumbnailDialog.Label.StepNumber=\u05e6\u05e2\u05d3 +ThumbnailDialog.View.VideoOnly=\u05e8\u05e7 \u05d5\u05d9\u05d3\u05d0\u05d5 +ThumbnailDialog.View.MainView=\u05ea\u05e6\u05d5\u05d2\u05d4 \u05e8\u05d0\u05e9\u05d9\u05ea +ThumbnailDialog.View.WholeFrame=\u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05dc\u05d0\u05d4 +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=\u05e9\u05de\u05d5\u05e8 \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 +ThumbnailDialog.Subtitle.Image=\u05ea\u05de\u05d5\u05e0\u05d4 +TMenuBar.MenuItem.Thumbnail=\u05ea\u05de\u05d5\u05e0\u05ea \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 +TToolBar.Button.SaveZip.Tooltip=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +TTrack.MenuItem.DeletePoint=\u05de\u05d7\u05e7 \u05e6\u05e2\u05d3 \u05e0\u05d1\u05d7\u05e8 +ZipResourceDialog.Title=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +ZipResourceDialog.Label.Format=\u05e1\u05d5\u05d2 +ZipResourceDialog.Label.Title=\u05e9\u05dd +ZipResourceDialog.Label.Description=\u05ea\u05d9\u05d0\u05d5\u05e8 +ZipResourceDialog.Label.Keywords=\u05de\u05d9\u05dc\u05d5\u05ea \u05de\u05e4\u05ea\u05d7 +ZipResourceDialog.Label.Link=\u05e7\u05d9\u05e9\u05d5\u05e8\u05d9\u05dd \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9\u05d9\u05dd +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd \u05e0\u05e9\u05de\u05e8 \u05d1\u05e9\u05dd +ZipResourceDialog.Complete.Message2=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e4\u05ea\u05d5\u05d7 \u05d6\u05d0\u05ea \u05d1\u05d8\u05e8\u05e7\u05e8 \u05e2\u05db\u05e9\u05d9\u05d5? +ZipResourceDialog.Complete.Title=\u05d4\u05e6\u05dc\u05d7\u05d4 +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=\u05d5\u05d9\u05d3\u05d0\u05d5 +ZipResourceDialog.Border.Title.Thumbnail=\u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2 +ZipResourceDialog.FileChooser.SaveZip.Title=\u05d9\u05e6\u05d0 \u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +ZipResourceDialog.FileChooser.AddFile.Title=\u05d4\u05d5\u05e1\u05e3 \u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (zip) +ZipResourceDialog.FileChooser.OpenHTML.Title=\u05e4\u05ea\u05d7 \u05e7\u05d5\u05d1\u05e5 HTML +ZipResourceDialog.Button.AddFiles=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9\u05dd +ZipResourceDialog.Button.ThumbnailSettings=\u05d4\u05d2\u05d3\u05e8\u05d5\u05ea +ZipResourceDialog.Checkbox.TrimVideo=\u05d7\u05ea\u05d5\u05da \u05dc\u05e1\u05e8\u05d8\u05d5\u05df +ZipResourceDialog.AddHTMLInfo.Title=\u05d4\u05d5\u05e1\u05e3 \u05e0\u05ea\u05d5\u05e0\u05d9 \u05e7\u05d5\u05d1\u05e5 HTML +ZipResourceDialog.AddHTMLInfo.Message1=\u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05d4\u05d5\u05e1\u05d9\u05e3 \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05dc\u05e7\u05d5\u05d1\u05e5 HTML? +ZipResourceDialog.AddHTMLInfo.Message2=\u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd? +ZipResourceDialog.HTMLField.DefaultText=\u05d0\u05dd \u05dc\u05d0 \u05d4\u05d5\u05d2\u05d3\u05e8, \u05e7\u05d5\u05d1\u05e5 \u05d9\u05d9\u05d5\u05e6\u05e8 \u05de\u05d4\u05ea\u05d7\u05dc\u05d4 +ZipResourceDialog.Dialog.AddFiles.Title=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9 HTML \u05d5- PDF +ZipResourceDialog.Tooltip.HTML=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d5\u05d1\u05e5 \u05de\u05e7\u05d5\u05e8 HTML (\u05d0\u05dd \u05d0\u05d9\u05df \u05e7\u05d1\u05e6\u05d9\u05dd \u05d9\u05d9\u05d5\u05e6\u05e8\u05d5 \u05de\u05d4\u05ea\u05d7\u05dc\u05d4) +ZipResourceDialog.Tooltip.Author=\u05d9\u05d5\u05e6\u05e8 \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 +ZipResourceDialog.Tooltip.Title=\u05d4\u05e8\u05d0\u05d4 \u05e9\u05dd \u05de\u05e9\u05d0\u05d1 (\u05dc\u05d0 \u05e9\u05dd \u05e7\u05d5\u05d1\u05e5) +ZipResourceDialog.Tooltip.Description=\u05ea\u05d9\u05d0\u05d5\u05e8 \u05e9\u05d9\u05de\u05d5\u05e9\u05d9 \u05e9\u05dc \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 +ZipResourceDialog.Tooltip.Keywords=\u05e8\u05e9\u05d9\u05de\u05ea \u05de\u05d9\u05dc\u05d5\u05ea \u05de\u05e4\u05ea\u05d7 \u05dc\u05d7\u05d9\u05e4\u05d5\u05e9 \u05d1\u05d3\u05e4\u05d3\u05e4\u05df +ZipResourceDialog.Tooltip.Contact=\u05e4\u05e8\u05d8\u05d9 \u05e7\u05e9\u05e8 \u05e9\u05dc \u05d4\u05d9\u05d5\u05e6\u05e8 (\u05de\u05d5\u05e1\u05d3, e-mail, \u05d0\u05ea\u05e8 \u05d0\u05d9\u05e0\u05d8\u05e8\u05e0\u05d8, \u05d5\u05db\u05d3\u05d5\u05de\u05d4...) +ZipResourceDialog.Tooltip.Link=\u05db\u05ea\u05d5\u05d1\u05ea URL \u05e9\u05dc \u05e7\u05d5\u05d1\u05e5 HTML \u05d7\u05d9\u05e6\u05d5\u05e0\u05d9 \u05e2\u05dd \u05de\u05d9\u05d3\u05e2 \u05e2\u05dc \u05de\u05e9\u05d0\u05d1 \u05d6\u05d4 +ZipResourceDialog.Tooltip.ThumbnailSettings=\u05e9\u05e0\u05d4 \u05de\u05e8\u05d0\u05d4 \u05d8\u05d1\u05d9\u05e2\u05ea \u05d0\u05e6\u05d1\u05e2, \u05d2\u05d5\u05d3\u05dc \u05d0\u05d5 \u05e1\u05d5\u05d2 \u05e7\u05d5\u05d1\u05e5 +ZipResourceDialog.Tooltip.AddFiles=\u05d4\u05d5\u05e1\u05e3 \u05e7\u05d1\u05e6\u05d9 HTML \u05d5- PDF \u05dc\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd +ZipResourceDialog.Tooltip.TrimVideo=\u05e1\u05de\u05df \u05db\u05d3\u05d9 \u05dc\u05d9\u05e6\u05d0 \u05e1\u05e8\u05d8\u05d5\u05df, \u05d0\u05dc \u05ea\u05e1\u05de\u05df \u05db\u05d3\u05d9 \u05dc\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05e1\u05e8\u05d8 \u05d4\u05de\u05e7\u05d5\u05e8\u05d9 +ZipResourceDialog.Tooltip.LoadHTML=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d1\u05d5\u05d7\u05e8 \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05db\u05d3\u05d9 \u05dc\u05d8\u05e2\u05d5\u05df \u05de\u05d9\u05d3\u05e2 \u05de\u05e7\u05d5\u05d1\u05e5 HTML + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05e9\u05ea\u05e0\u05d4 +PrefsDialog.Button.NoEngine=\u05d0\u05e3-\u05d0\u05d7\u05d3 +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=\u05d4\u05e8\u05d0\u05d4 \u05e2\u05d6\u05e8\u05d4 \u05e2\u05db\u05e9\u05d9\u05d5 +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=\u05dc\u05d0 \u05e7\u05d1\u05d5\u05e2 +TMenuBar.MenuItem.CheckFrameDurations=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 +TMenuBar.MenuItem.ExportZIP=\u05e7\u05d5\u05d1\u05e5 \u05d8\u05e8\u05e7\u05e8 \u05de\u05e6\u05d5\u05de\u05e6\u05dd (Zip) +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Load All Images +TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=\u05e8\u05db\u05d9\u05d1 x \u05e9\u05dc \u05e4\u05d9\u05e7\u05e1\u05dc +PointMass.Data.Description.PixelY=\u05e8\u05db\u05d9\u05d1 y \u05e9\u05dc \u05e4\u05d9\u05e7\u05e1\u05dc +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=\u05e9\u05d3\u05d5\u05ea \u05d0\u05d9-\u05d6\u05d5\u05d2\u05d9\u05d9\u05dd \u05e7\u05d5\u05d3\u05dd +ExportVideoDialog.Deinterlace.EvenFirst=\u05e9\u05d3\u05d5\u05ea \u05d6\u05d5\u05d2\u05d9\u05d9\u05dd \u05e7\u05d5\u05d3\u05dd +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=\u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +TFrame.Dialog.LibraryError.FileNotFound.Message=\u05dc\u05d0 \u05de\u05e6\u05dc\u05d9\u05d7 \u05dc\u05de\u05e6\u05d5\u05d0 \u05d0\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 +TrackerPanel.DataBuilder.Button.Autoload=\u05d8\u05e2\u05d9\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=\u05e0\u05d4\u05dc \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d8\u05e2\u05d9\u05e0\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea +TrackerPanel.DataBuilder.Autoload.Title=\u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d5\u05ea \u05d8\u05e2\u05d9\u05e0\u05ea \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea +TrackerPanel.DataBuilder.Autoload.Message=\u05d1\u05d7\u05e8 \u05e4\u05d5\u05e0\u05e7\u05e6\u05d9\u05d4 \u05dc\u05d8\u05e2\u05d9\u05e0\u05d4 \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9\u05ea: +TrackerPanel.DataBuilder.Chooser.XMLFiles=\u05e7\u05d1\u05e6\u05d9 XML +TrackerIO.Dialog.Open.Title=\u05e4\u05ea\u05d7 +TToolbar.Button.Refresh.Popup.RefreshNow=\u05e8\u05e2\u05e0\u05df +TToolbar.Button.Refresh.Popup.AutoRefresh=\u05e8\u05e2\u05e0\u05d5\u05df \u05d0\u05d5\u05d8\u05d5\u05de\u05d8\u05d9 +TToolbar.Button.Refresh.Tooltip=\u05e8\u05e2\u05e0\u05df \u05e0\u05ea\u05d5\u05e0\u05d9\u05dd \u05d5\u05ea\u05e6\u05d5\u05d2\u05d5\u05ea + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=\u05e4\u05d9\u05e7\u05e1\u05dc \u05e8\u05d0\u05e9\u05d9\u05ea +CoordAxes.Origin.Field.Tooltip=\u05de\u05d9\u05e7\u05d5\u05dd \u05d4\u05e8\u05d0\u05e9\u05d9\u05ea \u05e0\u05de\u05d3\u05d3 \u05de\u05d4\u05e4\u05d9\u05e0\u05d4 \u05d4\u05e9\u05de\u05d0\u05dc\u05d9\u05ea \u05d4\u05e2\u05dc\u05d9\u05d5\u05e0\u05d4 \u05e9\u05dc \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=\u05d1\u05d7\u05e8 \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea +MainTView.Popup.MenuItem.Deselect=\u05d1\u05d8\u05dc \u05d1\u05d7\u05d9\u05e8\u05ea \u05e0\u05e7\u05d5\u05d3\u05d5\u05ea +ZipResourceDialog.Checkbox.PreviewThumbnail=\u05d4\u05e6\u05d2\u05d4 \u05de\u05e7\u05d3\u05d9\u05de\u05d4 +ZipResourceDialog.Dialog.BadFileName.Message=\u05e9\u05dd \u05e7\u05d5\u05d1\u05e5 \u05dc\u05d0 \u05d9\u05db\u05d5\u05dc \u05dc\u05db\u05dc\u05d5\u05dc \u05d0\u05ea \u05d4\u05ea\u05d5\u05d5\u05d9\u05dd \u05d4\u05d1\u05d0\u05d9\u05dd: +ZipResourceDialog.Dialog.BadFileName.Title=\u05e9\u05dd \u05e7\u05d5\u05d1\u05e5 \u05d0\u05e1\u05d5\u05e8 +ZipResourceDialog.Dialog.ExportFailed.Message=\u05dc\u05d0 \u05e0\u05d9\u05ea\u05df \u05dc\u05d9\u05e6\u05d0 \u05d0\u05ea \u05e7\u05d5\u05d1\u05e5 \u05d4- ZIP. +ZipResourceDialog.Dialog.ExportFailed.Title=\u05d9\u05e6\u05d5\u05d0 \u05e0\u05db\u05e9\u05dc +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=\u05d9\u05d5\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05d4 +Tracker.StartLog.NotFound=\u05d9\u05d5\u05de\u05df \u05d4\u05ea\u05d7\u05dc\u05d4 \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +Tracker.Dialog.MemoryReduced.Title=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05de\u05d5\u05e2\u05d3\u05e3 \u05d4\u05d5\u05e4\u05d7\u05ea +Tracker.Dialog.MemoryReduced.Message1=\u05d8\u05e8\u05e7\u05e8 \u05dc\u05d0 \u05d4\u05e6\u05dc\u05d9\u05d7 \u05dc\u05d4\u05ea\u05d7\u05d9\u05dc \u05e2\u05dd \u05d6\u05d9\u05db\u05e8\u05d5\u05df +Tracker.Dialog.MemoryReduced.Message2=\u05d0\u05d6 \u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05de\u05d5\u05e2\u05d3\u05e3 \u05d4\u05d5\u05e4\u05d7\u05ea \u05dc +Tracker.Dialog.MemoryReduced.Message3=\u05dc\u05de\u05d9\u05d3\u05e2 \u05e0\u05d5\u05e1\u05e3 \u05e8\u05d0\u05d4 \u05e2\u05d6\u05e8\u05d4|\u05d3\u05d9\u05d0\u05d2\u05e0\u05d5\u05d6\u05d4|\u05d4\u05ea\u05d7\u05dc \u05d9\u05d5\u05de\u05df... +TrackPlottingPanel.Popup.MenuItem.ShowZero=\u05d4\u05e6\u05d2 +TableTrackView.Menu.TextColumn.Text=\u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05e7\u05e1\u05d8 +TableTrackView.Menu.TextColumn.Tooltip=\u05e0\u05d4\u05dc \u05e2\u05de\u05d5\u05d3\u05d5\u05ea \u05d8\u05e7\u05e1\u05d8 \u05d4\u05e0\u05d9\u05ea\u05e0\u05d5\u05ea \u05dc\u05e2\u05e8\u05d9\u05db\u05d4 +TableTrackView.Action.CreateTextColumn.Text=\u05e6\u05d5\u05e8... +TableTrackView.Action.DeleteTextColumn.Text=\u05de\u05d7\u05e7 +TableTrackView.Action.RenameTextColumn.Text=\u05ea\u05df \u05e9\u05dd \u05d7\u05d3\u05e9 +TableTrackView.Dialog.NameColumn.Message=\u05d4\u05db\u05e0\u05e1 \u05e9\u05dd \u05e2\u05de\u05d5\u05d3\u05d4. +TableTrackView.Dialog.NameColumn.TryAgain=\u05e9\u05dd \u05d6\u05d4 \u05db\u05d1\u05e8 \u05d1\u05e9\u05d9\u05de\u05d5\u05e9. +TableTrackView.Dialog.NameColumn.Title=\u05e2\u05de\u05d5\u05d3\u05ea \u05d8\u05e7\u05e1\u05d8 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties index 2a325d75..c5b4f983 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties @@ -1,1199 +1,1199 @@ -# This is the Korean tracker.properties file -# Translation by Hyunsoo Kim 2012 - -Calibration.Name=\uad50\uc815 \uc810 -Calibration.New.Name=\uad50\uc815 \uc810 -CenterOfMass.Name=\uc9c8\ub7c9\uc911\uc2ec -CenterOfMass.New.Name=\uc9c8\ub7c9\uc911\uc2ec -CenterOfMass.MenuItem.Inspector=\ubb3c\uccb4 \uc120\ud0dd\ud558\uae30... -CenterOfMassInspector.Title=\uc9c8\ub7c9\uc911\uc2ec -CenterOfMassInspector.Border.Title=\ubb3c\uccb4 -ConfigInspector.Border.Title=\uc120\ud0dd \ud56d\ubaa9 -ConfigInspector.Title=\uc635\uc158 -ConfigInspector.Button.SaveAsDefault=\uae30\ubcf8 \uc124\uc815\uc73c\ub85c -CoordAxes.Name=\ucd95 -CoordAxes.New.Name=\ucd95 -Dialog.Button.Cancel=\ucde8\uc18c -Dialog.Button.OK=\ud655\uc778 -Dialog.Button.Close=\ub2eb\uae30 -Dialog.Button.All=\ubaa8\ub450 \uc120\ud0dd -Dialog.Button.None=\ubaa8\ub450 \ud574\uc81c -Dialog.Button.Copy=\ubcf5\uc0ac -Dialog.Button.Update=\uc5c5\ub370\uc774\ud2b8 -Dialog.Button.SelectAll=\ubaa8\ub450 \uc120\ud0dd -Footprint.Diamond=\ub9c8\ub984\ubaa8 -Footprint.BoldDiamond=\uad75\uc740 \ub9c8\ub984\ubaa8 -Footprint.SolidDiamond=\uc18d\uc774 \ucc2c \ub9c8\ub984\ubaa8 -Footprint.Triangle=\uc0bc\uac01\ud615 -Footprint.BoldTriangle=\uad75\uc740 \uc0bc\uac01\ud615 -Footprint.SolidTriangle=\uc18d\uc774 \ucc2c \uc0bc\uac01\ud615 -Footprint.Circle=\uc6d0 -Footprint.BoldCircle=\uad75\uc740 \uc6d0 -Footprint.SolidCircle=\uc18d\uc774 \ucc2c \uc6d0 -Footprint.VerticalLine=\uc218\uc9c1 \uc120 -Footprint.BoldVerticalLine=\uad75\uc740 \uc218\uc9c1\uc120 -Footprint.HorizontalLine=\uc218\ud3c9\uc120 -Footprint.BoldHorizontalLine=\uad75\uc740 \uc218\ud3c9\uc120 -Footprint.Crosshair=\uc2ed\uc790\uc120 -Footprint.BoldCrosshair=\uad75\uc740 \uc2ed\uc790\uc120 -Footprint.SimpleAxes=\uac00\ub294 \ucd95 -Footprint.BoldSimpleAxes=\uad75\uc740 \ucd95 -Footprint.Spot=\uc810 -Footprint.Line=\uc120 -Footprint.BoldLine=\uad75\uc740 \uc120 -Footprint.Outline=\uc724\uacfd\uc120 -Footprint.BoldOutline=\uad75\uc740 \uc724\uacfd\uc120 -Footprint.Arrow=\ud654\uc0b4\ud45c -Footprint.BoldArrow=\uad75\uc740 \ud654\uc0b4\ud45c -Footprint.DoubleArrow=\uc591\ucabd \ud654\uc0b4\ud45c -Footprint.BoldDoubleArrow=\uad75\uc740 \uc591\ucabd \ud654\uc0b4\ud45c -Footprint.2xArrow=2x \ud654\uc0b4\ud45c -Footprint.Bold2xArrow=\uad75\uc740 2x \ud654\uc0b4\ud45c -Footprint.4xArrow=4x \ud654\uc0b4\ud45c -Footprint.Bold4xArrow=\uad75\uc740 4x \ud654\uc0b4\ud45c -Footprint.DashArrow=\uc810\uc120 \ud654\uc0b4\ud45c -Footprint.BoldDashArrow=\uad75\uc740 \uc810\uc120 \ud654\uc0b4\ud45c -Footprint.BigArrow=\ud070 \ud654\uc0b4\ud45c -Footprint.BigDashArrow=\ud070 \uc810\uc120 \ud654\uc0b4\ud45c -LineProfile.Name=\uc120 \ud504\ub85c\ud30c\uc77c -LineProfile.New.Name=\ud504\ub85c\ud30c\uc77c -LineProfile.Data.Brightness=\ubc1d\uae30 -LineProfile.Data.Pixel=\ud53d\uc140 -LineProfile.Data.Red=\uc801\uc0c9 -LineProfile.Data.Green=\ub179\uc0c9 -LineProfile.Data.Blue=\uccad\uc0c9 -LineProfile.Data.Weighting=\uac12 -MainTView.Popup.MenuItem.QTPlayer=QuickTime \ud50c\ub808\uc774\uc5b4 -MainTView.Popup.MenuItem.Zoom=\ud654\uba74 \ud655\ub300/\ucd95\uc18c -MainTView.Popup.MenuItem.ToFit=\ud654\uba74\uc5d0 \ub9de\ucda4 -OffsetOrigin.Name=\uc88c\ud45c \uc774\ub3d9 -OffsetOrigin.New.Name=\uc88c\ud45c \uc774\ub3d9 -PlotTrackView.Button.PlotCount=\uadf8\ub798\ud504 -PlotTrackView.Button.PlotCount.ToolTip=\uadf8\ub798\ud504 \uc218 -PointMass.Name=\uc9c8\uc810 -PointMass.New.Name=\uc9c8\uc810 -PointMass.MenuItem.VectorsToPosition=\uc704\uce58\uc5d0 \ub9de\ucda4 -PointMass.MenuItem.Velocity=\uc18d\ub3c4 -PointMass.MenuItem.Acceleration=\uac00\uc18d\ub3c4 -Star.Name=\ubcc4 -Star.New.Name=\ubcc4 -TableTrackView.Action.CopyData=\ub370\uc774\ud130 \ubcf5\uc0ac -TableTrackView.Button.SelectTableData=\ub370\uc774\ud130 -TableTrackView.Button.SelectTableData.ToolTip=\ub370\uc774\ud130 \uad6c\uc131 \uc694\uc18c -TableTrackView.Popup.MenuItem.Analyze=\ubd84\uc11d... -TableTrackView.Dialog.Border.Title=\ubcf4\uae30: -TActions.Action.Description=\ub178\ud2b8 -TActions.Action.ClearTracks=\uc9c0\uc6b0\uae30 -TActions.Action.NewTab=\uc0c8 \ubb38\uc11c -TActions.Action.Copy=\ubcf5\uc0ac -TActions.Action.Paste=\ubd99\uc774\uae30... -TActions.Action.Open=\uc5f4\uae30... -TActions.Action.Close=\ubb38\uc11c \ub2eb\uae30 -TActions.Action.Import=\ubd88\ub7ec\uc624\uae30... -TActions.Action.Save=\uc800\uc7a5 -TActions.Action.SaveAs=\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \uc800\uc7a5... -TActions.Action.Export=\ubcf4\ub0b4\uae30... -TActions.Action.CaptureVideo=\ube44\ub514\uc624 \ucea1\ucc98... -TActions.Action.Delete=\uc0ad\uc81c -TActions.Action.Config=\uc635\uc158... -TActions.Action.AxesVisible=\ubcf4\uae30 -TActions.Action.TapeVisible=\ubcf4\uae30 -TActions.Action.Print=\uc778\uc1c4... -TActions.Action.ClearFilters=\uc9c0\uc6b0\uae30 -TActions.Action.ImportVideo=\ubd88\ub7ec\uc624\uae30... -TActions.Action.CloseVideo=\ub2eb\uae30 -TActions.Action.CloseAll=\ubaa8\ub450 \ub2eb\uae30 -TActions.Action.Exit=\ub05d -TActions.Dialog.PrintError.Message=\uc778\uc1c4 \uc624\ub958\uc785\ub2c8\ub2e4. -TActions.Dialog.PrintError.Title=\uc778\uc1c4 \uc624\ub958 -TActions.Dialog.Description.Title=\ub178\ud2b8: -TActions.Dialog.DeleteLockedTracks.Message=\ud2b8\ub799\uc774 \uc7a0\uaca8 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub798\ub3c4 \uc0ad\uc81c\ud560\uae4c\uc694? -TActions.Dialog.DeleteLockedTracks.Title=\uc7a0\uae34 \ud2b8\ub799\uc744 \uc0ad\uc81c\ud560\uae4c\uc694? -TActions.Dialog.NewPointMass.Title=\uc0c8 \uc9c8\uc810 -TapeMeasure.Name=\uc904\uc790 -TapeMeasure.New.Name=\uc904\uc790 -TapeMeasure.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 -TFrame.View.Plot=\uadf8\ub798\ud504 -TFrame.View.Table=\ub370\uc774\ud130 -TFrame.View.World=\uc6d4\ub4dc \ubdf0 -TFrame.View.Video=\ube44\ub514\uc624 -TFrame.Dialog.Help.Title=Tracker \ub3c4\uc6c0\ub9d0 -TMenuBar.Menu.File=\ud30c\uc77c -TMenuBar.Menu.Edit=\ud3b8\uc9d1 -TMenuBar.Menu.Video=\ube44\ub514\uc624 -TMenuBar.Menu.Tracks=\ud2b8\ub799 -TMenuBar.Menu.Coords=\uc88c\ud45c -TMenuBar.Menu.Window=\ucc3d -TMenuBar.Menu.Help=\ub3c4\uc6c0\ub9d0 -TMenuBar.MenuItem.EditProperties=\uc18d\uc131... -TMenuBar.MenuItem.VideoVisible=\ubcf4\uae30 -TMenuBar.MenuItem.VideoFilters=\ud544\ud130 -TMenuBar.MenuItem.NewVideoFilter=\uc0c8 \ud544\ud130 -TMenuBar.MenuItem.NewTrack=\uc0c8 \ud2b8\ub799 -TMenuBar.MenuItem.CoordsLocked=\uc7a0\uae08 -TMenuBar.MenuItem.CoordsFixedOrigin=\uc6d0\uc810 \uace0\uc815 -TMenuBar.MenuItem.CoordsFixedAngle=\uac01 \uace0\uc815 -TMenuBar.MenuItem.CoordsFixedScale=\ub208\uae08 \uace0\uc815 -TMenuBar.MenuItem.CoordsRefFrame=\uae30\uc900\ud2c0 -TMenuBar.MenuItem.CoordsDefault=\uce74\uba54\ub77c \ubdf0 -TMenuBar.MenuItem.WindowRight=\uc624\ub978\ucabd \ucc3d -TMenuBar.MenuItem.WindowBottom=\uc544\ub798\ucabd \ucc3d -TMenuBar.MenuItem.PlayAllSteps=\uc2a4\ud15d \ubaa8\ub450 \ubcf4\uae30 -TMenuBar.MenuItem.Record=\ub179\ud654 -TMenuBar.MenuItem.MatSize=\ud574\uc0c1\ub3c4 -TMenuBar.MenuItem.Language=\uc5b8\uc5b4 -TMenuBar.MenuItem.DeleteTrack=\uc0ad\uc81c -TMenuBar.MenuItem.TrackerHelp=Tracker \ub3c4\uc6c0\ub9d0... -TMenuBar.MenuItem.MessageLog=\uba54\uc2dc\uc9c0 \ub85c\uadf8... -TrackControl.Name=\ud2b8\ub799 \ucee8\ud2b8\ub864 -TrackControl.Button.NewTrack=\uc0c8 \ud2b8\ub799 -TrackControl.Button.NewTrack.ToolTip=\uc0c8 \ud2b8\ub799 \ub9cc\ub4e4\uae30 -TrackControl.Button.Trails.ToolTip=\uc2a4\ud15d \uc790\ucde8 \uc124\uc815\ud558\uae30 -TrackControl.Button.Labels.ToolTip=\uc2a4\ud15d \ubc88\ud638 \ubcf4\uae30/\uac10\ucd94\uae30 -TrackControl.Button.StretchVectors.ToolTip=\ubca1\ud130 \ub298\ub9ac\uae30 -TrackControl.Button.Accelerations.ToolTip=\uac00\uc18d\ub3c4 \ubca1\ud130 \ubcf4\uae30/\uac10\ucd94\uae30 -TrackControl.Button.Xmass.ToolTip=\ubca1\ud130\uc5d0 \uc9c8\ub7c9 \uacf1\ud558\uae30 -TrackControl.Button.Vectors.ToolTip=\ubca1\ud130 -TrackControl.Button.Velocities.ToolTip=\uc18d\ub3c4 \ubca1\ud130 \ubcf4\uae30/\uac10\ucd94\uae30 -TrackControl.Button.Properties.ToolTip=\uc18d\uc131 \uc120\ud0dd\ud558\uae30 -TrackControl.Button.Positions.ToolTip=\uc704\uce58 \ubcf4\uae30/\uac10\ucd94\uae30 -Tracker.Popup.MenuItem.Snapshot=\uc2a4\ub0c5\uc0f7... -Tracker.Popup.MenuItem.Help=\ub3c4\uc6c0\ub9d0... -Tracker.Cursor.Crosshair.Description=\uc2ed\uc790\uc120 -Tracker.Action.AboutTracker=Tracker \uc815\ubcf4... -Tracker.Dialog.AboutTracker.Title=Tracker \uc815\ubcf4 -Tracker.Action.AboutJava=Java \uc815\ubcf4... -Tracker.Dialog.AboutJava.Title=Java \uc815\ubcf4 -Tracker.Dialog.AboutJava.UnknownVersion=\uc54c \uc218 \uc5c6\uc74c -Tracker.Dialog.AboutJava.Message=Java \ubc84\uc804 -Tracker.Action.AboutQT=QuickTime \uc815\ubcf4... -Tracker.Dialog.AboutQT.Title=QuickTime \uc815\ubcf4 -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime \ubc84\uc804 -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava \ubc84\uc804 -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava \uacbd\ub85c: -Tracker.Dialog.NoQT.Title=QTJava.zip \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c -Tracker.Dialog.NoQT.Message1=QuickTime for Java \uac00 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoQT.Message2=QuickTime \ube44\ub514\uc624\ub97c \ubd84\uc11d\ud558\ub824\uba74, QuickTime\uc744 \ub2e4\uc2dc \uc124\uce58\ud558\uc138\uc694. -Tracker.Dialog.NoQT.Message3=\ub3c4\uc6c0\ub9d0: QuickTime \uc744 \uc124\uce58\ud560 \ub54c, \ubc18\ub4dc\uc2dc QuickTime for Java \ub97c \uc120\ud0dd\ud558\uc138\uc694. -Tracker.Dialog.UpdateQT.Title=QTJava.zip \uc5c5\ub370\uc774\ud2b8 -Tracker.Dialog.UpdateQT.Message1=QTJava.zip \uc758 \uc0c8 \ubc84\uc804\uc774 \uc788\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.UpdateQT.Message2=\uae30\uc874 \ud30c\uc77c\uc744 \uc0c8 \ud30c\uc77c\ub85c \uc5c5\ub370\uc774\ud2b8 \ud560\uae4c\uc694? -Tracker.Dialog.CopyQT.Title=QTJava.zip \ubcf5\uc0ac -Tracker.Dialog.CopyQT.Message1=QuickTime \uc774 \uc124\uce58\ub418\uc5c8\uc73c\uba70, Tracker \uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ud569\ub2c8\ub2e4: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip \uc744 \ubcf5\uc0ac\ud574\uc57c \ud569\ub2c8\ub2e4. -Tracker.Dialog.CopyQT.Message3= (\uc73c\ub85c) -Tracker.Dialog.CopyQT.Message4= 2. Tracker \ub97c \ub2e4\uc2dc \uc2dc\uc791\ud574\uc57c \ud569\ub2c8\ub2e4. -Tracker.Dialog.CopyQT.Message5=QTJava.zip \uc744 \ubcf5\uc0ac\ud560\uae4c\uc694? -Tracker.Dialog.CopyFailed.Title=\ubcf5\uc0ac \uc2e4\ud328 -Tracker.Dialog.CopyFailed.Message=QTJava.zip \uc744 \ubcf5\uc0ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.CopiedTo.Title=\ubcf5\uc0ac \uc131\uacf5 -Tracker.Dialog.CopiedTo.Message1=QTJava.zip \uc744 \uc131\uacf5\uc801\uc73c\ub85c \ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.CopiedTo.Message2=Tracker \ub97c \ub2e4\uc2dc \uc2dc\uc791\ud558\uae30 \uc704\ud574 \uc885\ub8cc\ud569\ub2c8\ub2e4. -Tracker.Splash.Loading=\ubd88\ub7ec\uc624\ub294 \uc911... -TrackerIO.Dialog.Import.Title=Tracker \ud30c\uc77c \ubd88\ub7ec\uc624\uae30 -TrackerIO.Dialog.Import.Message=\ubd88\ub7ec\uc62c \ud56d\ubaa9 \uc120\ud0dd -TrackerIO.Dialog.ImportVideo.Title=\ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30 -TrackerIO.Dialog.Export.Title=\ubcf4\ub0b4\uae30 -TrackerIO.Dialog.Export.Message=\ubcf4\ub0bc \ud56d\ubaa9 \uc120\ud0dd -TrackerIO.Dialog.ReplaceFile.Title=\uae30\uc874 \ud30c\uc77c \ub36e\uc5b4\uc4f0\uae30 -TrackerIO.Dialog.ReplaceFile.Message=\ud30c\uc77c\uc774 \uc774\ubbf8 \uc788\uc2b5\ub2c8\ub2e4. \ub36e\uc5b4\uc4f8\uae4c\uc694? -TrackerIO.Dialog.NotTrackerXML.Title=XML \uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c -TrackerIO.Dialog.NotTrackerXML.Message=\uc740 \ub2e4\ub978 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c XML \ub370\uc774\ud130\ub97c \ud3ec\ud568\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. -TrackerIO.Dialog.BadVideo.Message=\ube44\ub514\uc624 \ud30c\uc77c \ud615\uc2dd\uc774 \uc544\ub2d9\ub2c8\ub2e4... -TrackerIO.Dialog.BadVideo.Title=\uc54c \uc218 \uc5c6\ub294 \ube44\ub514\uc624 \ud30c\uc77c -TrackerPanel.NewTab.Name=\ube48 \ubb38\uc11c -TrackerPanel.DragToMark.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uae30 -TrackerPanel.ClickToMark.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub204\ub974\uae30 -TrackerPanel.Dialog.LoadFailed.Title=Tracker \ud30c\uc77c \uc624\ub958 -TrackerPanel.Dialog.LoadFailed.Message=\uc62c\ubc14\ub978 Tracker \ud30c\uc77c\uc774 \uc544\ub2d9\ub2c8\ub2e4... -TrackerPanel.Dialog.SaveChanges.Title=\ubcc0\uacbd\ub41c \ub0b4\uc6a9 \uc800\uc7a5 -TrackerPanel.Dialog.SaveChanges.Message=\ubcc0\uacbd\ub41c \ub0b4\uc6a9\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4... -TrackPlottingPanel.Popup.MenuItem.Lines=\uc120 -TrackPlottingPanel.Popup.MenuItem.Points=\uc810 -TrackPlottingPanel.Popup.MenuItem.Scale=\ub208\uae08... -TrackPlottingPanel.Popup.MenuItem.Print=\uc778\uc1c4... -TrackPlottingPanel.Popup.MenuItem.Measure=\ub208\uae08 \ub9de\ucda4 -TrackPlottingPanel.Popup.MenuItem.Analyze=\ubd84\uc11d... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=\ud655\ub300 -TrackPlottingPanel.Popup.MenuItem.ZoomOut=\ucd95\uc18c -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\uc790\ub3d9\uc73c\ub85c \ub9de\ucda4 -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\uc601\uc5ed\uc5d0 \ub9de\ucda4 -TrackPlottingPanelInspector.Title=\ub208\uae08 -TrackPlottingPanelInspector.Label.Min=\ucd5c\uc18c -TrackPlottingPanelInspector.Label.Max=\ucd5c\ub300 -TrackPlottingPanelInspector.Label.Auto=\uc790\ub3d9 -TToolBar.Button.Footprint.Tooltip=\ubaa8\uc591 \uc124\uc815\ud558\uae30 -TToolBar.Dropdown.SelectedTrack.Tooltip=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 -TToolBar.Dropdown.SelectedTrack.None=\uc5c6\uc74c -TTrack.MenuItem.Delete=\uc0ad\uc81c -TTrack.MenuItem.Color=\uc0c9... -TTrack.Dialog.Color.Title=\uc0c9 -TTrack.MenuItem.Name=\uc774\ub984... -TTrack.MenuItem.Footprint=\ubaa8\uc591 -TTrack.MenuItem.Description=\ub178\ud2b8... -TTrack.MenuItem.Visible=\ubcf4\uae30 -TTrack.MenuItem.TrailVisible=\uc2a4\ud15d \uc790\ucde8 \ubcf4\uae30 -TTrack.MenuItem.Autostep=\uc790\ub3d9 \uc2a4\ud15d \ucc3e\uae30 -TTrack.MenuItem.MarkByDefault=\uc9c1\uc811 \uc2a4\ud15d \ud45c\uc2dc -TTrack.MenuItem.Locked=\uc7a0\uae08 -TTrack.MenuItem.Delete=\uc0ad\uc81c -TTrack.Name.None=\uc774\ub984 \uc5c6\uc74c -TTrack.Dialog.Description.Title=\ub178\ud2b8: -TTrack.Dialog.Name.Title=\uc774\ub984 \uc785\ub825 -TTrack.Dialog.Name.Label=\uc774\ub984: -TViewChooser.Button.Choose.Tooltip=\ub3c4\uad6c \uc120\ud0dd\ud558\uae30 -Vector.Name=\ubca1\ud130 -Vector.New.Name=\ubca1\ud130 -Vector.MenuItem.ToOrigin=\uc6d0\uc810\uc5d0 \ub9de\ucda4 -Vector.MenuItem.Label=\ub77c\ubca8 \ubcf4\uae30 -VectorSum.Name=\ubca1\ud130\ud569 -VectorSum.New.Name=\ud569 -VectorSum.MenuItem.Inspector=\ubca1\ud130 \uc120\ud0dd\ud558\uae30... -VectorSumInspector.Title=\ubca1\ud130\ud569 -VectorSumInspector.Border.Title=\ubca1\ud130 \uc120\ud0dd -WorldTView.Popup.MenuItem.Projectile=\ud3ec\ubb3c\uc120 \uc6b4\ub3d9 \ubaa8\ud615 - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=\uc6b4\ub3d9\ud559 \ubaa8\ud615 -AnalyticParticle.Inspector.Title=\uc6b4\ub3d9\ud559 \ubaa8\ud615 -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=\ubc18\uc9c0\ub984 4 -CircleFootprint.Circle_6=\ubc18\uc9c0\ub984 6 -CircleFootprint.Circle_8=\ubc18\uc9c0\ub984 8 -DynamicParticle.Name=\ub3d9\uc5ed\ud559 \ubaa8\ud615 (\ub370\uce74\ub974\ud2b8 \uc88c\ud45c) -DynamicParticle.Inspector.Title=\ub3d9\uc5ed\ud559 \ubaa8\ud615 -DynamicParticle.Property.ForceX=\ud798 x -DynamicParticle.Property.ForceY=\ud798 y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 -ParticleModel.New.Name=\ubaa8\ud615 -ParticleModel.MenuItem.InspectModel=\ubaa8\ud615 \ub3c4\uad6c... -ParticleModel.Inspector.Button.Undo=\ub418\ub3cc\ub9ac\uae30 -ParticleModel.Inspector.Button.Redo=\ub2e4\uc2dc \uc2e4\ud589 -ParticleModel.Inspector.Button.Close=\ub2eb\uae30 -ParticleModel.Inspector.Button.Help=\ub3c4\uc6c0\ub9d0 - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=X -Calibration.Axes.YOnly=Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=\uad50\uc815\ucd95 \uc120\ud0dd -Calibration.Label.Axes=\ucd95 -Calibration.Dialog.InvalidCoordinates.Title=\uc798\ubabb\ub41c \uc88c\ud45c -Calibration.Dialog.InvalidCoordinates.Message=\uac19\uc740 \uac12\uc758 \uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Calibration.Dialog.InvalidXCoordinates.Message=\uac19\uc740 \uac12\uc758 X-\uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Calibration.Dialog.InvalidYCoordinates.Message=\uac19\uc740 \uac12\uc758 Y-\uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -SpectralLineFilter.Title=\uae30\uccb4 \uc2a4\ud399\ud2b8\ub7fc -SpectralLineFilter.H=\uc218\uc18c -SpectralLineFilter.He=\ud5ec\ub968 -SpectralLineFilter.Ne=\ub124\uc628 -SpectralLineFilter.Hg=\uc218\uc740 -TFrame.View.Unknown=\ucc3d -TMenuBar.MenuItem.Undo=\ub418\ub3cc\ub9ac\uae30 -TMenuBar.MenuItem.Redo=\ub2e4\uc2dc \uc2e4\ud589 -TMenuBar.MenuItem.Replace=\ubc14\uafb8\uae30... -TMenuBar.Menu.AddImage=\uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 -TMenuBar.MenuItem.AddBefore=\uc774 \ud504\ub808\uc784 \uc55e\uc5d0... -TMenuBar.MenuItem.AddAfter=\uc774 \ud504\ub808\uc784 \ub4a4\uc5d0... -TMenuBar.MenuItem.RemoveImage=\uc774 \ud504\ub808\uc784 \uc9c0\uc6b0\uae30 -TMenuBar.Menu.Tools=\ub3c4\uad6c -TMenuBar.MenuItem.DataFunctionTool=\ub370\uc774\ud130 \ubaa8\ud615 -TMenuBar.MenuItem.DatasetTool=\ub370\uc774\ud130 \ubd84\uc11d -TMenuBar.Menu.CopyImage=\uadf8\ub9bc \ubcf5\uc0ac -TMenuBar.MenuItem.CopyMainView=\uc791\uc5c5 \ucc3d -TMenuBar.MenuItem.CopyFrame=\ud504\ub808\uc784 -TMenuBar.MenuItem.PrintFrame=\uc778\uc1c4... -TrackerIO.Dialog.AddImage.Title=\uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 (\ud558\ub098 \ub610\ub294 \uc5ec\ub7ec \uac1c \uc120\ud0dd) -TTrack.Dialog.Name.BadName=\uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4. \ub2e4\ub978 \uc774\ub984\uc744 \uc120\ud0dd\ud558\uc138\uc694. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=F -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=\ud2b8\ub799\uc758 \uadf8\ub798\ud504\ub97c \ucc28\ud2b8\uc5d0 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. -TableTView.Label.NoData=\ud2b8\ub799\uc758 \ub370\uc774\ud130\ub97c \ud14c\uc774\ube14\uc5d0 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. -TrackerPanel.Message.NoData0=\ube44\ub514\uc624\uc640 \ud2b8\ub799\uc758 \uc791\uc5c5 \ucc3d\uc785\ub2c8\ub2e4. -TrackerPanel.Message.NoData1=\uc2dc\uc791\ud558\ub824\uba74 \ud30c\uc77c\uc744 \ubd88\ub7ec\uc624\uac70\ub098 \uc0c8 \ud2b8\ub799\uc744 \ub9cc\ub4ed\ub2c8\ub2e4. -WorldTView.Label.NoData=\ube44\ub514\uc624\uc640 \ud2b8\ub799 \ud654\uba74\uc744 \uc6d4\ub4dc \uc88c\ud45c\uc5d0\uc11c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=\ud574 \ucc3e\uae30: -DynamicParticle.Solver.Euler=\uc624\uc77c\ub7ec -DynamicParticle.Solver.Verlet=\ubc8c\ub81b -DynamicParticle.Solver.RK4=\ub8fd\uac8c-\ucfe0\ud0c0 -DynamicParticle.Solver.ODEMultistep=\uc801\uc751\ud615 \ub2e4\uc911 \uc2a4\ud15d -DynamicParticle.Table.Force.Border.Title=\ud798 (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=\uc704\uce58 (t) -ParticleModel.Table.Initial.Border.Title=\uae30\ubcf8 \uc124\uc815 -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=\ubd99\uc774\uae30 -TMenuBar.MenuItem.PasteAfter=\uc774 \ud504\ub808\uc784 \ub4a4 -TMenuBar.MenuItem.PasteBefore=\uc774 \ud504\ub808\uc784 \uc55e -TMenuBar.MenuItem.PasteReplace=\ube44\ub514\uc624 \ubc14\uafb8\uae30 - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=\uc2dc\uc791\ud558\uae30... -Tracker.Splash.HelpMessage=\ube44\ub514\uc624 \ubd84\uc11d\uacfc \ubaa8\ub378\ub9c1 \ub3c4\uad6c - Tracker - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=\uae30\uc6b8\uae30 \uac01 -LineProfile.Checkbox.Rotates=\ud68c\uc804 -LineProfile.Label.Spread=\ud504\ub85c\ud30c\uc77c \ub108\ube44 -RGBRegion.Name=RGB \uc601\uc5ed -RGBRegion.New.Name=\uc601\uc5ed -RGBRegion.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 -RGBRegion.Label.Radius=\ud53d\uc140 \ubc18\uc9c0\ub984 -TTrack.Label.Step=\uc2a4\ud15d - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=\uc704\uce58 \ubc88\ud638 -LineProfile.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 -LineProfile.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 -LineProfile.Data.Description.3=\uc801\uc0c9 -LineProfile.Data.Description.4=\ub179\uc0c9 -LineProfile.Data.Description.5=\uccad\uc0c9 -LineProfile.Data.Description.6=\ubc1d\uae30 -LineProfile.Data.Description.7=\ud53d\uc140 \ub108\ube44 -ParticleModel.MenuItem.TraceVisible=\ucc3e\uae30 \ubcf4\uae30 -ParticleModel.MenuItem.StepsVisible=\uc2a4\ud15d \ubcf4\uae30 -PointMass.Data.Description.0=\uc2dc\uac04 -PointMass.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 -PointMass.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 -PointMass.Data.Description.3=\uac70\ub9ac -PointMass.Data.Description.4=\uc704\uce58 \ubca1\ud130\uc758 \uac01 -PointMass.Data.Description.5=\uc18d\ub3c4 x-\uc131\ubd84 -PointMass.Data.Description.6=\uc18d\ub3c4 y-\uc131\ubd84 -PointMass.Data.Description.7=\uc18d\ub3c4 \ud06c\uae30 -PointMass.Data.Description.8=\uc18d\ub3c4 \ubca1\ud130\uc758 \uac01 -PointMass.Data.Description.9=\uac00\uc18d\ub3c4 x-\uc131\ubd84 -PointMass.Data.Description.10=\uac00\uc18d\ub3c4 y-\uc131\ubd84 -PointMass.Data.Description.11=\uac00\uc18d\ub3c4 \ud06c\uae30 -PointMass.Data.Description.12=\uac00\uc18d\ub3c4 \ubca1\ud130\uc758 \uac01 -PointMass.Data.Description.13=\uac01 -PointMass.Data.Description.14=\uac01\uc18d\ub3c4 -PointMass.Data.Description.15=\uac01\uac00\uc18d\ub3c4 -PointMass.Data.Description.16=\uc2a4\ud15d \ubc88\ud638 -PointMass.Data.Description.17=\ud504\ub808\uc784 \ubc88\ud638 -PointMass.Data.Description.18=\uc6b4\ub3d9\ub7c9 x-\uc131\ubd84 -PointMass.Data.Description.19=\uc6b4\ub3d9\ub7c9 y-\uc131\ubd84 -PointMass.Data.Description.20=\uc6b4\ub3d9\ub7c9 \ud06c\uae30 -PointMass.Data.Description.21=\uc6b4\ub3d9\ub7c9 \ubca1\ud130\uc758 \uac01 -PointMass.Data.Description.22=\uc6b4\ub3d9\uc5d0\ub108\uc9c0 -RGBRegion.Data.Description.0=\uc2dc\uac04 -RGBRegion.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 -RGBRegion.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 -RGBRegion.Data.Description.3=\uc801\uc139 -RGBRegion.Data.Description.4=\ub179\uc0c9 -RGBRegion.Data.Description.5=\uccad\uc0c9 -RGBRegion.Data.Description.6=\ubc1d\uae30 -RGBRegion.Data.Description.7=\ud53d\uc140 \uc218 -RGBRegion.Data.Description.8=\uc2a4\ud15d \ubc88\ud638 -RGBRegion.Data.Description.9=\ud504\ub808\uc784 \ubc88\ud638 -TView.Menuitem.Define=\uc815\uc758... -Vector.Data.Description.0=\uc2dc\uac04 -Vector.Data.Description.1=x-\uc131\ubd84 -Vector.Data.Description.2=y-\uc131\ubd84 -Vector.Data.Description.3=\ud06c\uae30 -Vector.Data.Description.4=\uac01 -Vector.Data.Description.5=\ubca1\ud130 \uaf2c\ub9ac\uc758 \uc704\uce58 x-\uc131\ubd84 -Vector.Data.Description.6=\ubca1\ud130 \uaf2c\ub9ac\uc758 \uc704\uce58 y-\uc131\ubd84 -Vector.Data.Description.7=\uc2a4\ud15d \ubc88\ud638 -Vector.Data.Description.8=\ud504\ub808\uc784 \ubc88\ud638 - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=\ubb3c\uccb4 \uc9c8\ub7c9 -ParticleModel.Parameter.InitialTime.Description=\ucc98\uc74c \uc2dc\uac04 -AnalyticParticle.PositionFunction.X.Description=\uc704\uce58 x-\uc131\ubd84 -AnalyticParticle.PositionFunction.Y.Description=\uc704\uce58 y-\uc131\ubd84 -DynamicParticle.ForceFunction.X.Description=\ud798 x-\uc131\ubd84 -DynamicParticle.ForceFunction.Y.Description=\ud798 y-\uc131\ubd84 -DynamicParticle.Parameter.InitialX.Description=\ucc98\uc74c \uc704\uce58 x-\uc131\ubd84 -DynamicParticle.Parameter.InitialY.Description=\ucc98\uc74c \uc704\uce58 y-\uc131\ubd84 -DynamicParticle.Parameter.InitialVelocityX.Description=\ucc98\uc74c \uc18d\ub3c4 x-\uc131\ubd84 -DynamicParticle.Parameter.InitialVelocityY.Description=\ucc98\uc74c \uc18d\ub3c4 y-\uc131\ubd84 -TrackerPanel.ModelBuilder.Title=\ubb3c\ub9ac \ubaa8\ud615 -TrackerPanel.DataBuilder.Title=\ub370\uc774\ud130 \ubaa8\ud615 -TrackControl.TrailMenu.NoTrail=\uc2a4\ud15d \uac10\ucd94\uae30 -TrackControl.TrailMenu.ShortTrail=\uc2a4\ud15d \uc9e7\uac8c \ubcf4\uae30 -TrackControl.TrailMenu.LongTrail=\uc2a4\ud15d \uae38\uac8c \ubcf4\uae30 -TrackControl.TrailMenu.FullTrail=\ubaa8\ub4e0 \uc2a4\ud15d \ubcf4\uae30 -TrackerPanel.ModelBuilder.Spinner.Tooltip=\ud604\uc7ac \uc120\ud0dd\ud55c \ubaa8\ud615 -TrackerPanel.ModelBuilder.LineButton.Text=\uc120 \uc18d\uc131 -TrackerPanel.ModelBuilder.LineButton.Tooltip=\uc120 \uc18d\uc131 \uc124\uc815 -ParticleModel.LineStyle.None=\uc120 \uc5c6\uc74c -ParticleModel.LineStyle.Connect=\uc2a4\ud15d \uc5f0\uacb0 -ParticleModel.LineStyle.Smooth=\ubd80\ub4dc\ub7ec\uc6b4 \uc120 -ModelFunctionPanel.Label=\ubaa8\ud615 -AnalyticFunctionPanel.FunctionEditor.Border.Title=\uc704\uce58 \ud568\uc218 -DynamicFunctionPanel.FunctionEditor.Border.Title=\ud798 \ud568\uc218 - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=\ub370\uc774\ud130 \uad6c\uc131 \uc694\uc18c -Tracker.About.ProjectOf=\ud504\ub85c\uc81d\ud2b8: -Tracker.About.TranslationBy=\ubc88\uc5ed -Tracker.About.Translator=Hyunsoo Kim -TMenuBar.Menu.SaveVideoAs=\ube44\ub514\uc624 \uc800\uc7a5 -TActions.SaveClipAs.ProgressMonitor.Message=\ube44\ub514\uc624 \uc800\uc7a5\ud558\uae30 -TActions.SaveClipAs.ProgressMonitor.Progress=\uc644\ub8cc - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=\ub3d9\uae30\ud654 -PlotTrackView.Checkbox.Synchronize.Tooltip=\uc218\ud3c9\ucd95 \ub3d9\uae30\ud654 -RGBRegion.MenuItem.FixedRadius=\ubc18\uc9c0\ub984 \uace0\uc815 -Tracker.VideoZoom.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \ud654\uba74 \ud655\ub300 \ucd95\uc18c \uc120\ud0dd, \ub354\ube14 \ud074\ub9ad\ud574\uc11c \ud654\uba74 \ub9de\ucda4 -Tracker.PlotZoomIn.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud655\ub300, \ub354\ube14 \ud074\ub9ad\ud574\uc11c \uc790\ub3d9 \ub208\uae08 \uc870\uc815 -Tracker.PlotZoomOut.Hint=\ub20c\ub7ec\uc11c \ucd95\uc18c -Tracker.MenuItem.Hints=\ub3c4\uc6c0\ub9d0 \ubcf4\uae30 -TapeMeasure.Label.Length=\uae38\uc774 -TapeMeasure.Label.TapeAngle=\uc218\ud3c9\ucd95 \uae30\uc900 \uac01 -TapeMeasure.Label.ArcAngle=\uac01\ub3c4\uae30 \uce21\uc815 \uac01 -TrackerIO.Dialog.NotAnImage.Title=\uc798\ubabb\ub41c \ud30c\uc77c \ud615\uc2dd -TrackerIO.Dialog.NotAnImage.Message1=JPG \ub610\ub294 GIF \ud30c\uc77c\uc774 \uc544\ub2d9\ub2c8\ub2e4. -TrackerIO.Dialog.NotAnImage.Message2=\uacc4\uc18d \ud560\uae4c\uc694? -TToolBar.Button.Zoom.Tooltip=\ud654\uba74 \ud655\ub300/\ucd95\uc18c \uc124\uc815 -TrackChooserTView.DropDown.Tooltip=\ud2b8\ub799 \uc124\uc815 -TapeMeasure.Field.TapeAngle.Tooltip=\uc218\ud3c9\ucd95 (+x) \uc5d0\uc11c \uc904\uc790\uae4c\uc9c0 \ubc8c\uc5b4\uc9c4 \uac01 -TapeMeasure.Field.Magnitude.Tooltip= \ub208\uae08 \uc870\uc815\ub41c \uae38\uc774 -TapeMeasure.Readout.Magnitude.Name=\uae38\uc774 -TapeMeasure.Readout.Magnitude.Hint=\uad6d\uc81c\ub2e8\uc704 -TapeMeasure.Readout.Angle.Name=\uce21\uc815 \uac01 -TapeMeasure.Readout.Angle.Hint=+x \ucd95\uc73c\ub85c\ubd80\ud130 \uce21\uc815\ud55c \uac01 -TapeMeasure.End.Name=\uc904\uc790 \ub05d -TapeMeasure.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uae38\uc774\uc640 \uac01 \uce21\uc815, Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc904\uc790 \ub2e4\uc2dc \uc124\uc815 -TapeMeasure.Handle.Name=\ud578\ub4e4 -TapeMeasure.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc774\ub3d9 -Vector.Tip.Name=\ubca1\ud130\uc758 \uba38\ub9ac -Vector.Tip.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 -Vector.Handle.Name=\ud578\ub4e4 -Vector.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 -Vector.ShortHandle.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9, Alt \ud0a4 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \uc120\ud0dd -PointMass.Position.Name=\uc704\uce58 -PointMass.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 -PointMass.Velocity.Name=\uc18d\ub3c4 -PointMass.Acceleration.Name=\uac00\uc18d\ub3c4 -PointMass.Vector.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 -PointMass.Position.Locked.Hint=\ub20c\ub7ec\uc11c \uc120\ud0dd - \ub04c \uc218 \uc5c6\uc74c -CoordAxes.Handle.Name=+x \ucd95 -CoordAxes.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uae30\uc6b8\uae30 \ubcc0\uacbd -CoordAxes.Origin.Name=\uc6d0\uc810 -CoordAxes.Origin.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc704\uce58 \ubcc0\uacbd -OffsetOrigin.Position.Name=\uc704\uce58 -OffsetOrigin.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \uc88c\ud45c \uc774\ub3d9 -Calibration.Point.Name=\uc810 -Calibration.Point.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \ucd95\uacfc \ub208\uae08 \ubcc0\uacbd -RGBRegion.Position.Name=\uc704\uce58 -RGBRegion.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \uc704\uce58 \ubcc0\uacbd -LineProfile.End.Name=\ud504\ub85c\ud30c\uc77c \ub05d -LineProfile.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uae38\uc774 \ubcc0\uacbd -LineProfile.Handle.Name=\ud578\ub4e4 -LineProfile.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uc774\ub3d9 -PointMass.Hint=\ud234\ubc14\uc5d0 \ubb3c\uccb4 \uc124\uc815 -PointMass.Unmarked.Hint=, Shift \ud0a4 \ub20c\ub7ec\uc11c \uc9c8\uc810 \uc124\uc815 -TTrack.Unselected.Hint=\ub9c8\uc6b0\uc2a4 \ub20c\ub7ec\uc11c \uc120\ud0dd \uadf8\ub9ac\uace0/\ub610\ub294 \uc18d\uc131 \uc124\uc815 -Vector.Unmarked.Hint=Shit \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ubca1\ud130 \uc124\uc815 -OffsetOrigin.Unmarked.Hint=Shit \ud0a4 \ub20c\ub7ec\uc11c \uc88c\ud45c \uc774\ub3d9 \uc124\uc815 -Calibration.Unmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \uc2dc\uc791 \uc810 \uc124\uc815 -Calibration.Halfmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \ub2e4\uc2dc \uc124\uc815 -CenterOfMass.Empty.Hint=\uc9c8\ub7c9\uc911\uc2ec \uc88c\ud45c \uc815\uc758\ub97c \uc704\ud574 \ubb3c\uccb4 \uc120\ud0dd -VectorSum.Empty.Hint=\ubca1\ud130\ud569 \uc815\uc758\ub97c \uc704\ud55c \ubca1\ud130 \uc120\ud0dd\ud558\uae30 -TapeMeasure.Hint=\uc904\uc790 \ub05d\uc744 \ub04c\uc5b4\uc11c \uac70\ub9ac\uc640 \uac01 \uce21\uc815\ud558\uae30 -CoordAxes.Hint=\uae30\uc6b8\uae30 \ubcc0\uacbd\uc744 \uc704\ud55c \uac01 \uc785\ub825 -ParticleModel.Hint=\ud234\ubc14\uc5d0 \ubb3c\uccb4 \uc124\uc815, \ubaa8\ud615 \ub3c4\uad6c\uc5d0\uc11c \ubaa8\ub378\ub9c1 \uc704\ud55c \uc218\uc2dd \uc785\ub825 -RGBRegion.Hint=\ud06c\uae30 \ubcc0\uacbd\uc744 \uc704\ud55c \ubc18\uc9c0\ub984 \uc785\ub825 -RGBRegion.Unmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \uc704\uce58 \uc124\uc815 -TTrack.ImportVideo.Hint=RGB \uce21\uc815\uc744 \uc704\ud55c \ube44\ub514\uc624 \ub610\ub294 \uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 -TTrack.Selected.Hint=\uc120\ud0dd -LineProfile.Hint=\ud504\ub85c\ud30c\uc77c \ub108\ube44 \ubcc0\uacbd\uc744 \uc704\ud55c \uac12 \uc785\ub825 -LineProfile.Unmarked.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uc120 \uadf8\ub9ac\uae30 -LineProfile.Menu.Orientation=\ud504\ub85c\ud30c\uc77c \ub9de\ucda4 -LineProfile.MenuItem.Horizontal=\uc218\ud3c9\ud558\uac8c -LineProfile.MenuItem.XAxis=\uc88c\ud45c\uc758 x \ucd95\uc5d0 \ub098\ub780\ud788 -Footprint.PositionVector=\ubca1\ud130 -Footprint.BoldPositionVector=\uad75\uc740 \ubca1\ud130 -Tracker.Startup.Hint=\ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 (\ub610\ub294 \uba54\ub274\uc5d0\uc11c \ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ub044\uae30), \ub3c4\uc6c0\ub9d0 \ub0b4\uc6a9\uc744 \ubcf4\ub824\uba74 F1 \ud0a4 \ub204\ub984 -TrackerPanel.NoVideo.Hint=\ubd84\uc11d\uc744 \ud558\ub824\uba74 \ud30c\uc77c\uc744 \uc5f4\uac70\ub098 \ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30\ub97c \uc2e4\ud589 -TrackerPanel.CalibrateVideo.Hint=\uad50\uc815 \ub3c4\uad6c\ub97c \uc774\uc6a9\ud558\uc5ec \ube44\ub514\uc624 \uad50\uc815\ud558\uae30 -TrackerPanel.NoTracks.Hint=\uce21\uc815\uc744 \ud558\ub824\uba74 \uc0c8 \ud2b8\ub799 \ub9cc\ub4e4\uae30\ub97c \uc2e4\ud589 -TrackerPanel.SetClip.Hint=\ube44\ub514\uc624 \uc124\uc815 \ub610\ub294 \ubcf4\uae30 -TrackerPanel.ShowAxes.Hint=\uc88c\ud45c\ucd95\uc758 \uc6d0\uc810\uacfc \uac01 \uc124\uc815 -VideoPlayer.Step.Hint=\uc2a4\ud15d \uc55e\uc73c\ub85c (\ub2e8\ucd95\ud0a4: PageDown \ud0a4) -VideoPlayer.Back.Hint=\uc2a4\ud15d \ub4a4\ub85c (\ub2e8\ucd95\ud0a4: PageUp \ud0a4) -TrackerPanel.DVVideo.Hint=DV \ube44\ub514\uc624\uc5d0\uc11c \uc77c\uadf8\ub7ec\uc9d0 \ubcf4\uc815\uc744 \uc704\ud55c \ud574\uc0c1\ub3c4 \ubcc0\uacbd \ud544\ud130 \uc801\uc6a9 -TrackerIO.DataFileFilter.Description=Tracker \ud30c\uc77c -Tracker.Button.PDFHelp=PDF \ubb38\uc11c -TToolbar.Button.TapeVisible.Tooltip=\ubcf4\uae30/\uac10\ucd94\uae30 \ub610\ub294 \uad50\uc815 \ub3c4\uad6c \ub9cc\ub4e4\uae30 - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=\ud2b8\ub799 \ucee8\ud2b8\ub864 -TMenuBar.MenuItem.Description=\ub178\ud2b8 -TrackPlottingPanel.RightDrag.Hint=\ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94 \ub204\ub978 \ud6c4 \uc635\uc158 \uc124\uc815 -TMenuBar.MenuItem.DeleteSelectedPoint=\uc120\ud0dd\ud55c \uc2a4\ud15d -TFrame.InfoDialog.SaveChanges.Title=\ubcc0\uacbd \ub0b4\uc6a9 \uc800\uc7a5 -TFrame.InfoDialog.SaveChanges.Message=\ubcc0\uacbd\ub41c \ub0b4\uc6a9\uc744 \uc800\uc7a5\ud560\uae4c\uc694? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=\ub370\uce74\ub974\ud2b8\uc88c\ud45c -DynamicParticle.Editor.Button.Polar=\uadf9\uc88c\ud45c -DynamicParticle.Parameter.InitialR.Description=\ucc98\uc74c \ubc18\uc9c0\ub984 -DynamicParticle.Parameter.InitialTheta.Description=\ucc98\uc74c \uac01 -DynamicParticle.Parameter.InitialVelocityR.Description=\ucc98\uc74c \uc9c0\ub984\uc18d\ub3c4 -DynamicParticle.Parameter.InitialOmega.Description=\ucc98\uc74c \uac01\uc18d\ub3c4 -DynamicParticle.ForceFunction.R.Description=\uc9c0\ub984 \uc131\ubd84\uc758 \ud798 -DynamicParticle.ForceFunction.Theta.Description=\uc811\uc120 \uc131\ubd84\uc758 \ud798 -DynamicParticlePolar.Name=\ub3d9\uc5ed\ud559 \ubaa8\ud615 (\uadf9\uc88c\ud45c) -TMenuBar.Menu.DynamicParticle=\ub3d9\uc5ed\ud559 \ubaa8\ud615 -TMenuBar.MenuItem.Cartesian=\ub370\uce74\ub974\ud2b8\uc88c\ud45c -TMenuBar.MenuItem.Polar=\uadf9\uc88c\ud45c - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=\uc790\ub3d9 \ucc3e\uae30... -Dialog.Button.Help=\ub3c4\uc6c0\ub9d0 -AutoTracker.Wizard.Title=\uc790\ub3d9 \ucc3e\uae30 -AutoTracker.Wizard.Button.Reset=\uc6d0\ub798\ub300\ub85c -AutoTracker.Wizard.Button.Back=\ub4a4\ub85c -AutoTracker.Wizard.Button.Next=\uc2a4\ud15d -AutoTracker.Wizard.Button.Accept=\uc801\uc6a9 -AutoTracker.Wizard.Button.Search=\ucc3e\uae30 -AutoTracker.Wizard.Button.Pause=\uba48\ucda4 -AutoTracker.Wizard.Button.Skip=\uac74\ub108\ub6f0\uae30 -AutoTracker.Label.Mask=\ucc3e\uae30 \uacac\ubcf8 -AutoTracker.Label.AcceptLevel=\ubb38\uc9c0\ubc29 -AutoTracker.TabbedPane.TabTitle.Mask=\ucc3e\uae30 \uacac\ubcf8 -AutoTracker.TabbedPane.TabTitle.Target=\ucc3e\uae30 \ub300\uc0c1 -AutoTracker.TabbedPane.TabTitle.Settings=\uc801\uc6a9 -AutoTracker.TabbedPane.TabTitle.Search=\ucc3e\uae30 -AutoTracker.Info.GetStarted=\uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \ub9cc\ub4e4\uae30 \uc704\ud574\uc11c\ub294 Shit-Ctrl \ud0a4\ub97c \ub204\ub978 \uc0c1\ud0dc\ub85c \uc6d0\ud558\ub294 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\uc5d0\uc11c \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -AutoTracker.Info.Mask1=\ube44\ub514\uc624 \ud504\ub808\uc784\uc758 \uc77c\uc815\ud55c \uc601\uc5ed \uc548\uc5d0\uc11c \ub300\uc0c1\uc744 \ucc3e\uc544\uc11c \uc77c\uce58\ud558\uae30 \uc6d0\ud558\ub294 \ubaa8\uc591\uc744 \ucc3e\uae30 \uacac\ubcf8\uc5d0 \uc815\uc758\ud569\ub2c8\ub2e4. -AutoTracker.Info.Mask2=\ucc3e\uae30 \uacac\ubcf8\uc758 \ubaa8\uc591\uacfc \uc0c9\uc5d0 \ub300\ud55c \uc2dc\uac04\uc5d0 \ub530\ub978 \ubcc0\ud654\ub97c \uc801\uc6a9\ud569\ub2c8\ub2e4. \ubcc0\ud654\uc728\uc774 \ub192\uc744 \uc218\ub85d \uacac\ubcf8\uc758 \ubaa8\uc591\uacfc \uc0c9 \ubcc0\ud654\uac00 \ube60\ub978 \uac83\uc744 \ucc3e\uc744 \uc218 \uc788\uc73c\ub098 \uc815\ud655\ub3c4\uac00 \ub0ae\uc544\uc9d1\ub2c8\ub2e4. -AutoTracker.Info.MaskLocked1=\ucc3e\uae30 \uacac\ubcf8\uc744 \uc0ac\uc6a9 \uc911\uc774\uba70 \uc7a0\uaca8 \uc788\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.MaskLocked2=\ubaa8\ub4e0 \uc2a4\ud15d\uc744 \uc9c0\uc6b0\uace0 \ub2e4\uc2dc \uc2dc\uc791\ud558\ub824\uba74 \uc6d0\ub798\ub300\ub85c \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -AutoTracker.Info.Target1=\ucc3e\uae30 \ub300\uc0c1\uc774 \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12 \uc774\uc0c1\uc73c\ub85c \ucc3e\uae30 \uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub3c4\ub85d \uc790\ub3d9\uc73c\ub85c \ucc3e\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.Target2=\ub3c4\uc6c0\ub9d0: \ucc3e\uae30 \uc2a4\ud15d\uc774 \uc644\ub8cc\ub41c \ud6c4\uc5d0\ub3c4 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\uc874\uc758 \uc2a4\ud15d\uc740 \uc790\ub3d9\uc73c\ub85c \ub300\uc0c1\uc744 \ub530\ub77c \uc774\ub3d9\ub429\ub2c8\ub2e4. -AutoTracker.Info.TargetLocked=\ucc3e\uae30 \ub300\uc0c1\uc744 \uc0ac\uc6a9 \uc911\uc774\uba70 \uae30\uc874\uc758 \uc2a4\ud15d \uc704\uce58\uc5d0 \ubb36\uc5ec \uc788\uc2b5\ub2c8\ub2e4. \ub300\uc0c1\uc744 \uc62e\uae30\uba74 \ubaa8\ub4e0 \uc2a4\ud15d \ub610\ud55c \uc62e\uaca8\uc9d1\ub2c8\ub2e4. -AutoTracker.Info.Settings1=\uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12 \uc774\uc0c1\uc73c\ub85c \ucc3e\uae30 \uacac\ubcf8\uc774 \uc77c\uce58\ub41c \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4. -AutoTracker.Info.Settings2=\ub3c4\uc6c0\ub9d0: \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc744 \uc904\uc774\uba74 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc77c\uce58\uc5d0 \ub300\ud55c \ubd88\ud655\uc2e4\ub3c4\uac00 \ucee4\uc9d1\ub2c8\ub2e4. \ub300\uc2e0\uc5d0 \ubcc0\ud654\uc728\uc744 \ub192\uc774\uba74 \uc774 \ubd88\ud655\uc2e4\ub3c4\ub97c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.Search1=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc870\uc0ac\uc911\uc785\ub2c8\ub2e4. \ucc3e\uae30 \uc601\uc5ed \uc0ac\uac01\ud615\uc758 \ubaa8\uc11c\ub9ac\ub098 \ud578\ub4e4\uc744 \ub9c8\uc6b0\uc2a4\ub85c \ub04c\uc5b4\uc11c \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.Search2=\ub3c4\uc6c0\ub9d0: \ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \ucc3e\uae30 \uc601\uc5ed\uc774 \ud074 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc740 \uc77c\uce58 \ub300\uc0c1\uc758 \uc704\uce58\ub85c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc790\ub3d9\uc73c\ub85c \uc62e\uae30\ub3c4\ub85d \ud569\ub2c8\ub2e4. -AutoTracker.Info.Frame=\ud504\ub808\uc784 -AutoTracker.Info.Match=\uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub294 \ucc3e\uae30 \ub300\uc0c1\uc774 \uc790\ub3d9\uc73c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4. -AutoTracker.Info.Possible=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uac00\ub2a5\ud55c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: -AutoTracker.Info.NoMatch=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: -AutoTracker.Info.Outside=\ucc3e\uae30 \uc601\uc5ed\uc774 \uc774\ubbf8\uc9c0\ub97c \ubc97\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: -AutoTracker.Info.Accepted=\ucc3e\uae30 \ub300\uc0c1\uc774 \uc77c\uce58\ud558\ub294 \uac83\uc73c\ub85c \uc801\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.MarkedByUser=\uc218\ub3d9\uc73c\ub85c \uc2a4\ud15d\uc774 \ud45c\uc2dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.NoVideo=\uc790\ub3d9 \ucc3e\uae30\uc5d0 \ud544\uc694\ud55c \ube44\ub514\uc624\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -AutoTracker.Info.Height=\ub192\uc774 -AutoTracker.Info.Width=\ud3ed -AutoTracker.Info.Accept= - \ucc3e\uae30 \ub300\uc0c1\uc774 \uc77c\uce58\ud558\ub294 \uac83\uc73c\ub85c \uc801\uc6a9 -AutoTracker.Info.Retry= - \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uc5ec \ub2e4\uc2dc \ucc3e\uae30 -AutoTracker.Info.Mark= - Shift \ud0a4 \ub20c\ub7ec\uc11c \uc218\ub3d9\uc73c\ub85c \uc2a4\ud15d\uc744 \ud45c\uc2dc -AutoTracker.Info.Skip= - \uc774 \ud504\ub808\uc784\uc744 \uac74\ub108 \ub6f0\uace0 \ub2e4\uc74c\uc73c\ub85c \uacc4\uc18d \uc9c4\ud589 -AutoTracker.Info.Reset= - \ubc14\ub974\uac8c \ud45c\uc2dc\ub41c \ud504\ub808\uc784\uc73c\ub85c \uc2a4\ud15d\uc744 \ub4a4\ub85c \uc774\ub3d9\ud558\uace0 Shift-Ctrl \ud0a4\ub97c \ub20c\ub7ec\uc11c \uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \uc815\uc758 -AutoTracker.Info.MatchScore=\uc77c\uce58\ud558\ub294 \uac12 -AutoTracker.Dialog.MaskLocked.Title=\ucc3e\uae30 \uacac\ubcf8 \uc7a0\uae08 -PointMass.Cursor.Autotrack.Description=\uc790\ub3d9 \ucc3e\uae30 \ucee4\uc11c -VideoPlayer.StartFrame.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc2dc\uc791 \ud504\ub808\uc784 \uc124\uc815 -VideoPlayer.EndFrame.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub05d \ud504\ub808\uc784 \uc124\uc815 -VideoPlayer.Slider.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ube44\ub514\uc624 \ucc3e\uae30 -FileDropHandler.Dialog.BadFile.Message=\ubd88\ub7ec\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -FileDropHandler.Dialog.BadFile.Title=\uc54c \uc218 \uc5c6\ub294 \ud30c\uc77c - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=\uc801\uc6a9 -DynamicParticle.Dialog.Delete.Message=\uc774 \uc9c8\uc810\uc744 \uc0ad\uc81c\ud558\uac8c \ub418\uba74 \ub3d9\uc5ed\ud559\uacc4\uc5d0\uc11c \uc81c\uac70\ub429\ub2c8\ub2e4. \uadf8\ub798\ub3c4 \uc0ad\uc81c\ud560\uae4c\uc694? -DynamicParticle.Dialog.Delete.Title=\uc9c8\uc810\ub3d9\uc5ed\ud559\uacc4 -DynamicParticle.System.In=<- -DynamicSystem.Empty=\ube44\uc5c8\uc74c -DynamicSystem.Force.Name.Internal=\uc18d -DynamicSystem.ForceFunction.R.Description=\uc18d\ud798\uc758 \uc9c0\ub984 \uc131\ubd84 -DynamicSystem.ForceFunction.Theta.Description=\uc18d\ud798\uc758 \uc811\uc120 \uc131\ubd84 -DynamicSystem.MenuItem.Inspector=\uc9c8\uc810 \uc120\ud0dd... -DynamicSystem.Name=\ub3d9\uc5ed\ud559 \ub450 \ubb3c\uccb4 -DynamicSystem.New.Name=\ub3d9\uc5ed\ud559\uacc4 -DynamicSystem.Parameter.Of=/ -DynamicSystem.Parameter.RelativeTo=\uc0c1\ub300- -DynamicSystem.Parameter.Name.Relative=\uc0c1\ub300 -DynamicSystem.Parameter.ParticleMass.Description=\uc9c8\ub7c9- -DynamicSystem.Parameter.Mass.Description=\uc774 \uacc4\uc758 \uc804\uccb4 \uc9c8\ub7c9 -DynamicSystemInspector.Border.Title=\uc9c8\uc810 -DynamicSystemInspector.Title=\ub450 \ubb3c\uccb4 -DynamicSystemInspector.Button.Change=\ubcc0\uacbd... -DynamicSystemInspector.ParticleName.None=(\uc5c6\uc74c) -TMenuBar.MenuItem.Clone=\uc0ac\ubcf8 -TMenuBar.MenuItem.TwoBody=\ub450 \ubb3c\uccb4 -TrackerPanel.DataBuilder.Dropdown.Tooltip=\ud604\uc7ac \uc120\ud0dd\ub41c \ud2b8\ub799 -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\uc218\uc9c1\ucd95 \ub3d9\uae30\ud654 -TrackControl.Button.Trace.ToolTip=\uacbd\ub85c \ubcf4\uae30 \ub610\ub294 \uac10\ucd94\uae30 -TToolBar.Button.Open.Tooltip=\uc0c8 \ubb38\uc11c\uc5d0\uc11c \ube44\ub514\uc624 \ub610\ub294 Tracker \ud30c\uc77c \uc5f4\uae30 -TToolBar.Button.Save.Tooltip=\ud604\uc7ac \ubb38\uc11c\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5: -TToolBar.Button.SelectTrack=\uc120\ud0dd -TToolBar.Button.SelectTrack.Tooltip=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 -TTrack.MenuItem.ClearSteps=\ubaa8\ub4e0 \uc2a4\ud15d \uc9c0\uc6b0\uae30 -PointMass.MenuItem.Position=\uc704\uce58 -TMenuBar.MenuItem.Empty=(\ube44\uc5c8\uc74c) -TTrackBar.Button.Memory=\uc0ac\uc6a9 \uba54\ubaa8\ub9ac: -TTrackBar.Button.Memory.Tooltip=\uba54\ubaa8\ub9ac \uac10\uc2dc\uc640 \uad00\ub9ac -TTrackBar.Memory.PopupItem.Launch1=\uc801\uc6a9 -TTrackBar.Memory.PopupItem.Launch2=\uba54\ubaa8\ub9ac -TButton.Track.ToolTip=\uc18d\uc131 \uc124\uc815: -Tracker.Dialog.OutOfMemory.Message1=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uba54\ubaa8\ub9ac\uac00 \ubd80\uc871\ud569\ub2c8\ub2e4. -Tracker.Dialog.OutOfMemory.Message2=\uc635\uc158 \uc124\uc815\uc744 \uc704\ud574 \uba54\ubaa8\ub9ac \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -Tracker.Dialog.OutOfMemory.Title=\uba54\ubaa8\ub9ac \ubd80\uc871 - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=\ubbf8\ub9ac\ubcf4\uae30 -AutoTracker.Label.Original=\ud0a4 \ud504\ub808\uc784 -AutoTracker.Label.NoMask=\uc5c6\uc74c -AutoTracker.Label.Rate=\ube44\uc728: -AutoTracker.Info.Mask3=\ub3c4\uc6c0\ub9d0: \ucc3e\uae30 \uacac\ubcf8\uc774 \ud06c\uac70\ub098 \ub300\uc0c1 \ubb3c\uccb4\uc758 \ud06c\uae30 \uc804\uccb4\ub97c \ud3ec\ud568\ud560 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uacac\ubcf8\uc758 \ud615\ud0dc\uc640 \uc0c9\uc774 \ubd84\uba85\ud558\uace0 \ub300\ube44\uac00 \ub69c\ub837\ud560 \uc218\ub85d \ubcf4\ub2e4 \uc720\uc758\ud558\uac8c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -AutoTracker.Wizard.Checkbox.XAxis=x \ucd95\ub9cc \ucc3e\uae30 -AutoTracker.Info.SearchOnAxis1=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc758 x \ucd95\uc774 \uc870\uc0ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucc3e\uae30 \uc601\uc5ed\uc758 \uc911\uc2ec\uc774\ub098 \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. -AutoTracker.Info.PossibleOnAxis=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c x \ucd95\uc744 \ub530\ub77c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4. \uc635\uc158: -AutoTracker.Info.NoMatchOnAxis=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c x \ucd95\uc744 \ub530\ub77c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ubc1c\uacac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc635\uc158: -AutoTracker.Info.RetryOnAxis= - \ucc3e\uae30 \uc601\uc5ed\uc774\ub098 x \ucd95\uc744 \uc62e\uae34 \ub2e4\uc74c \ub2e4\uc2dc \ucc3e\uae30\ub97c \ud569\ub2c8\ub2e4. -AutoTracker.Wizard.Button.Delete=\uc0ad\uc81c -AutoTracker.Wizard.Button.DeleteMore=\ub098\uc911 \ud3ec\uc778\ud130 \uc0ad\uc81c -Button.Define.Tooltip=\uae30\uc874 \ubcc0\uc218\ub4e4\uc758 \ub0b4\uc6a9 \uc815\uc758 -Calibration.Label.Point=\uc810 -CalibrationStick.Hint=\uae38\uc774 \uac12\uc744 \uc785\ub825\ud558\uac70\ub098 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub208\uae08 \ubcc0\uacbd, \uac01\uc744 \uc785\ub825\ud574\uc11c \uae30\uc6b8\uae30 \uc870\uc815 -CalibrationStick.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub208\uae08 \ubcc0\uacbd, Shift \ud0a4 \ub20c\ub7ec\uc11c \ub2e4\uc2dc \uc124\uc815 -CalibrationStick.New.Name=\uad50\uc815 \ub9c9\ub300\uc790 -CalibrationTapeMeasure.New.Name=\uad50\uc815 \uc904\uc790 -CalibrationTapeMeasure.Readout.Magnitude.Hint=\uc54c\uace0 \uc788\ub294 \uae38\uc774\ub97c \uad6d\uc81c\ub2e8\uc704\uacc4\ub85c \uc785\ub825\ud558\ub824\uba74 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub204\ub984 -CalibrationTapeMeasure.Hint=\ub208\uae08 \ubcc0\uacbd\uc744 \uc704\ud574 \uae38\uc774 \uc785\ub825, \uae30\uc6b8\uae30 \ubcc0\uacbd\uc744 \uc704\ud574 \uac01 \uc785\ub825 -DynamicSystem.Data.Description.0=\uc9c8\uc810 \uc0ac\uc774\uc758 \uc0c1\ub300 \uac70\ub9ac -DynamicSystem.Data.Description.1=\uc0c1\ub300 \uac01 -DynamicSystem.Data.Description.2=\uc0c1\ub300 \uc9c0\ub984\uc18d\ub3c4 -DynamicSystem.Data.Description.3=\uc0c1\ub300 \uac01\uc18d\ub3c4 -ExportDataDialog.Subtitle.Table=\ub370\uc774\ud130 -ExportDataDialog.Subtitle.Content=\uc140 -ExportDataDialog.Subtitle.Format=\uc22b\uc790 \ud615\uc2dd -ExportDataDialog.Subtitle.Delimiter=\uad6c\ubd84 \ubb38\uc790 -ExportDataDialog.Title=\ub370\uc774\ud130 \ubcf4\ub0b4\uae30 -ExportDataDialog.Delimiter.Add=\ucd94\uac00... -ExportDataDialog.Delimiter.Remove=\uc81c\uac70... -ExportDataDialog.Content.AllCells=\ubaa8\ub4e0 \uc140 -ExportDataDialog.Content.SelectedCells=\uc120\ud0dd\ub41c \uc140 -ExportDataDialog.MenuItem.RemoveDelimiter=\uad6c\ubd84 \ubb38\uc790 \uc81c\uac70 -ExportDataDialog.Chooser.SaveData.Title=\ub370\uc774\ud130 \uc800\uc7a5 -ExportVideoDialog.Button.SaveAs=\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \uc800\uc7a5... -ExportVideoDialog.Button.FullSize=\uc804\uccb4 \ud06c\uae30 -ExportVideoDialog.Button.DrawnSize=\uc120\ud0dd\ud55c \ud06c\uae30 -ExportVideoDialog.Content.VideoOnly=\ube44\ub514\uc624\ub9cc -ExportVideoDialog.Content.VideoAndGraphics=\ube44\ub514\uc624\uc640 \uadf8\ub798\ud53d -ExportVideoDialog.Content.GraphicsOnly=\uadf8\ub798\ud53d\ub9cc -ExportVideoDialog.Title=\ube44\ub514\uc624 \ubcf4\ub0b4\uae30 -ExportVideoDialog.Label.ClipSettings=\ube44\ub514\uc624 \uc124\uc815 -ExportVideoDialog.Subtitle.Size=\ud574\uc0c1\ub3c4 -ExportVideoDialog.Subtitle.Content=\ud074\ub9bd -ExportVideoDialog.Subtitle.View=\uac1c\uccb4 -ExportVideoDialog.Subtitle.Format=\ud615\uc2dd -ExportVideoDialog.Complete.Message1=\ub2e4\uc74c\uacfc \uac19\uc774 \ube44\ub514\uc624 \uc800\uc7a5 \uc644\ub8cc: -ExportVideoDialog.Complete.Message2=Tracker \uc5d0\uc11c \uc9c0\uae08 \uc5f4\uae4c\uc694? -ExportVideoDialog.Complete.Title=\ubcf4\ub0b4\uae30 \uc644\ub8cc -ExportVideoDialog.VideoSize=\ube44\ub514\uc624 \ud574\uc0c1\ub3c4 -ExportVideoDialog.MatSize=\ubc14\ud0d5 \ud574\uc0c1\ub3c4 -ExportVideo.Dialog.HiddenPlots.Message=\uadf8\ub798\ud504\ub97c \ub0b4\ubcf4\ub0b4\ub824\uba74 \ub3c4\uad6c \ucc3d\uc5d0 \uadf8\ub798\ud504\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -ExportVideo.Dialog.HiddenPlots.Title=\ub3c4\uad6c \ucc3d \uc624\ub958 -Footprint.DoubleTarget=\uc774\uc911 \uc2ed\uc790\uc120 -Footprint.BoldDoubleTarget=\uad75\uc740 \uc774\uc911 \uc2ed\uc790\uc120 -OffsetOrigin.MenuItem.Fixed=\uc6d4\ub4dc \uc88c\ud45c \uace0\uc815 -ParticleModel.Dialog.Offscreen.Message1=\ud654\uba74\uc5d0\uc11c \ub108\ubb34 \uba40\ub9ac \ubc97\uc5b4\ub09c \ubaa8\ud615\uc758 \uc77c\ubd80 \uc2a4\ud15d\ub4e4\uc740 \ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. -ParticleModel.Dialog.Offscreen.Message2=\uc774\ub97c \uace0\uce58\ub824\uba74 \ubaa8\ud615\uc744 \uc218\uc815\ud558\uac70\ub098 \ube44\ub514\uc624\uc758 \ud654\uba74 \ud06c\uae30\ub97c \ub2e4\uc2dc \ubcc0\uacbd\ud569\ub2c8\ub2e4. -ParticleModel.Dialog.Offscreen.Title=\ud654\uba74\uc5d0\uc11c \ubc97\uc5b4\ub0a8 -PrefsDialog.Tab.Configuration.Title=\ub3c4\uad6c -PrefsDialog.Memory.BorderTitle=\uba54\ubaa8\ub9ac \ud06c\uae30 -PrefsDialog.Tab.General.Title=\ud504\ub85c\uadf8\ub7a8 -PrefsDialog.RecentFiles.BorderTitle=\ucd5c\uadfc \uc791\uc5c5 \ubb38\uc11c -PrefsDialog.Label.RecentSize=\ubcf4\uc5ec \uc904 \ud30c\uc77c \uc218 -PrefsDialog.Hints.BorderTitle=\ub3c4\uc6c0\ub9d0 -PrefsDialog.Button.Relaunch=\ub2e4\uc2dc \uc2dc\uc791\ud558\uae30 -PrefsDialog.Button.ClearRecent=\uc9c0\uc6b0\uae30 -PrefsDialog.Checkbox.DefaultSize=\uae30\ubcf8 \uc124\uc815\uc73c\ub85c -PrefsDialog.Checkbox.HintsOn=\ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 -PrefsDialog.Tab.Video.Title=\ube44\ub514\uc624 -PrefsDialog.VideoPref.BorderTitle=\ube44\ub514\uc624 \uc5d4\uc9c4 -PrefsDialog.Button.Xuggle=Xuggle (\uad8c\uc7a5) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc\uc77c \uacbd\uc6b0 \uba54\ubaa8\ub9ac \uad00\ub9ac\uac00 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. -PrefsDialog.Dialog.WebStart.Title=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc -PrefsDialog.LookFeel.BorderTitle=\uc2a4\ud0a8 -PrefsDialog.Language.BorderTitle=\uc5b8\uc5b4 -PrefsDialog.Upgrades.BorderTitle=\uc5c5\uadf8\ub808\uc774\ub4dc \ud655\uc778 -PrefsDialog.Tab.Runtime.Title=\uc2e4\ud589 -PrefsDialog.Tab.Display.Title=\ubcf4\uae30 -PrefsDialog.Language.Default=\uae30\ubcf8 \uc124\uc815 -PrefsDialog.Upgrades.Always=\ud56d\uc0c1 -PrefsDialog.Upgrades.Weekly=1\uc8fc\uc77c \uac04\uaca9 -PrefsDialog.Upgrades.Monthly=1\ub2ec \uac04\uaca9 -PrefsDialog.Upgrades.Never=\ud655\uc778\ud558\uc9c0 \uc54a\uc74c -PrefsDialog.Button.CheckForUpgrade=\uc9c0\uae08 \ud655\uc778 -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle \ube44\ub514\uc624 \uc7ac\uc0dd -PrefsDialog.Xuggle.Slow=\ubd80\ub4dc\ub7fd\uac8c (\ub290\ub9bc) -PrefsDialog.Xuggle.Fast=\uac70\uce60\uac8c (\ube60\ub984) -PrefsDialog.CalibrationTool.BorderTitle=\uae30\ubcf8 \uad50\uc815 \ub3c4\uad6c -Protractor.Name=\uac01\ub3c4\uae30 -Protractor.New.Name=\uac01\ub3c4\uae30 -Protractor.Hint=\uac01\ub3c4\uae30\uc758 \ud314\uc744 \ub9c8\uc6b0\uc2a4\ub85c \ub04c\uc5b4\uc11c \uac01 \uce21\uc815 -Protractor.Label.Angle=\uac01 -Protractor.Field.Angle.Tooltip=\uac01\ub3c4\uae30 \ub450 \ud314 \uc0ac\uc774\uc758 \uac01 -Protractor.Vertex.Name=\uaf2d\uc9c0\uc810 -Protractor.Vertex.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uaf2d\uc9c0\uc810 \uc774\ub3d9 -Protractor.End.Name=\uac01\ub3c4\uae30 \ud314\uc758 \ub05d -Protractor.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \ud314\uc744 \ud68c\uc804 -Protractor.Handle.Name=\ud578\ub4e4 -Protractor.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \uc774\ub3d9 -Protractor.Rotator.Name=\ud68c\uc804\uc790 -Protractor.Rotator.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \ud68c\uc804 -Protractor.Readout.Name=\uce21\uc815\uac12 -Protractor.Readout.Hint=\uac01\ub3c4\uae30 \ub450 \ud314 \uc0ac\uc774\uc758 \uac01 -ProtractorFootprint.Circle3=\uc791\uc740 \uc6d0 -ProtractorFootprint.Circle5=\ud070 \uc6d0 -ProtractorFootprint.Circle3Bold=\uad75\uc740 \uc791\uc740 \uc6d0 -ProtractorFootprint.Circle5Bold=\uad75\uc740 \ud070 \uc6d0 -Stick.Name=\uad50\uc815 \ub9c9\ub300\uc790 -Stick.New.Name=\uad50\uc815 \ub9c9\ub300\uc790 -TableTrackView.MenuItem.Unformatted=\uc22b\uc790 -TableTrackView.MenuItem.Formatted=\uc720\ud6a8\uc22b\uc790 -TableTrackView.Menu.SetDelimiter=\uad6c\ubd84 \ubb38\uc790... -TableTrackView.MenuItem.AddDelimiter=\ucd94\uac00... -TableTrackView.MenuItem.RemoveDelimiter=\uc81c\uac70... -TableTrackView.Dialog.CustomDelimiter.Message=\uc0c8 \uad6c\ubd84 \ubb38\uc790 \uc785\ub825: -TableTrackView.Dialog.CustomDelimiter.Title=\uad6c\ubd84 \ubb38\uc790 \ucd94\uac00 -TableTrackView.Header.Tooltip=\ub9c8\uc6b0\uc2a4 \ub20c\ub7ec\uc11c \uc815\ub82c \ub610\ub294 \ub354\ube14 \ud074\ub9ad\ud574\uc11c \uc5f4 \uc120\ud0dd -TableTrackView.MenuItem.CopySelectedData=\ub370\uc774\ud130 \ubcf5\uc0ac -TableTrackView.Dialog.RemoveDelimiter.Message=\uc81c\uac70\ud558\ub824\ub294 \uad6c\ubd84 \ubb38\uc790 \uc120\ud0dd: -TableTrackView.Dialog.RemoveDelimiter.Title=\uad6c\ubd84 \ubb38\uc790 \uc81c\uac70 -TableTrackView.Radians.Tooltip=(\ub77c\ub514\uc548) -TableTrackView.Degrees.Tooltip=(\ub3c4) -TableTrackView.RadiansPerSecond.Tooltip=(rad/s) -TableTrackView.DegreesPerSecond.Tooltip=(deg/s) -TableTrackView.RadiansPerSecondSquared.Tooltip=(rad/s^2) -TableTrackView.DegreesPerSecondSquared.Tooltip=(deg/s^2) -TableTrackView.MenuItem.DeleteDataFunction=\ub370\uc774\ud130 \ud568\uc218 \uc0ad\uc81c -TActions.Action.SaveFrame=\ud1b5\ud569 \ubb38\uc11c \uc800\uc7a5... -TActions.AboutVideo=\uc18d\uc131... -TActions.Dialog.AboutVideo.Title=\ube44\ub514\uc624 \uc18d\uc131 -TActions.Dialog.AboutVideo.Type=\ud615\uc2dd -TActions.Dialog.AboutVideo.Size=\ud574\uc0c1\ub3c4 -TActions.Dialog.AboutVideo.Length=\uae38\uc774 -TActions.Dialog.AboutVideo.Frames=\ud504\ub808\uc784 -TActions.Dialog.AboutVideo.Seconds=\ucd08 -TActions.Dialog.AboutVideo.FrameRate=\ud504\ub808\uc784 \uc18d\ub3c4 -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=\uacbd\ub85c -TActions.Action.ImportTRK=Tracker \ud30c\uc77c... -TActions.Action.ProtractorVisible=\ubcf4\uae30 -TapeMeasure.MenuItem.FixedLength=\uae38\uc774 \uace0\uc815 -TextTView.Label.NoTab=\uc5ec\uae30\uc5d0 \uae00\uacfc HTML \uc6f9 \ud398\uc774\uc9c0\ub97c \ucd94\uac00\ud558\ub824\uba74 "\ub0b4\uc6a9"\uc744 \ub204\ub985\ub2c8\ub2e4. -TextTView.NewTab.Text1=\uae00\uc774\ub098 \uc81c\ubaa9\uc744 \uc218\uc815\ud558\ub824\uba74 \ub354\ube14 \ud074\ub9ad\ud569\ub2c8\ub2e4. \uc635\uc158\uc744 \ub354 \ubcf4\ub824\uba74 \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -TextTView.NewTab.Text2=\uc6f9 \ud398\uc774\uc9c0\ub97c \ubcf4\ub824\uba74 \uc6f9 \uc0ac\uc774\ud2b8 \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uac70\ub098 \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94\ub97c \ub20c\ub7ec\uc11c \uc6f9 \ud398\uc774\uc9c0 \ubd88\ub7ec\uc624\uae30\ub97c \ud569\ub2c8\ub2e4. -TextTView.NewTab.Title=\ub0b4\uc6a9 -TextTView.Dialog.TabTitle.Title=\uc81c\ubaa9 \uc785\ub825 -TextTView.MenuItem.OpenHTML=\uc6f9 \ud398\uc774\uc9c0 \ubd88\ub7ec\uc624\uae30... -TextTView.MenuItem.SetTitle=\uc81c\ubaa9 \uc785\ub825... -TextTView.Button.NewTab=\uc0c8 \ub0b4\uc6a9 -TextTView.TextEdit.Description=... -TFrame.Dialog.FileNotFound.Message=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c: -TFrame.Dialog.FileNotFound.Title=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c -TFrame.View.Text=\ub0b4\uc6a9 -TFrame.View.Main=\uc791\uc5c5 \ucc3d -TMenuBar.Menu.OpenRecent=\ucd5c\uadfc \uc791\uc5c5 \ub0b4\uc6a9 -TMenuBar.Menu.Import=\ubd88\ub7ec\uc624\uae30 -TMenuBar.Menu.Export=\ubcf4\ub0b4\uae30 -TMenuBar.MenuItem.Video=\ube44\ub514\uc624... -TMenuBar.MenuItem.Data=\ub370\uc774\ud130... -TMenuBar.Menu.CopyObject=\uac1c\uccb4 \ubcf5\uc0ac -TMenuBar.MenuItem.Coords=\uc88c\ud45c -TMenuBar.MenuItem.VideoClip=\ube44\ub514\uc624 -TMenuBar.Menu.MeasuringTools=\uce21\uc815 \ub3c4\uad6c -TMenuBar.Menu.AngleUnits=\uac01 -TMenuBar.MenuItem.Degrees=\ub3c4 -TMenuBar.MenuItem.Radians=\ub77c\ub514\uc548 -Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message1=Xuggle \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message2=Xuggle \ub2e4\uc6b4\ub85c\ub4dc: http://www.xuggle.com/xuggler/downloads/ -Tracker.Action.AboutXuggle=Xuggle \uc815\ubcf4... -Tracker.Dialog.AboutXuggle.Title=Xuggle \uc815\ubcf4 -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \ubc84\uc804 -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \uc124\uce58 \uacbd\ub85c: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar \uacbd\ub85c: -Tracker.Dialog.NoVideoEngine.Message1=Tracker \ub294 \uae30\ubcf8 \ud615\uc2dd\uc758 \uc560\ub2c8\uba54\uc774\uc158 GIF, \uadf8\ub9bc\uacfc \ub3d9\uc601\uc0c1\uc744 \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoVideoEngine.Message2=\uadf8\ub7ec\ub098 \ub2e4\ub978 \ube44\ub514\uc624 \ud615\uc2dd\uc744 \ubd88\ub7ec\uc624\ub824\uba74 \ubcc4\ub3c4\uc758 \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. -Tracker.Dialog.NoVideoEngine.Message3=\uacf5\uac1c \ucf54\ub4dc\uc774\uba70 \uacf5\ud1b5 \ud615\uc2dd\uc73c\ub85c \uad8c\uc7a5\ub41c \ube44\ub514\uc624 \uc5d4\uc9c4\uc778 Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c -Tracker.Dialog.NoVideoEngine.Message4=\uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: -Tracker.Dialog.NoVideoEngine.Title=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c -Tracker.Dialog.NoXuggle.Message1=Xuggle \uc744 \uc62c\ubc14\ub974\uac8c \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message2=xuggle jar \ud30c\uc77c\uc774 \uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message3=\uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\ub294 Tracker_README.txt \ub97c \ucc38\uc870\ud569\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message4=Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: -Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c -Tracker.About.DefaultLocale=\uae30\ubcf8 \uc124\uc815 -Tracker.About.CurrentLanguage=\uc5b8\uc5b4 -Tracker.Dialog.InsufficientMemory.Title=\uba54\ubaa8\ub9ac \ubd80\uc871 -Tracker.Dialog.InsufficientMemory.Message=\uc694\uccad\ud55c \uba54\ubaa8\ub9ac\uac00 \ub108\ubb34 \ud07d\ub2c8\ub2e4. -TrackerIO.Dialog.TabMustBeSaved.Message1=\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \ubb38\uc11c - -TrackerIO.Dialog.TabMustBeSaved.Message2= \ub97c \ud1b5\ud569 \ubb38\uc11c \uc548\uc5d0 Tracker \ud30c\uc77c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4. -TrackerIO.Dialog.TabMustBeSaved.Message3=\uc800\uc7a5\ud560\uae4c\uc694? -TrackerIO.Dialog.TabMustBeSaved.Title=\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \ubb38\uc11c -TrackerIO.Dialog.NoTabs.Message=\uc800\uc7a5\ud558\uae30 \uc704\ud55c \ubb38\uc11c\uac00 \uc5c6\uc2b5\ub2c8\ub2e4! -TrackerIO.Dialog.NoTabs.Title=\ube48 \ubb38\uc11c \ud1b5\ud569 -TrackerIO.Dialog.SaveTabset.Title=\ud1b5\ud569 \ubb38\uc11c \uc800\uc7a5 -TrackerIO.Dialog.SaveTab.Title=\ubb38\uc11c \uc800\uc7a5 -TrackerIO.Delimiter.Tab=\ud0ed -TrackerIO.Delimiter.Space=\uacf5\ubc31 -TrackerIO.Delimiter.Comma=\uc27c\ud45c -TrackerIO.Delimiter.Semicolon=\uc30d\ubc18\uc810 -TrackerIO.VideoAndDataFileFilter.Description=\ube44\ub514\uc624\uc640 Tracker \ud30c\uc77c -TrackerPanel.Dialog.Version.Message1= \ud604\uc7ac \uc2e4\ud589 \uc911\uc778 Tracker \ubc84\uc804\uc5d0 \uc5c6\ub294 \uae30\ub2a5\uacfc \ub0b4\uc6a9\uc774 \ucd94\uac00\ub41c -TrackerPanel.Dialog.Version.Message2=\ub2e4\ub978 \ubc84\uc804\uc5d0\uc11c \ub9cc\ub4e4\uc5b4\uc9c4 \ud30c\uc77c\uc744 \ubd88\ub7ec\uc624\ub824\uace0 \ud569\ub2c8\ub2e4. -TrackerPanel.Dialog.Version.Message3=Tracker \ubc84\uc804\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. -TrackerPanel.Dialog.Version.Message4=\uac00\uc7a5 \ucd5c\uadfc\uc758 \ubc84\uc804 \uc0ac\uc6a9 \uac00\ub2a5: -TrackerPanel.Dialog.Version.Title=\ubc84\uc804\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c -TrackerPanel.Label.ModelStart=\uc2dc\uc791 -TrackerPanel.Label.ModelEnd=\ub05d -TrackerPanel.Spinner.ModelStart.Tooltip=\uc774 \ubaa8\ud615\uc5d0 \ub300\ud55c \uc2dc\uc791 \ud504\ub808\uc784 \uc124\uc815 -TrackerPanel.Spinner.ModelEnd.Tooltip=\uc774 \ubaa8\ud615\uc5d0 \ub300\ud55c \ub05d \ud504\ub808\uc784 \uc124\uc815 -TToolbar.Button.ProtractorVisible.Tooltip=\uac01\ub3c4\uae30 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 -TToolbar.Button.AxesVisible.Tooltip=\uc88c\ud45c\ucd95 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 -TToolBar.Button.TrackControl.Tooltip=\ud2b8\ub799 \ucee8\ud2b8\ub864 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 -TTrack.Dialog.StepSizeWarning.Message1=\uc8fc\uc758: \ucc3e\uc9c0 \ubabb\ud558\uace0 \uac74\ub108\ub6f4 \ud504\ub808\uc784\uc774 \ud55c \uac1c \uc774\uc0c1\uc758 \uc2a4\ud15d \ud06c\uae30\ub85c \uc124\uc815\ub41c \uc77c\ubd80 \ud2b8\ub799\uc774 \uc788\uc2b5\ub2c8\ub2e4. -TTrack.Dialog.StepSizeWarning.Message2=\uc2a4\ud15d \ud06c\uae30\uac00 \ub2e4\ub974\uba74 \ub370\uc774\ud130 \uacc4\uc5f4\uc774 \uc5f0\uc18d\uc801\uc774\uc9c0 \uc54a\uc740 \ube48 \ub370\uc774\ud130 \uacb0\uacfc\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. -TTrack.Dialog.StepSizeWarning.Message3=\ubaa8\ub4e0 \ub370\uc774\ud130 \uc2a4\ud15d\uc774 \ud45c\uc2dc\ub418\uae30 \uc804\uae4c\uc9c0\ub294 \ube48 \ub370\uc774\ud130 \uacc4\uc5f4 \uc8fc\ubcc0\uc5d0\uc11c \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4\ub97c \uacc4\uc0b0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -TTrack.Dialog.StepSizeWarning.Title=\uc8fc\uc758 -TTrack.Dialog.SkippedStepWarning.Message1=\uc8fc\uc758: \ucc3e\uae30 \uc704\uce58\ub97c \ud45c\uc2dc\ud560 \ub54c \uc2a4\ud15d\uc744 \uac74\ub108 \ub6f0\uba74 \ub370\uc774\ud130 \uacc4\uc5f4\uc5d0 \ube48 \ub370\uc774\ud130\ub97c \ub0a8\uae30\uac8c \ub429\ub2c8\ub2e4. -TTrack.Dialog.SkippedStepWarning.Title=\uc8fc\uc758 -TTrack.Dialog.SkippedStepWarning.Checkbox=\ub2e4\uc2dc \ubcf4\uc9c0 \uc54a\uae30 -TTrack.Locked.Hint=\uc7a0\uae08 -TTrack.AngleField.Radians.Tooltip=\uac01 (\ub77c\ub514\uc548) -TTrack.AngleField.Degrees.Tooltip=\uac01 (\ub3c4) -TTrack.AngleField.Popup.Radians=\uac01 (\ub77c\ub514\uc548)\uc73c\ub85c \ubcc0\ud658 -TTrack.AngleField.Popup.Degrees=\uac01 (\ub3c4)\ub85c \ubcc0\ud658 -TTrackBar.Memory.Menu.SetSize=\uba54\ubaa8\ub9ac \ud06c\uae30 \uc124\uc815... -TTrackBar.Button.Version=\uc9c0\uae08 \ud65c\uc6a9 \uac00\ub2a5: \ubc84\uc804 -TTrackBar.Popup.MenuItem.Upgrade=\uc9c0\uae08 \uc5c5\uadf8\ub808\uc774\ub4dc... -TTrackBar.Popup.MenuItem.Ignore=\ubb34\uc2dc -XuggleVideo.MenuItem.SmoothPlay=\ubd80\ub4dc\ub7ec\uc6b4 \uc7ac\uc0dd (\ub290\ub9bc) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=\uad50\uc815 \uc904\uc790 -CircleFootprint.Circle=\uc6d0 -CircleFootprint.FilledCircle=\uc18d\uc774 \ucc2c \uc6d0 -CircleFootprint.Dialog.Title=\uc6d0 \uc18d\uc131 -CircleFootprint.Dialog.Label.Radius=\ubc18\uc9c0\ub984 -CircleFootprint.Dialog.Checkbox.Bold=\uad75\uac8c -CircleFootprint.Dialog.Checkbox.CenterSpot=\uac00\uc6b4\ub370 \uc810 -LineProfile.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc120 \ud504\ub85c\ud30c\uc77c \uc124\uc815 -PageTView.Button.Page=\ub0b4\uc6a9 -PageTView.MenuItem.ClosePage=\ub2eb\uae30 -PointMass.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc124\uc815, Enter \ud0a4 \ub20c\ub7ec\uc11c \uc774\uc804 \uc2a4\ud15d \ubcf5\uc0ac -PrefsDialog.Dialog.NewVersion.Title=\uc5c5\uadf8\ub808\uc774\ub4dc -PrefsDialog.Dialog.NewVersion.Message1=\ubc84\uc804 -PrefsDialog.Dialog.NewVersion.Message2=\uc9c0\uae08 \uc5c5\uadf8\ub808\uc774\ub4dc \uac00\ub2a5: -PrefsDialog.Dialog.NewVersion.None.Message=\uc9c0\uae08 \ud65c\uc6a9 \uac00\ub2a5\ud55c \uc0c8 \ubc84\uc804\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. -RGBRegion.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc601\uc5ed\uc758 \uc911\uc2ec\uc744 \ud45c\uc2dc -TMenuBar.MenuItem.Restore=\ucc3d\uc744 \uc6d0\ub798\ub300\ub85c -TrackControl.StretchVectors.None=\ubca1\ud130 \ub298\ub9ac\uae30 \uc5c6\uc74c -TViewChooser.Maximize.Tooltip=\ucc3d\uc744 \ucd5c\ub300 \ud06c\uae30\ub85c -TViewChooser.Restore.Tooltip=\ucc3d\uc744 \uc6d0\ub798\ub300\ub85c -Vector.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \uc124\uc815, Enter \ud0a4 \ub20c\ub7ec\uc11c \uc774\uc804 \uc2a4\ud15d \ubcf5\uc0ac -WorldTView.Button.World=\uc6d4\ub4dc \ubdf0 - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=\uc8fc\uc758 -PrefsDialog.Checkbox.WarnIfNoEngine=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle \uc624\ub958 -PropertiesDialog.Title=\uc18d\uc131 -PropertiesDialog.Label.Author=\uc9c0\uc740\uc774 -PropertiesDialog.Label.Contact=\uc5f0\ub77d\ucc98 -TActions.Action.Properties=\uc18d\uc131... -TActions.Action.OpenBrowser=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac... -TFrame.Progress.Xuggle=Xuggle \ud504\ub808\uc784 \ubd88\ub7ec\uc624\ub294 \uc911 -TFrame.Progress.ClickToCancel=(\ucde8\uc18c\ud558\ub824\uba74 \ub204\ub984) -TFrame.Dialog.StalledVideo.Title=\ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30 \uc624\ub958 -TFrame.Dialog.StalledVideo.Message0=\ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \uc911\uc5d0 \uc77c\uc2dc\uc801\uc73c\ub85c \uba48\ucd94\uc5c8\uc2b5\ub2c8\ub2e4. -TFrame.Dialog.StalledVideo.Message1=\ubd88\ub7ec\uc624\uae30\ub97c \uc9c0\uae08 \uc911\uc9c0\ud558\uac70\ub098 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. -TFrame.Dialog.StalledVideo.Message2=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\uae30 \uc704\ud574 \uac00\ub2a5\ud55c \ub2e4\ub978 \ubc29\ubc95: -TFrame.Dialog.StalledVideo.Message3=1. \ube44\ub514\uc624 \ubcc0\ud658 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \ub2e4\ub978 \ud615\uc2dd\uc73c\ub85c \ubcc0\ud658\ud574\uc11c \ubd88\ub7ec\uc635\ub2c8\ub2e4. -TFrame.Dialog.StalledVideo.Message4=2. \ud30c\uc77c \ud0d0\uc0c9\uae30\ub098 \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c QuickTime \uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. -TFrame.Dialog.StalledVideo.MessageMac=2. 32-\ube44\ud2b8 Java VM \uc5d0\uc11c Tracker \ub97c \uc5f4\uace0 QuickTime\uc73c\ub85c \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc635\ub2c8\ub2e4. -TFrame.Dialog.StalledVideo.Button.Stop=\uba48\ucda4 -TFrame.Dialog.StalledVideo.Button.Wait=\uae30\ub2e4\ub9bc -Tracker.Dialog.NoVideoEngine.Checkbox=\ub2e4\uc2dc \ubcf4\uc9c0 \uc54a\uae30 -TrackerIO.ZipFileFilter.Description=\uc555\ucd95 (zip) \ud30c\uc77c -TrackerIO.Dialog.ErrorFFMPEG.Message1=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \ub3d9\uc548 Xuggle \uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uc624\ub958 \ubc1c\uc0dd: -TrackerIO.Dialog.ErrorFFMPEG.Message2=\ubaa8\ub4e0 \uc624\ub958\uac00 \uce58\uba85\uc801\uc778 \uac83\uc740 \uc544\ub2c8\uba70 \uc624\ub958 \uba54\uc2dc\uc2dc\ub97c \ubcf4\ub824\uba74 [\ub3c4\uc6c0\ub9d0|\uba54\uc2dc\uc9c0 \ub85c\uadf8]\ub97c \ubd05\ub2c8\ub2e4. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Xuggle \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74, QuickTime \uc73c\ub85c \ube44\ub514\uc624\ub97c \uc5f4\uc5b4 \ubcfc \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\ub178\ud2b8: Mac OSX \uc5d0\uc11c\ub294 32-\ube44\ud2b8 Java VM \uc5d0\uc11c Tracker \ub97c \uc5f4\uc5b4\uc57c \ud569\ub2c8\ub2e4. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \uc624\ub958 -TrackerIO.ErrorFFMPEG.LogMessage=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc744 \ubcf4\uae30 \uc704\ud574, \ud658\uacbd \uc124\uc815 \ub300\ud654 \uc0c1\uc790 [\ud3b8\uc9d1|\ud658\uacbd \uc124\uc815]\uc5d0\uc11c [\ube44\ub514\uc624|\uc8fc\uc758] \ud56d\ubaa9\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. -TToolBar.Button.OpenBrowser.Tooltip=OSP \ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac - -# Additions by Doug Brown 2011-07-04 -VideoFilter.Deinterlace=\ub514\uc778\ud130\ub808\uc774\uc2a4 -VideoFilter.Ghost=\uc794\uc0c1 -VideoFilter.DarkGhost=\uc9d9\uc740 \uc794\uc0c1 -VideoFilter.Negative=\ub124\uac70\ud2f0\ube0c -VideoFilter.GrayScale=\ud68c\uc0c9\uc870 -VideoFilter.Brightness=\ubc1d\uae30\uc640 \ub300\ube44 -VideoFilter.Baseline=\ubca0\uc774\uc2a4\ub77c\uc778 -VideoFilter.Sum=\ud569 -VideoFilter.Resize=\ud574\uc0c1\ub3c4 \ubcc0\uacbd -VideoFilter.Rotate=\ud68c\uc804 -VideoFilter.Perspective=\uc6d0\uadfc - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c -TFrame.Dialog.NoTRKInComPADRE.Message=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c Tracker \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=\uc6b4\ub3d9\ud559 \uc785\uc790 -DynamicParticle.Builder.Title=\ub3d9\uc5ed\ud559 \uc785\uc790 (\ub370\uce74\ub974\ud2b8 \uc88c\ud45c) -DynamicParticlePolar.Builder.Title=\ub3d9\uc5ed\ud559 \uc785\uc790 (\uadf9\uc88c\ud45c) -DynamicSystem.Builder.Title=\ub3d9\uc5ed\ud559\uacc4 (\uc18d) -PropertiesDialog.Button.CopyFilePath=\ud30c\uc77c \uacbd\ub85c \ubcf5\uc0ac -PropertiesDialog.Button.CopyVideoPath=\ube44\ub514\uc624 \uacbd\ub85c \ubcf5\uc0ac -PropertiesDialog.Tab.TrackerFile=Tracker \ud30c\uc77c -PropertiesDialog.Tab.Metadata=\uba54\ud0c0\ub370\uc774\ud130 -PropertiesDialog.Header.Property=\uc18d\uc131 -PropertiesDialog.Header.Value=\uac12 -TActions.Action.OpenURL=\uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubd88\ub7ec\uc624\uae30... -TActions.Dialog.OpenURL.Title=\uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubd88\ub7ec\uc624\uae30 -TActions.Dialog.OpenURL.Message=\uc6f9 \uae30\ubc18 \ube44\ub514\uc624, Tracker \ud30c\uc77c \ub610\ub294 Tracker \uc555\ucd95 (zip) \ud30c\uc77c\uc758 URL \uc785\ub825 -TActions.Dialog.AboutVideo.Name=\uc774\ub984 - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=\uce90\uc2dc \ud30c\uc77c -PrefsDialog.Button.ClearCache=\uc9c0\uc6b0\uae30 - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, Shift \ud0a4 \ub20c\ub7ec\uc11c \uc704\uce58 \ub2e4\uc2dc \uc124\uc815 -PointMass.Remarking.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc704\uce58 \ub2e4\uc2dc \uc124\uc815 -PointMass.PositionSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uac70\ub098 \uc704\uce58 \uc785\ub825 -PointMass.VectorSelected.Hint=\ub04c\uc5b4\uc11c \uc774\ub3d9 -Vector.Remark.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \ub2e4\uc2dc \uc124\uc815 -Vector.TipSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uac70\ub098 \ubca1\ud130 \uc131\ubd84 \uc785\ub825 -Vector.HandleSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \uc774\ub3d9 -Vector.Remarking.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \ub2e4\uc2dc \uc124\uc815 -AutoTracker.Label.Search=\ucc3e\uae30 -AutoTracker.Label.Target=\ubaa9\ud45c -AutoTracker.Label.Frame=\ud504\ub808\uc784 -AutoTracker.Label.Point=\ub300\uc0c1 -AutoTracker.Label.Template=\uacac\ubcf8 -AutoTracker.Label.Track=\ud2b8\ub799 -AutoTracker.Label.Match=\uc77c\uce58 -AutoTracker.Label.NoTemplate=\uacac\ubcf8 \uc5c6\uc74c -AutoTracker.Label.EvolutionRate=\ubcc0\ud654\uc728 -AutoTracker.Label.Automark=\uc624\ud1a0\ub9c8\ud06c -AutoTracker.Info.Instructions=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uae30 \uc704\ud574\uc11c \ucc3e\uae30 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -AutoTracker.Info.KeyFrame.Instructions1=\uc774 \ud0a4 \ud504\ub808\uc784\uc740 \uacac\ubcf8\uacfc \ub300\uc0c1\uc744 \uadf8\ub9bc\uacfc \uac19\uc774 \uc815\uc758\ud569\ub2c8\ub2e4. \uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uba74 \ucc3e\uae30 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. -AutoTracker.Info.KeyFrame.Instructions2=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \ub300\uc0c1\uc774\ub098 \uacac\ubcf8 \ub610\ub294 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. -AutoTracker.Info.MouseOver.Instructions=\ucee8\ud2b8\ub864\uc758 \uc124\uc815\uacfc \ubcc0\uacbd\uc5d0 \ub300\ud574 \ub3c4\uc6c0\ub9d0\uc774 \ud544\uc694\ud558\uba74 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130\ub97c \ucee8\ud2b8\ub864 \uc704\ub85c \uac00\uc838\ub2e4 \ub193\uc2b5\ub2c8\ub2e4. -AutoTracker.Info.Mask1=\ucc3e\uc544\uc11c \uc77c\uce58\uc2dc\ud0a4\ub824\ub294 \ub300\uc0c1\uc778 \ucc3e\uae30 \uacac\ubcf8\uc740 \ud0a4 \ud504\ub808\uc784\uc758 \uc2dc\uc791\uacfc \ud568\uaed8 \uc810\uc9c4\uc801\uc73c\ub85c \ubaa8\uc591\uacfc \uc0c9 \ubcc0\ud654\uc5d0 \uc801\uc751\ub429\ub2c8\ub2e4. -AutoTracker.Info.Mask2=\uc790\ub3d9 \ucc3e\uae30\ub97c \ud558\uae30 \uc704\ud574\uc11c\ub294 \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc774 \ub300\uc0c1\uacfc \uc77c\uce58\ud558\ub294 \ucd5c\uc18c\uac12\uc774 \ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. -AutoTracker.Info.Mask.Instructions=\ubaa8\uc11c\ub9ac \ub610\ub294 \uac00\uc7a5\uc790\ub9ac \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \uacac\ubcf8\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc758 \ub2e8\ucd94\ub97c \ub20c\ub7ec\uc11c \ubcc0\ud654\uc728\uacfc \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc744 \uc870\uc815\ud569\ub2c8\ub2e4. -AutoTracker.Info.Mask.Tip=\uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc774 \uc791\uc73c\uba74 \ucc3e\uae30 \ub300\uc0c1\uc774 \uc798\ubabb \uc77c\uce58\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\ub294 \ub300\uc2e0\uc5d0 \ubcc0\ud654\uc728\uc744 \ub192\uc785\ub2c8\ub2e4. -AutoTracker.Info.Search=\ucd5c\uc801\uc758 \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc870\uc0ac\ud569\ub2c8\ub2e4.. -AutoTracker.Info.SearchOnAxis=\ucd5c\uc801\uc758 \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc758 x \ucd95\uc744 \uc870\uc0ac\ud569\ub2c8\ub2e4. -AutoTracker.Info.Search.Instructions=\ubaa8\uc11c\ub9ac \ub610\ub294 \uac00\uc7a5\uc790\ub9ac \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. x \ucd95\uacfc \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. -AutoTracker.Info.Search.Tip=\ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \ucc3e\uae30 \uc601\uc5ed\uc774 \ud074 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc740 \uc790\ub3d9\uc73c\ub85c \ub2e4\uc74c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc608\uce21\ud558\uc5ec \uc774\ub3d9\uc2dc\ucf1c \uc90d\ub2c8\ub2e4. -AutoTracker.Info.Target=\ucc3e\uae30 \ubaa9\ud45c\ub294 \ud2b8\ub799\uacfc \ub300\uc0c1\uc785\ub2c8\ub2e4. -AutoTracker.Info.Target.Instructions=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \ub300\uc0c1\uc744 \uc62e\uae41\ub2c8\ub2e4 (\ud0a4 \ud504\ub808\uc784). \ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc758 \ubaa9\ub85d\uc5d0\uc11c \ucc3e\uae30 \ubaa9\ud45c\uc758 \ud2b8\ub799\uacfc \ub300\uc0c1\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. -AutoTracker.Info.Title.Settings=\uc124\uc815 -AutoTracker.Info.Title.Tip=\ub3c4\uc6c0\ub9d0 -AutoTracker.Info.SelectTrack=\uc790\ub3d9\uc73c\ub85c \ucc3e\uae30 \uc704\ud574\uc11c \ud2b8\ub799\uacfc \ub300\uc0c1\uc744 \uc120\ud0dd\ud558\uac70\ub098 \ub9cc\ub4ed\ub2c8\ub2e4. -AutoTracker.Info.OutsideXAxis=x \ucd95\uc774 \ucc3e\uae30 \uc601\uc5ed \ubc16\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \uc635\uc158: -AutoTracker.Info.NewKeyFrame= - \uc2a4\ud15d\uc744 \ub4a4\ub85c \ub3cc\ub824\uc11c \ubcc0\ud654\uc728\uc744 \ubcc0\uacbd\ud558\uac70\ub098 Shift \ud0a4\ub97c \ub20c\ub7ec\uc11c \uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. -AutoTracker.Info.Replace= - \uc77c\uce58 \uacb0\uacfc\ub97c \uc801\uc6a9\ud558\uace0 \uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \ub300\uccb4\ud569\ub2c8\ub2e4. -AutoTracker.Info.Keep= - \uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \uadf8\ub300\ub85c \uc720\uc9c0\ud569\ub2c8\ub2e4. -AutoTracker.Info.PossibleReplace=\uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \ubc14\uafc0 \uc218 \uc788\ub294 \uc77c\uce58 \ub300\uc0c1\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4. \uc635\uc158: -AutoTracker.Wizard.Button.Accept=\uc801\uc6a9 -AutoTracker.Wizard.Button.Stop=\uba48\ucda4 -AutoTracker.Wizard.Button.Skip=\uac74\ub108\ub6f0\uae30 -AutoTracker.Wizard.Button.Replace=\ubc14\uafb8\uae30 -AutoTracker.Wizard.Button.Keep=\uadf8\ub300\ub85c \ub450\uae30 -AutoTracker.Wizard.Button.Search=\ucc3e\uae30 -AutoTracker.Wizard.Button.SearchThis=\uc5ec\uae30 -AutoTracker.Wizard.Button.SearchNext=\ub2e4\uc74c -AutoTracker.Wizard.Button.Delete=\uc0ad\uc81c -AutoTracker.Wizard.Button.ShowKeyFrame=\ud0a4 \ud504\ub808\uc784 \ubcf4\uae30 -AutoTracker.Wizard.Button.DeleteKeyFrame=\ud0a4 \ud504\ub808\uc784 \uc0ad\uc81c -AutoTracker.Wizard.Checkbox.LookAhead=\ubbf8\ub9ac\ubcf4\uae30 -AutoTracker.Wizard.Checkbox.XAxis=X-\ucd95\ub9cc -AutoTracker.Wizard.Menuitem.DeleteThis=\uc774 \uc2a4\ud15d -AutoTracker.Wizard.Menuitem.DeleteLater=\uc774 \ub4a4\uc758 \ubaa8\ub4e0 \uc2a4\ud15d -AutoTracker.Wizard.Menuitem.DeleteAll=\ubaa8\ub4e0 \uc2a4\ud15d -TToolBar.Button.AutoTracker.Tooltip=\uc790\ub3d9 \ucc3e\uae30 \ubcf4\uac70\ub098 \uac10\ucd94\uae30 -MainTView.Popup.MenuItem.ZoomIn=\ud655\ub300 -MainTView.Popup.MenuItem.ZoomOut=\ucd95\uc18c -MainTView.Popup.MenuItem.ZoomToFit=\ud654\uba74\uc5d0 \ub9de\ucda4 -TrackerIO.Dialog.DurationVaries.Title=\ud504\ub808\uc784 \uc2dc\uac04 \uae38\uc774 \ub2e4\ub984 -TrackerIO.Dialog.DurationVaries.Message1=\uc774 \ube44\ub514\uc624\ub294 \ud3c9\uade0 \ubc94\uc704 \uc774\uc0c1\uc758 \ub2e4\ub978 \uc2dc\uac04 \uae38\uc774\uc758 \ud504\ub808\uc784\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \ubc94\uc704: -TrackerIO.Dialog.DurationVaries.Message2=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4 \ubd84\uc11d\uc744 \uc704\ud574 \ube44\ub514\uc624\uc758 \uc2dc\uc791 \ud504\ub808\uc784\uacfc -TrackerIO.Dialog.DurationVaries.Message3=\ub05d \ud504\ub808\uc784 \uc124\uc815\uc744 \ud1b5\ud55c \uacc4\uc0b0\uc5d0\uc11c \uc774 \ud504\ub808\uc784\uc744 \ucd94\ucd9c\ud574\uc57c \ud569\ub2c8\ub2e4. -TrackerIO.Dialog.DurationVaries.Message4=\ucd94\ucd9c\ud560 \ud504\ub808\uc784: -TrackerIO.Dialog.DurationVaries.Message5=\ucd94\ucd9c\ub41c \ud6c4 \ud504\ub808\uc784 \ud3c9\uade0 \uae38\uc774\uc640 \uc18d\ub3c4: -TFrame.Dialog.LibraryError.Title=\uc624\ub958 -TFrame.Dialog.LibraryError.Message=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c \uc790\ub8cc\ub97c \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=Shift \ud0a4 \ub20c\ub7ec\uc11c \ud45c\uc2dc -PrefsDialog.Label.Path=\uacbd\ub85c -PrefsDialog.Checkbox.ClearCacheOnExit=\ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\ud560 \ub54c \uc9c0\uc6c0 -PrefsDialog.FileChooser.Title.Cache=\uce90\uc2dc \uc124\uc815 -PrefsDialog.FileFilter.Directories=\ub514\ub809\ud130\ub9ac -Tracker.Action.AboutThreads= Thread \uc815\ubcf4... -PrefsDialog.JRE.BorderTitle=Java \uac00\uc0c1 \uba38\uc2e0 -PrefsDialog.FileChooser.Title.JRE=Java VM \uc124\uc815 -PrefsDialog.FileFilter.JRE=\ub514\ub809\ud130\ub9ac\uc640 Java VMs -PrefsDialog.Version.BorderTitle=Tracker \ubc84\uc804 -PrefsDialog.Version.Default=\uae30\ubcf8 \uc124\uc815 -PrefsDialog.Tab.ClearCacheOnExit=\ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\ud560 \ub54c \uc9c0\uc6c0 -PrefsDialog.Run.BorderTitle=\uc2dc\uc791\ud560 \ub54c \uc2e4\ud589\ud560 \ud504\ub85c\uadf8\ub7a8 -PrefsDialog.FileChooser.Title.Run=\uc2e4\ud589 \ud30c\uc77c \uc120\ud0dd -PrefsDialog.Button.Save=\uc800\uc7a5 -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c -Popup.MenuItem.Algorithm=\uc54c\uace0\ub9ac\ub4ec... -AlgorithmDialog.Button.FiniteDifference=\uad6c\uac04 \ubcc0\ud654\uc728 \uacc4\uc0b0 -AlgorithmDialog.Button.BounceDetect=\ubd80\ub4dc\ub7ec\uc6b4 \ucd94\uc138 \uadfc\uc0ac -AlgorithmDialog.TitledBorder.Choose=\uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4 \ubd84\uc11d\uc744 \uc704\ud574 \uc0ac\uc6a9\ud560 \uc54c\uace0\ub9ac\ub4ec \uc120\ud0dd: -AlgorithmDialog.Title=\uc54c\uace0\ub9ac\ub4ec -AlgorithmDialog.FiniteDifference.Message1=\uae30\ubcf8 \uc54c\uace0\ub9ac\ub4ec\uc73c\ub85c Finite Difference \ub97c \ud65c\uc6a9\ud569\ub2c8\ub2e4. -AlgorithmDialog.FiniteDifference.Message2=\uc18d\ub3c4: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=\uac00\uc18d\ub3c4: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=\uc774 Bounce Detection \uc54c\uace0\ub9ac\ub4ec\uc740 \uae09\uaca9\ud55c \uc18d\ub3c4 \ubcc0\ud654 \uad6c\uac04\uc744 \uac10\uc9c0\ud558\uba70 \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4\uc758 \ucd94\uc138\ub97c \ubd84\uc11d\ud558\uc5ec \ub370\uc774\ud130\uac00 \ud280\uc9c0 \uc54a\ub3c4\ub85d \ucd94\uc138\uc5d0 \ub9de\uac8c \ubd80\ub4dc\ub7fd\uac8c \uadf8\ub824\uc90d\ub2c8\ub2e4. -AlgorithmDialog.BounceDetect.Message2=\uc8fc\uc758: \uc774 \ubd84\uc11d\uc758 \uacb0\uacfc\ub294 \uc2e4\ud5d8 \uc0c1\ud669\uc5d0 \ub530\ub77c \uc720\uc758\ubbf8\ud558\uc9c0 \uc54a\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc54c\uace0\ub9ac\ub4ec\uc5d0 \ub300\ud55c \uc815\ubcf4: -TMenuBar.Menu.Diagnostics=\ud504\ub85c\uadf8\ub7a8 \uc815\ubcf4 - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 XML -Tracker.Dialog.Invalid.Message=\ud30c\uc77c\uc744 \uc77d\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -TrackPlottingPanel.Popup.Menu.CompareWith=\uc0bd\uc785 -TrackerPanel.DataBuilder.TrackType.Unknown=\ube48 \ud2b8\ub799 -TrackerPanel.DataBuilder.Button.Load.Tooltip=XML \ud30c\uc77c\ub85c\ubd80\ud130 \ub370\uc774\ud130 \uc218\uc2dd \ubd88\ub7ec\uc624\uae30 -TrackerPanel.DataBuilder.Button.Save.Tooltip=XML \ud30c\uc77c\ub85c \ub370\uc774\ud130 \uc218\uc2dd \uc800\uc7a5\ud558\uae30 -TrackerPanel.DataBuilder.Load.Title=\ub370\uc774\ud130 \uc218\uc2dd \ubd88\ub7ec\uc624\uae30 -TrackerPanel.DataBuilder.Load.Message=\ubd88\ub7ec\uc62c \uc218\uc2dd \uc120\ud0dd: -TrackerPanel.DataBuilder.Save.Title=\ub370\uc774\ud130 \uc218\uc2dd \uc800\uc7a5\ud558\uae30 -TrackerPanel.DataBuilder.Save.Message=\uc800\uc7a5\ud560 \uc218\uc2dd \uc120\ud0dd: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=\ubaa8\ub4e0 \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc624\uae30 -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=\ub2e4\uc74c \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc624\uae30: -TrackerPanel.DataBuilder.Dialog.Load.Title=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 -TrackerPanel.DataBuilder.Dialog.Load.Message=\ubaa8\ub4e0 \uc720\ud615\uc758 \ud2b8\ub799\uc73c\ub85c \uc218\uc2dd\uc744 \ubd88\ub7ec\uc62c\uae4c\uc694? -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=\uc798\ubabb\ub41c \ud2b8\ub799 \uc720\ud615 -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=\ud30c\uc77c\uc5d0\uc11c \ud2b8\ub799 \uc720\ud615\uc73c\ub85c \ub370\uc774\ud130 \uc218\uc2dd\uc744 \uc815\uc758\ud558\uc600\uc73c\ub098 -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=\uc218\uc2dd\uc744 \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -TrackerPanel.DataBuilder.Dialog.WrongType.Title=\uc798\ubabb\ub41c \ud2b8\ub799 \uc720\ud615 -TrackerPanel.DataBuilder.Dialog.WrongType.Message=\ub370\uc774\ud130 \uc218\uc2dd\uc744 \uc815\uc758\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. -TToolbar.Button.Refresh=\ub370\uc774\ud130\uc640 \ud654\uba74\uc744 \uc0c8\ub85c\uace0\uce68 - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=\uc0c8 \ubb38\uc11c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4... -ExportTRKDialog.Complete.Message2=Tracker \uc5d0\uc11c \uc9c0\uae08 \uc5f4\uae4c\uc694? -ExportTRKDialog.Complete.Title=\ubcf4\ub0b4\uae30 \uc644\ub8cc -ExportTRKDialog.Title=\ubcf4\ub0b4\uae30 -ExportTRKDialog.Message1=\ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\ub0b4\uae30 \uc791\uc5c5\uc744 \ud569\ub2c8\ub2e4: (1) \ube44\ub514\uc624 \ud074\ub9bd \ubcf4\ub0b4\uae30, (2) \ubcf4\ub0b8 \ube44\ub514\uc624\uc5d0 \ub9de\uac8c \ubb38\uc11c \ub370\uc774\ud130 \ubcc0\ud658\ud558\uae30, \uadf8\ub9ac\uace0 (3) \uc0c8 Tracker \ud30c\uc77c\ub85c \ubcc0\ud658\ub41c \ubb38\uc11c\ub97c \uc800\uc7a5\ud558\uae30 -ExportTRKDialog.Message2=Tracker \ubb38\uc11c \ud30c\uc77c\uacfc \ube44\ub514\uc624 \ud30c\uc77c\uc774 \uac19\uc740 \ud3f4\ub354 \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4. -TMenuBar.MenuItem.TabClip=\ubb38\uc11c -TrackerIO.Dialog.DurationVaries.Button.SetClip=\uad8c\uc7a5 \ud074\ub9bd \uc124\uc815 -TrackerIO.Dialog.DurationVaries.Start=\uc2dc\uc791 -TrackerIO.Dialog.DurationVaries.End=\ub05d -TrackerIO.Dialog.DurationVaries.Recommended=\uad8c\uc7a5 \ud074\ub9bd -TMenuBar.Menu.CalibrationTools=\uad50\uc815 \ub3c4\uad6c - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=\ub05d \ubd99\uc774\uae30 -AttachmentInspector.Label.End=\ub05d -AttachmentInspector.Label.Vertex=\uc815\uc810 -AttachmentInspector.Header.PointName=\uc774\ub984 -AttachmentInspector.Header.AttachedTo=\ubd99\uc774\uae30: -ExportTRKDialog.Label.VideoFormat=\ube44\ub514\uc624 \ud615\uc2dd -MeasuringTool.MenuItem.Attach=\ub05d \ubd99\uc774\uae30... -PerspectiveTrack.Corner=\ubaa8\uc11c\ub9ac -PrefsDialog.LogLevel.BorderTitle=\uc2dc\uc791 \uba54\uc2dc\uc9c0 \ub85c\uadf8 -Protractor.Data.Description.0=\uc2dc\uac04 -Protractor.Data.Description.1=\uac01 -Protractor.Data.Description.2=\ud314 \uae38\uc774 1 -Protractor.Data.Description.3=\ud314 \uae38\uc774 2 -Protractor.Data.Description.4=\uc2a4\ud15d \ubc88\ud638 -Protractor.Data.Description.5=\ud504\ub808\uc784 \ubc88\ud638 -TapeMeasure.Data.Description.0=\uc2dc\uac04 -TapeMeasure.Data.Description.1=\uae38\uc774 -TapeMeasure.Data.Description.2=+x\ucd95\uc5d0\uc11c \uce21\uc815\ud55c \uac01 -TapeMeasure.Data.Description.3=\uc2a4\ud15d \ubc88\ud638 -TapeMeasure.Data.Description.4=\ud504\ub808\uc784 \ubc88\ud638 - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=\ucc3e\uc9c0 \uc54a\uc74c -AutoTracker.Info.KeyFrame=\ud0a4 \ud504\ub808\uc784 -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=\uc774 \ud0a4 \ud504\ub808\uc784 -AutoTracker.Wizard.Menuitem.DeleteThisMatch= \uc774 \uc77c\uce58 \ub300\uc0c1 -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=\ub098\uc911 \uc77c\uce58 \ub300\uc0c1 -PrefsDialog.Checkbox.64BitVM=64-\ube44\ud2b8 - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=\uc790\ub3d9 \ucc3e\uae30 -Dialog.Button.Add=\ucd94\uac00 -Dialog.Button.Remove=\uc81c\uac70 -PrefsDialog.Button.ClearHost=\uc9c0\uc6b0\uae30 -PrefsDialog.Button.ClearHost.Tooltip=OSP \uce90\uc2dc\uc5d0\uc11c \uc6f9 \uc0ac\uc774\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uce90\uc2dc \ud30c\uc77c\uc744 \uc9c0\uc6c0 -PrefsDialog.Button.ClearCache.Tooltip=OSP \uce90\uc2dc\uc5d0\uc11c \ubaa8\ub4e0 \uce90\uc2dc \ud30c\uc77c\uc744 \uc9c0\uc6c0 -TActions.Action.SaveZip=\uc555\ucd95 (zip) \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 -ThumbnailDialog.Title=\ubbf8\ub9ac\ubcf4\uae30 \uadf8\ub9bc \ubcf4\ub0b4\uae30 -ThumbnailDialog.Settings.Title=\ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158 -ThumbnailDialog.Label.CurrentImage=\ud604\uc7ac \uadf8\ub9bc -ThumbnailDialog.Label.FrameNumber=\ud504\ub808\uc784 -ThumbnailDialog.Label.StepNumber=\uc2a4\ud15d -ThumbnailDialog.View.VideoOnly=\ube44\ub514\uc624\ub9cc -ThumbnailDialog.View.MainView=\uc791\uc5c5 \ucc3d -ThumbnailDialog.View.WholeFrame=\ubaa8\ub4e0 \ud504\ub808\uc784 -ThumbnailDialog.Format.PNG=PNG \uadf8\ub9bc -ThumbnailDialog.Format.JPG=JPEG \uadf8\ub9bc -ThumbnailDialog.Chooser.SaveThumbnail.Title=\ubbf8\ub9ac\ubcf4\uae30 \uc800\uc7a5 -ThumbnailDialog.Subtitle.Image=\uadf8\ub9bc -TMenuBar.MenuItem.Thumbnail=\ubbf8\ub9ac\ubcf4\uae30 \uadf8\ub9bc -TToolBar.Button.SaveZip.Tooltip=OSP \ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc555\ucd95 \ud30c\uc77c \ubcf4\ub0b4\uae30 -TTrack.MenuItem.DeletePoint=\uc120\ud0dd\ud55c \uc2a4\ud15d \uc0ad\uc81c -ZipResourceDialog.Title=\uc555\ucd95 (zip) \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 -ZipResourceDialog.Label.Format=\ud615\uc2dd -ZipResourceDialog.Label.Title=\uc774\ub984 -ZipResourceDialog.Label.Description=\uc124\uba85 -ZipResourceDialog.Label.Keywords=\uc8fc\uc81c\uc5b4 -ZipResourceDialog.Label.Link=\uc678\ubd80 \ub9c1\ud06c -ZipResourceDialog.Label.HTML=HTML \uc6d0\ubcf8 -ZipResourceDialog.Complete.Message1=\uc555\ucd95 \ud30c\uc77c\ub85c \uc800\uc7a5\ub428: -ZipResourceDialog.Complete.Message2=\uc9c0\uae08 Tracker \uc5d0\uc11c \uc5f4\uae4c\uc694? -ZipResourceDialog.Complete.Title=\uc644\ub8cc -ZipResourceDialog.Border.Title.Documentation=HTML \ubb38\uc11c -ZipResourceDialog.Border.Title.Video=\ube44\ub514\uc624 -ZipResourceDialog.Border.Title.Thumbnail=\ubbf8\ub9ac\ubcf4\uae30 -ZipResourceDialog.FileChooser.SaveZip.Title=\uc555\ucd95 \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 -ZipResourceDialog.FileChooser.AddFile.Title=\uc555\ucd95 \ud30c\uc77c\uc5d0 \ud30c\uc77c \ucd94\uac00 -ZipResourceDialog.FileChooser.OpenHTML.Title=HTML \ud30c\uc77c \uc5f4\uae30 -ZipResourceDialog.Button.AddFiles=\ud30c\uc77c \ucd94\uac00 -ZipResourceDialog.Button.ThumbnailSettings=\ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158 -ZipResourceDialog.Checkbox.TrimVideo=\ube44\ub514\uc624 \ud074\ub9bd \ubcf4\ub0b4\uae30 -ZipResourceDialog.AddHTMLInfo.Title=HTML \uc815\ubcf4 \ud30c\uc77c \ucd94\uac00 -ZipResourceDialog.AddHTMLInfo.Message1=\uc555\ucd95 (zip) \ud30c\uc77c\uc5d0 HTML \uc815\ubcf4 \ud30c\uc77c\uc744 \ucd94\uac00\ud560\uae4c\uc694? -ZipResourceDialog.AddHTMLInfo.Message2= -ZipResourceDialog.HTMLField.DefaultText=HTML \uc6d0\ubcf8 \ud30c\uc77c (\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc9d0) -ZipResourceDialog.Dialog.AddFiles.Title=HTML \ub610\ub294 PDF \ud30c\uc77c \ucd94\uac00 -ZipResourceDialog.Tooltip.HTML=HTML \uc6d0\ubcf8 \ud30c\uc77c \uacbd\ub85c\ub97c \ud30c\uc77c \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uc124\uc815\ud568 (\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc9d0) -ZipResourceDialog.Tooltip.Author=\uc774 \uc790\ub8cc\uc758 \uc9c0\uc740\uc774 -ZipResourceDialog.Tooltip.Title=\uc774 \uc790\ub8cc\uc758 \uc774\ub984 -ZipResourceDialog.Tooltip.Description=\uc774 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc720\uc6a9\ud55c \uc124\uba85 -ZipResourceDialog.Tooltip.Keywords=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c \ucc3e\uc744 \uac80\uc0c9\uc5b4 \ubaa9\ub85d -ZipResourceDialog.Tooltip.Contact=\uc9c0\uc740\uc774 \uc5f0\ub77d\ucc98 -ZipResourceDialog.Tooltip.Link=\uc774 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc678\ubd80 \ub9c1\ud06c HTML \ud30c\uc77c\uc758 URL -ZipResourceDialog.Tooltip.ThumbnailSettings=\ubbf8\ub9ac\ubcf4\uae30\uc758 \ud06c\uae30\ub098 \ud30c\uc77c \ud615\uc2dd\uc744 \ubcc0\uacbd -ZipResourceDialog.Tooltip.AddFiles=HTML \ub610\ub294 PDF \ud30c\uc77c\uc744 \uc555\ucd95 \ud30c\uc77c\uc5d0 \ucd94\uac00 -ZipResourceDialog.Tooltip.TrimVideo=\ube44\ub514\uc624 \ud074\ub9bd\uc744 \ub2e4\ub978 \ud615\uc2dd\uc73c\ub85c \ubcf4\ub0b4\ub824\uba74 \uc120\ud0dd, \uc6d0\ubcf8 \ube44\ub514\uc624\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ud574\uc81c -ZipResourceDialog.Tooltip.LoadHTML=\ud30c\uc77c \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c HTML \ud30c\uc77c\uc744 \uc120\ud0dd\ud558\uc5ec \ubd88\ub7ec\uc634 +# This is the Korean tracker.properties file +# Translation by Hyunsoo Kim 2012 + +Calibration.Name=\uad50\uc815 \uc810 +Calibration.New.Name=\uad50\uc815 \uc810 +CenterOfMass.Name=\uc9c8\ub7c9\uc911\uc2ec +CenterOfMass.New.Name=\uc9c8\ub7c9\uc911\uc2ec +CenterOfMass.MenuItem.Inspector=\ubb3c\uccb4 \uc120\ud0dd\ud558\uae30... +CenterOfMassInspector.Title=\uc9c8\ub7c9\uc911\uc2ec +CenterOfMassInspector.Border.Title=\ubb3c\uccb4 +ConfigInspector.Border.Title=\uc120\ud0dd \ud56d\ubaa9 +ConfigInspector.Title=\uc635\uc158 +ConfigInspector.Button.SaveAsDefault=\uae30\ubcf8 \uc124\uc815\uc73c\ub85c +CoordAxes.Name=\ucd95 +CoordAxes.New.Name=\ucd95 +Dialog.Button.Cancel=\ucde8\uc18c +Dialog.Button.OK=\ud655\uc778 +Dialog.Button.Close=\ub2eb\uae30 +Dialog.Button.All=\ubaa8\ub450 \uc120\ud0dd +Dialog.Button.None=\ubaa8\ub450 \ud574\uc81c +Dialog.Button.Copy=\ubcf5\uc0ac +Dialog.Button.Update=\uc5c5\ub370\uc774\ud2b8 +Dialog.Button.SelectAll=\ubaa8\ub450 \uc120\ud0dd +Footprint.Diamond=\ub9c8\ub984\ubaa8 +Footprint.BoldDiamond=\uad75\uc740 \ub9c8\ub984\ubaa8 +Footprint.SolidDiamond=\uc18d\uc774 \ucc2c \ub9c8\ub984\ubaa8 +Footprint.Triangle=\uc0bc\uac01\ud615 +Footprint.BoldTriangle=\uad75\uc740 \uc0bc\uac01\ud615 +Footprint.SolidTriangle=\uc18d\uc774 \ucc2c \uc0bc\uac01\ud615 +Footprint.Circle=\uc6d0 +Footprint.BoldCircle=\uad75\uc740 \uc6d0 +Footprint.SolidCircle=\uc18d\uc774 \ucc2c \uc6d0 +Footprint.VerticalLine=\uc218\uc9c1 \uc120 +Footprint.BoldVerticalLine=\uad75\uc740 \uc218\uc9c1\uc120 +Footprint.HorizontalLine=\uc218\ud3c9\uc120 +Footprint.BoldHorizontalLine=\uad75\uc740 \uc218\ud3c9\uc120 +Footprint.Crosshair=\uc2ed\uc790\uc120 +Footprint.BoldCrosshair=\uad75\uc740 \uc2ed\uc790\uc120 +Footprint.SimpleAxes=\uac00\ub294 \ucd95 +Footprint.BoldSimpleAxes=\uad75\uc740 \ucd95 +Footprint.Spot=\uc810 +Footprint.Line=\uc120 +Footprint.BoldLine=\uad75\uc740 \uc120 +Footprint.Outline=\uc724\uacfd\uc120 +Footprint.BoldOutline=\uad75\uc740 \uc724\uacfd\uc120 +Footprint.Arrow=\ud654\uc0b4\ud45c +Footprint.BoldArrow=\uad75\uc740 \ud654\uc0b4\ud45c +Footprint.DoubleArrow=\uc591\ucabd \ud654\uc0b4\ud45c +Footprint.BoldDoubleArrow=\uad75\uc740 \uc591\ucabd \ud654\uc0b4\ud45c +Footprint.2xArrow=2x \ud654\uc0b4\ud45c +Footprint.Bold2xArrow=\uad75\uc740 2x \ud654\uc0b4\ud45c +Footprint.4xArrow=4x \ud654\uc0b4\ud45c +Footprint.Bold4xArrow=\uad75\uc740 4x \ud654\uc0b4\ud45c +Footprint.DashArrow=\uc810\uc120 \ud654\uc0b4\ud45c +Footprint.BoldDashArrow=\uad75\uc740 \uc810\uc120 \ud654\uc0b4\ud45c +Footprint.BigArrow=\ud070 \ud654\uc0b4\ud45c +Footprint.BigDashArrow=\ud070 \uc810\uc120 \ud654\uc0b4\ud45c +LineProfile.Name=\uc120 \ud504\ub85c\ud30c\uc77c +LineProfile.New.Name=\ud504\ub85c\ud30c\uc77c +LineProfile.Data.Brightness=\ubc1d\uae30 +LineProfile.Data.Pixel=\ud53d\uc140 +LineProfile.Data.Red=\uc801\uc0c9 +LineProfile.Data.Green=\ub179\uc0c9 +LineProfile.Data.Blue=\uccad\uc0c9 +LineProfile.Data.Weighting=\uac12 +MainTView.Popup.MenuItem.QTPlayer=QuickTime \ud50c\ub808\uc774\uc5b4 +MainTView.Popup.MenuItem.Zoom=\ud654\uba74 \ud655\ub300/\ucd95\uc18c +MainTView.Popup.MenuItem.ToFit=\ud654\uba74\uc5d0 \ub9de\ucda4 +OffsetOrigin.Name=\uc88c\ud45c \uc774\ub3d9 +OffsetOrigin.New.Name=\uc88c\ud45c \uc774\ub3d9 +PlotTrackView.Button.PlotCount=\uadf8\ub798\ud504 +PlotTrackView.Button.PlotCount.ToolTip=\uadf8\ub798\ud504 \uc218 +PointMass.Name=\uc9c8\uc810 +PointMass.New.Name=\uc9c8\uc810 +PointMass.MenuItem.VectorsToPosition=\uc704\uce58\uc5d0 \ub9de\ucda4 +PointMass.MenuItem.Velocity=\uc18d\ub3c4 +PointMass.MenuItem.Acceleration=\uac00\uc18d\ub3c4 +Star.Name=\ubcc4 +Star.New.Name=\ubcc4 +TableTrackView.Action.CopyData=\ub370\uc774\ud130 \ubcf5\uc0ac +TableTrackView.Button.SelectTableData=\ub370\uc774\ud130 +TableTrackView.Button.SelectTableData.ToolTip=\ub370\uc774\ud130 \uad6c\uc131 \uc694\uc18c +TableTrackView.Popup.MenuItem.Analyze=\ubd84\uc11d... +TableTrackView.Dialog.Border.Title=\ubcf4\uae30: +TActions.Action.Description=\ub178\ud2b8 +TActions.Action.ClearTracks=\uc9c0\uc6b0\uae30 +TActions.Action.NewTab=\uc0c8 \ubb38\uc11c +TActions.Action.Copy=\ubcf5\uc0ac +TActions.Action.Paste=\ubd99\uc774\uae30... +TActions.Action.Open=\uc5f4\uae30... +TActions.Action.Close=\ubb38\uc11c \ub2eb\uae30 +TActions.Action.Import=\ubd88\ub7ec\uc624\uae30... +TActions.Action.Save=\uc800\uc7a5 +TActions.Action.SaveAs=\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \uc800\uc7a5... +TActions.Action.Export=\ubcf4\ub0b4\uae30... +TActions.Action.CaptureVideo=\ube44\ub514\uc624 \ucea1\ucc98... +TActions.Action.Delete=\uc0ad\uc81c +TActions.Action.Config=\uc635\uc158... +TActions.Action.AxesVisible=\ubcf4\uae30 +TActions.Action.TapeVisible=\ubcf4\uae30 +TActions.Action.Print=\uc778\uc1c4... +TActions.Action.ClearFilters=\uc9c0\uc6b0\uae30 +TActions.Action.ImportVideo=\ubd88\ub7ec\uc624\uae30... +TActions.Action.CloseVideo=\ub2eb\uae30 +TActions.Action.CloseAll=\ubaa8\ub450 \ub2eb\uae30 +TActions.Action.Exit=\ub05d +TActions.Dialog.PrintError.Message=\uc778\uc1c4 \uc624\ub958\uc785\ub2c8\ub2e4. +TActions.Dialog.PrintError.Title=\uc778\uc1c4 \uc624\ub958 +TActions.Dialog.Description.Title=\ub178\ud2b8: +TActions.Dialog.DeleteLockedTracks.Message=\ud2b8\ub799\uc774 \uc7a0\uaca8 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub798\ub3c4 \uc0ad\uc81c\ud560\uae4c\uc694? +TActions.Dialog.DeleteLockedTracks.Title=\uc7a0\uae34 \ud2b8\ub799\uc744 \uc0ad\uc81c\ud560\uae4c\uc694? +TActions.Dialog.NewPointMass.Title=\uc0c8 \uc9c8\uc810 +TapeMeasure.Name=\uc904\uc790 +TapeMeasure.New.Name=\uc904\uc790 +TapeMeasure.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 +TFrame.View.Plot=\uadf8\ub798\ud504 +TFrame.View.Table=\ub370\uc774\ud130 +TFrame.View.World=\uc6d4\ub4dc \ubdf0 +TFrame.View.Video=\ube44\ub514\uc624 +TFrame.Dialog.Help.Title=Tracker \ub3c4\uc6c0\ub9d0 +TMenuBar.Menu.File=\ud30c\uc77c +TMenuBar.Menu.Edit=\ud3b8\uc9d1 +TMenuBar.Menu.Video=\ube44\ub514\uc624 +TMenuBar.Menu.Tracks=\ud2b8\ub799 +TMenuBar.Menu.Coords=\uc88c\ud45c +TMenuBar.Menu.Window=\ucc3d +TMenuBar.Menu.Help=\ub3c4\uc6c0\ub9d0 +TMenuBar.MenuItem.EditProperties=\uc18d\uc131... +TMenuBar.MenuItem.VideoVisible=\ubcf4\uae30 +TMenuBar.MenuItem.VideoFilters=\ud544\ud130 +TMenuBar.MenuItem.NewVideoFilter=\uc0c8 \ud544\ud130 +TMenuBar.MenuItem.NewTrack=\uc0c8 \ud2b8\ub799 +TMenuBar.MenuItem.CoordsLocked=\uc7a0\uae08 +TMenuBar.MenuItem.CoordsFixedOrigin=\uc6d0\uc810 \uace0\uc815 +TMenuBar.MenuItem.CoordsFixedAngle=\uac01 \uace0\uc815 +TMenuBar.MenuItem.CoordsFixedScale=\ub208\uae08 \uace0\uc815 +TMenuBar.MenuItem.CoordsRefFrame=\uae30\uc900\ud2c0 +TMenuBar.MenuItem.CoordsDefault=\uce74\uba54\ub77c \ubdf0 +TMenuBar.MenuItem.WindowRight=\uc624\ub978\ucabd \ucc3d +TMenuBar.MenuItem.WindowBottom=\uc544\ub798\ucabd \ucc3d +TMenuBar.MenuItem.PlayAllSteps=\uc2a4\ud15d \ubaa8\ub450 \ubcf4\uae30 +TMenuBar.MenuItem.Record=\ub179\ud654 +TMenuBar.MenuItem.MatSize=\ud574\uc0c1\ub3c4 +TMenuBar.MenuItem.Language=\uc5b8\uc5b4 +TMenuBar.MenuItem.DeleteTrack=\uc0ad\uc81c +TMenuBar.MenuItem.TrackerHelp=Tracker \ub3c4\uc6c0\ub9d0... +TMenuBar.MenuItem.MessageLog=\uba54\uc2dc\uc9c0 \ub85c\uadf8... +TrackControl.Name=\ud2b8\ub799 \ucee8\ud2b8\ub864 +TrackControl.Button.NewTrack=\uc0c8 \ud2b8\ub799 +TrackControl.Button.NewTrack.ToolTip=\uc0c8 \ud2b8\ub799 \ub9cc\ub4e4\uae30 +TrackControl.Button.Trails.ToolTip=\uc2a4\ud15d \uc790\ucde8 \uc124\uc815\ud558\uae30 +TrackControl.Button.Labels.ToolTip=\uc2a4\ud15d \ubc88\ud638 \ubcf4\uae30/\uac10\ucd94\uae30 +TrackControl.Button.StretchVectors.ToolTip=\ubca1\ud130 \ub298\ub9ac\uae30 +TrackControl.Button.Accelerations.ToolTip=\uac00\uc18d\ub3c4 \ubca1\ud130 \ubcf4\uae30/\uac10\ucd94\uae30 +TrackControl.Button.Xmass.ToolTip=\ubca1\ud130\uc5d0 \uc9c8\ub7c9 \uacf1\ud558\uae30 +TrackControl.Button.Vectors.ToolTip=\ubca1\ud130 +TrackControl.Button.Velocities.ToolTip=\uc18d\ub3c4 \ubca1\ud130 \ubcf4\uae30/\uac10\ucd94\uae30 +TrackControl.Button.Properties.ToolTip=\uc18d\uc131 \uc120\ud0dd\ud558\uae30 +TrackControl.Button.Positions.ToolTip=\uc704\uce58 \ubcf4\uae30/\uac10\ucd94\uae30 +Tracker.Popup.MenuItem.Snapshot=\uc2a4\ub0c5\uc0f7... +Tracker.Popup.MenuItem.Help=\ub3c4\uc6c0\ub9d0... +Tracker.Cursor.Crosshair.Description=\uc2ed\uc790\uc120 +Tracker.Action.AboutTracker=Tracker \uc815\ubcf4... +Tracker.Dialog.AboutTracker.Title=Tracker \uc815\ubcf4 +Tracker.Action.AboutJava=Java \uc815\ubcf4... +Tracker.Dialog.AboutJava.Title=Java \uc815\ubcf4 +Tracker.Dialog.AboutJava.UnknownVersion=\uc54c \uc218 \uc5c6\uc74c +Tracker.Dialog.AboutJava.Message=Java \ubc84\uc804 +Tracker.Action.AboutQT=QuickTime \uc815\ubcf4... +Tracker.Dialog.AboutQT.Title=QuickTime \uc815\ubcf4 +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime \ubc84\uc804 +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava \ubc84\uc804 +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava \uacbd\ub85c: +Tracker.Dialog.NoQT.Title=QTJava.zip \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c +Tracker.Dialog.NoQT.Message1=QuickTime for Java \uac00 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoQT.Message2=QuickTime \ube44\ub514\uc624\ub97c \ubd84\uc11d\ud558\ub824\uba74, QuickTime\uc744 \ub2e4\uc2dc \uc124\uce58\ud558\uc138\uc694. +Tracker.Dialog.NoQT.Message3=\ub3c4\uc6c0\ub9d0: QuickTime \uc744 \uc124\uce58\ud560 \ub54c, \ubc18\ub4dc\uc2dc QuickTime for Java \ub97c \uc120\ud0dd\ud558\uc138\uc694. +Tracker.Dialog.UpdateQT.Title=QTJava.zip \uc5c5\ub370\uc774\ud2b8 +Tracker.Dialog.UpdateQT.Message1=QTJava.zip \uc758 \uc0c8 \ubc84\uc804\uc774 \uc788\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.UpdateQT.Message2=\uae30\uc874 \ud30c\uc77c\uc744 \uc0c8 \ud30c\uc77c\ub85c \uc5c5\ub370\uc774\ud2b8 \ud560\uae4c\uc694? +Tracker.Dialog.CopyQT.Title=QTJava.zip \ubcf5\uc0ac +Tracker.Dialog.CopyQT.Message1=QuickTime \uc774 \uc124\uce58\ub418\uc5c8\uc73c\uba70, Tracker \uc5d0\uc11c \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 \ub2e4\uc74c\uacfc \uac19\uc774 \ud569\ub2c8\ub2e4: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip \uc744 \ubcf5\uc0ac\ud574\uc57c \ud569\ub2c8\ub2e4. +Tracker.Dialog.CopyQT.Message3= (\uc73c\ub85c) +Tracker.Dialog.CopyQT.Message4= 2. Tracker \ub97c \ub2e4\uc2dc \uc2dc\uc791\ud574\uc57c \ud569\ub2c8\ub2e4. +Tracker.Dialog.CopyQT.Message5=QTJava.zip \uc744 \ubcf5\uc0ac\ud560\uae4c\uc694? +Tracker.Dialog.CopyFailed.Title=\ubcf5\uc0ac \uc2e4\ud328 +Tracker.Dialog.CopyFailed.Message=QTJava.zip \uc744 \ubcf5\uc0ac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.CopiedTo.Title=\ubcf5\uc0ac \uc131\uacf5 +Tracker.Dialog.CopiedTo.Message1=QTJava.zip \uc744 \uc131\uacf5\uc801\uc73c\ub85c \ubcf5\uc0ac\ud588\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.CopiedTo.Message2=Tracker \ub97c \ub2e4\uc2dc \uc2dc\uc791\ud558\uae30 \uc704\ud574 \uc885\ub8cc\ud569\ub2c8\ub2e4. +Tracker.Splash.Loading=\ubd88\ub7ec\uc624\ub294 \uc911... +TrackerIO.Dialog.Import.Title=Tracker \ud30c\uc77c \ubd88\ub7ec\uc624\uae30 +TrackerIO.Dialog.Import.Message=\ubd88\ub7ec\uc62c \ud56d\ubaa9 \uc120\ud0dd +TrackerIO.Dialog.ImportVideo.Title=\ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30 +TrackerIO.Dialog.Export.Title=\ubcf4\ub0b4\uae30 +TrackerIO.Dialog.Export.Message=\ubcf4\ub0bc \ud56d\ubaa9 \uc120\ud0dd +TrackerIO.Dialog.ReplaceFile.Title=\uae30\uc874 \ud30c\uc77c \ub36e\uc5b4\uc4f0\uae30 +TrackerIO.Dialog.ReplaceFile.Message=\ud30c\uc77c\uc774 \uc774\ubbf8 \uc788\uc2b5\ub2c8\ub2e4. \ub36e\uc5b4\uc4f8\uae4c\uc694? +TrackerIO.Dialog.NotTrackerXML.Title=XML \uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c +TrackerIO.Dialog.NotTrackerXML.Message=\uc740 \ub2e4\ub978 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc704\ud55c XML \ub370\uc774\ud130\ub97c \ud3ec\ud568\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. +TrackerIO.Dialog.BadVideo.Message=\ube44\ub514\uc624 \ud30c\uc77c \ud615\uc2dd\uc774 \uc544\ub2d9\ub2c8\ub2e4... +TrackerIO.Dialog.BadVideo.Title=\uc54c \uc218 \uc5c6\ub294 \ube44\ub514\uc624 \ud30c\uc77c +TrackerPanel.NewTab.Name=\ube48 \ubb38\uc11c +TrackerPanel.DragToMark.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uae30 +TrackerPanel.ClickToMark.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub204\ub974\uae30 +TrackerPanel.Dialog.LoadFailed.Title=Tracker \ud30c\uc77c \uc624\ub958 +TrackerPanel.Dialog.LoadFailed.Message=\uc62c\ubc14\ub978 Tracker \ud30c\uc77c\uc774 \uc544\ub2d9\ub2c8\ub2e4... +TrackerPanel.Dialog.SaveChanges.Title=\ubcc0\uacbd\ub41c \ub0b4\uc6a9 \uc800\uc7a5 +TrackerPanel.Dialog.SaveChanges.Message=\ubcc0\uacbd\ub41c \ub0b4\uc6a9\uc744 \uc800\uc7a5\ud569\ub2c8\ub2e4... +TrackPlottingPanel.Popup.MenuItem.Lines=\uc120 +TrackPlottingPanel.Popup.MenuItem.Points=\uc810 +TrackPlottingPanel.Popup.MenuItem.Scale=\ub208\uae08... +TrackPlottingPanel.Popup.MenuItem.Print=\uc778\uc1c4... +TrackPlottingPanel.Popup.MenuItem.Measure=\ub208\uae08 \ub9de\ucda4 +TrackPlottingPanel.Popup.MenuItem.Analyze=\ubd84\uc11d... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=\ud655\ub300 +TrackPlottingPanel.Popup.MenuItem.ZoomOut=\ucd95\uc18c +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\uc790\ub3d9\uc73c\ub85c \ub9de\ucda4 +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\uc601\uc5ed\uc5d0 \ub9de\ucda4 +TrackPlottingPanelInspector.Title=\ub208\uae08 +TrackPlottingPanelInspector.Label.Min=\ucd5c\uc18c +TrackPlottingPanelInspector.Label.Max=\ucd5c\ub300 +TrackPlottingPanelInspector.Label.Auto=\uc790\ub3d9 +TToolBar.Button.Footprint.Tooltip=\ubaa8\uc591 \uc124\uc815\ud558\uae30 +TToolBar.Dropdown.SelectedTrack.Tooltip=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 +TToolBar.Dropdown.SelectedTrack.None=\uc5c6\uc74c +TTrack.MenuItem.Delete=\uc0ad\uc81c +TTrack.MenuItem.Color=\uc0c9... +TTrack.Dialog.Color.Title=\uc0c9 +TTrack.MenuItem.Name=\uc774\ub984... +TTrack.MenuItem.Footprint=\ubaa8\uc591 +TTrack.MenuItem.Description=\ub178\ud2b8... +TTrack.MenuItem.Visible=\ubcf4\uae30 +TTrack.MenuItem.TrailVisible=\uc2a4\ud15d \uc790\ucde8 \ubcf4\uae30 +TTrack.MenuItem.Autostep=\uc790\ub3d9 \uc2a4\ud15d \ucc3e\uae30 +TTrack.MenuItem.MarkByDefault=\uc9c1\uc811 \uc2a4\ud15d \ud45c\uc2dc +TTrack.MenuItem.Locked=\uc7a0\uae08 +TTrack.MenuItem.Delete=\uc0ad\uc81c +TTrack.Name.None=\uc774\ub984 \uc5c6\uc74c +TTrack.Dialog.Description.Title=\ub178\ud2b8: +TTrack.Dialog.Name.Title=\uc774\ub984 \uc785\ub825 +TTrack.Dialog.Name.Label=\uc774\ub984: +TViewChooser.Button.Choose.Tooltip=\ub3c4\uad6c \uc120\ud0dd\ud558\uae30 +Vector.Name=\ubca1\ud130 +Vector.New.Name=\ubca1\ud130 +Vector.MenuItem.ToOrigin=\uc6d0\uc810\uc5d0 \ub9de\ucda4 +Vector.MenuItem.Label=\ub77c\ubca8 \ubcf4\uae30 +VectorSum.Name=\ubca1\ud130\ud569 +VectorSum.New.Name=\ud569 +VectorSum.MenuItem.Inspector=\ubca1\ud130 \uc120\ud0dd\ud558\uae30... +VectorSumInspector.Title=\ubca1\ud130\ud569 +VectorSumInspector.Border.Title=\ubca1\ud130 \uc120\ud0dd +WorldTView.Popup.MenuItem.Projectile=\ud3ec\ubb3c\uc120 \uc6b4\ub3d9 \ubaa8\ud615 + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=\uc6b4\ub3d9\ud559 \ubaa8\ud615 +AnalyticParticle.Inspector.Title=\uc6b4\ub3d9\ud559 \ubaa8\ud615 +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=\ubc18\uc9c0\ub984 4 +CircleFootprint.Circle_6=\ubc18\uc9c0\ub984 6 +CircleFootprint.Circle_8=\ubc18\uc9c0\ub984 8 +DynamicParticle.Name=\ub3d9\uc5ed\ud559 \ubaa8\ud615 (\ub370\uce74\ub974\ud2b8 \uc88c\ud45c) +DynamicParticle.Inspector.Title=\ub3d9\uc5ed\ud559 \ubaa8\ud615 +DynamicParticle.Property.ForceX=\ud798 x +DynamicParticle.Property.ForceY=\ud798 y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 +ParticleModel.New.Name=\ubaa8\ud615 +ParticleModel.MenuItem.InspectModel=\ubaa8\ud615 \ub3c4\uad6c... +ParticleModel.Inspector.Button.Undo=\ub418\ub3cc\ub9ac\uae30 +ParticleModel.Inspector.Button.Redo=\ub2e4\uc2dc \uc2e4\ud589 +ParticleModel.Inspector.Button.Close=\ub2eb\uae30 +ParticleModel.Inspector.Button.Help=\ub3c4\uc6c0\ub9d0 + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=X +Calibration.Axes.YOnly=Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=\uad50\uc815\ucd95 \uc120\ud0dd +Calibration.Label.Axes=\ucd95 +Calibration.Dialog.InvalidCoordinates.Title=\uc798\ubabb\ub41c \uc88c\ud45c +Calibration.Dialog.InvalidCoordinates.Message=\uac19\uc740 \uac12\uc758 \uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Calibration.Dialog.InvalidXCoordinates.Message=\uac19\uc740 \uac12\uc758 X-\uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Calibration.Dialog.InvalidYCoordinates.Message=\uac19\uc740 \uac12\uc758 Y-\uc88c\ud45c\ub97c \uac00\uc9c8 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +SpectralLineFilter.Title=\uae30\uccb4 \uc2a4\ud399\ud2b8\ub7fc +SpectralLineFilter.H=\uc218\uc18c +SpectralLineFilter.He=\ud5ec\ub968 +SpectralLineFilter.Ne=\ub124\uc628 +SpectralLineFilter.Hg=\uc218\uc740 +TFrame.View.Unknown=\ucc3d +TMenuBar.MenuItem.Undo=\ub418\ub3cc\ub9ac\uae30 +TMenuBar.MenuItem.Redo=\ub2e4\uc2dc \uc2e4\ud589 +TMenuBar.MenuItem.Replace=\ubc14\uafb8\uae30... +TMenuBar.Menu.AddImage=\uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 +TMenuBar.MenuItem.AddBefore=\uc774 \ud504\ub808\uc784 \uc55e\uc5d0... +TMenuBar.MenuItem.AddAfter=\uc774 \ud504\ub808\uc784 \ub4a4\uc5d0... +TMenuBar.MenuItem.RemoveImage=\uc774 \ud504\ub808\uc784 \uc9c0\uc6b0\uae30 +TMenuBar.Menu.Tools=\ub3c4\uad6c +TMenuBar.MenuItem.DataFunctionTool=\ub370\uc774\ud130 \ubaa8\ud615 +TMenuBar.MenuItem.DatasetTool=\ub370\uc774\ud130 \ubd84\uc11d +TMenuBar.Menu.CopyImage=\uadf8\ub9bc \ubcf5\uc0ac +TMenuBar.MenuItem.CopyMainView=\uc791\uc5c5 \ucc3d +TMenuBar.MenuItem.CopyFrame=\ud504\ub808\uc784 +TMenuBar.MenuItem.PrintFrame=\uc778\uc1c4... +TrackerIO.Dialog.AddImage.Title=\uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 (\ud558\ub098 \ub610\ub294 \uc5ec\ub7ec \uac1c \uc120\ud0dd) +TTrack.Dialog.Name.BadName=\uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc785\ub2c8\ub2e4. \ub2e4\ub978 \uc774\ub984\uc744 \uc120\ud0dd\ud558\uc138\uc694. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=F +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=\ud2b8\ub799\uc758 \uadf8\ub798\ud504\ub97c \ucc28\ud2b8\uc5d0 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. +TableTView.Label.NoData=\ud2b8\ub799\uc758 \ub370\uc774\ud130\ub97c \ud14c\uc774\ube14\uc5d0 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. +TrackerPanel.Message.NoData0=\ube44\ub514\uc624\uc640 \ud2b8\ub799\uc758 \uc791\uc5c5 \ucc3d\uc785\ub2c8\ub2e4. +TrackerPanel.Message.NoData1=\uc2dc\uc791\ud558\ub824\uba74 \ud30c\uc77c\uc744 \ubd88\ub7ec\uc624\uac70\ub098 \uc0c8 \ud2b8\ub799\uc744 \ub9cc\ub4ed\ub2c8\ub2e4. +WorldTView.Label.NoData=\ube44\ub514\uc624\uc640 \ud2b8\ub799 \ud654\uba74\uc744 \uc6d4\ub4dc \uc88c\ud45c\uc5d0\uc11c \ub098\ud0c0\ub0c5\ub2c8\ub2e4. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=\ud574 \ucc3e\uae30: +DynamicParticle.Solver.Euler=\uc624\uc77c\ub7ec +DynamicParticle.Solver.Verlet=\ubc8c\ub81b +DynamicParticle.Solver.RK4=\ub8fd\uac8c-\ucfe0\ud0c0 +DynamicParticle.Solver.ODEMultistep=\uc801\uc751\ud615 \ub2e4\uc911 \uc2a4\ud15d +DynamicParticle.Table.Force.Border.Title=\ud798 (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=\uc704\uce58 (t) +ParticleModel.Table.Initial.Border.Title=\uae30\ubcf8 \uc124\uc815 +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=\ubd99\uc774\uae30 +TMenuBar.MenuItem.PasteAfter=\uc774 \ud504\ub808\uc784 \ub4a4 +TMenuBar.MenuItem.PasteBefore=\uc774 \ud504\ub808\uc784 \uc55e +TMenuBar.MenuItem.PasteReplace=\ube44\ub514\uc624 \ubc14\uafb8\uae30 + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=\uc2dc\uc791\ud558\uae30... +Tracker.Splash.HelpMessage=\ube44\ub514\uc624 \ubd84\uc11d\uacfc \ubaa8\ub378\ub9c1 \ub3c4\uad6c - Tracker + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=\uae30\uc6b8\uae30 \uac01 +LineProfile.Checkbox.Rotates=\ud68c\uc804 +LineProfile.Label.Spread=\ud504\ub85c\ud30c\uc77c \ub108\ube44 +RGBRegion.Name=RGB \uc601\uc5ed +RGBRegion.New.Name=\uc601\uc5ed +RGBRegion.MenuItem.Fixed=\uc704\uce58 \uace0\uc815 +RGBRegion.Label.Radius=\ud53d\uc140 \ubc18\uc9c0\ub984 +TTrack.Label.Step=\uc2a4\ud15d + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=\uc704\uce58 \ubc88\ud638 +LineProfile.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 +LineProfile.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 +LineProfile.Data.Description.3=\uc801\uc0c9 +LineProfile.Data.Description.4=\ub179\uc0c9 +LineProfile.Data.Description.5=\uccad\uc0c9 +LineProfile.Data.Description.6=\ubc1d\uae30 +LineProfile.Data.Description.7=\ud53d\uc140 \ub108\ube44 +ParticleModel.MenuItem.TraceVisible=\ucc3e\uae30 \ubcf4\uae30 +ParticleModel.MenuItem.StepsVisible=\uc2a4\ud15d \ubcf4\uae30 +PointMass.Data.Description.0=\uc2dc\uac04 +PointMass.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 +PointMass.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 +PointMass.Data.Description.3=\uac70\ub9ac +PointMass.Data.Description.4=\uc704\uce58 \ubca1\ud130\uc758 \uac01 +PointMass.Data.Description.5=\uc18d\ub3c4 x-\uc131\ubd84 +PointMass.Data.Description.6=\uc18d\ub3c4 y-\uc131\ubd84 +PointMass.Data.Description.7=\uc18d\ub3c4 \ud06c\uae30 +PointMass.Data.Description.8=\uc18d\ub3c4 \ubca1\ud130\uc758 \uac01 +PointMass.Data.Description.9=\uac00\uc18d\ub3c4 x-\uc131\ubd84 +PointMass.Data.Description.10=\uac00\uc18d\ub3c4 y-\uc131\ubd84 +PointMass.Data.Description.11=\uac00\uc18d\ub3c4 \ud06c\uae30 +PointMass.Data.Description.12=\uac00\uc18d\ub3c4 \ubca1\ud130\uc758 \uac01 +PointMass.Data.Description.13=\uac01 +PointMass.Data.Description.14=\uac01\uc18d\ub3c4 +PointMass.Data.Description.15=\uac01\uac00\uc18d\ub3c4 +PointMass.Data.Description.16=\uc2a4\ud15d \ubc88\ud638 +PointMass.Data.Description.17=\ud504\ub808\uc784 \ubc88\ud638 +PointMass.Data.Description.18=\uc6b4\ub3d9\ub7c9 x-\uc131\ubd84 +PointMass.Data.Description.19=\uc6b4\ub3d9\ub7c9 y-\uc131\ubd84 +PointMass.Data.Description.20=\uc6b4\ub3d9\ub7c9 \ud06c\uae30 +PointMass.Data.Description.21=\uc6b4\ub3d9\ub7c9 \ubca1\ud130\uc758 \uac01 +PointMass.Data.Description.22=\uc6b4\ub3d9\uc5d0\ub108\uc9c0 +RGBRegion.Data.Description.0=\uc2dc\uac04 +RGBRegion.Data.Description.1=\uc704\uce58 x-\uc131\ubd84 +RGBRegion.Data.Description.2=\uc704\uce58 y-\uc131\ubd84 +RGBRegion.Data.Description.3=\uc801\uc139 +RGBRegion.Data.Description.4=\ub179\uc0c9 +RGBRegion.Data.Description.5=\uccad\uc0c9 +RGBRegion.Data.Description.6=\ubc1d\uae30 +RGBRegion.Data.Description.7=\ud53d\uc140 \uc218 +RGBRegion.Data.Description.8=\uc2a4\ud15d \ubc88\ud638 +RGBRegion.Data.Description.9=\ud504\ub808\uc784 \ubc88\ud638 +TView.Menuitem.Define=\uc815\uc758... +Vector.Data.Description.0=\uc2dc\uac04 +Vector.Data.Description.1=x-\uc131\ubd84 +Vector.Data.Description.2=y-\uc131\ubd84 +Vector.Data.Description.3=\ud06c\uae30 +Vector.Data.Description.4=\uac01 +Vector.Data.Description.5=\ubca1\ud130 \uaf2c\ub9ac\uc758 \uc704\uce58 x-\uc131\ubd84 +Vector.Data.Description.6=\ubca1\ud130 \uaf2c\ub9ac\uc758 \uc704\uce58 y-\uc131\ubd84 +Vector.Data.Description.7=\uc2a4\ud15d \ubc88\ud638 +Vector.Data.Description.8=\ud504\ub808\uc784 \ubc88\ud638 + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=\ubb3c\uccb4 \uc9c8\ub7c9 +ParticleModel.Parameter.InitialTime.Description=\ucc98\uc74c \uc2dc\uac04 +AnalyticParticle.PositionFunction.X.Description=\uc704\uce58 x-\uc131\ubd84 +AnalyticParticle.PositionFunction.Y.Description=\uc704\uce58 y-\uc131\ubd84 +DynamicParticle.ForceFunction.X.Description=\ud798 x-\uc131\ubd84 +DynamicParticle.ForceFunction.Y.Description=\ud798 y-\uc131\ubd84 +DynamicParticle.Parameter.InitialX.Description=\ucc98\uc74c \uc704\uce58 x-\uc131\ubd84 +DynamicParticle.Parameter.InitialY.Description=\ucc98\uc74c \uc704\uce58 y-\uc131\ubd84 +DynamicParticle.Parameter.InitialVelocityX.Description=\ucc98\uc74c \uc18d\ub3c4 x-\uc131\ubd84 +DynamicParticle.Parameter.InitialVelocityY.Description=\ucc98\uc74c \uc18d\ub3c4 y-\uc131\ubd84 +TrackerPanel.ModelBuilder.Title=\ubb3c\ub9ac \ubaa8\ud615 +TrackerPanel.DataBuilder.Title=\ub370\uc774\ud130 \ubaa8\ud615 +TrackControl.TrailMenu.NoTrail=\uc2a4\ud15d \uac10\ucd94\uae30 +TrackControl.TrailMenu.ShortTrail=\uc2a4\ud15d \uc9e7\uac8c \ubcf4\uae30 +TrackControl.TrailMenu.LongTrail=\uc2a4\ud15d \uae38\uac8c \ubcf4\uae30 +TrackControl.TrailMenu.FullTrail=\ubaa8\ub4e0 \uc2a4\ud15d \ubcf4\uae30 +TrackerPanel.ModelBuilder.Spinner.Tooltip=\ud604\uc7ac \uc120\ud0dd\ud55c \ubaa8\ud615 +TrackerPanel.ModelBuilder.LineButton.Text=\uc120 \uc18d\uc131 +TrackerPanel.ModelBuilder.LineButton.Tooltip=\uc120 \uc18d\uc131 \uc124\uc815 +ParticleModel.LineStyle.None=\uc120 \uc5c6\uc74c +ParticleModel.LineStyle.Connect=\uc2a4\ud15d \uc5f0\uacb0 +ParticleModel.LineStyle.Smooth=\ubd80\ub4dc\ub7ec\uc6b4 \uc120 +ModelFunctionPanel.Label=\ubaa8\ud615 +AnalyticFunctionPanel.FunctionEditor.Border.Title=\uc704\uce58 \ud568\uc218 +DynamicFunctionPanel.FunctionEditor.Border.Title=\ud798 \ud568\uc218 + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=\ub370\uc774\ud130 \uad6c\uc131 \uc694\uc18c +Tracker.About.ProjectOf=\ud504\ub85c\uc81d\ud2b8: +Tracker.About.TranslationBy=\ubc88\uc5ed +Tracker.About.Translator=Hyunsoo Kim +TMenuBar.Menu.SaveVideoAs=\ube44\ub514\uc624 \uc800\uc7a5 +TActions.SaveClipAs.ProgressMonitor.Message=\ube44\ub514\uc624 \uc800\uc7a5\ud558\uae30 +TActions.SaveClipAs.ProgressMonitor.Progress=\uc644\ub8cc + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=\ub3d9\uae30\ud654 +PlotTrackView.Checkbox.Synchronize.Tooltip=\uc218\ud3c9\ucd95 \ub3d9\uae30\ud654 +RGBRegion.MenuItem.FixedRadius=\ubc18\uc9c0\ub984 \uace0\uc815 +Tracker.VideoZoom.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \ud654\uba74 \ud655\ub300 \ucd95\uc18c \uc120\ud0dd, \ub354\ube14 \ud074\ub9ad\ud574\uc11c \ud654\uba74 \ub9de\ucda4 +Tracker.PlotZoomIn.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud655\ub300, \ub354\ube14 \ud074\ub9ad\ud574\uc11c \uc790\ub3d9 \ub208\uae08 \uc870\uc815 +Tracker.PlotZoomOut.Hint=\ub20c\ub7ec\uc11c \ucd95\uc18c +Tracker.MenuItem.Hints=\ub3c4\uc6c0\ub9d0 \ubcf4\uae30 +TapeMeasure.Label.Length=\uae38\uc774 +TapeMeasure.Label.TapeAngle=\uc218\ud3c9\ucd95 \uae30\uc900 \uac01 +TapeMeasure.Label.ArcAngle=\uac01\ub3c4\uae30 \uce21\uc815 \uac01 +TrackerIO.Dialog.NotAnImage.Title=\uc798\ubabb\ub41c \ud30c\uc77c \ud615\uc2dd +TrackerIO.Dialog.NotAnImage.Message1=JPG \ub610\ub294 GIF \ud30c\uc77c\uc774 \uc544\ub2d9\ub2c8\ub2e4. +TrackerIO.Dialog.NotAnImage.Message2=\uacc4\uc18d \ud560\uae4c\uc694? +TToolBar.Button.Zoom.Tooltip=\ud654\uba74 \ud655\ub300/\ucd95\uc18c \uc124\uc815 +TrackChooserTView.DropDown.Tooltip=\ud2b8\ub799 \uc124\uc815 +TapeMeasure.Field.TapeAngle.Tooltip=\uc218\ud3c9\ucd95 (+x) \uc5d0\uc11c \uc904\uc790\uae4c\uc9c0 \ubc8c\uc5b4\uc9c4 \uac01 +TapeMeasure.Field.Magnitude.Tooltip= \ub208\uae08 \uc870\uc815\ub41c \uae38\uc774 +TapeMeasure.Readout.Magnitude.Name=\uae38\uc774 +TapeMeasure.Readout.Magnitude.Hint=\uad6d\uc81c\ub2e8\uc704 +TapeMeasure.Readout.Angle.Name=\uce21\uc815 \uac01 +TapeMeasure.Readout.Angle.Hint=+x \ucd95\uc73c\ub85c\ubd80\ud130 \uce21\uc815\ud55c \uac01 +TapeMeasure.End.Name=\uc904\uc790 \ub05d +TapeMeasure.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uae38\uc774\uc640 \uac01 \uce21\uc815, Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc904\uc790 \ub2e4\uc2dc \uc124\uc815 +TapeMeasure.Handle.Name=\ud578\ub4e4 +TapeMeasure.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc774\ub3d9 +Vector.Tip.Name=\ubca1\ud130\uc758 \uba38\ub9ac +Vector.Tip.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 +Vector.Handle.Name=\ud578\ub4e4 +Vector.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 +Vector.ShortHandle.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9, Alt \ud0a4 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \uc120\ud0dd +PointMass.Position.Name=\uc704\uce58 +PointMass.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 +PointMass.Velocity.Name=\uc18d\ub3c4 +PointMass.Acceleration.Name=\uac00\uc18d\ub3c4 +PointMass.Vector.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc120\ud0dd, \ub04c\uc5b4\uc11c \uc774\ub3d9 +PointMass.Position.Locked.Hint=\ub20c\ub7ec\uc11c \uc120\ud0dd - \ub04c \uc218 \uc5c6\uc74c +CoordAxes.Handle.Name=+x \ucd95 +CoordAxes.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uae30\uc6b8\uae30 \ubcc0\uacbd +CoordAxes.Origin.Name=\uc6d0\uc810 +CoordAxes.Origin.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc704\uce58 \ubcc0\uacbd +OffsetOrigin.Position.Name=\uc704\uce58 +OffsetOrigin.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \uc88c\ud45c \uc774\ub3d9 +Calibration.Point.Name=\uc810 +Calibration.Point.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \ucd95\uacfc \ub208\uae08 \ubcc0\uacbd +RGBRegion.Position.Name=\uc704\uce58 +RGBRegion.Position.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uac70\ub098 \uc88c\ud45c \uc785\ub825\ud574\uc11c \uc704\uce58 \ubcc0\uacbd +LineProfile.End.Name=\ud504\ub85c\ud30c\uc77c \ub05d +LineProfile.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uae38\uc774 \ubcc0\uacbd +LineProfile.Handle.Name=\ud578\ub4e4 +LineProfile.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uc774\ub3d9 +PointMass.Hint=\ud234\ubc14\uc5d0 \ubb3c\uccb4 \uc124\uc815 +PointMass.Unmarked.Hint=, Shift \ud0a4 \ub20c\ub7ec\uc11c \uc9c8\uc810 \uc124\uc815 +TTrack.Unselected.Hint=\ub9c8\uc6b0\uc2a4 \ub20c\ub7ec\uc11c \uc120\ud0dd \uadf8\ub9ac\uace0/\ub610\ub294 \uc18d\uc131 \uc124\uc815 +Vector.Unmarked.Hint=Shit \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ubca1\ud130 \uc124\uc815 +OffsetOrigin.Unmarked.Hint=Shit \ud0a4 \ub20c\ub7ec\uc11c \uc88c\ud45c \uc774\ub3d9 \uc124\uc815 +Calibration.Unmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \uc2dc\uc791 \uc810 \uc124\uc815 +Calibration.Halfmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \ub2e4\uc2dc \uc124\uc815 +CenterOfMass.Empty.Hint=\uc9c8\ub7c9\uc911\uc2ec \uc88c\ud45c \uc815\uc758\ub97c \uc704\ud574 \ubb3c\uccb4 \uc120\ud0dd +VectorSum.Empty.Hint=\ubca1\ud130\ud569 \uc815\uc758\ub97c \uc704\ud55c \ubca1\ud130 \uc120\ud0dd\ud558\uae30 +TapeMeasure.Hint=\uc904\uc790 \ub05d\uc744 \ub04c\uc5b4\uc11c \uac70\ub9ac\uc640 \uac01 \uce21\uc815\ud558\uae30 +CoordAxes.Hint=\uae30\uc6b8\uae30 \ubcc0\uacbd\uc744 \uc704\ud55c \uac01 \uc785\ub825 +ParticleModel.Hint=\ud234\ubc14\uc5d0 \ubb3c\uccb4 \uc124\uc815, \ubaa8\ud615 \ub3c4\uad6c\uc5d0\uc11c \ubaa8\ub378\ub9c1 \uc704\ud55c \uc218\uc2dd \uc785\ub825 +RGBRegion.Hint=\ud06c\uae30 \ubcc0\uacbd\uc744 \uc704\ud55c \ubc18\uc9c0\ub984 \uc785\ub825 +RGBRegion.Unmarked.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \uc704\uce58 \uc124\uc815 +TTrack.ImportVideo.Hint=RGB \uce21\uc815\uc744 \uc704\ud55c \ube44\ub514\uc624 \ub610\ub294 \uadf8\ub9bc \ubd88\ub7ec\uc624\uae30 +TTrack.Selected.Hint=\uc120\ud0dd +LineProfile.Hint=\ud504\ub85c\ud30c\uc77c \ub108\ube44 \ubcc0\uacbd\uc744 \uc704\ud55c \uac12 \uc785\ub825 +LineProfile.Unmarked.Hint=Shift \ud0a4 \ub204\ub974\uace0 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ud504\ub85c\ud30c\uc77c \uc120 \uadf8\ub9ac\uae30 +LineProfile.Menu.Orientation=\ud504\ub85c\ud30c\uc77c \ub9de\ucda4 +LineProfile.MenuItem.Horizontal=\uc218\ud3c9\ud558\uac8c +LineProfile.MenuItem.XAxis=\uc88c\ud45c\uc758 x \ucd95\uc5d0 \ub098\ub780\ud788 +Footprint.PositionVector=\ubca1\ud130 +Footprint.BoldPositionVector=\uad75\uc740 \ubca1\ud130 +Tracker.Startup.Hint=\ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 (\ub610\ub294 \uba54\ub274\uc5d0\uc11c \ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ub044\uae30), \ub3c4\uc6c0\ub9d0 \ub0b4\uc6a9\uc744 \ubcf4\ub824\uba74 F1 \ud0a4 \ub204\ub984 +TrackerPanel.NoVideo.Hint=\ubd84\uc11d\uc744 \ud558\ub824\uba74 \ud30c\uc77c\uc744 \uc5f4\uac70\ub098 \ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30\ub97c \uc2e4\ud589 +TrackerPanel.CalibrateVideo.Hint=\uad50\uc815 \ub3c4\uad6c\ub97c \uc774\uc6a9\ud558\uc5ec \ube44\ub514\uc624 \uad50\uc815\ud558\uae30 +TrackerPanel.NoTracks.Hint=\uce21\uc815\uc744 \ud558\ub824\uba74 \uc0c8 \ud2b8\ub799 \ub9cc\ub4e4\uae30\ub97c \uc2e4\ud589 +TrackerPanel.SetClip.Hint=\ube44\ub514\uc624 \uc124\uc815 \ub610\ub294 \ubcf4\uae30 +TrackerPanel.ShowAxes.Hint=\uc88c\ud45c\ucd95\uc758 \uc6d0\uc810\uacfc \uac01 \uc124\uc815 +VideoPlayer.Step.Hint=\uc2a4\ud15d \uc55e\uc73c\ub85c (\ub2e8\ucd95\ud0a4: PageDown \ud0a4) +VideoPlayer.Back.Hint=\uc2a4\ud15d \ub4a4\ub85c (\ub2e8\ucd95\ud0a4: PageUp \ud0a4) +TrackerPanel.DVVideo.Hint=DV \ube44\ub514\uc624\uc5d0\uc11c \uc77c\uadf8\ub7ec\uc9d0 \ubcf4\uc815\uc744 \uc704\ud55c \ud574\uc0c1\ub3c4 \ubcc0\uacbd \ud544\ud130 \uc801\uc6a9 +TrackerIO.DataFileFilter.Description=Tracker \ud30c\uc77c +Tracker.Button.PDFHelp=PDF \ubb38\uc11c +TToolbar.Button.TapeVisible.Tooltip=\ubcf4\uae30/\uac10\ucd94\uae30 \ub610\ub294 \uad50\uc815 \ub3c4\uad6c \ub9cc\ub4e4\uae30 + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=\ud2b8\ub799 \ucee8\ud2b8\ub864 +TMenuBar.MenuItem.Description=\ub178\ud2b8 +TrackPlottingPanel.RightDrag.Hint=\ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94 \ub204\ub978 \ud6c4 \uc635\uc158 \uc124\uc815 +TMenuBar.MenuItem.DeleteSelectedPoint=\uc120\ud0dd\ud55c \uc2a4\ud15d +TFrame.InfoDialog.SaveChanges.Title=\ubcc0\uacbd \ub0b4\uc6a9 \uc800\uc7a5 +TFrame.InfoDialog.SaveChanges.Message=\ubcc0\uacbd\ub41c \ub0b4\uc6a9\uc744 \uc800\uc7a5\ud560\uae4c\uc694? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=\ub370\uce74\ub974\ud2b8\uc88c\ud45c +DynamicParticle.Editor.Button.Polar=\uadf9\uc88c\ud45c +DynamicParticle.Parameter.InitialR.Description=\ucc98\uc74c \ubc18\uc9c0\ub984 +DynamicParticle.Parameter.InitialTheta.Description=\ucc98\uc74c \uac01 +DynamicParticle.Parameter.InitialVelocityR.Description=\ucc98\uc74c \uc9c0\ub984\uc18d\ub3c4 +DynamicParticle.Parameter.InitialOmega.Description=\ucc98\uc74c \uac01\uc18d\ub3c4 +DynamicParticle.ForceFunction.R.Description=\uc9c0\ub984 \uc131\ubd84\uc758 \ud798 +DynamicParticle.ForceFunction.Theta.Description=\uc811\uc120 \uc131\ubd84\uc758 \ud798 +DynamicParticlePolar.Name=\ub3d9\uc5ed\ud559 \ubaa8\ud615 (\uadf9\uc88c\ud45c) +TMenuBar.Menu.DynamicParticle=\ub3d9\uc5ed\ud559 \ubaa8\ud615 +TMenuBar.MenuItem.Cartesian=\ub370\uce74\ub974\ud2b8\uc88c\ud45c +TMenuBar.MenuItem.Polar=\uadf9\uc88c\ud45c + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=\uc790\ub3d9 \ucc3e\uae30... +Dialog.Button.Help=\ub3c4\uc6c0\ub9d0 +AutoTracker.Wizard.Title=\uc790\ub3d9 \ucc3e\uae30 +AutoTracker.Wizard.Button.Reset=\uc6d0\ub798\ub300\ub85c +AutoTracker.Wizard.Button.Back=\ub4a4\ub85c +AutoTracker.Wizard.Button.Next=\uc2a4\ud15d +AutoTracker.Wizard.Button.Accept=\uc801\uc6a9 +AutoTracker.Wizard.Button.Search=\ucc3e\uae30 +AutoTracker.Wizard.Button.Pause=\uba48\ucda4 +AutoTracker.Wizard.Button.Skip=\uac74\ub108\ub6f0\uae30 +AutoTracker.Label.Mask=\ucc3e\uae30 \uacac\ubcf8 +AutoTracker.Label.AcceptLevel=\ubb38\uc9c0\ubc29 +AutoTracker.TabbedPane.TabTitle.Mask=\ucc3e\uae30 \uacac\ubcf8 +AutoTracker.TabbedPane.TabTitle.Target=\ucc3e\uae30 \ub300\uc0c1 +AutoTracker.TabbedPane.TabTitle.Settings=\uc801\uc6a9 +AutoTracker.TabbedPane.TabTitle.Search=\ucc3e\uae30 +AutoTracker.Info.GetStarted=\uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \ub9cc\ub4e4\uae30 \uc704\ud574\uc11c\ub294 Shit-Ctrl \ud0a4\ub97c \ub204\ub978 \uc0c1\ud0dc\ub85c \uc6d0\ud558\ub294 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\uc5d0\uc11c \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +AutoTracker.Info.Mask1=\ube44\ub514\uc624 \ud504\ub808\uc784\uc758 \uc77c\uc815\ud55c \uc601\uc5ed \uc548\uc5d0\uc11c \ub300\uc0c1\uc744 \ucc3e\uc544\uc11c \uc77c\uce58\ud558\uae30 \uc6d0\ud558\ub294 \ubaa8\uc591\uc744 \ucc3e\uae30 \uacac\ubcf8\uc5d0 \uc815\uc758\ud569\ub2c8\ub2e4. +AutoTracker.Info.Mask2=\ucc3e\uae30 \uacac\ubcf8\uc758 \ubaa8\uc591\uacfc \uc0c9\uc5d0 \ub300\ud55c \uc2dc\uac04\uc5d0 \ub530\ub978 \ubcc0\ud654\ub97c \uc801\uc6a9\ud569\ub2c8\ub2e4. \ubcc0\ud654\uc728\uc774 \ub192\uc744 \uc218\ub85d \uacac\ubcf8\uc758 \ubaa8\uc591\uacfc \uc0c9 \ubcc0\ud654\uac00 \ube60\ub978 \uac83\uc744 \ucc3e\uc744 \uc218 \uc788\uc73c\ub098 \uc815\ud655\ub3c4\uac00 \ub0ae\uc544\uc9d1\ub2c8\ub2e4. +AutoTracker.Info.MaskLocked1=\ucc3e\uae30 \uacac\ubcf8\uc744 \uc0ac\uc6a9 \uc911\uc774\uba70 \uc7a0\uaca8 \uc788\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.MaskLocked2=\ubaa8\ub4e0 \uc2a4\ud15d\uc744 \uc9c0\uc6b0\uace0 \ub2e4\uc2dc \uc2dc\uc791\ud558\ub824\uba74 \uc6d0\ub798\ub300\ub85c \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +AutoTracker.Info.Target1=\ucc3e\uae30 \ub300\uc0c1\uc774 \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12 \uc774\uc0c1\uc73c\ub85c \ucc3e\uae30 \uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub3c4\ub85d \uc790\ub3d9\uc73c\ub85c \ucc3e\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.Target2=\ub3c4\uc6c0\ub9d0: \ucc3e\uae30 \uc2a4\ud15d\uc774 \uc644\ub8cc\ub41c \ud6c4\uc5d0\ub3c4 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\uc874\uc758 \uc2a4\ud15d\uc740 \uc790\ub3d9\uc73c\ub85c \ub300\uc0c1\uc744 \ub530\ub77c \uc774\ub3d9\ub429\ub2c8\ub2e4. +AutoTracker.Info.TargetLocked=\ucc3e\uae30 \ub300\uc0c1\uc744 \uc0ac\uc6a9 \uc911\uc774\uba70 \uae30\uc874\uc758 \uc2a4\ud15d \uc704\uce58\uc5d0 \ubb36\uc5ec \uc788\uc2b5\ub2c8\ub2e4. \ub300\uc0c1\uc744 \uc62e\uae30\uba74 \ubaa8\ub4e0 \uc2a4\ud15d \ub610\ud55c \uc62e\uaca8\uc9d1\ub2c8\ub2e4. +AutoTracker.Info.Settings1=\uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12 \uc774\uc0c1\uc73c\ub85c \ucc3e\uae30 \uacac\ubcf8\uc774 \uc77c\uce58\ub41c \uacbd\uc6b0 \uc790\ub3d9\uc73c\ub85c \ucc3e\uae30 \ub300\uc0c1\uc758 \uc704\uce58\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4. +AutoTracker.Info.Settings2=\ub3c4\uc6c0\ub9d0: \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc744 \uc904\uc774\uba74 \ucc3e\uae30 \ub300\uc0c1\uc758 \uc77c\uce58\uc5d0 \ub300\ud55c \ubd88\ud655\uc2e4\ub3c4\uac00 \ucee4\uc9d1\ub2c8\ub2e4. \ub300\uc2e0\uc5d0 \ubcc0\ud654\uc728\uc744 \ub192\uc774\uba74 \uc774 \ubd88\ud655\uc2e4\ub3c4\ub97c \uc904\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.Search1=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc870\uc0ac\uc911\uc785\ub2c8\ub2e4. \ucc3e\uae30 \uc601\uc5ed \uc0ac\uac01\ud615\uc758 \ubaa8\uc11c\ub9ac\ub098 \ud578\ub4e4\uc744 \ub9c8\uc6b0\uc2a4\ub85c \ub04c\uc5b4\uc11c \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.Search2=\ub3c4\uc6c0\ub9d0: \ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \ucc3e\uae30 \uc601\uc5ed\uc774 \ud074 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc740 \uc77c\uce58 \ub300\uc0c1\uc758 \uc704\uce58\ub85c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc790\ub3d9\uc73c\ub85c \uc62e\uae30\ub3c4\ub85d \ud569\ub2c8\ub2e4. +AutoTracker.Info.Frame=\ud504\ub808\uc784 +AutoTracker.Info.Match=\uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub294 \ucc3e\uae30 \ub300\uc0c1\uc774 \uc790\ub3d9\uc73c\ub85c \ud45c\uc2dc\ub429\ub2c8\ub2e4. +AutoTracker.Info.Possible=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uac00\ub2a5\ud55c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: +AutoTracker.Info.NoMatch=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: +AutoTracker.Info.Outside=\ucc3e\uae30 \uc601\uc5ed\uc774 \uc774\ubbf8\uc9c0\ub97c \ubc97\uc5b4\ub0ac\uc2b5\ub2c8\ub2e4. \uc124\uc815\ub41c \uc635\uc158: +AutoTracker.Info.Accepted=\ucc3e\uae30 \ub300\uc0c1\uc774 \uc77c\uce58\ud558\ub294 \uac83\uc73c\ub85c \uc801\uc6a9\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.MarkedByUser=\uc218\ub3d9\uc73c\ub85c \uc2a4\ud15d\uc774 \ud45c\uc2dc\ub418\uc5c8\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.NoVideo=\uc790\ub3d9 \ucc3e\uae30\uc5d0 \ud544\uc694\ud55c \ube44\ub514\uc624\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. +AutoTracker.Info.Height=\ub192\uc774 +AutoTracker.Info.Width=\ud3ed +AutoTracker.Info.Accept= - \ucc3e\uae30 \ub300\uc0c1\uc774 \uc77c\uce58\ud558\ub294 \uac83\uc73c\ub85c \uc801\uc6a9 +AutoTracker.Info.Retry= - \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uc5ec \ub2e4\uc2dc \ucc3e\uae30 +AutoTracker.Info.Mark= - Shift \ud0a4 \ub20c\ub7ec\uc11c \uc218\ub3d9\uc73c\ub85c \uc2a4\ud15d\uc744 \ud45c\uc2dc +AutoTracker.Info.Skip= - \uc774 \ud504\ub808\uc784\uc744 \uac74\ub108 \ub6f0\uace0 \ub2e4\uc74c\uc73c\ub85c \uacc4\uc18d \uc9c4\ud589 +AutoTracker.Info.Reset= - \ubc14\ub974\uac8c \ud45c\uc2dc\ub41c \ud504\ub808\uc784\uc73c\ub85c \uc2a4\ud15d\uc744 \ub4a4\ub85c \uc774\ub3d9\ud558\uace0 Shift-Ctrl \ud0a4\ub97c \ub20c\ub7ec\uc11c \uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \uc815\uc758 +AutoTracker.Info.MatchScore=\uc77c\uce58\ud558\ub294 \uac12 +AutoTracker.Dialog.MaskLocked.Title=\ucc3e\uae30 \uacac\ubcf8 \uc7a0\uae08 +PointMass.Cursor.Autotrack.Description=\uc790\ub3d9 \ucc3e\uae30 \ucee4\uc11c +VideoPlayer.StartFrame.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc2dc\uc791 \ud504\ub808\uc784 \uc124\uc815 +VideoPlayer.EndFrame.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub05d \ud504\ub808\uc784 \uc124\uc815 +VideoPlayer.Slider.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ube44\ub514\uc624 \ucc3e\uae30 +FileDropHandler.Dialog.BadFile.Message=\ubd88\ub7ec\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +FileDropHandler.Dialog.BadFile.Title=\uc54c \uc218 \uc5c6\ub294 \ud30c\uc77c + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=\uc801\uc6a9 +DynamicParticle.Dialog.Delete.Message=\uc774 \uc9c8\uc810\uc744 \uc0ad\uc81c\ud558\uac8c \ub418\uba74 \ub3d9\uc5ed\ud559\uacc4\uc5d0\uc11c \uc81c\uac70\ub429\ub2c8\ub2e4. \uadf8\ub798\ub3c4 \uc0ad\uc81c\ud560\uae4c\uc694? +DynamicParticle.Dialog.Delete.Title=\uc9c8\uc810\ub3d9\uc5ed\ud559\uacc4 +DynamicParticle.System.In=<- +DynamicSystem.Empty=\ube44\uc5c8\uc74c +DynamicSystem.Force.Name.Internal=\uc18d +DynamicSystem.ForceFunction.R.Description=\uc18d\ud798\uc758 \uc9c0\ub984 \uc131\ubd84 +DynamicSystem.ForceFunction.Theta.Description=\uc18d\ud798\uc758 \uc811\uc120 \uc131\ubd84 +DynamicSystem.MenuItem.Inspector=\uc9c8\uc810 \uc120\ud0dd... +DynamicSystem.Name=\ub3d9\uc5ed\ud559 \ub450 \ubb3c\uccb4 +DynamicSystem.New.Name=\ub3d9\uc5ed\ud559\uacc4 +DynamicSystem.Parameter.Of=/ +DynamicSystem.Parameter.RelativeTo=\uc0c1\ub300- +DynamicSystem.Parameter.Name.Relative=\uc0c1\ub300 +DynamicSystem.Parameter.ParticleMass.Description=\uc9c8\ub7c9- +DynamicSystem.Parameter.Mass.Description=\uc774 \uacc4\uc758 \uc804\uccb4 \uc9c8\ub7c9 +DynamicSystemInspector.Border.Title=\uc9c8\uc810 +DynamicSystemInspector.Title=\ub450 \ubb3c\uccb4 +DynamicSystemInspector.Button.Change=\ubcc0\uacbd... +DynamicSystemInspector.ParticleName.None=(\uc5c6\uc74c) +TMenuBar.MenuItem.Clone=\uc0ac\ubcf8 +TMenuBar.MenuItem.TwoBody=\ub450 \ubb3c\uccb4 +TrackerPanel.DataBuilder.Dropdown.Tooltip=\ud604\uc7ac \uc120\ud0dd\ub41c \ud2b8\ub799 +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\uc218\uc9c1\ucd95 \ub3d9\uae30\ud654 +TrackControl.Button.Trace.ToolTip=\uacbd\ub85c \ubcf4\uae30 \ub610\ub294 \uac10\ucd94\uae30 +TToolBar.Button.Open.Tooltip=\uc0c8 \ubb38\uc11c\uc5d0\uc11c \ube44\ub514\uc624 \ub610\ub294 Tracker \ud30c\uc77c \uc5f4\uae30 +TToolBar.Button.Save.Tooltip=\ud604\uc7ac \ubb38\uc11c\ub97c \ud30c\uc77c\ub85c \uc800\uc7a5: +TToolBar.Button.SelectTrack=\uc120\ud0dd +TToolBar.Button.SelectTrack.Tooltip=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 +TTrack.MenuItem.ClearSteps=\ubaa8\ub4e0 \uc2a4\ud15d \uc9c0\uc6b0\uae30 +PointMass.MenuItem.Position=\uc704\uce58 +TMenuBar.MenuItem.Empty=(\ube44\uc5c8\uc74c) +TTrackBar.Button.Memory=\uc0ac\uc6a9 \uba54\ubaa8\ub9ac: +TTrackBar.Button.Memory.Tooltip=\uba54\ubaa8\ub9ac \uac10\uc2dc\uc640 \uad00\ub9ac +TTrackBar.Memory.PopupItem.Launch1=\uc801\uc6a9 +TTrackBar.Memory.PopupItem.Launch2=\uba54\ubaa8\ub9ac +TButton.Track.ToolTip=\uc18d\uc131 \uc124\uc815: +Tracker.Dialog.OutOfMemory.Message1=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \uba54\ubaa8\ub9ac\uac00 \ubd80\uc871\ud569\ub2c8\ub2e4. +Tracker.Dialog.OutOfMemory.Message2=\uc635\uc158 \uc124\uc815\uc744 \uc704\ud574 \uba54\ubaa8\ub9ac \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +Tracker.Dialog.OutOfMemory.Title=\uba54\ubaa8\ub9ac \ubd80\uc871 + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=\ubbf8\ub9ac\ubcf4\uae30 +AutoTracker.Label.Original=\ud0a4 \ud504\ub808\uc784 +AutoTracker.Label.NoMask=\uc5c6\uc74c +AutoTracker.Label.Rate=\ube44\uc728: +AutoTracker.Info.Mask3=\ub3c4\uc6c0\ub9d0: \ucc3e\uae30 \uacac\ubcf8\uc774 \ud06c\uac70\ub098 \ub300\uc0c1 \ubb3c\uccb4\uc758 \ud06c\uae30 \uc804\uccb4\ub97c \ud3ec\ud568\ud560 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c \uacac\ubcf8\uc758 \ud615\ud0dc\uc640 \uc0c9\uc774 \ubd84\uba85\ud558\uace0 \ub300\ube44\uac00 \ub69c\ub837\ud560 \uc218\ub85d \ubcf4\ub2e4 \uc720\uc758\ud558\uac8c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. +AutoTracker.Wizard.Checkbox.XAxis=x \ucd95\ub9cc \ucc3e\uae30 +AutoTracker.Info.SearchOnAxis1=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc758 x \ucd95\uc774 \uc870\uc0ac\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucc3e\uae30 \uc601\uc5ed\uc758 \uc911\uc2ec\uc774\ub098 \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. +AutoTracker.Info.PossibleOnAxis=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c x \ucd95\uc744 \ub530\ub77c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ubc1c\uacac\ud588\uc2b5\ub2c8\ub2e4. \uc635\uc158: +AutoTracker.Info.NoMatchOnAxis=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c x \ucd95\uc744 \ub530\ub77c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ubc1c\uacac\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \uc635\uc158: +AutoTracker.Info.RetryOnAxis= - \ucc3e\uae30 \uc601\uc5ed\uc774\ub098 x \ucd95\uc744 \uc62e\uae34 \ub2e4\uc74c \ub2e4\uc2dc \ucc3e\uae30\ub97c \ud569\ub2c8\ub2e4. +AutoTracker.Wizard.Button.Delete=\uc0ad\uc81c +AutoTracker.Wizard.Button.DeleteMore=\ub098\uc911 \ud3ec\uc778\ud130 \uc0ad\uc81c +Button.Define.Tooltip=\uae30\uc874 \ubcc0\uc218\ub4e4\uc758 \ub0b4\uc6a9 \uc815\uc758 +Calibration.Label.Point=\uc810 +CalibrationStick.Hint=\uae38\uc774 \uac12\uc744 \uc785\ub825\ud558\uac70\ub098 \ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub208\uae08 \ubcc0\uacbd, \uac01\uc744 \uc785\ub825\ud574\uc11c \uae30\uc6b8\uae30 \uc870\uc815 +CalibrationStick.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \ub208\uae08 \ubcc0\uacbd, Shift \ud0a4 \ub20c\ub7ec\uc11c \ub2e4\uc2dc \uc124\uc815 +CalibrationStick.New.Name=\uad50\uc815 \ub9c9\ub300\uc790 +CalibrationTapeMeasure.New.Name=\uad50\uc815 \uc904\uc790 +CalibrationTapeMeasure.Readout.Magnitude.Hint=\uc54c\uace0 \uc788\ub294 \uae38\uc774\ub97c \uad6d\uc81c\ub2e8\uc704\uacc4\ub85c \uc785\ub825\ud558\ub824\uba74 \ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub204\ub984 +CalibrationTapeMeasure.Hint=\ub208\uae08 \ubcc0\uacbd\uc744 \uc704\ud574 \uae38\uc774 \uc785\ub825, \uae30\uc6b8\uae30 \ubcc0\uacbd\uc744 \uc704\ud574 \uac01 \uc785\ub825 +DynamicSystem.Data.Description.0=\uc9c8\uc810 \uc0ac\uc774\uc758 \uc0c1\ub300 \uac70\ub9ac +DynamicSystem.Data.Description.1=\uc0c1\ub300 \uac01 +DynamicSystem.Data.Description.2=\uc0c1\ub300 \uc9c0\ub984\uc18d\ub3c4 +DynamicSystem.Data.Description.3=\uc0c1\ub300 \uac01\uc18d\ub3c4 +ExportDataDialog.Subtitle.Table=\ub370\uc774\ud130 +ExportDataDialog.Subtitle.Content=\uc140 +ExportDataDialog.Subtitle.Format=\uc22b\uc790 \ud615\uc2dd +ExportDataDialog.Subtitle.Delimiter=\uad6c\ubd84 \ubb38\uc790 +ExportDataDialog.Title=\ub370\uc774\ud130 \ubcf4\ub0b4\uae30 +ExportDataDialog.Delimiter.Add=\ucd94\uac00... +ExportDataDialog.Delimiter.Remove=\uc81c\uac70... +ExportDataDialog.Content.AllCells=\ubaa8\ub4e0 \uc140 +ExportDataDialog.Content.SelectedCells=\uc120\ud0dd\ub41c \uc140 +ExportDataDialog.MenuItem.RemoveDelimiter=\uad6c\ubd84 \ubb38\uc790 \uc81c\uac70 +ExportDataDialog.Chooser.SaveData.Title=\ub370\uc774\ud130 \uc800\uc7a5 +ExportVideoDialog.Button.SaveAs=\ub2e4\ub978 \uc774\ub984\uc73c\ub85c \uc800\uc7a5... +ExportVideoDialog.Button.FullSize=\uc804\uccb4 \ud06c\uae30 +ExportVideoDialog.Button.DrawnSize=\uc120\ud0dd\ud55c \ud06c\uae30 +ExportVideoDialog.Content.VideoOnly=\ube44\ub514\uc624\ub9cc +ExportVideoDialog.Content.VideoAndGraphics=\ube44\ub514\uc624\uc640 \uadf8\ub798\ud53d +ExportVideoDialog.Content.GraphicsOnly=\uadf8\ub798\ud53d\ub9cc +ExportVideoDialog.Title=\ube44\ub514\uc624 \ubcf4\ub0b4\uae30 +ExportVideoDialog.Label.ClipSettings=\ube44\ub514\uc624 \uc124\uc815 +ExportVideoDialog.Subtitle.Size=\ud574\uc0c1\ub3c4 +ExportVideoDialog.Subtitle.Content=\ud074\ub9bd +ExportVideoDialog.Subtitle.View=\uac1c\uccb4 +ExportVideoDialog.Subtitle.Format=\ud615\uc2dd +ExportVideoDialog.Complete.Message1=\ub2e4\uc74c\uacfc \uac19\uc774 \ube44\ub514\uc624 \uc800\uc7a5 \uc644\ub8cc: +ExportVideoDialog.Complete.Message2=Tracker \uc5d0\uc11c \uc9c0\uae08 \uc5f4\uae4c\uc694? +ExportVideoDialog.Complete.Title=\ubcf4\ub0b4\uae30 \uc644\ub8cc +ExportVideoDialog.VideoSize=\ube44\ub514\uc624 \ud574\uc0c1\ub3c4 +ExportVideoDialog.MatSize=\ubc14\ud0d5 \ud574\uc0c1\ub3c4 +ExportVideo.Dialog.HiddenPlots.Message=\uadf8\ub798\ud504\ub97c \ub0b4\ubcf4\ub0b4\ub824\uba74 \ub3c4\uad6c \ucc3d\uc5d0 \uadf8\ub798\ud504\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. +ExportVideo.Dialog.HiddenPlots.Title=\ub3c4\uad6c \ucc3d \uc624\ub958 +Footprint.DoubleTarget=\uc774\uc911 \uc2ed\uc790\uc120 +Footprint.BoldDoubleTarget=\uad75\uc740 \uc774\uc911 \uc2ed\uc790\uc120 +OffsetOrigin.MenuItem.Fixed=\uc6d4\ub4dc \uc88c\ud45c \uace0\uc815 +ParticleModel.Dialog.Offscreen.Message1=\ud654\uba74\uc5d0\uc11c \ub108\ubb34 \uba40\ub9ac \ubc97\uc5b4\ub09c \ubaa8\ud615\uc758 \uc77c\ubd80 \uc2a4\ud15d\ub4e4\uc740 \ube44\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. +ParticleModel.Dialog.Offscreen.Message2=\uc774\ub97c \uace0\uce58\ub824\uba74 \ubaa8\ud615\uc744 \uc218\uc815\ud558\uac70\ub098 \ube44\ub514\uc624\uc758 \ud654\uba74 \ud06c\uae30\ub97c \ub2e4\uc2dc \ubcc0\uacbd\ud569\ub2c8\ub2e4. +ParticleModel.Dialog.Offscreen.Title=\ud654\uba74\uc5d0\uc11c \ubc97\uc5b4\ub0a8 +PrefsDialog.Tab.Configuration.Title=\ub3c4\uad6c +PrefsDialog.Memory.BorderTitle=\uba54\ubaa8\ub9ac \ud06c\uae30 +PrefsDialog.Tab.General.Title=\ud504\ub85c\uadf8\ub7a8 +PrefsDialog.RecentFiles.BorderTitle=\ucd5c\uadfc \uc791\uc5c5 \ubb38\uc11c +PrefsDialog.Label.RecentSize=\ubcf4\uc5ec \uc904 \ud30c\uc77c \uc218 +PrefsDialog.Hints.BorderTitle=\ub3c4\uc6c0\ub9d0 +PrefsDialog.Button.Relaunch=\ub2e4\uc2dc \uc2dc\uc791\ud558\uae30 +PrefsDialog.Button.ClearRecent=\uc9c0\uc6b0\uae30 +PrefsDialog.Checkbox.DefaultSize=\uae30\ubcf8 \uc124\uc815\uc73c\ub85c +PrefsDialog.Checkbox.HintsOn=\ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 +PrefsDialog.Tab.Video.Title=\ube44\ub514\uc624 +PrefsDialog.VideoPref.BorderTitle=\ube44\ub514\uc624 \uc5d4\uc9c4 +PrefsDialog.Button.Xuggle=Xuggle (\uad8c\uc7a5) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc\uc77c \uacbd\uc6b0 \uba54\ubaa8\ub9ac \uad00\ub9ac\uac00 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. +PrefsDialog.Dialog.WebStart.Title=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc +PrefsDialog.LookFeel.BorderTitle=\uc2a4\ud0a8 +PrefsDialog.Language.BorderTitle=\uc5b8\uc5b4 +PrefsDialog.Upgrades.BorderTitle=\uc5c5\uadf8\ub808\uc774\ub4dc \ud655\uc778 +PrefsDialog.Tab.Runtime.Title=\uc2e4\ud589 +PrefsDialog.Tab.Display.Title=\ubcf4\uae30 +PrefsDialog.Language.Default=\uae30\ubcf8 \uc124\uc815 +PrefsDialog.Upgrades.Always=\ud56d\uc0c1 +PrefsDialog.Upgrades.Weekly=1\uc8fc\uc77c \uac04\uaca9 +PrefsDialog.Upgrades.Monthly=1\ub2ec \uac04\uaca9 +PrefsDialog.Upgrades.Never=\ud655\uc778\ud558\uc9c0 \uc54a\uc74c +PrefsDialog.Button.CheckForUpgrade=\uc9c0\uae08 \ud655\uc778 +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle \ube44\ub514\uc624 \uc7ac\uc0dd +PrefsDialog.Xuggle.Slow=\ubd80\ub4dc\ub7fd\uac8c (\ub290\ub9bc) +PrefsDialog.Xuggle.Fast=\uac70\uce60\uac8c (\ube60\ub984) +PrefsDialog.CalibrationTool.BorderTitle=\uae30\ubcf8 \uad50\uc815 \ub3c4\uad6c +Protractor.Name=\uac01\ub3c4\uae30 +Protractor.New.Name=\uac01\ub3c4\uae30 +Protractor.Hint=\uac01\ub3c4\uae30\uc758 \ud314\uc744 \ub9c8\uc6b0\uc2a4\ub85c \ub04c\uc5b4\uc11c \uac01 \uce21\uc815 +Protractor.Label.Angle=\uac01 +Protractor.Field.Angle.Tooltip=\uac01\ub3c4\uae30 \ub450 \ud314 \uc0ac\uc774\uc758 \uac01 +Protractor.Vertex.Name=\uaf2d\uc9c0\uc810 +Protractor.Vertex.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uaf2d\uc9c0\uc810 \uc774\ub3d9 +Protractor.End.Name=\uac01\ub3c4\uae30 \ud314\uc758 \ub05d +Protractor.End.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \ud314\uc744 \ud68c\uc804 +Protractor.Handle.Name=\ud578\ub4e4 +Protractor.Handle.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \uc774\ub3d9 +Protractor.Rotator.Name=\ud68c\uc804\uc790 +Protractor.Rotator.Hint=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uac01\ub3c4\uae30 \ud68c\uc804 +Protractor.Readout.Name=\uce21\uc815\uac12 +Protractor.Readout.Hint=\uac01\ub3c4\uae30 \ub450 \ud314 \uc0ac\uc774\uc758 \uac01 +ProtractorFootprint.Circle3=\uc791\uc740 \uc6d0 +ProtractorFootprint.Circle5=\ud070 \uc6d0 +ProtractorFootprint.Circle3Bold=\uad75\uc740 \uc791\uc740 \uc6d0 +ProtractorFootprint.Circle5Bold=\uad75\uc740 \ud070 \uc6d0 +Stick.Name=\uad50\uc815 \ub9c9\ub300\uc790 +Stick.New.Name=\uad50\uc815 \ub9c9\ub300\uc790 +TableTrackView.MenuItem.Unformatted=\uc22b\uc790 +TableTrackView.MenuItem.Formatted=\uc720\ud6a8\uc22b\uc790 +TableTrackView.Menu.SetDelimiter=\uad6c\ubd84 \ubb38\uc790... +TableTrackView.MenuItem.AddDelimiter=\ucd94\uac00... +TableTrackView.MenuItem.RemoveDelimiter=\uc81c\uac70... +TableTrackView.Dialog.CustomDelimiter.Message=\uc0c8 \uad6c\ubd84 \ubb38\uc790 \uc785\ub825: +TableTrackView.Dialog.CustomDelimiter.Title=\uad6c\ubd84 \ubb38\uc790 \ucd94\uac00 +TableTrackView.Header.Tooltip=\ub9c8\uc6b0\uc2a4 \ub20c\ub7ec\uc11c \uc815\ub82c \ub610\ub294 \ub354\ube14 \ud074\ub9ad\ud574\uc11c \uc5f4 \uc120\ud0dd +TableTrackView.MenuItem.CopySelectedData=\ub370\uc774\ud130 \ubcf5\uc0ac +TableTrackView.Dialog.RemoveDelimiter.Message=\uc81c\uac70\ud558\ub824\ub294 \uad6c\ubd84 \ubb38\uc790 \uc120\ud0dd: +TableTrackView.Dialog.RemoveDelimiter.Title=\uad6c\ubd84 \ubb38\uc790 \uc81c\uac70 +TableTrackView.Radians.Tooltip=(\ub77c\ub514\uc548) +TableTrackView.Degrees.Tooltip=(\ub3c4) +TableTrackView.RadiansPerSecond.Tooltip=(rad/s) +TableTrackView.DegreesPerSecond.Tooltip=(deg/s) +TableTrackView.RadiansPerSecondSquared.Tooltip=(rad/s^2) +TableTrackView.DegreesPerSecondSquared.Tooltip=(deg/s^2) +TableTrackView.MenuItem.DeleteDataFunction=\ub370\uc774\ud130 \ud568\uc218 \uc0ad\uc81c +TActions.Action.SaveFrame=\ud1b5\ud569 \ubb38\uc11c \uc800\uc7a5... +TActions.AboutVideo=\uc18d\uc131... +TActions.Dialog.AboutVideo.Title=\ube44\ub514\uc624 \uc18d\uc131 +TActions.Dialog.AboutVideo.Type=\ud615\uc2dd +TActions.Dialog.AboutVideo.Size=\ud574\uc0c1\ub3c4 +TActions.Dialog.AboutVideo.Length=\uae38\uc774 +TActions.Dialog.AboutVideo.Frames=\ud504\ub808\uc784 +TActions.Dialog.AboutVideo.Seconds=\ucd08 +TActions.Dialog.AboutVideo.FrameRate=\ud504\ub808\uc784 \uc18d\ub3c4 +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=\uacbd\ub85c +TActions.Action.ImportTRK=Tracker \ud30c\uc77c... +TActions.Action.ProtractorVisible=\ubcf4\uae30 +TapeMeasure.MenuItem.FixedLength=\uae38\uc774 \uace0\uc815 +TextTView.Label.NoTab=\uc5ec\uae30\uc5d0 \uae00\uacfc HTML \uc6f9 \ud398\uc774\uc9c0\ub97c \ucd94\uac00\ud558\ub824\uba74 "\ub0b4\uc6a9"\uc744 \ub204\ub985\ub2c8\ub2e4. +TextTView.NewTab.Text1=\uae00\uc774\ub098 \uc81c\ubaa9\uc744 \uc218\uc815\ud558\ub824\uba74 \ub354\ube14 \ud074\ub9ad\ud569\ub2c8\ub2e4. \uc635\uc158\uc744 \ub354 \ubcf4\ub824\uba74 \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +TextTView.NewTab.Text2=\uc6f9 \ud398\uc774\uc9c0\ub97c \ubcf4\ub824\uba74 \uc6f9 \uc0ac\uc774\ud2b8 \uc8fc\uc18c\ub97c \uc785\ub825\ud558\uac70\ub098 \ub9c8\uc6b0\uc2a4 \uc624\ub978\ucabd \ub2e8\ucd94\ub97c \ub20c\ub7ec\uc11c \uc6f9 \ud398\uc774\uc9c0 \ubd88\ub7ec\uc624\uae30\ub97c \ud569\ub2c8\ub2e4. +TextTView.NewTab.Title=\ub0b4\uc6a9 +TextTView.Dialog.TabTitle.Title=\uc81c\ubaa9 \uc785\ub825 +TextTView.MenuItem.OpenHTML=\uc6f9 \ud398\uc774\uc9c0 \ubd88\ub7ec\uc624\uae30... +TextTView.MenuItem.SetTitle=\uc81c\ubaa9 \uc785\ub825... +TextTView.Button.NewTab=\uc0c8 \ub0b4\uc6a9 +TextTView.TextEdit.Description=... +TFrame.Dialog.FileNotFound.Message=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c: +TFrame.Dialog.FileNotFound.Title=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c +TFrame.View.Text=\ub0b4\uc6a9 +TFrame.View.Main=\uc791\uc5c5 \ucc3d +TMenuBar.Menu.OpenRecent=\ucd5c\uadfc \uc791\uc5c5 \ub0b4\uc6a9 +TMenuBar.Menu.Import=\ubd88\ub7ec\uc624\uae30 +TMenuBar.Menu.Export=\ubcf4\ub0b4\uae30 +TMenuBar.MenuItem.Video=\ube44\ub514\uc624... +TMenuBar.MenuItem.Data=\ub370\uc774\ud130... +TMenuBar.Menu.CopyObject=\uac1c\uccb4 \ubcf5\uc0ac +TMenuBar.MenuItem.Coords=\uc88c\ud45c +TMenuBar.MenuItem.VideoClip=\ube44\ub514\uc624 +TMenuBar.Menu.MeasuringTools=\uce21\uc815 \ub3c4\uad6c +TMenuBar.Menu.AngleUnits=\uac01 +TMenuBar.MenuItem.Degrees=\ub3c4 +TMenuBar.MenuItem.Radians=\ub77c\ub514\uc548 +Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoXuggle.Message1=Xuggle \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoXuggle.Message2=Xuggle \ub2e4\uc6b4\ub85c\ub4dc: http://www.xuggle.com/xuggler/downloads/ +Tracker.Action.AboutXuggle=Xuggle \uc815\ubcf4... +Tracker.Dialog.AboutXuggle.Title=Xuggle \uc815\ubcf4 +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \ubc84\uc804 +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \uc124\uce58 \uacbd\ub85c: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar \uacbd\ub85c: +Tracker.Dialog.NoVideoEngine.Message1=Tracker \ub294 \uae30\ubcf8 \ud615\uc2dd\uc758 \uc560\ub2c8\uba54\uc774\uc158 GIF, \uadf8\ub9bc\uacfc \ub3d9\uc601\uc0c1\uc744 \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoVideoEngine.Message2=\uadf8\ub7ec\ub098 \ub2e4\ub978 \ube44\ub514\uc624 \ud615\uc2dd\uc744 \ubd88\ub7ec\uc624\ub824\uba74 \ubcc4\ub3c4\uc758 \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. +Tracker.Dialog.NoVideoEngine.Message3=\uacf5\uac1c \ucf54\ub4dc\uc774\uba70 \uacf5\ud1b5 \ud615\uc2dd\uc73c\ub85c \uad8c\uc7a5\ub41c \ube44\ub514\uc624 \uc5d4\uc9c4\uc778 Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c +Tracker.Dialog.NoVideoEngine.Message4=\uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: +Tracker.Dialog.NoVideoEngine.Title=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c +Tracker.Dialog.NoXuggle.Message1=Xuggle \uc744 \uc62c\ubc14\ub974\uac8c \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoXuggle.Message2=xuggle jar \ud30c\uc77c\uc774 \uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. +Tracker.Dialog.NoXuggle.Message3=\uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\ub294 Tracker_README.txt \ub97c \ucc38\uc870\ud569\ub2c8\ub2e4. +Tracker.Dialog.NoXuggle.Message4=Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: +Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c +Tracker.About.DefaultLocale=\uae30\ubcf8 \uc124\uc815 +Tracker.About.CurrentLanguage=\uc5b8\uc5b4 +Tracker.Dialog.InsufficientMemory.Title=\uba54\ubaa8\ub9ac \ubd80\uc871 +Tracker.Dialog.InsufficientMemory.Message=\uc694\uccad\ud55c \uba54\ubaa8\ub9ac\uac00 \ub108\ubb34 \ud07d\ub2c8\ub2e4. +TrackerIO.Dialog.TabMustBeSaved.Message1=\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \ubb38\uc11c - +TrackerIO.Dialog.TabMustBeSaved.Message2= \ub97c \ud1b5\ud569 \ubb38\uc11c \uc548\uc5d0 Tracker \ud30c\uc77c\ub85c \uc800\uc7a5\ud569\ub2c8\ub2e4. +TrackerIO.Dialog.TabMustBeSaved.Message3=\uc800\uc7a5\ud560\uae4c\uc694? +TrackerIO.Dialog.TabMustBeSaved.Title=\uc800\uc7a5\ud558\uc9c0 \uc54a\uc740 \ubb38\uc11c +TrackerIO.Dialog.NoTabs.Message=\uc800\uc7a5\ud558\uae30 \uc704\ud55c \ubb38\uc11c\uac00 \uc5c6\uc2b5\ub2c8\ub2e4! +TrackerIO.Dialog.NoTabs.Title=\ube48 \ubb38\uc11c \ud1b5\ud569 +TrackerIO.Dialog.SaveTabset.Title=\ud1b5\ud569 \ubb38\uc11c \uc800\uc7a5 +TrackerIO.Dialog.SaveTab.Title=\ubb38\uc11c \uc800\uc7a5 +TrackerIO.Delimiter.Tab=\ud0ed +TrackerIO.Delimiter.Space=\uacf5\ubc31 +TrackerIO.Delimiter.Comma=\uc27c\ud45c +TrackerIO.Delimiter.Semicolon=\uc30d\ubc18\uc810 +TrackerIO.VideoAndDataFileFilter.Description=\ube44\ub514\uc624\uc640 Tracker \ud30c\uc77c +TrackerPanel.Dialog.Version.Message1= \ud604\uc7ac \uc2e4\ud589 \uc911\uc778 Tracker \ubc84\uc804\uc5d0 \uc5c6\ub294 \uae30\ub2a5\uacfc \ub0b4\uc6a9\uc774 \ucd94\uac00\ub41c +TrackerPanel.Dialog.Version.Message2=\ub2e4\ub978 \ubc84\uc804\uc5d0\uc11c \ub9cc\ub4e4\uc5b4\uc9c4 \ud30c\uc77c\uc744 \ubd88\ub7ec\uc624\ub824\uace0 \ud569\ub2c8\ub2e4. +TrackerPanel.Dialog.Version.Message3=Tracker \ubc84\uc804\uc744 \ud655\uc778\ud569\ub2c8\ub2e4. +TrackerPanel.Dialog.Version.Message4=\uac00\uc7a5 \ucd5c\uadfc\uc758 \ubc84\uc804 \uc0ac\uc6a9 \uac00\ub2a5: +TrackerPanel.Dialog.Version.Title=\ubc84\uc804\uc774 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c +TrackerPanel.Label.ModelStart=\uc2dc\uc791 +TrackerPanel.Label.ModelEnd=\ub05d +TrackerPanel.Spinner.ModelStart.Tooltip=\uc774 \ubaa8\ud615\uc5d0 \ub300\ud55c \uc2dc\uc791 \ud504\ub808\uc784 \uc124\uc815 +TrackerPanel.Spinner.ModelEnd.Tooltip=\uc774 \ubaa8\ud615\uc5d0 \ub300\ud55c \ub05d \ud504\ub808\uc784 \uc124\uc815 +TToolbar.Button.ProtractorVisible.Tooltip=\uac01\ub3c4\uae30 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 +TToolbar.Button.AxesVisible.Tooltip=\uc88c\ud45c\ucd95 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 +TToolBar.Button.TrackControl.Tooltip=\ud2b8\ub799 \ucee8\ud2b8\ub864 \ubcf4\uc774\uac70\ub098 \uac10\ucd94\uae30 +TTrack.Dialog.StepSizeWarning.Message1=\uc8fc\uc758: \ucc3e\uc9c0 \ubabb\ud558\uace0 \uac74\ub108\ub6f4 \ud504\ub808\uc784\uc774 \ud55c \uac1c \uc774\uc0c1\uc758 \uc2a4\ud15d \ud06c\uae30\ub85c \uc124\uc815\ub41c \uc77c\ubd80 \ud2b8\ub799\uc774 \uc788\uc2b5\ub2c8\ub2e4. +TTrack.Dialog.StepSizeWarning.Message2=\uc2a4\ud15d \ud06c\uae30\uac00 \ub2e4\ub974\uba74 \ub370\uc774\ud130 \uacc4\uc5f4\uc774 \uc5f0\uc18d\uc801\uc774\uc9c0 \uc54a\uc740 \ube48 \ub370\uc774\ud130 \uacb0\uacfc\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. +TTrack.Dialog.StepSizeWarning.Message3=\ubaa8\ub4e0 \ub370\uc774\ud130 \uc2a4\ud15d\uc774 \ud45c\uc2dc\ub418\uae30 \uc804\uae4c\uc9c0\ub294 \ube48 \ub370\uc774\ud130 \uacc4\uc5f4 \uc8fc\ubcc0\uc5d0\uc11c \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4\ub97c \uacc4\uc0b0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +TTrack.Dialog.StepSizeWarning.Title=\uc8fc\uc758 +TTrack.Dialog.SkippedStepWarning.Message1=\uc8fc\uc758: \ucc3e\uae30 \uc704\uce58\ub97c \ud45c\uc2dc\ud560 \ub54c \uc2a4\ud15d\uc744 \uac74\ub108 \ub6f0\uba74 \ub370\uc774\ud130 \uacc4\uc5f4\uc5d0 \ube48 \ub370\uc774\ud130\ub97c \ub0a8\uae30\uac8c \ub429\ub2c8\ub2e4. +TTrack.Dialog.SkippedStepWarning.Title=\uc8fc\uc758 +TTrack.Dialog.SkippedStepWarning.Checkbox=\ub2e4\uc2dc \ubcf4\uc9c0 \uc54a\uae30 +TTrack.Locked.Hint=\uc7a0\uae08 +TTrack.AngleField.Radians.Tooltip=\uac01 (\ub77c\ub514\uc548) +TTrack.AngleField.Degrees.Tooltip=\uac01 (\ub3c4) +TTrack.AngleField.Popup.Radians=\uac01 (\ub77c\ub514\uc548)\uc73c\ub85c \ubcc0\ud658 +TTrack.AngleField.Popup.Degrees=\uac01 (\ub3c4)\ub85c \ubcc0\ud658 +TTrackBar.Memory.Menu.SetSize=\uba54\ubaa8\ub9ac \ud06c\uae30 \uc124\uc815... +TTrackBar.Button.Version=\uc9c0\uae08 \ud65c\uc6a9 \uac00\ub2a5: \ubc84\uc804 +TTrackBar.Popup.MenuItem.Upgrade=\uc9c0\uae08 \uc5c5\uadf8\ub808\uc774\ub4dc... +TTrackBar.Popup.MenuItem.Ignore=\ubb34\uc2dc +XuggleVideo.MenuItem.SmoothPlay=\ubd80\ub4dc\ub7ec\uc6b4 \uc7ac\uc0dd (\ub290\ub9bc) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=\uad50\uc815 \uc904\uc790 +CircleFootprint.Circle=\uc6d0 +CircleFootprint.FilledCircle=\uc18d\uc774 \ucc2c \uc6d0 +CircleFootprint.Dialog.Title=\uc6d0 \uc18d\uc131 +CircleFootprint.Dialog.Label.Radius=\ubc18\uc9c0\ub984 +CircleFootprint.Dialog.Checkbox.Bold=\uad75\uac8c +CircleFootprint.Dialog.Checkbox.CenterSpot=\uac00\uc6b4\ub370 \uc810 +LineProfile.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub04c\uc5b4\uc11c \uc120 \ud504\ub85c\ud30c\uc77c \uc124\uc815 +PageTView.Button.Page=\ub0b4\uc6a9 +PageTView.MenuItem.ClosePage=\ub2eb\uae30 +PointMass.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc124\uc815, Enter \ud0a4 \ub20c\ub7ec\uc11c \uc774\uc804 \uc2a4\ud15d \ubcf5\uc0ac +PrefsDialog.Dialog.NewVersion.Title=\uc5c5\uadf8\ub808\uc774\ub4dc +PrefsDialog.Dialog.NewVersion.Message1=\ubc84\uc804 +PrefsDialog.Dialog.NewVersion.Message2=\uc9c0\uae08 \uc5c5\uadf8\ub808\uc774\ub4dc \uac00\ub2a5: +PrefsDialog.Dialog.NewVersion.None.Message=\uc9c0\uae08 \ud65c\uc6a9 \uac00\ub2a5\ud55c \uc0c8 \ubc84\uc804\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. +RGBRegion.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc601\uc5ed\uc758 \uc911\uc2ec\uc744 \ud45c\uc2dc +TMenuBar.MenuItem.Restore=\ucc3d\uc744 \uc6d0\ub798\ub300\ub85c +TrackControl.StretchVectors.None=\ubca1\ud130 \ub298\ub9ac\uae30 \uc5c6\uc74c +TViewChooser.Maximize.Tooltip=\ucc3d\uc744 \ucd5c\ub300 \ud06c\uae30\ub85c +TViewChooser.Restore.Tooltip=\ucc3d\uc744 \uc6d0\ub798\ub300\ub85c +Vector.Hint.Marking=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \uc124\uc815, Enter \ud0a4 \ub20c\ub7ec\uc11c \uc774\uc804 \uc2a4\ud15d \ubcf5\uc0ac +WorldTView.Button.World=\uc6d4\ub4dc \ubdf0 + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=\uc8fc\uc758 +PrefsDialog.Checkbox.WarnIfNoEngine=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c +PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle \uc624\ub958 +PropertiesDialog.Title=\uc18d\uc131 +PropertiesDialog.Label.Author=\uc9c0\uc740\uc774 +PropertiesDialog.Label.Contact=\uc5f0\ub77d\ucc98 +TActions.Action.Properties=\uc18d\uc131... +TActions.Action.OpenBrowser=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac... +TFrame.Progress.Xuggle=Xuggle \ud504\ub808\uc784 \ubd88\ub7ec\uc624\ub294 \uc911 +TFrame.Progress.ClickToCancel=(\ucde8\uc18c\ud558\ub824\uba74 \ub204\ub984) +TFrame.Dialog.StalledVideo.Title=\ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30 \uc624\ub958 +TFrame.Dialog.StalledVideo.Message0=\ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \uc911\uc5d0 \uc77c\uc2dc\uc801\uc73c\ub85c \uba48\ucd94\uc5c8\uc2b5\ub2c8\ub2e4. +TFrame.Dialog.StalledVideo.Message1=\ubd88\ub7ec\uc624\uae30\ub97c \uc9c0\uae08 \uc911\uc9c0\ud558\uac70\ub098 \uae30\ub2e4\ub9bd\ub2c8\ub2e4. +TFrame.Dialog.StalledVideo.Message2=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\uae30 \uc704\ud574 \uac00\ub2a5\ud55c \ub2e4\ub978 \ubc29\ubc95: +TFrame.Dialog.StalledVideo.Message3=1. \ube44\ub514\uc624 \ubcc0\ud658 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \uc774\uc6a9\ud558\uc5ec \ub2e4\ub978 \ud615\uc2dd\uc73c\ub85c \ubcc0\ud658\ud574\uc11c \ubd88\ub7ec\uc635\ub2c8\ub2e4. +TFrame.Dialog.StalledVideo.Message4=2. \ud30c\uc77c \ud0d0\uc0c9\uae30\ub098 \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c QuickTime \uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. +TFrame.Dialog.StalledVideo.MessageMac=2. 32-\ube44\ud2b8 Java VM \uc5d0\uc11c Tracker \ub97c \uc5f4\uace0 QuickTime\uc73c\ub85c \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc635\ub2c8\ub2e4. +TFrame.Dialog.StalledVideo.Button.Stop=\uba48\ucda4 +TFrame.Dialog.StalledVideo.Button.Wait=\uae30\ub2e4\ub9bc +Tracker.Dialog.NoVideoEngine.Checkbox=\ub2e4\uc2dc \ubcf4\uc9c0 \uc54a\uae30 +TrackerIO.ZipFileFilter.Description=\uc555\ucd95 (zip) \ud30c\uc77c +TrackerIO.Dialog.ErrorFFMPEG.Message1=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \ub3d9\uc548 Xuggle \uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uc624\ub958 \ubc1c\uc0dd: +TrackerIO.Dialog.ErrorFFMPEG.Message2=\ubaa8\ub4e0 \uc624\ub958\uac00 \uce58\uba85\uc801\uc778 \uac83\uc740 \uc544\ub2c8\uba70 \uc624\ub958 \uba54\uc2dc\uc2dc\ub97c \ubcf4\ub824\uba74 [\ub3c4\uc6c0\ub9d0|\uba54\uc2dc\uc9c0 \ub85c\uadf8]\ub97c \ubd05\ub2c8\ub2e4. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Xuggle \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74, QuickTime \uc73c\ub85c \ube44\ub514\uc624\ub97c \uc5f4\uc5b4 \ubcfc \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\ub178\ud2b8: Mac OSX \uc5d0\uc11c\ub294 32-\ube44\ud2b8 Java VM \uc5d0\uc11c Tracker \ub97c \uc5f4\uc5b4\uc57c \ud569\ub2c8\ub2e4. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \uc624\ub958 +TrackerIO.ErrorFFMPEG.LogMessage=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc744 \ubcf4\uae30 \uc704\ud574, \ud658\uacbd \uc124\uc815 \ub300\ud654 \uc0c1\uc790 [\ud3b8\uc9d1|\ud658\uacbd \uc124\uc815]\uc5d0\uc11c [\ube44\ub514\uc624|\uc8fc\uc758] \ud56d\ubaa9\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. +TToolBar.Button.OpenBrowser.Tooltip=OSP \ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac + +# Additions by Doug Brown 2011-07-04 +VideoFilter.Deinterlace=\ub514\uc778\ud130\ub808\uc774\uc2a4 +VideoFilter.Ghost=\uc794\uc0c1 +VideoFilter.DarkGhost=\uc9d9\uc740 \uc794\uc0c1 +VideoFilter.Negative=\ub124\uac70\ud2f0\ube0c +VideoFilter.GrayScale=\ud68c\uc0c9\uc870 +VideoFilter.Brightness=\ubc1d\uae30\uc640 \ub300\ube44 +VideoFilter.Baseline=\ubca0\uc774\uc2a4\ub77c\uc778 +VideoFilter.Sum=\ud569 +VideoFilter.Resize=\ud574\uc0c1\ub3c4 \ubcc0\uacbd +VideoFilter.Rotate=\ud68c\uc804 +VideoFilter.Perspective=\uc6d0\uadfc + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=\ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c +TFrame.Dialog.NoTRKInComPADRE.Message=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c Tracker \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=\uc6b4\ub3d9\ud559 \uc785\uc790 +DynamicParticle.Builder.Title=\ub3d9\uc5ed\ud559 \uc785\uc790 (\ub370\uce74\ub974\ud2b8 \uc88c\ud45c) +DynamicParticlePolar.Builder.Title=\ub3d9\uc5ed\ud559 \uc785\uc790 (\uadf9\uc88c\ud45c) +DynamicSystem.Builder.Title=\ub3d9\uc5ed\ud559\uacc4 (\uc18d) +PropertiesDialog.Button.CopyFilePath=\ud30c\uc77c \uacbd\ub85c \ubcf5\uc0ac +PropertiesDialog.Button.CopyVideoPath=\ube44\ub514\uc624 \uacbd\ub85c \ubcf5\uc0ac +PropertiesDialog.Tab.TrackerFile=Tracker \ud30c\uc77c +PropertiesDialog.Tab.Metadata=\uba54\ud0c0\ub370\uc774\ud130 +PropertiesDialog.Header.Property=\uc18d\uc131 +PropertiesDialog.Header.Value=\uac12 +TActions.Action.OpenURL=\uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubd88\ub7ec\uc624\uae30... +TActions.Dialog.OpenURL.Title=\uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \ubd88\ub7ec\uc624\uae30 +TActions.Dialog.OpenURL.Message=\uc6f9 \uae30\ubc18 \ube44\ub514\uc624, Tracker \ud30c\uc77c \ub610\ub294 Tracker \uc555\ucd95 (zip) \ud30c\uc77c\uc758 URL \uc785\ub825 +TActions.Dialog.AboutVideo.Name=\uc774\ub984 + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=\uce90\uc2dc \ud30c\uc77c +PrefsDialog.Button.ClearCache=\uc9c0\uc6b0\uae30 + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, Shift \ud0a4 \ub20c\ub7ec\uc11c \uc704\uce58 \ub2e4\uc2dc \uc124\uc815 +PointMass.Remarking.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \uc704\uce58 \ub2e4\uc2dc \uc124\uc815 +PointMass.PositionSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uac70\ub098 \uc704\uce58 \uc785\ub825 +PointMass.VectorSelected.Hint=\ub04c\uc5b4\uc11c \uc774\ub3d9 +Vector.Remark.Hint=Shift \ud0a4 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \ub2e4\uc2dc \uc124\uc815 +Vector.TipSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uac70\ub098 \ubca1\ud130 \uc131\ubd84 \uc785\ub825 +Vector.HandleSelected.Hint=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \uc774\ub3d9 +Vector.Remarking.Hint=\ub9c8\uc6b0\uc2a4 \ub2e8\ucd94 \ub20c\ub7ec\uc11c \ubca1\ud130\uc758 \uba38\ub9ac \ub2e4\uc2dc \uc124\uc815 +AutoTracker.Label.Search=\ucc3e\uae30 +AutoTracker.Label.Target=\ubaa9\ud45c +AutoTracker.Label.Frame=\ud504\ub808\uc784 +AutoTracker.Label.Point=\ub300\uc0c1 +AutoTracker.Label.Template=\uacac\ubcf8 +AutoTracker.Label.Track=\ud2b8\ub799 +AutoTracker.Label.Match=\uc77c\uce58 +AutoTracker.Label.NoTemplate=\uacac\ubcf8 \uc5c6\uc74c +AutoTracker.Label.EvolutionRate=\ubcc0\ud654\uc728 +AutoTracker.Label.Automark=\uc624\ud1a0\ub9c8\ud06c +AutoTracker.Info.Instructions=\ucc3e\uae30 \uc601\uc5ed\uc5d0\uc11c \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uae30 \uc704\ud574\uc11c \ucc3e\uae30 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +AutoTracker.Info.KeyFrame.Instructions1=\uc774 \ud0a4 \ud504\ub808\uc784\uc740 \uacac\ubcf8\uacfc \ub300\uc0c1\uc744 \uadf8\ub9bc\uacfc \uac19\uc774 \uc815\uc758\ud569\ub2c8\ub2e4. \uacac\ubcf8\uacfc \uc77c\uce58\ud558\ub294 \ub300\uc0c1\uc744 \ucc3e\uc73c\ub824\uba74 \ucc3e\uae30 \ub2e8\ucd94\ub97c \ub204\ub985\ub2c8\ub2e4. +AutoTracker.Info.KeyFrame.Instructions2=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \ub300\uc0c1\uc774\ub098 \uacac\ubcf8 \ub610\ub294 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. +AutoTracker.Info.MouseOver.Instructions=\ucee8\ud2b8\ub864\uc758 \uc124\uc815\uacfc \ubcc0\uacbd\uc5d0 \ub300\ud574 \ub3c4\uc6c0\ub9d0\uc774 \ud544\uc694\ud558\uba74 \ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130\ub97c \ucee8\ud2b8\ub864 \uc704\ub85c \uac00\uc838\ub2e4 \ub193\uc2b5\ub2c8\ub2e4. +AutoTracker.Info.Mask1=\ucc3e\uc544\uc11c \uc77c\uce58\uc2dc\ud0a4\ub824\ub294 \ub300\uc0c1\uc778 \ucc3e\uae30 \uacac\ubcf8\uc740 \ud0a4 \ud504\ub808\uc784\uc758 \uc2dc\uc791\uacfc \ud568\uaed8 \uc810\uc9c4\uc801\uc73c\ub85c \ubaa8\uc591\uacfc \uc0c9 \ubcc0\ud654\uc5d0 \uc801\uc751\ub429\ub2c8\ub2e4. +AutoTracker.Info.Mask2=\uc790\ub3d9 \ucc3e\uae30\ub97c \ud558\uae30 \uc704\ud574\uc11c\ub294 \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc774 \ub300\uc0c1\uacfc \uc77c\uce58\ud558\ub294 \ucd5c\uc18c\uac12\uc774 \ub418\uc5b4\uc57c \ud569\ub2c8\ub2e4. +AutoTracker.Info.Mask.Instructions=\ubaa8\uc11c\ub9ac \ub610\ub294 \uac00\uc7a5\uc790\ub9ac \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \uacac\ubcf8\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. \ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc758 \ub2e8\ucd94\ub97c \ub20c\ub7ec\uc11c \ubcc0\ud654\uc728\uacfc \uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc744 \uc870\uc815\ud569\ub2c8\ub2e4. +AutoTracker.Info.Mask.Tip=\uc624\ud1a0\ub9c8\ud06c \uc124\uc815\uac12\uc774 \uc791\uc73c\uba74 \ucc3e\uae30 \ub300\uc0c1\uc774 \uc798\ubabb \uc77c\uce58\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\ub294 \ub300\uc2e0\uc5d0 \ubcc0\ud654\uc728\uc744 \ub192\uc785\ub2c8\ub2e4. +AutoTracker.Info.Search=\ucd5c\uc801\uc758 \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc744 \uc870\uc0ac\ud569\ub2c8\ub2e4.. +AutoTracker.Info.SearchOnAxis=\ucd5c\uc801\uc758 \uc77c\uce58\ub97c \uc704\ud574 \ucc3e\uae30 \uc601\uc5ed\uc758 x \ucd95\uc744 \uc870\uc0ac\ud569\ub2c8\ub2e4. +AutoTracker.Info.Search.Instructions=\ubaa8\uc11c\ub9ac \ub610\ub294 \uac00\uc7a5\uc790\ub9ac \ud578\ub4e4\uc744 \ub04c\uc5b4\uc11c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc774\ub3d9\ud558\uac70\ub098 \ud06c\uae30\ub97c \ubcc0\uacbd\ud569\ub2c8\ub2e4. x \ucd95\uacfc \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. +AutoTracker.Info.Search.Tip=\ub300\ubd80\ubd84\uc758 \uacbd\uc6b0 \ucc3e\uae30 \uc601\uc5ed\uc774 \ud074 \ud544\uc694\ub294 \uc5c6\uc2b5\ub2c8\ub2e4. \ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158\uc740 \uc790\ub3d9\uc73c\ub85c \ub2e4\uc74c \ucc3e\uae30 \uc601\uc5ed\uc744 \uc608\uce21\ud558\uc5ec \uc774\ub3d9\uc2dc\ucf1c \uc90d\ub2c8\ub2e4. +AutoTracker.Info.Target=\ucc3e\uae30 \ubaa9\ud45c\ub294 \ud2b8\ub799\uacfc \ub300\uc0c1\uc785\ub2c8\ub2e4. +AutoTracker.Info.Target.Instructions=\ub9c8\uc6b0\uc2a4 \ud3ec\uc778\ud130 \ub04c\uc5b4\uc11c \ub300\uc0c1\uc744 \uc62e\uae41\ub2c8\ub2e4 (\ud0a4 \ud504\ub808\uc784). \ud14d\uc2a4\ud2b8 \uc0c1\uc790\uc758 \ubaa9\ub85d\uc5d0\uc11c \ucc3e\uae30 \ubaa9\ud45c\uc758 \ud2b8\ub799\uacfc \ub300\uc0c1\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. +AutoTracker.Info.Title.Settings=\uc124\uc815 +AutoTracker.Info.Title.Tip=\ub3c4\uc6c0\ub9d0 +AutoTracker.Info.SelectTrack=\uc790\ub3d9\uc73c\ub85c \ucc3e\uae30 \uc704\ud574\uc11c \ud2b8\ub799\uacfc \ub300\uc0c1\uc744 \uc120\ud0dd\ud558\uac70\ub098 \ub9cc\ub4ed\ub2c8\ub2e4. +AutoTracker.Info.OutsideXAxis=x \ucd95\uc774 \ucc3e\uae30 \uc601\uc5ed \ubc16\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \uc635\uc158: +AutoTracker.Info.NewKeyFrame= - \uc2a4\ud15d\uc744 \ub4a4\ub85c \ub3cc\ub824\uc11c \ubcc0\ud654\uc728\uc744 \ubcc0\uacbd\ud558\uac70\ub098 Shift \ud0a4\ub97c \ub20c\ub7ec\uc11c \uc0c8\ub85c\uc6b4 \ud0a4 \ud504\ub808\uc784\uc744 \uc815\uc758\ud569\ub2c8\ub2e4. +AutoTracker.Info.Replace= - \uc77c\uce58 \uacb0\uacfc\ub97c \uc801\uc6a9\ud558\uace0 \uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \ub300\uccb4\ud569\ub2c8\ub2e4. +AutoTracker.Info.Keep= - \uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \uadf8\ub300\ub85c \uc720\uc9c0\ud569\ub2c8\ub2e4. +AutoTracker.Info.PossibleReplace=\uae30\uc874\uc758 \ucc3e\uae30 \ub300\uc0c1\uc744 \ubc14\uafc0 \uc218 \uc788\ub294 \uc77c\uce58 \ub300\uc0c1\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4. \uc635\uc158: +AutoTracker.Wizard.Button.Accept=\uc801\uc6a9 +AutoTracker.Wizard.Button.Stop=\uba48\ucda4 +AutoTracker.Wizard.Button.Skip=\uac74\ub108\ub6f0\uae30 +AutoTracker.Wizard.Button.Replace=\ubc14\uafb8\uae30 +AutoTracker.Wizard.Button.Keep=\uadf8\ub300\ub85c \ub450\uae30 +AutoTracker.Wizard.Button.Search=\ucc3e\uae30 +AutoTracker.Wizard.Button.SearchThis=\uc5ec\uae30 +AutoTracker.Wizard.Button.SearchNext=\ub2e4\uc74c +AutoTracker.Wizard.Button.Delete=\uc0ad\uc81c +AutoTracker.Wizard.Button.ShowKeyFrame=\ud0a4 \ud504\ub808\uc784 \ubcf4\uae30 +AutoTracker.Wizard.Button.DeleteKeyFrame=\ud0a4 \ud504\ub808\uc784 \uc0ad\uc81c +AutoTracker.Wizard.Checkbox.LookAhead=\ubbf8\ub9ac\ubcf4\uae30 +AutoTracker.Wizard.Checkbox.XAxis=X-\ucd95\ub9cc +AutoTracker.Wizard.Menuitem.DeleteThis=\uc774 \uc2a4\ud15d +AutoTracker.Wizard.Menuitem.DeleteLater=\uc774 \ub4a4\uc758 \ubaa8\ub4e0 \uc2a4\ud15d +AutoTracker.Wizard.Menuitem.DeleteAll=\ubaa8\ub4e0 \uc2a4\ud15d +TToolBar.Button.AutoTracker.Tooltip=\uc790\ub3d9 \ucc3e\uae30 \ubcf4\uac70\ub098 \uac10\ucd94\uae30 +MainTView.Popup.MenuItem.ZoomIn=\ud655\ub300 +MainTView.Popup.MenuItem.ZoomOut=\ucd95\uc18c +MainTView.Popup.MenuItem.ZoomToFit=\ud654\uba74\uc5d0 \ub9de\ucda4 +TrackerIO.Dialog.DurationVaries.Title=\ud504\ub808\uc784 \uc2dc\uac04 \uae38\uc774 \ub2e4\ub984 +TrackerIO.Dialog.DurationVaries.Message1=\uc774 \ube44\ub514\uc624\ub294 \ud3c9\uade0 \ubc94\uc704 \uc774\uc0c1\uc758 \ub2e4\ub978 \uc2dc\uac04 \uae38\uc774\uc758 \ud504\ub808\uc784\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \ubc94\uc704: +TrackerIO.Dialog.DurationVaries.Message2=\ubcf4\ub2e4 \uc815\ud655\ud55c \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4 \ubd84\uc11d\uc744 \uc704\ud574 \ube44\ub514\uc624\uc758 \uc2dc\uc791 \ud504\ub808\uc784\uacfc +TrackerIO.Dialog.DurationVaries.Message3=\ub05d \ud504\ub808\uc784 \uc124\uc815\uc744 \ud1b5\ud55c \uacc4\uc0b0\uc5d0\uc11c \uc774 \ud504\ub808\uc784\uc744 \ucd94\ucd9c\ud574\uc57c \ud569\ub2c8\ub2e4. +TrackerIO.Dialog.DurationVaries.Message4=\ucd94\ucd9c\ud560 \ud504\ub808\uc784: +TrackerIO.Dialog.DurationVaries.Message5=\ucd94\ucd9c\ub41c \ud6c4 \ud504\ub808\uc784 \ud3c9\uade0 \uae38\uc774\uc640 \uc18d\ub3c4: +TFrame.Dialog.LibraryError.Title=\uc624\ub958 +TFrame.Dialog.LibraryError.Message=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c \uc790\ub8cc\ub97c \ubd88\ub7ec\uc62c \uc218 \uc5c6\uc74c + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=Shift \ud0a4 \ub20c\ub7ec\uc11c \ud45c\uc2dc +PrefsDialog.Label.Path=\uacbd\ub85c +PrefsDialog.Checkbox.ClearCacheOnExit=\ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\ud560 \ub54c \uc9c0\uc6c0 +PrefsDialog.FileChooser.Title.Cache=\uce90\uc2dc \uc124\uc815 +PrefsDialog.FileFilter.Directories=\ub514\ub809\ud130\ub9ac +Tracker.Action.AboutThreads= Thread \uc815\ubcf4... +PrefsDialog.JRE.BorderTitle=Java \uac00\uc0c1 \uba38\uc2e0 +PrefsDialog.FileChooser.Title.JRE=Java VM \uc124\uc815 +PrefsDialog.FileFilter.JRE=\ub514\ub809\ud130\ub9ac\uc640 Java VMs +PrefsDialog.Version.BorderTitle=Tracker \ubc84\uc804 +PrefsDialog.Version.Default=\uae30\ubcf8 \uc124\uc815 +PrefsDialog.Tab.ClearCacheOnExit=\ud504\ub85c\uadf8\ub7a8 \uc885\ub8cc\ud560 \ub54c \uc9c0\uc6c0 +PrefsDialog.Run.BorderTitle=\uc2dc\uc791\ud560 \ub54c \uc2e4\ud589\ud560 \ud504\ub85c\uadf8\ub7a8 +PrefsDialog.FileChooser.Title.Run=\uc2e4\ud589 \ud30c\uc77c \uc120\ud0dd +PrefsDialog.Button.Save=\uc800\uc7a5 +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README \ud30c\uc77c\uc744 \ucc3e\uc744 \uc218 \uc5c6\uc74c +Popup.MenuItem.Algorithm=\uc54c\uace0\ub9ac\ub4ec... +AlgorithmDialog.Button.FiniteDifference=\uad6c\uac04 \ubcc0\ud654\uc728 \uacc4\uc0b0 +AlgorithmDialog.Button.BounceDetect=\ubd80\ub4dc\ub7ec\uc6b4 \ucd94\uc138 \uadfc\uc0ac +AlgorithmDialog.TitledBorder.Choose=\uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4 \ubd84\uc11d\uc744 \uc704\ud574 \uc0ac\uc6a9\ud560 \uc54c\uace0\ub9ac\ub4ec \uc120\ud0dd: +AlgorithmDialog.Title=\uc54c\uace0\ub9ac\ub4ec +AlgorithmDialog.FiniteDifference.Message1=\uae30\ubcf8 \uc54c\uace0\ub9ac\ub4ec\uc73c\ub85c Finite Difference \ub97c \ud65c\uc6a9\ud569\ub2c8\ub2e4. +AlgorithmDialog.FiniteDifference.Message2=\uc18d\ub3c4: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=\uac00\uc18d\ub3c4: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=\uc774 Bounce Detection \uc54c\uace0\ub9ac\ub4ec\uc740 \uae09\uaca9\ud55c \uc18d\ub3c4 \ubcc0\ud654 \uad6c\uac04\uc744 \uac10\uc9c0\ud558\uba70 \uc18d\ub3c4\uc640 \uac00\uc18d\ub3c4\uc758 \ucd94\uc138\ub97c \ubd84\uc11d\ud558\uc5ec \ub370\uc774\ud130\uac00 \ud280\uc9c0 \uc54a\ub3c4\ub85d \ucd94\uc138\uc5d0 \ub9de\uac8c \ubd80\ub4dc\ub7fd\uac8c \uadf8\ub824\uc90d\ub2c8\ub2e4. +AlgorithmDialog.BounceDetect.Message2=\uc8fc\uc758: \uc774 \ubd84\uc11d\uc758 \uacb0\uacfc\ub294 \uc2e4\ud5d8 \uc0c1\ud669\uc5d0 \ub530\ub77c \uc720\uc758\ubbf8\ud558\uc9c0 \uc54a\uc744 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc54c\uace0\ub9ac\ub4ec\uc5d0 \ub300\ud55c \uc815\ubcf4: +TMenuBar.Menu.Diagnostics=\ud504\ub85c\uadf8\ub7a8 \uc815\ubcf4 + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 XML +Tracker.Dialog.Invalid.Message=\ud30c\uc77c\uc744 \uc77d\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +TrackPlottingPanel.Popup.Menu.CompareWith=\uc0bd\uc785 +TrackerPanel.DataBuilder.TrackType.Unknown=\ube48 \ud2b8\ub799 +TrackerPanel.DataBuilder.Button.Load.Tooltip=XML \ud30c\uc77c\ub85c\ubd80\ud130 \ub370\uc774\ud130 \uc218\uc2dd \ubd88\ub7ec\uc624\uae30 +TrackerPanel.DataBuilder.Button.Save.Tooltip=XML \ud30c\uc77c\ub85c \ub370\uc774\ud130 \uc218\uc2dd \uc800\uc7a5\ud558\uae30 +TrackerPanel.DataBuilder.Load.Title=\ub370\uc774\ud130 \uc218\uc2dd \ubd88\ub7ec\uc624\uae30 +TrackerPanel.DataBuilder.Load.Message=\ubd88\ub7ec\uc62c \uc218\uc2dd \uc120\ud0dd: +TrackerPanel.DataBuilder.Save.Title=\ub370\uc774\ud130 \uc218\uc2dd \uc800\uc7a5\ud558\uae30 +TrackerPanel.DataBuilder.Save.Message=\uc800\uc7a5\ud560 \uc218\uc2dd \uc120\ud0dd: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=\ubaa8\ub4e0 \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc624\uae30 +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=\ub2e4\uc74c \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc624\uae30: +TrackerPanel.DataBuilder.Dialog.Load.Title=\ud2b8\ub799 \uc120\ud0dd\ud558\uae30 +TrackerPanel.DataBuilder.Dialog.Load.Message=\ubaa8\ub4e0 \uc720\ud615\uc758 \ud2b8\ub799\uc73c\ub85c \uc218\uc2dd\uc744 \ubd88\ub7ec\uc62c\uae4c\uc694? +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=\uc798\ubabb\ub41c \ud2b8\ub799 \uc720\ud615 +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=\ud30c\uc77c\uc5d0\uc11c \ud2b8\ub799 \uc720\ud615\uc73c\ub85c \ub370\uc774\ud130 \uc218\uc2dd\uc744 \uc815\uc758\ud558\uc600\uc73c\ub098 +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=\uc218\uc2dd\uc744 \ud2b8\ub799\uc73c\ub85c \uac00\uc838\uc62c \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +TrackerPanel.DataBuilder.Dialog.WrongType.Title=\uc798\ubabb\ub41c \ud2b8\ub799 \uc720\ud615 +TrackerPanel.DataBuilder.Dialog.WrongType.Message=\ub370\uc774\ud130 \uc218\uc2dd\uc744 \uc815\uc758\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. +TToolbar.Button.Refresh=\ub370\uc774\ud130\uc640 \ud654\uba74\uc744 \uc0c8\ub85c\uace0\uce68 + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=\uc0c8 \ubb38\uc11c\uac00 \ub2e4\uc74c\uacfc \uac19\uc774 \uc800\uc7a5\ub418\uc5c8\uc2b5\ub2c8\ub2e4... +ExportTRKDialog.Complete.Message2=Tracker \uc5d0\uc11c \uc9c0\uae08 \uc5f4\uae4c\uc694? +ExportTRKDialog.Complete.Title=\ubcf4\ub0b4\uae30 \uc644\ub8cc +ExportTRKDialog.Title=\ubcf4\ub0b4\uae30 +ExportTRKDialog.Message1=\ub2e4\uc74c\uacfc \uac19\uc774 \ubcf4\ub0b4\uae30 \uc791\uc5c5\uc744 \ud569\ub2c8\ub2e4: (1) \ube44\ub514\uc624 \ud074\ub9bd \ubcf4\ub0b4\uae30, (2) \ubcf4\ub0b8 \ube44\ub514\uc624\uc5d0 \ub9de\uac8c \ubb38\uc11c \ub370\uc774\ud130 \ubcc0\ud658\ud558\uae30, \uadf8\ub9ac\uace0 (3) \uc0c8 Tracker \ud30c\uc77c\ub85c \ubcc0\ud658\ub41c \ubb38\uc11c\ub97c \uc800\uc7a5\ud558\uae30 +ExportTRKDialog.Message2=Tracker \ubb38\uc11c \ud30c\uc77c\uacfc \ube44\ub514\uc624 \ud30c\uc77c\uc774 \uac19\uc740 \ud3f4\ub354 \uc548\uc5d0 \uc800\uc7a5\ub429\ub2c8\ub2e4. +TMenuBar.MenuItem.TabClip=\ubb38\uc11c +TrackerIO.Dialog.DurationVaries.Button.SetClip=\uad8c\uc7a5 \ud074\ub9bd \uc124\uc815 +TrackerIO.Dialog.DurationVaries.Start=\uc2dc\uc791 +TrackerIO.Dialog.DurationVaries.End=\ub05d +TrackerIO.Dialog.DurationVaries.Recommended=\uad8c\uc7a5 \ud074\ub9bd +TMenuBar.Menu.CalibrationTools=\uad50\uc815 \ub3c4\uad6c + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=\ub05d \ubd99\uc774\uae30 +AttachmentInspector.Label.End=\ub05d +AttachmentInspector.Label.Vertex=\uc815\uc810 +AttachmentInspector.Header.PointName=\uc774\ub984 +AttachmentInspector.Header.AttachedTo=\ubd99\uc774\uae30: +ExportTRKDialog.Label.VideoFormat=\ube44\ub514\uc624 \ud615\uc2dd +MeasuringTool.MenuItem.Attach=\ub05d \ubd99\uc774\uae30... +PerspectiveTrack.Corner=\ubaa8\uc11c\ub9ac +PrefsDialog.LogLevel.BorderTitle=\uc2dc\uc791 \uba54\uc2dc\uc9c0 \ub85c\uadf8 +Protractor.Data.Description.0=\uc2dc\uac04 +Protractor.Data.Description.1=\uac01 +Protractor.Data.Description.2=\ud314 \uae38\uc774 1 +Protractor.Data.Description.3=\ud314 \uae38\uc774 2 +Protractor.Data.Description.4=\uc2a4\ud15d \ubc88\ud638 +Protractor.Data.Description.5=\ud504\ub808\uc784 \ubc88\ud638 +TapeMeasure.Data.Description.0=\uc2dc\uac04 +TapeMeasure.Data.Description.1=\uae38\uc774 +TapeMeasure.Data.Description.2=+x\ucd95\uc5d0\uc11c \uce21\uc815\ud55c \uac01 +TapeMeasure.Data.Description.3=\uc2a4\ud15d \ubc88\ud638 +TapeMeasure.Data.Description.4=\ud504\ub808\uc784 \ubc88\ud638 + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=\ucc3e\uc9c0 \uc54a\uc74c +AutoTracker.Info.KeyFrame=\ud0a4 \ud504\ub808\uc784 +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=\uc774 \ud0a4 \ud504\ub808\uc784 +AutoTracker.Wizard.Menuitem.DeleteThisMatch= \uc774 \uc77c\uce58 \ub300\uc0c1 +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=\ub098\uc911 \uc77c\uce58 \ub300\uc0c1 +PrefsDialog.Checkbox.64BitVM=64-\ube44\ud2b8 + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=\uc790\ub3d9 \ucc3e\uae30 +Dialog.Button.Add=\ucd94\uac00 +Dialog.Button.Remove=\uc81c\uac70 +PrefsDialog.Button.ClearHost=\uc9c0\uc6b0\uae30 +PrefsDialog.Button.ClearHost.Tooltip=OSP \uce90\uc2dc\uc5d0\uc11c \uc6f9 \uc0ac\uc774\ud2b8\uc640 \uad00\ub828\ub41c \ubaa8\ub4e0 \uce90\uc2dc \ud30c\uc77c\uc744 \uc9c0\uc6c0 +PrefsDialog.Button.ClearCache.Tooltip=OSP \uce90\uc2dc\uc5d0\uc11c \ubaa8\ub4e0 \uce90\uc2dc \ud30c\uc77c\uc744 \uc9c0\uc6c0 +TActions.Action.SaveZip=\uc555\ucd95 (zip) \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 +ThumbnailDialog.Title=\ubbf8\ub9ac\ubcf4\uae30 \uadf8\ub9bc \ubcf4\ub0b4\uae30 +ThumbnailDialog.Settings.Title=\ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158 +ThumbnailDialog.Label.CurrentImage=\ud604\uc7ac \uadf8\ub9bc +ThumbnailDialog.Label.FrameNumber=\ud504\ub808\uc784 +ThumbnailDialog.Label.StepNumber=\uc2a4\ud15d +ThumbnailDialog.View.VideoOnly=\ube44\ub514\uc624\ub9cc +ThumbnailDialog.View.MainView=\uc791\uc5c5 \ucc3d +ThumbnailDialog.View.WholeFrame=\ubaa8\ub4e0 \ud504\ub808\uc784 +ThumbnailDialog.Format.PNG=PNG \uadf8\ub9bc +ThumbnailDialog.Format.JPG=JPEG \uadf8\ub9bc +ThumbnailDialog.Chooser.SaveThumbnail.Title=\ubbf8\ub9ac\ubcf4\uae30 \uc800\uc7a5 +ThumbnailDialog.Subtitle.Image=\uadf8\ub9bc +TMenuBar.MenuItem.Thumbnail=\ubbf8\ub9ac\ubcf4\uae30 \uadf8\ub9bc +TToolBar.Button.SaveZip.Tooltip=OSP \ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \uc555\ucd95 \ud30c\uc77c \ubcf4\ub0b4\uae30 +TTrack.MenuItem.DeletePoint=\uc120\ud0dd\ud55c \uc2a4\ud15d \uc0ad\uc81c +ZipResourceDialog.Title=\uc555\ucd95 (zip) \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 +ZipResourceDialog.Label.Format=\ud615\uc2dd +ZipResourceDialog.Label.Title=\uc774\ub984 +ZipResourceDialog.Label.Description=\uc124\uba85 +ZipResourceDialog.Label.Keywords=\uc8fc\uc81c\uc5b4 +ZipResourceDialog.Label.Link=\uc678\ubd80 \ub9c1\ud06c +ZipResourceDialog.Label.HTML=HTML \uc6d0\ubcf8 +ZipResourceDialog.Complete.Message1=\uc555\ucd95 \ud30c\uc77c\ub85c \uc800\uc7a5\ub428: +ZipResourceDialog.Complete.Message2=\uc9c0\uae08 Tracker \uc5d0\uc11c \uc5f4\uae4c\uc694? +ZipResourceDialog.Complete.Title=\uc644\ub8cc +ZipResourceDialog.Border.Title.Documentation=HTML \ubb38\uc11c +ZipResourceDialog.Border.Title.Video=\ube44\ub514\uc624 +ZipResourceDialog.Border.Title.Thumbnail=\ubbf8\ub9ac\ubcf4\uae30 +ZipResourceDialog.FileChooser.SaveZip.Title=\uc555\ucd95 \ud30c\uc77c\ub85c \ubcf4\ub0b4\uae30 +ZipResourceDialog.FileChooser.AddFile.Title=\uc555\ucd95 \ud30c\uc77c\uc5d0 \ud30c\uc77c \ucd94\uac00 +ZipResourceDialog.FileChooser.OpenHTML.Title=HTML \ud30c\uc77c \uc5f4\uae30 +ZipResourceDialog.Button.AddFiles=\ud30c\uc77c \ucd94\uac00 +ZipResourceDialog.Button.ThumbnailSettings=\ubbf8\ub9ac\ubcf4\uae30 \uc635\uc158 +ZipResourceDialog.Checkbox.TrimVideo=\ube44\ub514\uc624 \ud074\ub9bd \ubcf4\ub0b4\uae30 +ZipResourceDialog.AddHTMLInfo.Title=HTML \uc815\ubcf4 \ud30c\uc77c \ucd94\uac00 +ZipResourceDialog.AddHTMLInfo.Message1=\uc555\ucd95 (zip) \ud30c\uc77c\uc5d0 HTML \uc815\ubcf4 \ud30c\uc77c\uc744 \ucd94\uac00\ud560\uae4c\uc694? +ZipResourceDialog.AddHTMLInfo.Message2= +ZipResourceDialog.HTMLField.DefaultText=HTML \uc6d0\ubcf8 \ud30c\uc77c (\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc9d0) +ZipResourceDialog.Dialog.AddFiles.Title=HTML \ub610\ub294 PDF \ud30c\uc77c \ucd94\uac00 +ZipResourceDialog.Tooltip.HTML=HTML \uc6d0\ubcf8 \ud30c\uc77c \uacbd\ub85c\ub97c \ud30c\uc77c \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c \uc124\uc815\ud568 (\uc124\uc815\ud558\uc9c0 \uc54a\uc73c\uba74 \uc0c8\ub85c \ub9cc\ub4e4\uc5b4\uc9d0) +ZipResourceDialog.Tooltip.Author=\uc774 \uc790\ub8cc\uc758 \uc9c0\uc740\uc774 +ZipResourceDialog.Tooltip.Title=\uc774 \uc790\ub8cc\uc758 \uc774\ub984 +ZipResourceDialog.Tooltip.Description=\uc774 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc720\uc6a9\ud55c \uc124\uba85 +ZipResourceDialog.Tooltip.Keywords=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c \ucc3e\uc744 \uac80\uc0c9\uc5b4 \ubaa9\ub85d +ZipResourceDialog.Tooltip.Contact=\uc9c0\uc740\uc774 \uc5f0\ub77d\ucc98 +ZipResourceDialog.Tooltip.Link=\uc774 \uc790\ub8cc\uc5d0 \ub300\ud55c \uc678\ubd80 \ub9c1\ud06c HTML \ud30c\uc77c\uc758 URL +ZipResourceDialog.Tooltip.ThumbnailSettings=\ubbf8\ub9ac\ubcf4\uae30\uc758 \ud06c\uae30\ub098 \ud30c\uc77c \ud615\uc2dd\uc744 \ubcc0\uacbd +ZipResourceDialog.Tooltip.AddFiles=HTML \ub610\ub294 PDF \ud30c\uc77c\uc744 \uc555\ucd95 \ud30c\uc77c\uc5d0 \ucd94\uac00 +ZipResourceDialog.Tooltip.TrimVideo=\ube44\ub514\uc624 \ud074\ub9bd\uc744 \ub2e4\ub978 \ud615\uc2dd\uc73c\ub85c \ubcf4\ub0b4\ub824\uba74 \uc120\ud0dd, \uc6d0\ubcf8 \ube44\ub514\uc624\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ud574\uc81c +ZipResourceDialog.Tooltip.LoadHTML=\ud30c\uc77c \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c HTML \ud30c\uc77c\uc744 \uc120\ud0dd\ud558\uc5ec \ubd88\ub7ec\uc634 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties index 6ab43215..c3281901 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties @@ -1,1264 +1,1264 @@ -# This is the dutch tracker.properties file - -Calibration.Name=Calibration Points -Calibration.New.Name=calibration points -CenterOfMass.Name=Center Of Mass -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Select Masses... -CenterOfMassInspector.Title=Center of Mass -CenterOfMassInspector.Border.Title=Select Masses -ConfigInspector.Border.Title=Desired Features -ConfigInspector.Title=Preferences -ConfigInspector.Button.SaveAsDefault=Save As Default -CoordAxes.Name=Axes -CoordAxes.New.Name=axes -Dialog.Button.Cancel=Cancel -Dialog.Button.OK=OK -Dialog.Button.Close=Close -Dialog.Button.All=All -Dialog.Button.None=None -Dialog.Button.Copy=Copy -Dialog.Button.Update=Update -Dialog.Button.SelectAll=Select All -Footprint.Diamond=diamond -Footprint.BoldDiamond=bold diamond -Footprint.SolidDiamond=solid diamond -Footprint.Triangle=triangle -Footprint.BoldTriangle=bold triangle -Footprint.SolidTriangle=solid triangle -Footprint.Circle=circle -Footprint.BoldCircle=bold circle -Footprint.SolidCircle=solid circle -Footprint.VerticalLine=vertical line -Footprint.BoldVerticalLine=bold vertical line -Footprint.HorizontalLine=horizontal line -Footprint.BoldHorizontalLine=bold horizontal line -Footprint.Crosshair=crosshair -Footprint.BoldCrosshair=bold crosshair -Footprint.SimpleAxes=simple axes -Footprint.BoldSimpleAxes=bold simple axes -Footprint.Spot=spot -Footprint.Line=line -Footprint.BoldLine=bold line -Footprint.Outline=outline -Footprint.BoldOutline=bold outline -Footprint.Arrow=arrow -Footprint.BoldArrow=bold arrow -Footprint.DoubleArrow=double arrow -Footprint.BoldDoubleArrow=bold double arrow -Footprint.2xArrow=2x arrow -Footprint.Bold2xArrow=bold 2x arrow -Footprint.4xArrow=4x arrow -Footprint.Bold4xArrow=bold 4x arrow -Footprint.DashArrow=dashed arrow -Footprint.BoldDashArrow=bold dashed arrow -Footprint.BigArrow=big arrow -Footprint.BigDashArrow=big dashed arrow -LineProfile.Name=Line Profile -LineProfile.New.Name=profile -LineProfile.Data.Brightness=brightness -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=red -LineProfile.Data.Green=green -LineProfile.Data.Blue=blue -LineProfile.Data.Weighting=count -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=Zoom -MainTView.Popup.MenuItem.ToFit=To Fit -OffsetOrigin.Name=Offset Origin -OffsetOrigin.New.Name=offset origin -PlotTrackView.Button.PlotCount=Plot -PlotTrackView.Button.PlotCount.ToolTip=Set plot count -PointMass.Name=Point Mass -PointMass.New.Name=mass -PointMass.MenuItem.VectorsToPosition=To Position -PointMass.MenuItem.Velocity=Velocity -PointMass.MenuItem.Acceleration=Acceleration -Star.Name=Star -Star.New.Name=star -TableTrackView.Action.CopyData=Copy Data -TableTrackView.Button.SelectTableData=Table -TableTrackView.Button.SelectTableData.ToolTip=Choose table columns -TableTrackView.Popup.MenuItem.Analyze=Analyze... -TableTrackView.Dialog.Border.Title=Visible: -TActions.Action.Description=Notes -TActions.Action.ClearTracks=All Tracks -TActions.Action.NewTab=New Tab -TActions.Action.Copy=Copy -TActions.Action.Paste=Paste -TActions.Action.Open=Open File... -TActions.Action.Close=Close Tab -TActions.Action.Import=Import... -TActions.Action.Save=Save Tab -TActions.Action.SaveAs=Save Tab As... -TActions.Action.Export=Export... -TActions.Action.CaptureVideo=Capture Video... -TActions.Action.Delete=Delete -TActions.Action.Config=Preferences... -TActions.Action.AxesVisible=Visible -TActions.Action.TapeVisible=Visible -TActions.Action.Print=Print... -TActions.Action.ClearFilters=Clear -TActions.Action.ImportVideo=Import... -TActions.Action.CloseVideo=Close -TActions.Action.CloseAll=Close All Tabs -TActions.Action.Exit=Exit -TActions.Dialog.PrintError.Message=A printing error occurred. -TActions.Dialog.PrintError.Title=Printing Error -TActions.Dialog.Description.Title=Notes: -TActions.Dialog.DeleteLockedTracks.Message=Some tracks are locked. Delete anyway? -TActions.Dialog.DeleteLockedTracks.Title=Delete Locked Tracks? -TActions.Dialog.NewPointMass.Title=New Point Mass -TapeMeasure.Name=Tape Measure -TapeMeasure.New.Name=tape -TapeMeasure.MenuItem.Fixed=Fixed -TFrame.View.Plot=Plot View -TFrame.View.Table=Table View -TFrame.View.World=World View -TFrame.View.Video=Video View -TFrame.Dialog.Help.Title=Tracker Help -TMenuBar.Menu.File=Pig -TMenuBar.Menu.Edit=Edit -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Tracks -TMenuBar.Menu.Coords=Coordinate System -TMenuBar.Menu.Window=Views -TMenuBar.Menu.Help=Help -TMenuBar.MenuItem.EditProperties=Properties... -TMenuBar.MenuItem.VideoVisible=Visible -TMenuBar.MenuItem.VideoFilters=Filters -TMenuBar.MenuItem.NewVideoFilter=New -TMenuBar.MenuItem.NewTrack=New -TMenuBar.MenuItem.CoordsLocked=Locked -TMenuBar.MenuItem.CoordsFixedOrigin=Fixed Origin -TMenuBar.MenuItem.CoordsFixedAngle=Fixed Angle -TMenuBar.MenuItem.CoordsFixedScale=Fixed Scale -TMenuBar.MenuItem.CoordsRefFrame=Reference Frame -TMenuBar.MenuItem.CoordsDefault=Default -TMenuBar.MenuItem.WindowRight=Right View -TMenuBar.MenuItem.WindowBottom=Bottom View -TMenuBar.MenuItem.PlayAllSteps=Play All Steps -TMenuBar.MenuItem.Record=Record -TMenuBar.MenuItem.MatSize=Mat Size -TMenuBar.MenuItem.Language=Language -TMenuBar.MenuItem.DeleteTrack=Delete -TMenuBar.MenuItem.TrackerHelp=Tracker Help... -TMenuBar.MenuItem.MessageLog=Message Log... -TrackControl.Name=Track Control -TrackControl.Button.NewTrack=Create -TrackControl.Button.NewTrack.ToolTip=Create a new track -TrackControl.Button.Trails.ToolTip=Set trail length -TrackControl.Button.Labels.ToolTip=Show or hide numbering -TrackControl.Button.StretchVectors.ToolTip=Stretch vectors -TrackControl.Button.Accelerations.ToolTip=Show or hide acceleration vectors -TrackControl.Button.Xmass.ToolTip=Multiply vectors by mass -TrackControl.Button.Vectors.ToolTip=Vectors -TrackControl.Button.Velocities.ToolTip=Show or hide velocity vectors -TrackControl.Button.Properties.ToolTip=Click to select -TrackControl.Button.Positions.ToolTip=Show or hide positions -Tracker.Popup.MenuItem.Snapshot=Snapshot... -Tracker.Popup.MenuItem.Help=Help... -Tracker.Cursor.Crosshair.Description=Crosshair cursor -Tracker.Action.AboutTracker=About Tracker... -Tracker.Dialog.AboutTracker.Title=About Tracker -Tracker.Action.AboutJava=About Java... -Tracker.Dialog.AboutJava.Title=About Java -Tracker.Dialog.AboutJava.UnknownVersion=unknown -Tracker.Dialog.AboutJava.Message=Java version -Tracker.Action.AboutQT=About QuickTime... -Tracker.Dialog.AboutQT.Title=About QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: -Tracker.Dialog.NoQT.Title=QTJava.zip not found -Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. -Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. -Tracker.Dialog.UpdateQT.Title=Update QTJava.zip -Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at -Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? -Tracker.Dialog.CopyQT.Title=Copy QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from -Tracker.Dialog.CopyQT.Message3= to -Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. -Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? -Tracker.Dialog.CopyFailed.Title=Copy Failed -Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. -Tracker.Dialog.CopiedTo.Title=Copy Succeeded -Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to -Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. -Tracker.Splash.Loading=Loading -TrackerIO.Dialog.Import.Title=Import Tracker File -TrackerIO.Dialog.Import.Message=Select items to import -TrackerIO.Dialog.ImportVideo.Title=Import Video -TrackerIO.Dialog.Export.Title=Export -TrackerIO.Dialog.Export.Message=Select items to export -TrackerIO.Dialog.ReplaceFile.Title=Replace Existing File? -TrackerIO.Dialog.ReplaceFile.Message=already exists. Do you want to replace it? -TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML -TrackerIO.Dialog.NotTrackerXML.Message=contains xml data for a different application. -TrackerIO.Dialog.BadVideo.Message=File is not a recognized video type: -TrackerIO.Dialog.BadVideo.Title=Unrecognized Video File -TrackerPanel.NewTab.Name=Untitled -TrackerPanel.DragToMark.Hint=Shift-drag to mark -TrackerPanel.ClickToMark.Hint=Shift-click to mark -TrackerPanel.Dialog.LoadFailed.Title=Invalid Tracker File -TrackerPanel.Dialog.LoadFailed.Message=File is not a valid Tracker file: -TrackerPanel.Dialog.SaveChanges.Title=Save Changes -TrackerPanel.Dialog.SaveChanges.Message=Save changes to -TrackPlottingPanel.Popup.MenuItem.Lines=Lines -TrackPlottingPanel.Popup.MenuItem.Points=Points -TrackPlottingPanel.Popup.MenuItem.Scale=Scale... -TrackPlottingPanel.Popup.MenuItem.Print=Print... -TrackPlottingPanel.Popup.MenuItem.Measure=Scale to Fit -TrackPlottingPanel.Popup.MenuItem.Analyze=Analyze... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscale -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box -TrackPlottingPanelInspector.Title=Scale -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Set the footprint -TToolBar.Dropdown.SelectedTrack.Tooltip=Select a track -TToolBar.Dropdown.SelectedTrack.None=None -TTrack.MenuItem.Delete=Delete -TTrack.MenuItem.Color=Color... -TTrack.Dialog.Color.Title=Choose Track Color -TTrack.MenuItem.Name=Name... -TTrack.MenuItem.Footprint=Footprints -TTrack.MenuItem.Description=Notes... -TTrack.MenuItem.Visible=Visible -TTrack.MenuItem.TrailVisible=Trail Visible -TTrack.MenuItem.Autostep=Autostep -TTrack.MenuItem.MarkByDefault=Mark by Default -TTrack.MenuItem.Locked=Locked -TTrack.MenuItem.Delete=Delete -TTrack.Name.None=no name -TTrack.Dialog.Description.Title=Notes: -TTrack.Dialog.Name.Title=Set Name -TTrack.Dialog.Name.Label=Name: -TViewChooser.Button.Choose.Tooltip=Choose a view -Vector.Name=Vector -Vector.New.Name=vector -Vector.MenuItem.ToOrigin=To Origin -Vector.MenuItem.Label=Label Visible -VectorSum.Name=Vector Sum -VectorSum.New.Name=sum -VectorSum.MenuItem.Inspector=Select Vectors... -VectorSumInspector.Title=Vector Sum -VectorSumInspector.Border.Title=Select Vectors -WorldTView.Popup.MenuItem.Projectile=Projectile Model - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Kinematic Particle Model -AnalyticParticle.Inspector.Title=Kinematic Particle Model -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=radius 4 -CircleFootprint.Circle_6=radius 6 -CircleFootprint.Circle_8=radius 8 -DynamicParticle.Name=Dynamic Particle Model (Cartesian) -DynamicParticle.Inspector.Title=Dynamic Particle Model -DynamicParticle.Property.ForceX=force x -DynamicParticle.Property.ForceY=force y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Fixed Position -ParticleModel.New.Name=model -ParticleModel.MenuItem.InspectModel=Model Builder... -ParticleModel.Inspector.Button.Undo=Undo -ParticleModel.Inspector.Button.Redo=Redo -ParticleModel.Inspector.Button.Close=Close -ParticleModel.Inspector.Button.Help=Help - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=X Only -Calibration.Axes.YOnly=Y Only -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Select calibration axes -Calibration.Label.Axes=axes -Calibration.Dialog.InvalidCoordinates.Title=Invalid Coordinates -Calibration.Dialog.InvalidCoordinates.Message=Points cannot have the same world coordinates. -Calibration.Dialog.InvalidXCoordinates.Message=Points cannot have the same world x-coordinates. -Calibration.Dialog.InvalidYCoordinates.Message=Points cannot have the same world y-coordinates. -SpectralLineFilter.Title=Gas Spectra -SpectralLineFilter.H=Hydrogen -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Mercury -TFrame.View.Unknown=View -TMenuBar.MenuItem.Undo=Undo -TMenuBar.MenuItem.Redo=Redo -TMenuBar.MenuItem.Replace=Replace... -TMenuBar.Menu.AddImage=Import Images -TMenuBar.MenuItem.AddBefore=Before This Frame... -TMenuBar.MenuItem.AddAfter=After This Frame... -TMenuBar.MenuItem.RemoveImage=Remove This Frame -TMenuBar.Menu.Tools=Tools -TMenuBar.MenuItem.DataFunctionTool=Data Builder -TMenuBar.MenuItem.DatasetTool=Data Tool -TMenuBar.Menu.CopyImage=Copy Image -TMenuBar.MenuItem.CopyMainView=Main View -TMenuBar.MenuItem.CopyFrame=Frame -TMenuBar.MenuItem.PrintFrame=Print... -TrackerIO.Dialog.AddImage.Title=Import Images (choose one or more) -TTrack.Dialog.Name.BadName=is in use. Please choose another name. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=net force -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Plot view of track data will appear here. -TableTView.Label.NoData=Table view of track data will appear here. -TrackerPanel.Message.NoData0=Main view of video and tracks will appear here. -TrackerPanel.Message.NoData1=Choose File|Open or Tracks|New to start. -WorldTView.Label.NoData=World view of video and tracks will appear here. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Solver: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptive Multistep -DynamicParticle.Table.Force.Border.Title=Force Functions (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Position Functions (t) -ParticleModel.Table.Initial.Border.Title=Initial Values -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Paste Image -TMenuBar.MenuItem.PasteAfter=After This Frame -TMenuBar.MenuItem.PasteBefore=Before This Frame -TMenuBar.MenuItem.PasteReplace=Replace Video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Getting Started... -Tracker.Splash.HelpMessage=New user? See - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=angle from horizontal -LineProfile.Checkbox.Rotates=rotates -LineProfile.Label.Spread=spread -RGBRegion.Name=RGB Region -RGBRegion.New.Name=region -RGBRegion.MenuItem.Fixed=Fixed Position -RGBRegion.Label.Radius=pixel radius -TTrack.Label.Step=step - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=position number -LineProfile.Data.Description.1=position x-component -LineProfile.Data.Description.2=position y-component -LineProfile.Data.Description.3=red -LineProfile.Data.Description.4=green -LineProfile.Data.Description.5=blue -LineProfile.Data.Description.6=perceived brightness -LineProfile.Data.Description.7=line width -ParticleModel.MenuItem.TraceVisible=Trace Visible -ParticleModel.MenuItem.StepsVisible=Steps Visible -PointMass.Data.Description.0=time -PointMass.Data.Description.1=position x-component -PointMass.Data.Description.2=position y-component -PointMass.Data.Description.3=position magnitude -PointMass.Data.Description.4=position angle -PointMass.Data.Description.5=velocity x-component -PointMass.Data.Description.6=velocity y-component -PointMass.Data.Description.7=velocity magnitude -PointMass.Data.Description.8=velocity angle -PointMass.Data.Description.9=acceleration x-component -PointMass.Data.Description.10=acceleration y-component -PointMass.Data.Description.11=acceleration magnitude -PointMass.Data.Description.12=acceleration angle -PointMass.Data.Description.13=rotation angle -PointMass.Data.Description.14=angular velocity -PointMass.Data.Description.15=angular acceleration -PointMass.Data.Description.16=step number -PointMass.Data.Description.17=frame number -PointMass.Data.Description.18=momentum x-component -PointMass.Data.Description.19=momentum y-component -PointMass.Data.Description.20=momentum magnitude -PointMass.Data.Description.21=momentum angle -PointMass.Data.Description.22=kinetic energy -RGBRegion.Data.Description.0=time -RGBRegion.Data.Description.1=position x-component -RGBRegion.Data.Description.2=position y-component -RGBRegion.Data.Description.3=red -RGBRegion.Data.Description.4=green -RGBRegion.Data.Description.5=blue -RGBRegion.Data.Description.6=perceived brightness -RGBRegion.Data.Description.7=pixel count -RGBRegion.Data.Description.8=step number -RGBRegion.Data.Description.9=frame number -TView.Menuitem.Define=Define... -Vector.Data.Description.0=time -Vector.Data.Description.1=x-component -Vector.Data.Description.2=y-component -Vector.Data.Description.3=magnitude -Vector.Data.Description.4=angle -Vector.Data.Description.5=tail position x-component -Vector.Data.Description.6=tail position y-component -Vector.Data.Description.7=step number -Vector.Data.Description.8=frame number - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Mass of this particle -ParticleModel.Parameter.InitialTime.Description=Initial time -AnalyticParticle.PositionFunction.X.Description=Position x-component -AnalyticParticle.PositionFunction.Y.Description=Position y-component -DynamicParticle.ForceFunction.X.Description=Force x-component -DynamicParticle.ForceFunction.Y.Description=Force y-component -DynamicParticle.Parameter.InitialX.Description=Initial position x-component -DynamicParticle.Parameter.InitialY.Description=Initial position y-component -DynamicParticle.Parameter.InitialVelocityX.Description=Initial velocity x-component -DynamicParticle.Parameter.InitialVelocityY.Description=Initial velocity y-component -TrackerPanel.ModelBuilder.Title=Model Builder -TrackerPanel.DataBuilder.Title=Data Builder -TrackControl.TrailMenu.NoTrail=No trails -TrackControl.TrailMenu.ShortTrail=Short trails -TrackControl.TrailMenu.LongTrail=Long trails -TrackControl.TrailMenu.FullTrail=All steps -TrackerPanel.ModelBuilder.Spinner.Tooltip=Currently selected model -TrackerPanel.ModelBuilder.LineButton.Text=Line Style -TrackerPanel.ModelBuilder.LineButton.Tooltip=Set line style -ParticleModel.LineStyle.None=No line -ParticleModel.LineStyle.Connect=Connect steps -ParticleModel.LineStyle.Smooth=Smooth line -ModelFunctionPanel.Label=Model -AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functions -DynamicFunctionPanel.FunctionEditor.Border.Title=Force Functions - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Visible Table Columns -Tracker.About.ProjectOf=A project of: -Tracker.About.TranslationBy=Translation by -# following entry (Tracker.About.Translator) purposely left blank -Tracker.About.Translator= -TMenuBar.Menu.SaveVideoAs=Save Clip As -TActions.SaveClipAs.ProgressMonitor.Message=Saving clip as -TActions.SaveClipAs.ProgressMonitor.Progress=Completed - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sync -PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronize horizontal axes -RGBRegion.MenuItem.FixedRadius=Fixed Radius -Tracker.VideoZoom.Hint=click to zoom in or out, double-click to zoom to fit -Tracker.PlotZoomIn.Hint=drag to zoom in, double-click to autoscale -Tracker.PlotZoomOut.Hint=click to zoom out -Tracker.MenuItem.Hints=Show Hints -TapeMeasure.Label.Length=length -TapeMeasure.Label.TapeAngle=angle from x-axis -TapeMeasure.Label.ArcAngle=protractor angle -TrackerIO.Dialog.NotAnImage.Title=Incorrect File Type -TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. -TrackerIO.Dialog.NotAnImage.Message2=Do you wish to continue? -TToolBar.Button.Zoom.Tooltip=Set zoom level -TrackChooserTView.DropDown.Tooltip=Select a track -TapeMeasure.Field.TapeAngle.Tooltip=Angle from positive x-axis to tape -TapeMeasure.Field.Magnitude.Tooltip=Length in scaled world units -TapeMeasure.Readout.Magnitude.Name=length -TapeMeasure.Readout.Magnitude.Hint=world units -TapeMeasure.Readout.Angle.Name=angle readout -TapeMeasure.Readout.Angle.Hint=angle measured from the +x-axis -TapeMeasure.End.Name=end -TapeMeasure.End.Hint=drag to measure distances and angles, shift-click to re-mark -TapeMeasure.Handle.Name=handle -TapeMeasure.Handle.Hint=drag to move -Vector.Tip.Name=tip -Vector.Tip.Hint=click to select, drag to move -Vector.Handle.Name=handle -Vector.Handle.Hint=click to select, drag to move -Vector.ShortHandle.Hint=click to select, drag to move, alt-click to select tip -PointMass.Position.Name=position -PointMass.Position.Hint=click to select, drag to move -PointMass.Velocity.Name=velocity -PointMass.Acceleration.Name=acceleration -PointMass.Vector.Hint=click to select, drag to move -PointMass.Position.Locked.Hint=click to select--cannot be dragged -CoordAxes.Handle.Name=+x-axis -CoordAxes.Handle.Hint=drag to change tilt -CoordAxes.Origin.Name=origin -CoordAxes.Origin.Hint=drag to change position -OffsetOrigin.Position.Name=position -OffsetOrigin.Position.Hint=drag or enter coordinates to move origin -Calibration.Point.Name=point -Calibration.Point.Hint=drag or enter coordinates to change axes and scale -RGBRegion.Position.Name=position -RGBRegion.Position.Hint=drag or enter coordinates to change position -LineProfile.End.Name=end -LineProfile.End.Hint=drag to adjust line length -LineProfile.Handle.Name=handle -LineProfile.Handle.Hint=drag to move line -PointMass.Hint=set mass on toolbar -PointMass.Unmarked.Hint=, shift-click to mark -TTrack.Unselected.Hint=click to select and/or set properties -Vector.Unmarked.Hint=shift-drag to mark -OffsetOrigin.Unmarked.Hint=shift-click to re-mark -Calibration.Unmarked.Hint=shift-click to mark the first point -Calibration.Halfmarked.Hint=shift-click to re-mark -CenterOfMass.Empty.Hint=select masses to define system -VectorSum.Empty.Hint=select vectors to define sum -TapeMeasure.Hint=drag ends to measure distances and angles -CoordAxes.Hint=set angle to change tilt -ParticleModel.Hint=set mass on toolbar, enter expressions in Model Builder to animate -RGBRegion.Hint=enter radius to change size -RGBRegion.Unmarked.Hint=shift-click to mark positions -TTrack.ImportVideo.Hint=import video or image to measure RGB -TTrack.Selected.Hint=selected -LineProfile.Hint=enter spread to change line width -LineProfile.Unmarked.Hint=shift-drag to draw line -LineProfile.Menu.Orientation=Orientation -LineProfile.MenuItem.Horizontal=Horizontal -LineProfile.MenuItem.XAxis=Along X-Axis -Footprint.PositionVector=vector -Footprint.BoldPositionVector=bold vector -Tracker.Startup.Hint=look here for hints (or turn off hints in the Help menu), press F1 key at any time for help -TrackerPanel.NoVideo.Hint=open or import a video to analyze -TrackerPanel.CalibrateVideo.Hint=calibrate the video using a calibration tool -TrackerPanel.NoTracks.Hint=create a new track to measure features of interest -TrackerPanel.SetClip.Hint=set or review video clip settings -TrackerPanel.ShowAxes.Hint=set the origin and angle of the coordinate axes -VideoPlayer.Step.Hint=step forward (shortcut: PageDown key) -VideoPlayer.Back.Hint=step back (shortcut: PageUp key) -TrackerPanel.DVVideo.Hint=apply a resize filter to correct distortions in DV-format videos -TrackerIO.DataFileFilter.Description=Tracker File (.trk) -Tracker.Button.PDFHelp=Printable PDF Version -TToolbar.Button.TapeVisible.Tooltip=Show, hide or create calibration tools - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Track Control -TMenuBar.MenuItem.Description=Notes -TrackPlottingPanel.RightDrag.Hint=right-drag for options -TMenuBar.MenuItem.DeleteSelectedPoint=Selected Step -TFrame.InfoDialog.SaveChanges.Title=Save Changes -TFrame.InfoDialog.SaveChanges.Message=Do you wish to save changes? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesian -DynamicParticle.Editor.Button.Polar=Polar -DynamicParticle.Parameter.InitialR.Description=Initial radius -DynamicParticle.Parameter.InitialTheta.Description=Initial angle -DynamicParticle.Parameter.InitialVelocityR.Description=Initial radial velocity -DynamicParticle.Parameter.InitialOmega.Description=Initial angular velocity -DynamicParticle.ForceFunction.R.Description=Force radial component -DynamicParticle.ForceFunction.Theta.Description=Force tangential component -DynamicParticlePolar.Name=Dynamic Particle Model (Polar) -TMenuBar.Menu.DynamicParticle=Dynamic Particle Model -TMenuBar.MenuItem.Cartesian=Cartesian -TMenuBar.MenuItem.Polar=Polar - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotracker... -Dialog.Button.Help=Help -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Back -AutoTracker.Wizard.Button.Next=Step -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.Pause=Pause -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Label.Mask=Template -AutoTracker.Label.AcceptLevel=Threshold -AutoTracker.TabbedPane.TabTitle.Mask=Template -AutoTracker.TabbedPane.TabTitle.Target=Target -AutoTracker.TabbedPane.TabTitle.Settings=Accept -AutoTracker.TabbedPane.TabTitle.Search=Search -AutoTracker.Info.GetStarted=To create a new key frame, shift-control-click the video feature of interest. -AutoTracker.Info.Mask1=The template defines the image to be matched in each video frame. -AutoTracker.Info.Mask2=It evolves to adapt to shape and color changes over time. Higher evolution rates track more rapid changes, but are less accurate over long times. -AutoTracker.Info.MaskLocked1=The template is in use and locked. -AutoTracker.Info.MaskLocked2=Click the Reset button to clear all steps and start over. -AutoTracker.Info.Target1=The target is marked automatically for match scores above the automark level. -AutoTracker.Info.Target2=Tip: You can adjust the target position even after steps have been marked. Existing steps will automatically move along with the target. -AutoTracker.Info.TargetLocked=The target is in use and tied to existing step positions. Moving the target will move the steps as well. -AutoTracker.Info.Settings1=Match scores above the automark level are marked automatically. -AutoTracker.Info.Settings2=Tip: reducing the automark level may increase the likelihood of marking false matches. Try increasing the evolution rate instead. -AutoTracker.Info.Search1=The search area is scanned for the best match. Move or resize the search area by dragging its edge or handle, respectively. -AutoTracker.Info.Search2=Tip: The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. -AutoTracker.Info.Frame=Frame -AutoTracker.Info.Match=The match was marked automatically. -AutoTracker.Info.Possible=A possible match was found in the search area shown. Your options are: -AutoTracker.Info.NoMatch=No match was found in the search area shown. Your options are: -AutoTracker.Info.Outside=The search area is outside the image. Your options are: -AutoTracker.Info.Accepted=The match was accepted. -AutoTracker.Info.MarkedByUser=The step was marked manually by the user. -AutoTracker.Info.NoVideo=Autotracking requires a video. -AutoTracker.Info.Height=height -AutoTracker.Info.Width=width -AutoTracker.Info.Accept=--accept the match -AutoTracker.Info.Retry=--modify the search area and search again -AutoTracker.Info.Mark=--shift-click to mark manually -AutoTracker.Info.Skip=--skip this frame and continue with the next -AutoTracker.Info.Reset=--step back to a correctly marked frame and shift-control-click to define a new key frame -AutoTracker.Info.MatchScore=match score -AutoTracker.Dialog.MaskLocked.Title=Template Locked -PointMass.Cursor.Autotrack.Description=Autotracker cursor -VideoPlayer.StartFrame.Hint=drag to set the start frame -VideoPlayer.EndFrame.Hint=drag to set the end frame -VideoPlayer.Slider.Hint=drag to scan through the video -FileDropHandler.Dialog.BadFile.Message=could not be loaded. -FileDropHandler.Dialog.BadFile.Title=Unrecognized File - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Apply -DynamicParticle.Dialog.Delete.Message=Deleting this particle will remove it from a system. Delete anyway? -DynamicParticle.Dialog.Delete.Title=Dynamic System -DynamicParticle.System.In=in -DynamicSystem.Empty=empty -DynamicSystem.Force.Name.Internal=internal -DynamicSystem.ForceFunction.R.Description=Internal force radial component -DynamicSystem.ForceFunction.Theta.Description=Internal force tangential component -DynamicSystem.MenuItem.Inspector=Select Particles... -DynamicSystem.Name=Dynamic Two-Body System -DynamicSystem.New.Name=system -DynamicSystem.Parameter.Of=of -DynamicSystem.Parameter.RelativeTo=relative to -DynamicSystem.Parameter.Name.Relative=relative -DynamicSystem.Parameter.ParticleMass.Description=Mass of -DynamicSystem.Parameter.Mass.Description=Total mass of this system -DynamicSystemInspector.Border.Title=Particle -DynamicSystemInspector.Title=Two-Body System -DynamicSystemInspector.Button.Change=Change To... -DynamicSystemInspector.ParticleName.None=(none) -TMenuBar.MenuItem.Clone=Clone -TMenuBar.MenuItem.TwoBody=Two-Body System -TrackerPanel.DataBuilder.Dropdown.Tooltip=Currently selected track -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertical Axes -TrackControl.Button.Trace.ToolTip=Show or hide paths -TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab -TToolBar.Button.Save.Tooltip=Save the current tab in file -TToolBar.Button.SelectTrack=Select -TToolBar.Button.SelectTrack.Tooltip=Select an existing track -TTrack.MenuItem.ClearSteps=Clear Steps -PointMass.MenuItem.Position=Position -TMenuBar.MenuItem.Empty=(Empty) -TTrackBar.Button.Memory=memory in use: -TTrackBar.Button.Memory.Tooltip=Monitor and manage memory -TTrackBar.Memory.PopupItem.Launch1=Launch -TTrackBar.Memory.PopupItem.Launch2=with memory -TButton.Track.ToolTip=Set properties of -Tracker.Dialog.OutOfMemory.Message1=Tracker has run out of memory. -Tracker.Dialog.OutOfMemory.Message2=Click the memory button for options. -Tracker.Dialog.OutOfMemory.Title=Out of Memory - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Label.Original=Key Frame -AutoTracker.Label.NoMask=none -AutoTracker.Label.Rate=Rate: -AutoTracker.Info.Mask3=Tip: the template need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Info.SearchOnAxis1=The x-axis in the search area is scanned for the best match. Move or resize the search area by dragging its center or handle, respectively. -AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: -AutoTracker.Info.NoMatchOnAxis=No match was found along the x-axis in the search area shown. Your options are: -AutoTracker.Info.RetryOnAxis=--move the search area or x-axis and search again -AutoTracker.Wizard.Button.Delete=Delete -AutoTracker.Wizard.Button.DeleteMore=Delete Later Points -Button.Define.Tooltip=Define functions of existing column variables -Calibration.Label.Point=point -CalibrationStick.Hint=set length or drag end to change scale, set angle to change tilt -CalibrationStick.End.Hint=drag to change the scale, shift-click to re-mark -CalibrationStick.New.Name=calibration stick -CalibrationTapeMeasure.New.Name=calibration tape -CalibrationTapeMeasure.Readout.Magnitude.Hint=click to enter a known length in world units -CalibrationTapeMeasure.Hint=set length to change scale, set angle to change tilt -DynamicSystem.Data.Description.0=relative distance between particles -DynamicSystem.Data.Description.1=relative angle -DynamicSystem.Data.Description.2=relative radial velocity -DynamicSystem.Data.Description.3=relative angular velocity -ExportDataDialog.Subtitle.Table=Data Table -ExportDataDialog.Subtitle.Content=Cells -ExportDataDialog.Subtitle.Format=Number Format -ExportDataDialog.Subtitle.Delimiter=Delimiter -ExportDataDialog.Title=Export Data -ExportDataDialog.Delimiter.Add=Add... -ExportDataDialog.Delimiter.Remove=Remove... -ExportDataDialog.Content.AllCells=All Cells -ExportDataDialog.Content.SelectedCells=Selected Cells -ExportDataDialog.MenuItem.RemoveDelimiter=Remove custom delimiter -ExportDataDialog.Chooser.SaveData.Title=Save Data As -ExportVideoDialog.Button.SaveAs=Save As... -ExportVideoDialog.Button.FullSize=Full size -ExportVideoDialog.Button.DrawnSize=As drawn -ExportVideoDialog.Content.VideoOnly=Video only -ExportVideoDialog.Content.VideoAndGraphics=Video and graphics -ExportVideoDialog.Content.GraphicsOnly=Graphics only -ExportVideoDialog.Title=Export Video Clip -ExportVideoDialog.Label.ClipSettings=Clip settings -ExportVideoDialog.Subtitle.Size=Size -ExportVideoDialog.Subtitle.Content=Content -ExportVideoDialog.Subtitle.View=View -ExportVideoDialog.Subtitle.Format=Format -ExportVideoDialog.Complete.Message1=The video has been saved as -ExportVideoDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportVideoDialog.Complete.Title=Export Complete -ExportVideoDialog.VideoSize=video size -ExportVideoDialog.MatSize=mat size -ExportVideo.Dialog.HiddenPlots.Message=Plots must be fully visible for exporting. -ExportVideo.Dialog.HiddenPlots.Title=Incomplete View -Footprint.DoubleTarget=double crosshair -Footprint.BoldDoubleTarget=bold double crosshair -OffsetOrigin.MenuItem.Fixed=Fixed World Coordinates -ParticleModel.Dialog.Offscreen.Message1=Some model steps are empty because they are too far off screen. -ParticleModel.Dialog.Offscreen.Message2=To fix this, change the model or rescale the video. -ParticleModel.Dialog.Offscreen.Title=Out of Bounds -PrefsDialog.Tab.Configuration.Title=Configuration -PrefsDialog.Memory.BorderTitle=Memory Size -PrefsDialog.Tab.General.Title=General -PrefsDialog.RecentFiles.BorderTitle=Open Recent Menu -PrefsDialog.Label.RecentSize=File count -PrefsDialog.Hints.BorderTitle=Hints -PrefsDialog.Button.Relaunch=Relaunch Now -PrefsDialog.Button.ClearRecent=Clear -PrefsDialog.Checkbox.DefaultSize=Use default -PrefsDialog.Checkbox.HintsOn=Show hints by default -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. -PrefsDialog.Dialog.WebStart.Title=Web Start Mode -PrefsDialog.LookFeel.BorderTitle=Look And Feel -PrefsDialog.Language.BorderTitle=Language -PrefsDialog.Upgrades.BorderTitle=Check For Upgrades -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=Display -PrefsDialog.Language.Default=default -PrefsDialog.Upgrades.Always=Every Time -PrefsDialog.Upgrades.Weekly=Weekly -PrefsDialog.Upgrades.Monthly=Monthly -PrefsDialog.Upgrades.Never=Never -PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) -PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool -Protractor.Name=Protractor -Protractor.New.Name=protractor -Protractor.Hint=drag arms to measure angles -Protractor.Label.Angle=angle -Protractor.Field.Angle.Tooltip=Angle between protractor arms -Protractor.Vertex.Name=vertex -Protractor.Vertex.Hint=drag to move the vertex -Protractor.End.Name=arm end -Protractor.End.Hint=drag to rotate the arm -Protractor.Handle.Name=handle -Protractor.Handle.Hint=drag to move the protractor -Protractor.Rotator.Name=rotator -Protractor.Rotator.Hint=drag to rotate the protractor -Protractor.Readout.Name=readout -Protractor.Readout.Hint=angle between protractor arms -ProtractorFootprint.Circle3=small circle -ProtractorFootprint.Circle5=large circle -ProtractorFootprint.Circle3Bold=bold small circle -ProtractorFootprint.Circle5Bold=bold large circle -Stick.Name=Calibration Stick -Stick.New.Name=calibration stick -TableTrackView.MenuItem.Unformatted=Full Precision -TableTrackView.MenuItem.Formatted=As Formatted -TableTrackView.Menu.SetDelimiter=Set Delimiter -TableTrackView.MenuItem.AddDelimiter=Add... -TableTrackView.MenuItem.RemoveDelimiter=Remove... -TableTrackView.Dialog.CustomDelimiter.Message=Enter a new delimiter string: -TableTrackView.Dialog.CustomDelimiter.Title=Add Delimiter -TableTrackView.Header.Tooltip=Click to sort or double-click to select column -TableTrackView.MenuItem.CopySelectedData=Copy Selected Data -TableTrackView.Dialog.RemoveDelimiter.Message=Select the delimiter to remove: -TableTrackView.Dialog.RemoveDelimiter.Title=Remove Delimiter -TableTrackView.Radians.Tooltip=in radians -TableTrackView.Degrees.Tooltip=in degrees -TableTrackView.RadiansPerSecond.Tooltip=in radians/s -TableTrackView.DegreesPerSecond.Tooltip=in degrees/s -TableTrackView.RadiansPerSecondSquared.Tooltip=in radians/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=in degrees/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Delete Data Function -TActions.Action.SaveFrame=Save Tabset As... -TActions.AboutVideo=Properties... -TActions.Dialog.AboutVideo.Title=Video Properties -TActions.Dialog.AboutVideo.Type=Type -TActions.Dialog.AboutVideo.Size=Dimensions -TActions.Dialog.AboutVideo.Length=Length -TActions.Dialog.AboutVideo.Frames=frames -TActions.Dialog.AboutVideo.Seconds=seconds -TActions.Dialog.AboutVideo.FrameRate=Frame Rate -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Path -TActions.Action.ImportTRK=Tracker File... -TActions.Action.ProtractorVisible=Visible -TapeMeasure.MenuItem.FixedLength=Fixed Length -TextTView.Label.NoTab=Click "Page" to add text and HTML pages here. -TextTView.NewTab.Text1=Double-click to edit the text or title. Right-click for more options. -TextTView.NewTab.Text2=To display an HTML page, enter the url or right-click to open a file. -TextTView.NewTab.Title=Untitled -TextTView.Dialog.TabTitle.Title=Set Title -TextTView.MenuItem.OpenHTML=Open HTML... -TextTView.MenuItem.SetTitle=Set Title... -TextTView.Button.NewTab=New -TextTView.TextEdit.Description=Text -TFrame.Dialog.FileNotFound.Message=The file could not be found. -TFrame.Dialog.FileNotFound.Title=File Not Found -TFrame.View.Text=Page View -TFrame.View.Main=Main View -TMenuBar.Menu.OpenRecent=Open Recent -TMenuBar.Menu.Import=Import -TMenuBar.Menu.Export=Export -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=Data File... -TMenuBar.Menu.CopyObject=Copy Object -TMenuBar.MenuItem.Coords=Coordinate System -TMenuBar.MenuItem.VideoClip=Video Clip -TMenuBar.Menu.MeasuringTools=Measuring Tools -TMenuBar.Menu.AngleUnits=Angle Units -TMenuBar.MenuItem.Degrees=Degrees -TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: -Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you -Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. -Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable -Tracker.About.DefaultLocale=Default locale -Tracker.About.CurrentLanguage=Language -Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory -Tracker.Dialog.InsufficientMemory.Message=The requested memory size is too large. -TrackerIO.Dialog.TabMustBeSaved.Message1=Tab -TrackerIO.Dialog.TabMustBeSaved.Message2=must be saved as a tracker file to be included in the tabset. -TrackerIO.Dialog.TabMustBeSaved.Message3=Do you wish to save it? -TrackerIO.Dialog.TabMustBeSaved.Title=Unsaved Tab -TrackerIO.Dialog.NoTabs.Message=There are no tabs to save! -TrackerIO.Dialog.NoTabs.Title=Empty Tabset -TrackerIO.Dialog.SaveTabset.Title=Save Tabset -TrackerIO.Dialog.SaveTab.Title=Save Tab -TrackerIO.Delimiter.Tab=Tab -TrackerIO.Delimiter.Space=Space -TrackerIO.Delimiter.Comma=Comma -TrackerIO.Delimiter.Semicolon=Semicolon -TrackerIO.VideoAndDataFileFilter.Description=Video and Tracker Files -TrackerPanel.Dialog.Version.Message1=You are opening a file created with Tracker -TrackerPanel.Dialog.Version.Message2=which may refer to -TrackerPanel.Dialog.Version.Message3=features missing in the version you are running -TrackerPanel.Dialog.Version.Message4=The latest version is available at -TrackerPanel.Dialog.Version.Title=Version Mismatch -TrackerPanel.Label.ModelStart=Start frame -TrackerPanel.Label.ModelEnd=End frame -TrackerPanel.Spinner.ModelStart.Tooltip=Set the start frame for this model -TrackerPanel.Spinner.ModelEnd.Tooltip=Set the end frame for this model -TToolbar.Button.ProtractorVisible.Tooltip=Show or hide the protractor -TToolbar.Button.AxesVisible.Tooltip=Show or hide the coordinate axes -TToolBar.Button.TrackControl.Tooltip=Show or hide the track control -TTrack.Dialog.StepSizeWarning.Message1=Caution: some tracks were marked at a step size greater than one, leaving skipped frames unmarked. -TTrack.Dialog.StepSizeWarning.Message2=Changing the step size is therefore likely to result in gaps in the data set. -TTrack.Dialog.StepSizeWarning.Message3=Velocities and accelerations around the gaps cannot be determined until all steps are marked. -TTrack.Dialog.StepSizeWarning.Title=Caution -TTrack.Dialog.SkippedStepWarning.Message1=Caution: skipping steps when marking positions leaves gaps in the data set. -TTrack.Dialog.SkippedStepWarning.Title=Caution -TTrack.Dialog.SkippedStepWarning.Checkbox=Don't show this again -TTrack.Locked.Hint=locked -TTrack.AngleField.Radians.Tooltip=Angle in radians -TTrack.AngleField.Degrees.Tooltip=Angle in degrees -TTrack.AngleField.Popup.Radians=Switch To Radians -TTrack.AngleField.Popup.Degrees=Switch To Degrees -TTrackBar.Memory.Menu.SetSize=Set memory size... -TTrackBar.Button.Version=Now available: version -TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... -TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Calibration Tape -CircleFootprint.Circle=circle -CircleFootprint.FilledCircle=filled circle -CircleFootprint.Dialog.Title=Circle Footprint -CircleFootprint.Dialog.Label.Radius=Radius -CircleFootprint.Dialog.Checkbox.Bold=Bold -CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot -LineProfile.Hint.Marking=drag mouse to mark the line profile -PageTView.Button.Page=Page -PageTView.MenuItem.ClosePage=Close Page -PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step -PrefsDialog.Dialog.NewVersion.Title=Upgrades -PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=is now available at -PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. -RGBRegion.Hint.Marking=click mouse to mark the center of the region -TMenuBar.MenuItem.Restore=Restore Views -TrackControl.StretchVectors.None=No stretch -TViewChooser.Maximize.Tooltip=Maximize this view -TViewChooser.Restore.Tooltip=Restore views -Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step -WorldTView.Button.World=World - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Warnings -PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors -PropertiesDialog.Title=Properties -PropertiesDialog.Label.Author=Authors -PropertiesDialog.Label.Contact=Contact -TActions.Action.Properties=Properties... -TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame -TFrame.Progress.ClickToCancel=(click to cancel) -TFrame.Dialog.StalledVideo.Title=Error Loading Video -TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. -TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. -TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: -TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. -TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. -TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stop -TFrame.Dialog.StalledVideo.Button.Wait=Wait -Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again -TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found -TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinematic Particle -DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) -DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) -DynamicSystem.Builder.Title=Dynamic System (Internal) -PropertiesDialog.Button.CopyFilePath=Copy File Path -PropertiesDialog.Button.CopyVideoPath=Copy Video Path -PropertiesDialog.Tab.TrackerFile=Tracker File -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=Property -PropertiesDialog.Header.Value=Value -TActions.Action.OpenURL=Open URL... -TActions.Dialog.OpenURL.Title=Open URL -TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file -TActions.Dialog.AboutVideo.Name=Name - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cached Web Files -PrefsDialog.Button.ClearCache=Clear All - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-click to re-mark highlighted position -PointMass.Remarking.Hint=click mouse to re-mark position -PointMass.PositionSelected.Hint=drag or enter position on toolbar -PointMass.VectorSelected.Hint=drag to move -Vector.Remark.Hint=shift-click to re-mark highlighted tip -Vector.TipSelected.Hint=drag or enter components on toolbar -Vector.HandleSelected.Hint=drag to move -Vector.Remarking.Hint=click mouse to re-mark tip -AutoTracker.Label.Search=Search -AutoTracker.Label.Target=Target -AutoTracker.Label.Frame=Frame -AutoTracker.Label.Point=Point -AutoTracker.Label.Template=Template -AutoTracker.Label.Track=Track -AutoTracker.Label.Match=Match -AutoTracker.Label.NoTemplate=No Template -AutoTracker.Label.EvolutionRate=Evolution Rate -AutoTracker.Label.Automark=Automark -AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. -AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. -AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. -AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. -AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. -AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. -AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. -AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. -AutoTracker.Info.Search=The search area is scanned for the best match. -AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. -AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. -AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. -AutoTracker.Info.Target=The target is where the targeted track point is marked. -AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. -AutoTracker.Info.Title.Settings=Settings -AutoTracker.Info.Title.Tip=Tip -AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. -AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: -AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame -AutoTracker.Info.Replace=--accept the match -AutoTracker.Info.Keep=--skip this frame and leave unchanged -AutoTracker.Info.PossibleReplace=A possible match is shown. Your options are: -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Wizard.Button.Replace=Replace -AutoTracker.Wizard.Button.Keep=Decline -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.SearchThis=Search This -AutoTracker.Wizard.Button.SearchNext=Search Next -AutoTracker.Wizard.Button.Delete=Delete -AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Wizard.Menuitem.DeleteThis=This Point -AutoTracker.Wizard.Menuitem.DeleteLater=Later Points -AutoTracker.Wizard.Menuitem.DeleteAll=Clear All -TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker -MainTView.Popup.MenuItem.ZoomIn=Zoom In -MainTView.Popup.MenuItem.ZoomOut=Zoom Out -MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit -TrackerIO.Dialog.DurationVaries.Title=Frame Durations -TrackerIO.Dialog.DurationVaries.Message1=Some frame durations differ from the mean by more than -TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from -TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. -TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: -TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=No resource could be loaded for node - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift-click to mark -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Directories -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Clear on exit -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=Save -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=Algorithms... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: -AlgorithmDialog.Title=Algorithms -AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. -AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt^2) -AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. -AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=The file cannot be read. -TrackPlottingPanel.Popup.Menu.CompareWith=Compare With -TrackerPanel.DataBuilder.TrackType.Unknown=unknown -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=Load Data Functions -TrackerPanel.DataBuilder.Load.Message=Select functions to load: -TrackerPanel.DataBuilder.Save.Title=Save Data Functions -TrackerPanel.DataBuilder.Save.Message=Select functions to save: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into -TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection -TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type -TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=The Tracker clip has been saved as -ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportTRKDialog.Complete.Title=Export Complete -ExportTRKDialog.Title=Export Tracker Clip -ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. -ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. -TMenuBar.MenuItem.TabClip=Tracker Clip -TMenuBar.Menu.CalibrationTools=Calibration Tools -TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=end -TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Attach Ends -AttachmentInspector.Label.End=End -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Name -AttachmentInspector.Header.AttachedTo=Attach To -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Attach Ends... -PerspectiveTrack.Corner=corner -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=time -Protractor.Data.Description.1=protractor angle -Protractor.Data.Description.2=length of arm 1 -Protractor.Data.Description.3=length of arm 2 -Protractor.Data.Description.4=step number -Protractor.Data.Description.5=frame number -TapeMeasure.Data.Description.0=time -TapeMeasure.Data.Description.1=length -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=step number -TapeMeasure.Data.Description.4=frame number - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Add -Dialog.Button.Remove=Remove -PrefsDialog.Button.ClearHost=Clear Host -PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache -PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache -TActions.Action.SaveZip=Export Tracker ZIP -ThumbnailDialog.Title=Export Thumbnail Image -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Current image -ThumbnailDialog.Label.FrameNumber=frame -ThumbnailDialog.Label.StepNumber=step -ThumbnailDialog.View.VideoOnly=Video Only -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Thumbnail Image -TToolBar.Button.SaveZip.Tooltip=Export a Tracker ZIP file -TTrack.MenuItem.DeletePoint=Delete Selected Step -ZipResourceDialog.Title=Export Tracker ZIP -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Name -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Keywords -ZipResourceDialog.Label.Link=External Link -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=The Tracker ZIP file has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Success -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Export Tracker ZIP -ZipResourceDialog.FileChooser.AddFile.Title=Add File to Tracker ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File -ZipResourceDialog.Button.AddFiles=Add Files -ZipResourceDialog.Button.ThumbnailSettings=Settings -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File -ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file -ZipResourceDialog.AddHTMLInfo.Message2=to the Tracker ZIP? -ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch -ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files -ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) -ZipResourceDialog.Tooltip.Author=Authors of this resource -ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) -ZipResourceDialog.Tooltip.Description=A useful description of this resource -ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser -ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource -ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type -ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the Tracker ZIP -ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video -ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file - -# Additions by Doug Brown 2012-12-10 -PrefsDialog.Checkbox.32BitVM=32-bit -PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations -PrefsDialog.Button.NoEngine=None -PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. -PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed -PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. -PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. -PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. -PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. -PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required -PrefsDialog.Button.ShowHelpNow=Show Help Now -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT -TMenuBar.MenuItem.CheckFrameDurations=Frame Durations -TMenuBar.MenuItem.ExportZIP=Tracker Zip -Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. -Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they -Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. -Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? -Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now -Tracker.Dialog.Button.ShowPrefs=No, but show preferences -Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video -Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. -TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). -TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) -TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents -ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the -ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the -ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. -ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? -ZipResourceDialog.BadModels.Title=Clip-Model Conflicts -TMenuBar.MenuItem.EditVideoFrames=Load All Images -TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. -TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. -TMenuBar.Dialog.RequiresMemory.Title=Memory - -# Additions by Doug Brown 2013-01-25 -PointMass.Data.Description.PixelX=pixel x-component -PointMass.Data.Description.PixelY=pixel y-component -ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video -ExportVideoDialog.Deinterlace.OddFirst=Odd field first -ExportVideoDialog.Deinterlace.EvenFirst=Even field first -ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order -TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found -TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file -TrackerPanel.DataBuilder.Button.Autoload=Autoload -TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage data function autoloading -TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions -TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: -TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files -TrackerIO.Dialog.Open.Title=Open -TToolbar.Button.Refresh.Popup.RefreshNow=Refresh -TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh -TToolbar.Button.Refresh.Tooltip=Refresh data and views - -# Additions by Doug Brown 2013-05-10 -CoordAxes.Origin.Label=origin pixel position -CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video - -# Additions by Doug Brown 2013-08-24 -MainTView.Popup.MenuItem.Select=Select Points -MainTView.Popup.MenuItem.Deselect=Deselect Points -ZipResourceDialog.Checkbox.PreviewThumbnail=Preview -ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: -ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename -ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. -ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +# This is the dutch tracker.properties file + +Calibration.Name=Calibration Points +Calibration.New.Name=calibration points +CenterOfMass.Name=Center Of Mass +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Select Masses... +CenterOfMassInspector.Title=Center of Mass +CenterOfMassInspector.Border.Title=Select Masses +ConfigInspector.Border.Title=Desired Features +ConfigInspector.Title=Preferences +ConfigInspector.Button.SaveAsDefault=Save As Default +CoordAxes.Name=Axes +CoordAxes.New.Name=axes +Dialog.Button.Cancel=Cancel +Dialog.Button.OK=OK +Dialog.Button.Close=Close +Dialog.Button.All=All +Dialog.Button.None=None +Dialog.Button.Copy=Copy +Dialog.Button.Update=Update +Dialog.Button.SelectAll=Select All +Footprint.Diamond=diamond +Footprint.BoldDiamond=bold diamond +Footprint.SolidDiamond=solid diamond +Footprint.Triangle=triangle +Footprint.BoldTriangle=bold triangle +Footprint.SolidTriangle=solid triangle +Footprint.Circle=circle +Footprint.BoldCircle=bold circle +Footprint.SolidCircle=solid circle +Footprint.VerticalLine=vertical line +Footprint.BoldVerticalLine=bold vertical line +Footprint.HorizontalLine=horizontal line +Footprint.BoldHorizontalLine=bold horizontal line +Footprint.Crosshair=crosshair +Footprint.BoldCrosshair=bold crosshair +Footprint.SimpleAxes=simple axes +Footprint.BoldSimpleAxes=bold simple axes +Footprint.Spot=spot +Footprint.Line=line +Footprint.BoldLine=bold line +Footprint.Outline=outline +Footprint.BoldOutline=bold outline +Footprint.Arrow=arrow +Footprint.BoldArrow=bold arrow +Footprint.DoubleArrow=double arrow +Footprint.BoldDoubleArrow=bold double arrow +Footprint.2xArrow=2x arrow +Footprint.Bold2xArrow=bold 2x arrow +Footprint.4xArrow=4x arrow +Footprint.Bold4xArrow=bold 4x arrow +Footprint.DashArrow=dashed arrow +Footprint.BoldDashArrow=bold dashed arrow +Footprint.BigArrow=big arrow +Footprint.BigDashArrow=big dashed arrow +LineProfile.Name=Line Profile +LineProfile.New.Name=profile +LineProfile.Data.Brightness=brightness +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=red +LineProfile.Data.Green=green +LineProfile.Data.Blue=blue +LineProfile.Data.Weighting=count +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Zoom +MainTView.Popup.MenuItem.ToFit=To Fit +OffsetOrigin.Name=Offset Origin +OffsetOrigin.New.Name=offset origin +PlotTrackView.Button.PlotCount=Plot +PlotTrackView.Button.PlotCount.ToolTip=Set plot count +PointMass.Name=Point Mass +PointMass.New.Name=mass +PointMass.MenuItem.VectorsToPosition=To Position +PointMass.MenuItem.Velocity=Velocity +PointMass.MenuItem.Acceleration=Acceleration +Star.Name=Star +Star.New.Name=star +TableTrackView.Action.CopyData=Copy Data +TableTrackView.Button.SelectTableData=Table +TableTrackView.Button.SelectTableData.ToolTip=Choose table columns +TableTrackView.Popup.MenuItem.Analyze=Analyze... +TableTrackView.Dialog.Border.Title=Visible: +TActions.Action.Description=Notes +TActions.Action.ClearTracks=All Tracks +TActions.Action.NewTab=New Tab +TActions.Action.Copy=Copy +TActions.Action.Paste=Paste +TActions.Action.Open=Open File... +TActions.Action.Close=Close Tab +TActions.Action.Import=Import... +TActions.Action.Save=Save Tab +TActions.Action.SaveAs=Save Tab As... +TActions.Action.Export=Export... +TActions.Action.CaptureVideo=Capture Video... +TActions.Action.Delete=Delete +TActions.Action.Config=Preferences... +TActions.Action.AxesVisible=Visible +TActions.Action.TapeVisible=Visible +TActions.Action.Print=Print... +TActions.Action.ClearFilters=Clear +TActions.Action.ImportVideo=Import... +TActions.Action.CloseVideo=Close +TActions.Action.CloseAll=Close All Tabs +TActions.Action.Exit=Exit +TActions.Dialog.PrintError.Message=A printing error occurred. +TActions.Dialog.PrintError.Title=Printing Error +TActions.Dialog.Description.Title=Notes: +TActions.Dialog.DeleteLockedTracks.Message=Some tracks are locked. Delete anyway? +TActions.Dialog.DeleteLockedTracks.Title=Delete Locked Tracks? +TActions.Dialog.NewPointMass.Title=New Point Mass +TapeMeasure.Name=Tape Measure +TapeMeasure.New.Name=tape +TapeMeasure.MenuItem.Fixed=Fixed +TFrame.View.Plot=Plot View +TFrame.View.Table=Table View +TFrame.View.World=World View +TFrame.View.Video=Video View +TFrame.Dialog.Help.Title=Tracker Help +TMenuBar.Menu.File=Pig +TMenuBar.Menu.Edit=Edit +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Tracks +TMenuBar.Menu.Coords=Coordinate System +TMenuBar.Menu.Window=Views +TMenuBar.Menu.Help=Help +TMenuBar.MenuItem.EditProperties=Properties... +TMenuBar.MenuItem.VideoVisible=Visible +TMenuBar.MenuItem.VideoFilters=Filters +TMenuBar.MenuItem.NewVideoFilter=New +TMenuBar.MenuItem.NewTrack=New +TMenuBar.MenuItem.CoordsLocked=Locked +TMenuBar.MenuItem.CoordsFixedOrigin=Fixed Origin +TMenuBar.MenuItem.CoordsFixedAngle=Fixed Angle +TMenuBar.MenuItem.CoordsFixedScale=Fixed Scale +TMenuBar.MenuItem.CoordsRefFrame=Reference Frame +TMenuBar.MenuItem.CoordsDefault=Default +TMenuBar.MenuItem.WindowRight=Right View +TMenuBar.MenuItem.WindowBottom=Bottom View +TMenuBar.MenuItem.PlayAllSteps=Play All Steps +TMenuBar.MenuItem.Record=Record +TMenuBar.MenuItem.MatSize=Mat Size +TMenuBar.MenuItem.Language=Language +TMenuBar.MenuItem.DeleteTrack=Delete +TMenuBar.MenuItem.TrackerHelp=Tracker Help... +TMenuBar.MenuItem.MessageLog=Message Log... +TrackControl.Name=Track Control +TrackControl.Button.NewTrack=Create +TrackControl.Button.NewTrack.ToolTip=Create a new track +TrackControl.Button.Trails.ToolTip=Set trail length +TrackControl.Button.Labels.ToolTip=Show or hide numbering +TrackControl.Button.StretchVectors.ToolTip=Stretch vectors +TrackControl.Button.Accelerations.ToolTip=Show or hide acceleration vectors +TrackControl.Button.Xmass.ToolTip=Multiply vectors by mass +TrackControl.Button.Vectors.ToolTip=Vectors +TrackControl.Button.Velocities.ToolTip=Show or hide velocity vectors +TrackControl.Button.Properties.ToolTip=Click to select +TrackControl.Button.Positions.ToolTip=Show or hide positions +Tracker.Popup.MenuItem.Snapshot=Snapshot... +Tracker.Popup.MenuItem.Help=Help... +Tracker.Cursor.Crosshair.Description=Crosshair cursor +Tracker.Action.AboutTracker=About Tracker... +Tracker.Dialog.AboutTracker.Title=About Tracker +Tracker.Action.AboutJava=About Java... +Tracker.Dialog.AboutJava.Title=About Java +Tracker.Dialog.AboutJava.UnknownVersion=unknown +Tracker.Dialog.AboutJava.Message=Java version +Tracker.Action.AboutQT=About QuickTime... +Tracker.Dialog.AboutQT.Title=About QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: +Tracker.Dialog.NoQT.Title=QTJava.zip not found +Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. +Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. +Tracker.Dialog.UpdateQT.Title=Update QTJava.zip +Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at +Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? +Tracker.Dialog.CopyQT.Title=Copy QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from +Tracker.Dialog.CopyQT.Message3= to +Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. +Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? +Tracker.Dialog.CopyFailed.Title=Copy Failed +Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. +Tracker.Dialog.CopiedTo.Title=Copy Succeeded +Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to +Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. +Tracker.Splash.Loading=Loading +TrackerIO.Dialog.Import.Title=Import Tracker File +TrackerIO.Dialog.Import.Message=Select items to import +TrackerIO.Dialog.ImportVideo.Title=Import Video +TrackerIO.Dialog.Export.Title=Export +TrackerIO.Dialog.Export.Message=Select items to export +TrackerIO.Dialog.ReplaceFile.Title=Replace Existing File? +TrackerIO.Dialog.ReplaceFile.Message=already exists. Do you want to replace it? +TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML +TrackerIO.Dialog.NotTrackerXML.Message=contains xml data for a different application. +TrackerIO.Dialog.BadVideo.Message=File is not a recognized video type: +TrackerIO.Dialog.BadVideo.Title=Unrecognized Video File +TrackerPanel.NewTab.Name=Untitled +TrackerPanel.DragToMark.Hint=Shift-drag to mark +TrackerPanel.ClickToMark.Hint=Shift-click to mark +TrackerPanel.Dialog.LoadFailed.Title=Invalid Tracker File +TrackerPanel.Dialog.LoadFailed.Message=File is not a valid Tracker file: +TrackerPanel.Dialog.SaveChanges.Title=Save Changes +TrackerPanel.Dialog.SaveChanges.Message=Save changes to +TrackPlottingPanel.Popup.MenuItem.Lines=Lines +TrackPlottingPanel.Popup.MenuItem.Points=Points +TrackPlottingPanel.Popup.MenuItem.Scale=Scale... +TrackPlottingPanel.Popup.MenuItem.Print=Print... +TrackPlottingPanel.Popup.MenuItem.Measure=Scale to Fit +TrackPlottingPanel.Popup.MenuItem.Analyze=Analyze... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscale +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box +TrackPlottingPanelInspector.Title=Scale +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Set the footprint +TToolBar.Dropdown.SelectedTrack.Tooltip=Select a track +TToolBar.Dropdown.SelectedTrack.None=None +TTrack.MenuItem.Delete=Delete +TTrack.MenuItem.Color=Color... +TTrack.Dialog.Color.Title=Choose Track Color +TTrack.MenuItem.Name=Name... +TTrack.MenuItem.Footprint=Footprints +TTrack.MenuItem.Description=Notes... +TTrack.MenuItem.Visible=Visible +TTrack.MenuItem.TrailVisible=Trail Visible +TTrack.MenuItem.Autostep=Autostep +TTrack.MenuItem.MarkByDefault=Mark by Default +TTrack.MenuItem.Locked=Locked +TTrack.MenuItem.Delete=Delete +TTrack.Name.None=no name +TTrack.Dialog.Description.Title=Notes: +TTrack.Dialog.Name.Title=Set Name +TTrack.Dialog.Name.Label=Name: +TViewChooser.Button.Choose.Tooltip=Choose a view +Vector.Name=Vector +Vector.New.Name=vector +Vector.MenuItem.ToOrigin=To Origin +Vector.MenuItem.Label=Label Visible +VectorSum.Name=Vector Sum +VectorSum.New.Name=sum +VectorSum.MenuItem.Inspector=Select Vectors... +VectorSumInspector.Title=Vector Sum +VectorSumInspector.Border.Title=Select Vectors +WorldTView.Popup.MenuItem.Projectile=Projectile Model + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Kinematic Particle Model +AnalyticParticle.Inspector.Title=Kinematic Particle Model +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=radius 4 +CircleFootprint.Circle_6=radius 6 +CircleFootprint.Circle_8=radius 8 +DynamicParticle.Name=Dynamic Particle Model (Cartesian) +DynamicParticle.Inspector.Title=Dynamic Particle Model +DynamicParticle.Property.ForceX=force x +DynamicParticle.Property.ForceY=force y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Fixed Position +ParticleModel.New.Name=model +ParticleModel.MenuItem.InspectModel=Model Builder... +ParticleModel.Inspector.Button.Undo=Undo +ParticleModel.Inspector.Button.Redo=Redo +ParticleModel.Inspector.Button.Close=Close +ParticleModel.Inspector.Button.Help=Help + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=X Only +Calibration.Axes.YOnly=Y Only +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Select calibration axes +Calibration.Label.Axes=axes +Calibration.Dialog.InvalidCoordinates.Title=Invalid Coordinates +Calibration.Dialog.InvalidCoordinates.Message=Points cannot have the same world coordinates. +Calibration.Dialog.InvalidXCoordinates.Message=Points cannot have the same world x-coordinates. +Calibration.Dialog.InvalidYCoordinates.Message=Points cannot have the same world y-coordinates. +SpectralLineFilter.Title=Gas Spectra +SpectralLineFilter.H=Hydrogen +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Mercury +TFrame.View.Unknown=View +TMenuBar.MenuItem.Undo=Undo +TMenuBar.MenuItem.Redo=Redo +TMenuBar.MenuItem.Replace=Replace... +TMenuBar.Menu.AddImage=Import Images +TMenuBar.MenuItem.AddBefore=Before This Frame... +TMenuBar.MenuItem.AddAfter=After This Frame... +TMenuBar.MenuItem.RemoveImage=Remove This Frame +TMenuBar.Menu.Tools=Tools +TMenuBar.MenuItem.DataFunctionTool=Data Builder +TMenuBar.MenuItem.DatasetTool=Data Tool +TMenuBar.Menu.CopyImage=Copy Image +TMenuBar.MenuItem.CopyMainView=Main View +TMenuBar.MenuItem.CopyFrame=Frame +TMenuBar.MenuItem.PrintFrame=Print... +TrackerIO.Dialog.AddImage.Title=Import Images (choose one or more) +TTrack.Dialog.Name.BadName=is in use. Please choose another name. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=net force +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Plot view of track data will appear here. +TableTView.Label.NoData=Table view of track data will appear here. +TrackerPanel.Message.NoData0=Main view of video and tracks will appear here. +TrackerPanel.Message.NoData1=Choose File|Open or Tracks|New to start. +WorldTView.Label.NoData=World view of video and tracks will appear here. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Solver: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptive Multistep +DynamicParticle.Table.Force.Border.Title=Force Functions (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Position Functions (t) +ParticleModel.Table.Initial.Border.Title=Initial Values +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Paste Image +TMenuBar.MenuItem.PasteAfter=After This Frame +TMenuBar.MenuItem.PasteBefore=Before This Frame +TMenuBar.MenuItem.PasteReplace=Replace Video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Getting Started... +Tracker.Splash.HelpMessage=New user? See + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=angle from horizontal +LineProfile.Checkbox.Rotates=rotates +LineProfile.Label.Spread=spread +RGBRegion.Name=RGB Region +RGBRegion.New.Name=region +RGBRegion.MenuItem.Fixed=Fixed Position +RGBRegion.Label.Radius=pixel radius +TTrack.Label.Step=step + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=position number +LineProfile.Data.Description.1=position x-component +LineProfile.Data.Description.2=position y-component +LineProfile.Data.Description.3=red +LineProfile.Data.Description.4=green +LineProfile.Data.Description.5=blue +LineProfile.Data.Description.6=perceived brightness +LineProfile.Data.Description.7=line width +ParticleModel.MenuItem.TraceVisible=Trace Visible +ParticleModel.MenuItem.StepsVisible=Steps Visible +PointMass.Data.Description.0=time +PointMass.Data.Description.1=position x-component +PointMass.Data.Description.2=position y-component +PointMass.Data.Description.3=position magnitude +PointMass.Data.Description.4=position angle +PointMass.Data.Description.5=velocity x-component +PointMass.Data.Description.6=velocity y-component +PointMass.Data.Description.7=velocity magnitude +PointMass.Data.Description.8=velocity angle +PointMass.Data.Description.9=acceleration x-component +PointMass.Data.Description.10=acceleration y-component +PointMass.Data.Description.11=acceleration magnitude +PointMass.Data.Description.12=acceleration angle +PointMass.Data.Description.13=rotation angle +PointMass.Data.Description.14=angular velocity +PointMass.Data.Description.15=angular acceleration +PointMass.Data.Description.16=step number +PointMass.Data.Description.17=frame number +PointMass.Data.Description.18=momentum x-component +PointMass.Data.Description.19=momentum y-component +PointMass.Data.Description.20=momentum magnitude +PointMass.Data.Description.21=momentum angle +PointMass.Data.Description.22=kinetic energy +RGBRegion.Data.Description.0=time +RGBRegion.Data.Description.1=position x-component +RGBRegion.Data.Description.2=position y-component +RGBRegion.Data.Description.3=red +RGBRegion.Data.Description.4=green +RGBRegion.Data.Description.5=blue +RGBRegion.Data.Description.6=perceived brightness +RGBRegion.Data.Description.7=pixel count +RGBRegion.Data.Description.8=step number +RGBRegion.Data.Description.9=frame number +TView.Menuitem.Define=Define... +Vector.Data.Description.0=time +Vector.Data.Description.1=x-component +Vector.Data.Description.2=y-component +Vector.Data.Description.3=magnitude +Vector.Data.Description.4=angle +Vector.Data.Description.5=tail position x-component +Vector.Data.Description.6=tail position y-component +Vector.Data.Description.7=step number +Vector.Data.Description.8=frame number + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Mass of this particle +ParticleModel.Parameter.InitialTime.Description=Initial time +AnalyticParticle.PositionFunction.X.Description=Position x-component +AnalyticParticle.PositionFunction.Y.Description=Position y-component +DynamicParticle.ForceFunction.X.Description=Force x-component +DynamicParticle.ForceFunction.Y.Description=Force y-component +DynamicParticle.Parameter.InitialX.Description=Initial position x-component +DynamicParticle.Parameter.InitialY.Description=Initial position y-component +DynamicParticle.Parameter.InitialVelocityX.Description=Initial velocity x-component +DynamicParticle.Parameter.InitialVelocityY.Description=Initial velocity y-component +TrackerPanel.ModelBuilder.Title=Model Builder +TrackerPanel.DataBuilder.Title=Data Builder +TrackControl.TrailMenu.NoTrail=No trails +TrackControl.TrailMenu.ShortTrail=Short trails +TrackControl.TrailMenu.LongTrail=Long trails +TrackControl.TrailMenu.FullTrail=All steps +TrackerPanel.ModelBuilder.Spinner.Tooltip=Currently selected model +TrackerPanel.ModelBuilder.LineButton.Text=Line Style +TrackerPanel.ModelBuilder.LineButton.Tooltip=Set line style +ParticleModel.LineStyle.None=No line +ParticleModel.LineStyle.Connect=Connect steps +ParticleModel.LineStyle.Smooth=Smooth line +ModelFunctionPanel.Label=Model +AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functions +DynamicFunctionPanel.FunctionEditor.Border.Title=Force Functions + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Visible Table Columns +Tracker.About.ProjectOf=A project of: +Tracker.About.TranslationBy=Translation by +# following entry (Tracker.About.Translator) purposely left blank +Tracker.About.Translator= +TMenuBar.Menu.SaveVideoAs=Save Clip As +TActions.SaveClipAs.ProgressMonitor.Message=Saving clip as +TActions.SaveClipAs.ProgressMonitor.Progress=Completed + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sync +PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronize horizontal axes +RGBRegion.MenuItem.FixedRadius=Fixed Radius +Tracker.VideoZoom.Hint=click to zoom in or out, double-click to zoom to fit +Tracker.PlotZoomIn.Hint=drag to zoom in, double-click to autoscale +Tracker.PlotZoomOut.Hint=click to zoom out +Tracker.MenuItem.Hints=Show Hints +TapeMeasure.Label.Length=length +TapeMeasure.Label.TapeAngle=angle from x-axis +TapeMeasure.Label.ArcAngle=protractor angle +TrackerIO.Dialog.NotAnImage.Title=Incorrect File Type +TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. +TrackerIO.Dialog.NotAnImage.Message2=Do you wish to continue? +TToolBar.Button.Zoom.Tooltip=Set zoom level +TrackChooserTView.DropDown.Tooltip=Select a track +TapeMeasure.Field.TapeAngle.Tooltip=Angle from positive x-axis to tape +TapeMeasure.Field.Magnitude.Tooltip=Length in scaled world units +TapeMeasure.Readout.Magnitude.Name=length +TapeMeasure.Readout.Magnitude.Hint=world units +TapeMeasure.Readout.Angle.Name=angle readout +TapeMeasure.Readout.Angle.Hint=angle measured from the +x-axis +TapeMeasure.End.Name=end +TapeMeasure.End.Hint=drag to measure distances and angles, shift-click to re-mark +TapeMeasure.Handle.Name=handle +TapeMeasure.Handle.Hint=drag to move +Vector.Tip.Name=tip +Vector.Tip.Hint=click to select, drag to move +Vector.Handle.Name=handle +Vector.Handle.Hint=click to select, drag to move +Vector.ShortHandle.Hint=click to select, drag to move, alt-click to select tip +PointMass.Position.Name=position +PointMass.Position.Hint=click to select, drag to move +PointMass.Velocity.Name=velocity +PointMass.Acceleration.Name=acceleration +PointMass.Vector.Hint=click to select, drag to move +PointMass.Position.Locked.Hint=click to select--cannot be dragged +CoordAxes.Handle.Name=+x-axis +CoordAxes.Handle.Hint=drag to change tilt +CoordAxes.Origin.Name=origin +CoordAxes.Origin.Hint=drag to change position +OffsetOrigin.Position.Name=position +OffsetOrigin.Position.Hint=drag or enter coordinates to move origin +Calibration.Point.Name=point +Calibration.Point.Hint=drag or enter coordinates to change axes and scale +RGBRegion.Position.Name=position +RGBRegion.Position.Hint=drag or enter coordinates to change position +LineProfile.End.Name=end +LineProfile.End.Hint=drag to adjust line length +LineProfile.Handle.Name=handle +LineProfile.Handle.Hint=drag to move line +PointMass.Hint=set mass on toolbar +PointMass.Unmarked.Hint=, shift-click to mark +TTrack.Unselected.Hint=click to select and/or set properties +Vector.Unmarked.Hint=shift-drag to mark +OffsetOrigin.Unmarked.Hint=shift-click to re-mark +Calibration.Unmarked.Hint=shift-click to mark the first point +Calibration.Halfmarked.Hint=shift-click to re-mark +CenterOfMass.Empty.Hint=select masses to define system +VectorSum.Empty.Hint=select vectors to define sum +TapeMeasure.Hint=drag ends to measure distances and angles +CoordAxes.Hint=set angle to change tilt +ParticleModel.Hint=set mass on toolbar, enter expressions in Model Builder to animate +RGBRegion.Hint=enter radius to change size +RGBRegion.Unmarked.Hint=shift-click to mark positions +TTrack.ImportVideo.Hint=import video or image to measure RGB +TTrack.Selected.Hint=selected +LineProfile.Hint=enter spread to change line width +LineProfile.Unmarked.Hint=shift-drag to draw line +LineProfile.Menu.Orientation=Orientation +LineProfile.MenuItem.Horizontal=Horizontal +LineProfile.MenuItem.XAxis=Along X-Axis +Footprint.PositionVector=vector +Footprint.BoldPositionVector=bold vector +Tracker.Startup.Hint=look here for hints (or turn off hints in the Help menu), press F1 key at any time for help +TrackerPanel.NoVideo.Hint=open or import a video to analyze +TrackerPanel.CalibrateVideo.Hint=calibrate the video using a calibration tool +TrackerPanel.NoTracks.Hint=create a new track to measure features of interest +TrackerPanel.SetClip.Hint=set or review video clip settings +TrackerPanel.ShowAxes.Hint=set the origin and angle of the coordinate axes +VideoPlayer.Step.Hint=step forward (shortcut: PageDown key) +VideoPlayer.Back.Hint=step back (shortcut: PageUp key) +TrackerPanel.DVVideo.Hint=apply a resize filter to correct distortions in DV-format videos +TrackerIO.DataFileFilter.Description=Tracker File (.trk) +Tracker.Button.PDFHelp=Printable PDF Version +TToolbar.Button.TapeVisible.Tooltip=Show, hide or create calibration tools + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Track Control +TMenuBar.MenuItem.Description=Notes +TrackPlottingPanel.RightDrag.Hint=right-drag for options +TMenuBar.MenuItem.DeleteSelectedPoint=Selected Step +TFrame.InfoDialog.SaveChanges.Title=Save Changes +TFrame.InfoDialog.SaveChanges.Message=Do you wish to save changes? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesian +DynamicParticle.Editor.Button.Polar=Polar +DynamicParticle.Parameter.InitialR.Description=Initial radius +DynamicParticle.Parameter.InitialTheta.Description=Initial angle +DynamicParticle.Parameter.InitialVelocityR.Description=Initial radial velocity +DynamicParticle.Parameter.InitialOmega.Description=Initial angular velocity +DynamicParticle.ForceFunction.R.Description=Force radial component +DynamicParticle.ForceFunction.Theta.Description=Force tangential component +DynamicParticlePolar.Name=Dynamic Particle Model (Polar) +TMenuBar.Menu.DynamicParticle=Dynamic Particle Model +TMenuBar.MenuItem.Cartesian=Cartesian +TMenuBar.MenuItem.Polar=Polar + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotracker... +Dialog.Button.Help=Help +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Back +AutoTracker.Wizard.Button.Next=Step +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.Pause=Pause +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Label.Mask=Template +AutoTracker.Label.AcceptLevel=Threshold +AutoTracker.TabbedPane.TabTitle.Mask=Template +AutoTracker.TabbedPane.TabTitle.Target=Target +AutoTracker.TabbedPane.TabTitle.Settings=Accept +AutoTracker.TabbedPane.TabTitle.Search=Search +AutoTracker.Info.GetStarted=To create a new key frame, shift-control-click the video feature of interest. +AutoTracker.Info.Mask1=The template defines the image to be matched in each video frame. +AutoTracker.Info.Mask2=It evolves to adapt to shape and color changes over time. Higher evolution rates track more rapid changes, but are less accurate over long times. +AutoTracker.Info.MaskLocked1=The template is in use and locked. +AutoTracker.Info.MaskLocked2=Click the Reset button to clear all steps and start over. +AutoTracker.Info.Target1=The target is marked automatically for match scores above the automark level. +AutoTracker.Info.Target2=Tip: You can adjust the target position even after steps have been marked. Existing steps will automatically move along with the target. +AutoTracker.Info.TargetLocked=The target is in use and tied to existing step positions. Moving the target will move the steps as well. +AutoTracker.Info.Settings1=Match scores above the automark level are marked automatically. +AutoTracker.Info.Settings2=Tip: reducing the automark level may increase the likelihood of marking false matches. Try increasing the evolution rate instead. +AutoTracker.Info.Search1=The search area is scanned for the best match. Move or resize the search area by dragging its edge or handle, respectively. +AutoTracker.Info.Search2=Tip: The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. +AutoTracker.Info.Frame=Frame +AutoTracker.Info.Match=The match was marked automatically. +AutoTracker.Info.Possible=A possible match was found in the search area shown. Your options are: +AutoTracker.Info.NoMatch=No match was found in the search area shown. Your options are: +AutoTracker.Info.Outside=The search area is outside the image. Your options are: +AutoTracker.Info.Accepted=The match was accepted. +AutoTracker.Info.MarkedByUser=The step was marked manually by the user. +AutoTracker.Info.NoVideo=Autotracking requires a video. +AutoTracker.Info.Height=height +AutoTracker.Info.Width=width +AutoTracker.Info.Accept=--accept the match +AutoTracker.Info.Retry=--modify the search area and search again +AutoTracker.Info.Mark=--shift-click to mark manually +AutoTracker.Info.Skip=--skip this frame and continue with the next +AutoTracker.Info.Reset=--step back to a correctly marked frame and shift-control-click to define a new key frame +AutoTracker.Info.MatchScore=match score +AutoTracker.Dialog.MaskLocked.Title=Template Locked +PointMass.Cursor.Autotrack.Description=Autotracker cursor +VideoPlayer.StartFrame.Hint=drag to set the start frame +VideoPlayer.EndFrame.Hint=drag to set the end frame +VideoPlayer.Slider.Hint=drag to scan through the video +FileDropHandler.Dialog.BadFile.Message=could not be loaded. +FileDropHandler.Dialog.BadFile.Title=Unrecognized File + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Apply +DynamicParticle.Dialog.Delete.Message=Deleting this particle will remove it from a system. Delete anyway? +DynamicParticle.Dialog.Delete.Title=Dynamic System +DynamicParticle.System.In=in +DynamicSystem.Empty=empty +DynamicSystem.Force.Name.Internal=internal +DynamicSystem.ForceFunction.R.Description=Internal force radial component +DynamicSystem.ForceFunction.Theta.Description=Internal force tangential component +DynamicSystem.MenuItem.Inspector=Select Particles... +DynamicSystem.Name=Dynamic Two-Body System +DynamicSystem.New.Name=system +DynamicSystem.Parameter.Of=of +DynamicSystem.Parameter.RelativeTo=relative to +DynamicSystem.Parameter.Name.Relative=relative +DynamicSystem.Parameter.ParticleMass.Description=Mass of +DynamicSystem.Parameter.Mass.Description=Total mass of this system +DynamicSystemInspector.Border.Title=Particle +DynamicSystemInspector.Title=Two-Body System +DynamicSystemInspector.Button.Change=Change To... +DynamicSystemInspector.ParticleName.None=(none) +TMenuBar.MenuItem.Clone=Clone +TMenuBar.MenuItem.TwoBody=Two-Body System +TrackerPanel.DataBuilder.Dropdown.Tooltip=Currently selected track +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertical Axes +TrackControl.Button.Trace.ToolTip=Show or hide paths +TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab +TToolBar.Button.Save.Tooltip=Save the current tab in file +TToolBar.Button.SelectTrack=Select +TToolBar.Button.SelectTrack.Tooltip=Select an existing track +TTrack.MenuItem.ClearSteps=Clear Steps +PointMass.MenuItem.Position=Position +TMenuBar.MenuItem.Empty=(Empty) +TTrackBar.Button.Memory=memory in use: +TTrackBar.Button.Memory.Tooltip=Monitor and manage memory +TTrackBar.Memory.PopupItem.Launch1=Launch +TTrackBar.Memory.PopupItem.Launch2=with memory +TButton.Track.ToolTip=Set properties of +Tracker.Dialog.OutOfMemory.Message1=Tracker has run out of memory. +Tracker.Dialog.OutOfMemory.Message2=Click the memory button for options. +Tracker.Dialog.OutOfMemory.Title=Out of Memory + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Label.Original=Key Frame +AutoTracker.Label.NoMask=none +AutoTracker.Label.Rate=Rate: +AutoTracker.Info.Mask3=Tip: the template need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Info.SearchOnAxis1=The x-axis in the search area is scanned for the best match. Move or resize the search area by dragging its center or handle, respectively. +AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: +AutoTracker.Info.NoMatchOnAxis=No match was found along the x-axis in the search area shown. Your options are: +AutoTracker.Info.RetryOnAxis=--move the search area or x-axis and search again +AutoTracker.Wizard.Button.Delete=Delete +AutoTracker.Wizard.Button.DeleteMore=Delete Later Points +Button.Define.Tooltip=Define functions of existing column variables +Calibration.Label.Point=point +CalibrationStick.Hint=set length or drag end to change scale, set angle to change tilt +CalibrationStick.End.Hint=drag to change the scale, shift-click to re-mark +CalibrationStick.New.Name=calibration stick +CalibrationTapeMeasure.New.Name=calibration tape +CalibrationTapeMeasure.Readout.Magnitude.Hint=click to enter a known length in world units +CalibrationTapeMeasure.Hint=set length to change scale, set angle to change tilt +DynamicSystem.Data.Description.0=relative distance between particles +DynamicSystem.Data.Description.1=relative angle +DynamicSystem.Data.Description.2=relative radial velocity +DynamicSystem.Data.Description.3=relative angular velocity +ExportDataDialog.Subtitle.Table=Data Table +ExportDataDialog.Subtitle.Content=Cells +ExportDataDialog.Subtitle.Format=Number Format +ExportDataDialog.Subtitle.Delimiter=Delimiter +ExportDataDialog.Title=Export Data +ExportDataDialog.Delimiter.Add=Add... +ExportDataDialog.Delimiter.Remove=Remove... +ExportDataDialog.Content.AllCells=All Cells +ExportDataDialog.Content.SelectedCells=Selected Cells +ExportDataDialog.MenuItem.RemoveDelimiter=Remove custom delimiter +ExportDataDialog.Chooser.SaveData.Title=Save Data As +ExportVideoDialog.Button.SaveAs=Save As... +ExportVideoDialog.Button.FullSize=Full size +ExportVideoDialog.Button.DrawnSize=As drawn +ExportVideoDialog.Content.VideoOnly=Video only +ExportVideoDialog.Content.VideoAndGraphics=Video and graphics +ExportVideoDialog.Content.GraphicsOnly=Graphics only +ExportVideoDialog.Title=Export Video Clip +ExportVideoDialog.Label.ClipSettings=Clip settings +ExportVideoDialog.Subtitle.Size=Size +ExportVideoDialog.Subtitle.Content=Content +ExportVideoDialog.Subtitle.View=View +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=The video has been saved as +ExportVideoDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportVideoDialog.Complete.Title=Export Complete +ExportVideoDialog.VideoSize=video size +ExportVideoDialog.MatSize=mat size +ExportVideo.Dialog.HiddenPlots.Message=Plots must be fully visible for exporting. +ExportVideo.Dialog.HiddenPlots.Title=Incomplete View +Footprint.DoubleTarget=double crosshair +Footprint.BoldDoubleTarget=bold double crosshair +OffsetOrigin.MenuItem.Fixed=Fixed World Coordinates +ParticleModel.Dialog.Offscreen.Message1=Some model steps are empty because they are too far off screen. +ParticleModel.Dialog.Offscreen.Message2=To fix this, change the model or rescale the video. +ParticleModel.Dialog.Offscreen.Title=Out of Bounds +PrefsDialog.Tab.Configuration.Title=Configuration +PrefsDialog.Memory.BorderTitle=Memory Size +PrefsDialog.Tab.General.Title=General +PrefsDialog.RecentFiles.BorderTitle=Open Recent Menu +PrefsDialog.Label.RecentSize=File count +PrefsDialog.Hints.BorderTitle=Hints +PrefsDialog.Button.Relaunch=Relaunch Now +PrefsDialog.Button.ClearRecent=Clear +PrefsDialog.Checkbox.DefaultSize=Use default +PrefsDialog.Checkbox.HintsOn=Show hints by default +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video Engine +PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. +PrefsDialog.Dialog.WebStart.Title=Web Start Mode +PrefsDialog.LookFeel.BorderTitle=Look And Feel +PrefsDialog.Language.BorderTitle=Language +PrefsDialog.Upgrades.BorderTitle=Check For Upgrades +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=Display +PrefsDialog.Language.Default=default +PrefsDialog.Upgrades.Always=Every Time +PrefsDialog.Upgrades.Weekly=Weekly +PrefsDialog.Upgrades.Monthly=Monthly +PrefsDialog.Upgrades.Never=Never +PrefsDialog.Button.CheckForUpgrade=Check Now +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback +PrefsDialog.Xuggle.Slow=Smooth (may be slow) +PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool +Protractor.Name=Protractor +Protractor.New.Name=protractor +Protractor.Hint=drag arms to measure angles +Protractor.Label.Angle=angle +Protractor.Field.Angle.Tooltip=Angle between protractor arms +Protractor.Vertex.Name=vertex +Protractor.Vertex.Hint=drag to move the vertex +Protractor.End.Name=arm end +Protractor.End.Hint=drag to rotate the arm +Protractor.Handle.Name=handle +Protractor.Handle.Hint=drag to move the protractor +Protractor.Rotator.Name=rotator +Protractor.Rotator.Hint=drag to rotate the protractor +Protractor.Readout.Name=readout +Protractor.Readout.Hint=angle between protractor arms +ProtractorFootprint.Circle3=small circle +ProtractorFootprint.Circle5=large circle +ProtractorFootprint.Circle3Bold=bold small circle +ProtractorFootprint.Circle5Bold=bold large circle +Stick.Name=Calibration Stick +Stick.New.Name=calibration stick +TableTrackView.MenuItem.Unformatted=Full Precision +TableTrackView.MenuItem.Formatted=As Formatted +TableTrackView.Menu.SetDelimiter=Set Delimiter +TableTrackView.MenuItem.AddDelimiter=Add... +TableTrackView.MenuItem.RemoveDelimiter=Remove... +TableTrackView.Dialog.CustomDelimiter.Message=Enter a new delimiter string: +TableTrackView.Dialog.CustomDelimiter.Title=Add Delimiter +TableTrackView.Header.Tooltip=Click to sort or double-click to select column +TableTrackView.MenuItem.CopySelectedData=Copy Selected Data +TableTrackView.Dialog.RemoveDelimiter.Message=Select the delimiter to remove: +TableTrackView.Dialog.RemoveDelimiter.Title=Remove Delimiter +TableTrackView.Radians.Tooltip=in radians +TableTrackView.Degrees.Tooltip=in degrees +TableTrackView.RadiansPerSecond.Tooltip=in radians/s +TableTrackView.DegreesPerSecond.Tooltip=in degrees/s +TableTrackView.RadiansPerSecondSquared.Tooltip=in radians/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=in degrees/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Delete Data Function +TActions.Action.SaveFrame=Save Tabset As... +TActions.AboutVideo=Properties... +TActions.Dialog.AboutVideo.Title=Video Properties +TActions.Dialog.AboutVideo.Type=Type +TActions.Dialog.AboutVideo.Size=Dimensions +TActions.Dialog.AboutVideo.Length=Length +TActions.Dialog.AboutVideo.Frames=frames +TActions.Dialog.AboutVideo.Seconds=seconds +TActions.Dialog.AboutVideo.FrameRate=Frame Rate +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Path +TActions.Action.ImportTRK=Tracker File... +TActions.Action.ProtractorVisible=Visible +TapeMeasure.MenuItem.FixedLength=Fixed Length +TextTView.Label.NoTab=Click "Page" to add text and HTML pages here. +TextTView.NewTab.Text1=Double-click to edit the text or title. Right-click for more options. +TextTView.NewTab.Text2=To display an HTML page, enter the url or right-click to open a file. +TextTView.NewTab.Title=Untitled +TextTView.Dialog.TabTitle.Title=Set Title +TextTView.MenuItem.OpenHTML=Open HTML... +TextTView.MenuItem.SetTitle=Set Title... +TextTView.Button.NewTab=New +TextTView.TextEdit.Description=Text +TFrame.Dialog.FileNotFound.Message=The file could not be found. +TFrame.Dialog.FileNotFound.Title=File Not Found +TFrame.View.Text=Page View +TFrame.View.Main=Main View +TMenuBar.Menu.OpenRecent=Open Recent +TMenuBar.Menu.Import=Import +TMenuBar.Menu.Export=Export +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=Data File... +TMenuBar.Menu.CopyObject=Copy Object +TMenuBar.MenuItem.Coords=Coordinate System +TMenuBar.MenuItem.VideoClip=Video Clip +TMenuBar.Menu.MeasuringTools=Measuring Tools +TMenuBar.Menu.AngleUnits=Angle Units +TMenuBar.MenuItem.Degrees=Degrees +TMenuBar.MenuItem.Radians=Radians +Tracker.Dialog.NoXuggle.Title=Xuggle not found +Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. +Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=About Xuggle... +Tracker.Dialog.AboutXuggle.Title=About Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you +Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Title=No Video Engine +Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required +Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from +Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.About.DefaultLocale=Default locale +Tracker.About.CurrentLanguage=Language +Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory +Tracker.Dialog.InsufficientMemory.Message=The requested memory size is too large. +TrackerIO.Dialog.TabMustBeSaved.Message1=Tab +TrackerIO.Dialog.TabMustBeSaved.Message2=must be saved as a tracker file to be included in the tabset. +TrackerIO.Dialog.TabMustBeSaved.Message3=Do you wish to save it? +TrackerIO.Dialog.TabMustBeSaved.Title=Unsaved Tab +TrackerIO.Dialog.NoTabs.Message=There are no tabs to save! +TrackerIO.Dialog.NoTabs.Title=Empty Tabset +TrackerIO.Dialog.SaveTabset.Title=Save Tabset +TrackerIO.Dialog.SaveTab.Title=Save Tab +TrackerIO.Delimiter.Tab=Tab +TrackerIO.Delimiter.Space=Space +TrackerIO.Delimiter.Comma=Comma +TrackerIO.Delimiter.Semicolon=Semicolon +TrackerIO.VideoAndDataFileFilter.Description=Video and Tracker Files +TrackerPanel.Dialog.Version.Message1=You are opening a file created with Tracker +TrackerPanel.Dialog.Version.Message2=which may refer to +TrackerPanel.Dialog.Version.Message3=features missing in the version you are running +TrackerPanel.Dialog.Version.Message4=The latest version is available at +TrackerPanel.Dialog.Version.Title=Version Mismatch +TrackerPanel.Label.ModelStart=Start frame +TrackerPanel.Label.ModelEnd=End frame +TrackerPanel.Spinner.ModelStart.Tooltip=Set the start frame for this model +TrackerPanel.Spinner.ModelEnd.Tooltip=Set the end frame for this model +TToolbar.Button.ProtractorVisible.Tooltip=Show or hide the protractor +TToolbar.Button.AxesVisible.Tooltip=Show or hide the coordinate axes +TToolBar.Button.TrackControl.Tooltip=Show or hide the track control +TTrack.Dialog.StepSizeWarning.Message1=Caution: some tracks were marked at a step size greater than one, leaving skipped frames unmarked. +TTrack.Dialog.StepSizeWarning.Message2=Changing the step size is therefore likely to result in gaps in the data set. +TTrack.Dialog.StepSizeWarning.Message3=Velocities and accelerations around the gaps cannot be determined until all steps are marked. +TTrack.Dialog.StepSizeWarning.Title=Caution +TTrack.Dialog.SkippedStepWarning.Message1=Caution: skipping steps when marking positions leaves gaps in the data set. +TTrack.Dialog.SkippedStepWarning.Title=Caution +TTrack.Dialog.SkippedStepWarning.Checkbox=Don't show this again +TTrack.Locked.Hint=locked +TTrack.AngleField.Radians.Tooltip=Angle in radians +TTrack.AngleField.Degrees.Tooltip=Angle in degrees +TTrack.AngleField.Popup.Radians=Switch To Radians +TTrack.AngleField.Popup.Degrees=Switch To Degrees +TTrackBar.Memory.Menu.SetSize=Set memory size... +TTrackBar.Button.Version=Now available: version +TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... +TTrackBar.Popup.MenuItem.Ignore=Ignore +XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Calibration Tape +CircleFootprint.Circle=circle +CircleFootprint.FilledCircle=filled circle +CircleFootprint.Dialog.Title=Circle Footprint +CircleFootprint.Dialog.Label.Radius=Radius +CircleFootprint.Dialog.Checkbox.Bold=Bold +CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot +LineProfile.Hint.Marking=drag mouse to mark the line profile +PageTView.Button.Page=Page +PageTView.MenuItem.ClosePage=Close Page +PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step +PrefsDialog.Dialog.NewVersion.Title=Upgrades +PrefsDialog.Dialog.NewVersion.Message1=Version +PrefsDialog.Dialog.NewVersion.Message2=is now available at +PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. +RGBRegion.Hint.Marking=click mouse to mark the center of the region +TMenuBar.MenuItem.Restore=Restore Views +TrackControl.StretchVectors.None=No stretch +TViewChooser.Maximize.Tooltip=Maximize this view +TViewChooser.Restore.Tooltip=Restore views +Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step +WorldTView.Button.World=World + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Warnings +PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PropertiesDialog.Title=Properties +PropertiesDialog.Label.Author=Authors +PropertiesDialog.Label.Contact=Contact +TActions.Action.Properties=Properties... +TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.ClickToCancel=(click to cancel) +TFrame.Dialog.StalledVideo.Title=Error Loading Video +TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. +TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. +TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: +TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. +TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. +TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stop +TFrame.Dialog.StalledVideo.Button.Wait=Wait +Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again +TrackerIO.ZipFileFilter.Description=ZIP file (.zip) +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found +TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinematic Particle +DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) +DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) +DynamicSystem.Builder.Title=Dynamic System (Internal) +PropertiesDialog.Button.CopyFilePath=Copy File Path +PropertiesDialog.Button.CopyVideoPath=Copy Video Path +PropertiesDialog.Tab.TrackerFile=Tracker File +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Property +PropertiesDialog.Header.Value=Value +TActions.Action.OpenURL=Open URL... +TActions.Dialog.OpenURL.Title=Open URL +TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file +TActions.Dialog.AboutVideo.Name=Name + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cached Web Files +PrefsDialog.Button.ClearCache=Clear All + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-click to re-mark highlighted position +PointMass.Remarking.Hint=click mouse to re-mark position +PointMass.PositionSelected.Hint=drag or enter position on toolbar +PointMass.VectorSelected.Hint=drag to move +Vector.Remark.Hint=shift-click to re-mark highlighted tip +Vector.TipSelected.Hint=drag or enter components on toolbar +Vector.HandleSelected.Hint=drag to move +Vector.Remarking.Hint=click mouse to re-mark tip +AutoTracker.Label.Search=Search +AutoTracker.Label.Target=Target +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Point +AutoTracker.Label.Template=Template +AutoTracker.Label.Track=Track +AutoTracker.Label.Match=Match +AutoTracker.Label.NoTemplate=No Template +AutoTracker.Label.EvolutionRate=Evolution Rate +AutoTracker.Label.Automark=Automark +AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. +AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. +AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. +AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. +AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. +AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. +AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. +AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. +AutoTracker.Info.Search=The search area is scanned for the best match. +AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. +AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. +AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. +AutoTracker.Info.Target=The target is where the targeted track point is marked. +AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. +AutoTracker.Info.Title.Settings=Settings +AutoTracker.Info.Title.Tip=Tip +AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. +AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: +AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame +AutoTracker.Info.Replace=--accept the match +AutoTracker.Info.Keep=--skip this frame and leave unchanged +AutoTracker.Info.PossibleReplace=A possible match is shown. Your options are: +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Wizard.Button.Replace=Replace +AutoTracker.Wizard.Button.Keep=Decline +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.SearchThis=Search This +AutoTracker.Wizard.Button.SearchNext=Search Next +AutoTracker.Wizard.Button.Delete=Delete +AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Wizard.Menuitem.DeleteThis=This Point +AutoTracker.Wizard.Menuitem.DeleteLater=Later Points +AutoTracker.Wizard.Menuitem.DeleteAll=Clear All +TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker +MainTView.Popup.MenuItem.ZoomIn=Zoom In +MainTView.Popup.MenuItem.ZoomOut=Zoom Out +MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit +TrackerIO.Dialog.DurationVaries.Title=Frame Durations +TrackerIO.Dialog.DurationVaries.Message1=Some frame durations differ from the mean by more than +TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from +TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. +TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: +TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=No resource could be loaded for node + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift-click to mark +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Directories +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Clear on exit +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=Save +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=Algorithms... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: +AlgorithmDialog.Title=Algorithms +AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. +AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt^2) +AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. +AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=The file cannot be read. +TrackPlottingPanel.Popup.Menu.CompareWith=Compare With +TrackerPanel.DataBuilder.TrackType.Unknown=unknown +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=Load Data Functions +TrackerPanel.DataBuilder.Load.Message=Select functions to load: +TrackerPanel.DataBuilder.Save.Title=Save Data Functions +TrackerPanel.DataBuilder.Save.Message=Select functions to save: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into +TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection +TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type +TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=The Tracker clip has been saved as +ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportTRKDialog.Complete.Title=Export Complete +ExportTRKDialog.Title=Export Tracker Clip +ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. +ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. +TMenuBar.MenuItem.TabClip=Tracker Clip +TMenuBar.Menu.CalibrationTools=Calibration Tools +TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=end +TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Attach Ends +AttachmentInspector.Label.End=End +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Name +AttachmentInspector.Header.AttachedTo=Attach To +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Attach Ends... +PerspectiveTrack.Corner=corner +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=time +Protractor.Data.Description.1=protractor angle +Protractor.Data.Description.2=length of arm 1 +Protractor.Data.Description.3=length of arm 2 +Protractor.Data.Description.4=step number +Protractor.Data.Description.5=frame number +TapeMeasure.Data.Description.0=time +TapeMeasure.Data.Description.1=length +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=step number +TapeMeasure.Data.Description.4=frame number + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export Tracker ZIP +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a Tracker ZIP file +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export Tracker ZIP +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The Tracker ZIP file has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export Tracker ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Add File to Tracker ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Settings +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the Tracker ZIP? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the Tracker ZIP +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Load All Images +TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage data function autoloading +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed PrefsDialog.Button.SetCache=Set Cache \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties index 2667499b..2a59873d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties @@ -1,1190 +1,1190 @@ -# This is the Brazilian Portuguese tracker.properties file -# Translated by Arandi Ginane Bezerra Junior, Jorge Alberto Lenz, Leonardo Presoto de Oliveira, Arthur Nunes Santana - -Calibration.Name=Pontos de Calibração -Calibration.New.Name=calibração -CenterOfMass.Name=Centro de Massa -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Selecionar Massas... -CenterOfMassInspector.Title=Centro de Massa -CenterOfMassInspector.Border.Title=Selecionar Massas -ConfigInspector.Border.Title=Comparar Itens Desejados -ConfigInspector.Title=Preferências -ConfigInspector.Button.SaveAsDefault=Salvar Como Padrão -CoordAxes.Name=Eixos -CoordAxes.New.Name=eixos -Dialog.Button.Cancel=Cancelar -Dialog.Button.OK=Aceitar -Dialog.Button.Close=Fechar -Dialog.Button.All=Todos -Dialog.Button.None=Nenhum -Dialog.Button.Copy=Copiar -Dialog.Button.Update=Atualizar -Dialog.Button.SelectAll=Selecionar Todos -Footprint.Diamond=diamante -Footprint.BoldDiamond=diamante negrito -Footprint.SolidDiamond=diamante sólido -Footprint.Triangle=triângulo -Footprint.BoldTriangle=triângulo em negrito -Footprint.SolidTriangle=triângulo sólido -Footprint.Circle=círculo -Footprint.BoldCircle=círculo em negrito -Footprint.SolidCircle=círculo sólido -Footprint.VerticalLine=linha vertical -Footprint.BoldVerticalLine=linha vertical em negrito -Footprint.HorizontalLine=linha horizontal -Footprint.BoldHorizontalLine=linha horizontal em negrito -Footprint.Crosshair=cruz -Footprint.BoldCrosshair=cruz em negrito -Footprint.SimpleAxes=eixos simples -Footprint.BoldSimpleAxes=eixos simples em negrito -Footprint.Spot=ponto -Footprint.Line=linha -Footprint.BoldLine=linha em negrito -Footprint.Outline=contorno -Footprint.BoldOutline=contorno em negrito -Footprint.Arrow=flecha -Footprint.BoldArrow=flecha em negrito -Footprint.DoubleArrow=flecha dupla -Footprint.BoldDoubleArrow=flecha dupla em negrito -Footprint.2xArrow=flecha 2x -Footprint.Bold2xArrow=flecha 2x em negrito -Footprint.4xArrow=flecha 4x -Footprint.Bold4xArrow=flecha 4x em negrito -Footprint.DashArrow=flecha descontínua -Footprint.BoldDashArrow=flecha descontínua em negrito -Footprint.BigArrow=flecha grande -Footprint.BigDashArrow=flecha grande descontínua -LineProfile.Name=Perfil da Linha -LineProfile.New.Name=perfil -LineProfile.Data.Brightness=brilho -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=vermelho -LineProfile.Data.Green=verde -LineProfile.Data.Blue=azul -LineProfile.Data.Weighting=ponderando -MainTView.Popup.MenuItem.QTPlayer=Reprodutor QuickTime (Player) -MainTView.Popup.MenuItem.Zoom=Zoom -MainTView.Popup.MenuItem.ToFit=Para Ajustar -OffsetOrigin.Name=Origem de Compensação -OffsetOrigin.New.Name=compensação -PlotTrackView.Button.PlotCount=Diagrama -PlotTrackView.Button.PlotCount.ToolTip=Selecionar número de diagramas -PointMass.Name=Ponto de Massa -PointMass.New.Name=massa -PointMass.MenuItem.VectorsToPosition=Para Posição -PointMass.MenuItem.Velocity=Velocidade -PointMass.MenuItem.Acceleration=Aceleração -Star.Name=Estrela -Star.New.Name=estrela -TableTrackView.Action.CopyData=Copiar Dados -TableTrackView.Button.SelectTableData=Dados -TableTrackView.Button.SelectTableData.ToolTip=Escolher Dados -TableTrackView.Popup.MenuItem.Analyze=Analisar... -TableTrackView.Dialog.Border.Title=Mostrar: -TActions.Action.Description=Notas -TActions.Action.ClearTracks=Limpar -TActions.Action.NewTab=Novo -TActions.Action.Copy=Copiar -TActions.Action.Paste=Colar -TActions.Action.Open=Abrir... -TActions.Action.Close=Fechar -TActions.Action.Import=Importar... -TActions.Action.Save=Salvar -TActions.Action.SaveAs=Salvar Como... -TActions.Action.Export=Exportar... -TActions.Action.CaptureVideo=Capturar Vídeo... -TActions.Action.Delete=Deletar -TActions.Action.Config=Preferências... -TActions.Action.AxesVisible=Visível -TActions.Action.TapeVisible=Visível -TActions.Action.Print=Imprimir... -TActions.Action.ClearFilters=Limpar -TActions.Action.ImportVideo=Importar... -TActions.Action.CloseVideo=Fechar -TActions.Action.CloseAll=Fechar Todos -TActions.Action.Exit=Sair -TActions.Dialog.PrintError.Message=Ocorreu um erro de impressão. -TActions.Dialog.PrintError.Title=Erro de Impressão -TActions.Dialog.Description.Title=Notas: -TActions.Dialog.DeleteLockedTracks.Message=Algumas trajetórias estão bloqueadas. Deseja apagá-las mesmo assim? -TActions.Dialog.DeleteLockedTracks.Title=Apagar trajetórias bloqueadas? -TActions.Dialog.NewPointMass.Title=Novo Ponto de Massa -TapeMeasure.Name=Fita Métrica -TapeMeasure.New.Name=fita -TapeMeasure.MenuItem.Fixed=Definido -TFrame.View.Plot=Visualizar do Gráfico -TFrame.View.Table=Visualizar Tabelas -TFrame.View.World=Visualizar Tudo -TFrame.View.Video=Visualizar Vídeo -TFrame.Dialog.Help.Title=Ajuda do Tracker -TMenuBar.Menu.File=Arquivo -TMenuBar.Menu.Edit=Editar -TMenuBar.Menu.Video=Vídeo -TMenuBar.Menu.Tracks=Trajetórias -TMenuBar.Menu.Coords=Coordenadas -TMenuBar.Menu.Window=Janela -TMenuBar.Menu.Help=Ajuda -TMenuBar.MenuItem.EditProperties=Propriedades... -TMenuBar.MenuItem.VideoVisible=Visível -TMenuBar.MenuItem.VideoFilters=Filtros -TMenuBar.MenuItem.NewVideoFilter=Novo -TMenuBar.MenuItem.NewTrack=Novo -TMenuBar.MenuItem.CoordsLocked=Bloqueado -TMenuBar.MenuItem.CoordsFixedOrigin=Origem Definida -TMenuBar.MenuItem.CoordsFixedAngle=Ângulo Definido -TMenuBar.MenuItem.CoordsFixedScale=Escala Definida -TMenuBar.MenuItem.CoordsRefFrame=Quadro de Referência -TMenuBar.MenuItem.CoordsDefault=Padrão -TMenuBar.MenuItem.WindowRight=Vista Direita -TMenuBar.MenuItem.WindowBottom=Vista Inferior -TMenuBar.MenuItem.PlayAllSteps=Reproduzir Todos os Passos -TMenuBar.MenuItem.Record=Gravar Vídeo -TMenuBar.MenuItem.MatSize=Tamanho da Tela -TMenuBar.MenuItem.Language=Idioma -TMenuBar.MenuItem.DeleteTrack=Apagar -TMenuBar.MenuItem.TrackerHelp=Ajuda do Tracker... -TMenuBar.MenuItem.MessageLog=Registro de Mensagens... -TrackControl.Name=Controle de Trajetórias -TrackControl.Button.NewTrack=Novo -TrackControl.Button.NewTrack.ToolTip=Criar Nova Trajetória -TrackControl.Button.Trails.ToolTip=Traços -TrackControl.Button.Labels.ToolTip=Etiquetas -TrackControl.Button.StretchVectors.ToolTip=Estender vetores -TrackControl.Button.Accelerations.ToolTip=Acelerações -TrackControl.Button.Xmass.ToolTip=Multiplicar pela massa -TrackControl.Button.Vectors.ToolTip=Vetores -TrackControl.Button.Velocities.ToolTip=Velocidades -TrackControl.Button.Properties.ToolTip=Propriedades -TrackControl.Button.Positions.ToolTip=Posições -Tracker.Popup.MenuItem.Snapshot=Captura Instantânea -Tracker.Popup.MenuItem.Help=Ajuda... -Tracker.Cursor.Crosshair.Description=Cursor em cruz para marcar posições -Tracker.Action.AboutTracker=Sobre o Tracker... -Tracker.Dialog.AboutTracker.Title=Sobre o Tracker -Tracker.Action.AboutJava=Sobre o Java... -Tracker.Dialog.AboutJava.Title=Sobre o Java -Tracker.Dialog.AboutJava.UnknownVersion=desconhecido -Tracker.Dialog.AboutJava.Message=Versão do Java -Tracker.Action.AboutQT=Sobre o QuickTime... -Tracker.Dialog.AboutQT.Title=Sobre o QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=Versão do QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versão do QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=Caminho QTJava: -Tracker.Dialog.NoQT.Title=QTJava.zip não encontrado -Tracker.Dialog.NoQT.Message1=QuickTime para Java aparenta não estar instalado. -Tracker.Dialog.NoQT.Message2=Se você deseja analisar os vídeos do QuickTime, por favor reinstale o QuickTime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime para Java DEVE SER SELECIONADO quando o QuickTime for instalado. -Tracker.Dialog.UpdateQT.Title=Atualizar QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Uma nova versão do QTJava.zip foi encontrada -Tracker.Dialog.UpdateQT.Message2=Você deseja atualizar o arquivo existente? -Tracker.Dialog.CopyQT.Title=Copiar QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime está instalado, mas antes que o Tracker possa usá-lo: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip deve ser copiado de -Tracker.Dialog.CopyQT.Message3= para -Tracker.Dialog.CopyQT.Message4= 2. Tracker deve ser reiniciado. -Tracker.Dialog.CopyQT.Message5=Você deseja copiar o QTJava.zip agora? -Tracker.Dialog.CopyFailed.Title=Falha ao Copiar -Tracker.Dialog.CopyFailed.Message=QTJava.zip não pode ser aberto. -Tracker.Dialog.CopiedTo.Title=Copiado com Sucesso -Tracker.Dialog.CopiedTo.Message1=QTJava.zip foi copiado com sucesso para -Tracker.Dialog.CopiedTo.Message2=Tracker deve ser reiniciado e será finalizado agora. -Tracker.Splash.Loading=Carregando -TrackerIO.Dialog.Import.Title=Importar -TrackerIO.Dialog.Import.Message=Selecionar itens para importar -TrackerIO.Dialog.ImportVideo.Title=Importar Vídeo -TrackerIO.Dialog.Export.Title=Exportar -TrackerIO.Dialog.Export.Message=Selecionar itens para exportar -TrackerIO.Dialog.ReplaceFile.Title=Substituir Arquivo Existente? -TrackerIO.Dialog.ReplaceFile.Message=já existe. Deseja substituí-lo? -TrackerIO.Dialog.NotTrackerXML.Title=XML não correspondido -TrackerIO.Dialog.NotTrackerXML.Message=contém dados xml para uma aplicação diferente -TrackerIO.Dialog.BadVideo.Message=Vídeo não pode ser aberto: -TrackerPanel.NewTab.Name=Sem Título -TrackerPanel.DragToMark.Hint=Shift+Arrastar para marcar -TrackerPanel.ClickToMark.Hint=Shift+Clique para marcar -TrackerPanel.Dialog.LoadFailed.Title=Arquivo Não Carregado -TrackerPanel.Dialog.LoadFailed.Message=Arquivo não pode ser carregado: -TrackerPanel.Dialog.SaveChanges.Title=Salvar Alterações -TrackerPanel.Dialog.SaveChanges.Message=Salvar Alterações em -TrackPlottingPanel.Popup.MenuItem.Lines=Linhas -TrackPlottingPanel.Popup.MenuItem.Points=Pontos -TrackPlottingPanel.Popup.MenuItem.Scale=Escala... -TrackPlottingPanel.Popup.MenuItem.Print=Imprimir... -TrackPlottingPanel.Popup.MenuItem.Measure=Escala para Caber -TrackPlottingPanel.Popup.MenuItem.Analyze=Analisar... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Aproximar -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Afastar -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoescala -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom para Área -TrackPlottingPanelInspector.Title=Escala -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Definir Tipo de Marcação -TToolBar.Dropdown.SelectedTrack.Tooltip=Selecionar Trajetórias -TToolBar.Dropdown.SelectedTrack.None=sem seleção -TTrack.MenuItem.Delete=Deletar -TTrack.MenuItem.Color=Cores... -TTrack.Dialog.Color.Title=Escolher Cor de Trajetórias -TTrack.MenuItem.Name=Nome... -TTrack.MenuItem.Footprint=Tipo de Marcação -TTrack.MenuItem.Description=Notas... -TTrack.MenuItem.Visible=Visível -TTrack.MenuItem.TrailVisible=Traços Visíveis -TTrack.MenuItem.Autostep=Pulo Automático -TTrack.MenuItem.MarkByDefault=Marcar como Padrão -TTrack.MenuItem.Locked=Bloquear -TTrack.MenuItem.Delete=Apagar -TTrack.Name.None=sem nome -TTrack.Dialog.Description.Title=Notas: -TTrack.Dialog.Name.Title=Definir Nome -TTrack.Dialog.Name.Label=Nome: -TViewChooser.Button.Choose.Tooltip=Escolher uma Visualização -Vector.Name=Vetor -Vector.New.Name=vetor -Vector.MenuItem.ToOrigin=Para Origem -Vector.MenuItem.Label=Etiqueta Visível -VectorSum.Name=Soma de Vetores -VectorSum.New.Name=soma -VectorSum.MenuItem.Inspector=Selecionar Vetores... -VectorSumInspector.Title=Soma de Vetores -VectorSumInspector.Border.Title=Selecionar Vetores -WorldTView.Popup.MenuItem.Projectile=Modelo do Projétil - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Modelo Cinemático de Partícula -AnalyticParticle.Inspector.Title=Modelo Cinemático de Partícula -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=4 Raios -CircleFootprint.Circle_6=6 Raios -CircleFootprint.Circle_8=8 Raios -DynamicParticle.Name=Modelo Dinâmico de Partícula -DynamicParticle.Inspector.Title=Modelo Dinâmico de Partícula -DynamicParticle.Property.ForceX=força x -DynamicParticle.Property.ForceY=força y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocidadeX=vx -DynamicParticle.Property.InitialVelocidadeY=vy -LineProfile.MenuItem.Fixed=Definido -ParticleModel.New.Name=modelo -ParticleModel.MenuItem.InspectModel=Construtor de Modelos... -ParticleModel.Inspector.Button.Undo=Desfazer -ParticleModel.Inspector.Button.Redo=Refazer -ParticleModel.Inspector.Button.Close=Fechar -ParticleModel.Inspector.Button.Help=Ajuda - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=Somente X -Calibration.Axes.YOnly=Somente Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Selecionar eixos de calibração -Calibration.Label.Axes=Eixos -Calibration.Dialog.InvalidCoordinates.Title=Coordenadas Inválidas -Calibration.Dialog.InvalidCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas. -Calibration.Dialog.InvalidXCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas em x. -Calibration.Dialog.InvalidYCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas em y. -SpectralLineFilter.Title=Espectro de Gás -SpectralLineFilter.H=Hidrogênio -SpectralLineFilter.He=Hélio -SpectralLineFilter.Ne=Neônio -SpectralLineFilter.Hg=Mercúrio -TFrame.View.Unknown=Visualizar -TMenuBar.MenuItem.Undo=Desfazer -TMenuBar.MenuItem.Redo=Refazer -TMenuBar.MenuItem.Replace=Substituir... -TMenuBar.Menu.AddImage=Importar Imagens -TMenuBar.MenuItem.AddBefore=Antes deste Quadro... -TMenuBar.MenuItem.AddAfter=Depois deste Quadro... -TMenuBar.MenuItem.RemoveImage=Remover este Quadro -TMenuBar.Menu.Tools=Ferramentas -TMenuBar.MenuItem.DataFunctionTool=Construtor de Dados -TMenuBar.MenuItem.DatasetTool=Ferramentas de Dados -TMenuBar.Menu.CopyImage=Copiar Imagem -TMenuBar.MenuItem.CopyMainView=Janela Principal -TMenuBar.MenuItem.CopyFrame=Quadro -TMenuBar.MenuItem.PrintFrame=Imprimir... -TrackerIO.Dialog.AddImage.Title=Importar Imagens (escolha uma ou mais) -TTrack.Dialog.Name.BadName=já existe! Por favor, escolha outro nome. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=força resultante -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=A Janela de Gráficos de Dados de Trajetória aparecerá aqui. -TableTView.Label.NoData=A Janela de Tabela de Dados de Trajetória aparecerá aqui. -TrackerPanel.Message.NoData0=A vista Principal de Vídeos aparecerá aqui. -TrackerPanel.Message.NoData1=Escolha Arquivo|Abrir ou Trajetórias|Novo para iniciar. -WorldTView.Label.NoData=A Janela Principal aparecerá aqui. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Algoritmo: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Multietapas Adaptáveis -DynamicParticle.Table.Force.Border.Title=Funções de Força (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Funções de Posição (t) -ParticleModel.Table.Initial.Border.Title=Valores Iniciais -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Colar Imagem -TMenuBar.MenuItem.PasteAfter=Depois deste Quadro -TMenuBar.MenuItem.PasteBefore=Antes desde Quadro -TMenuBar.MenuItem.PasteReplace=Substituir Vídeo - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Começando... -Tracker.Splash.HelpMessage=Novo usuário? Escolha - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=ângulo a partir da horizontal -LineProfile.Checkbox.Rotates=girar -LineProfile.Label.Spread=expandir -RGBRegion.Name=Região RGB -RGBRegion.New.Name=região -RGBRegion.MenuItem.Fixed=Posição Definida -RGBRegion.Label.Radius=pixel raios -TTrack.Label.Step=etapa - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=número da posição -LineProfile.Data.Description.1=número da posição em x -LineProfile.Data.Description.2=número da posição em y -LineProfile.Data.Description.3=vermelho -LineProfile.Data.Description.4=verde -LineProfile.Data.Description.5=azul -LineProfile.Data.Description.6=brilho distinguido -LineProfile.Data.Description.7=largura da linha -ParticleModel.MenuItem.TraceVisible=Traço Visível -ParticleModel.MenuItem.StepsVisible=Passos Visíveis -PointMass.Data.Description.0=tempo -PointMass.Data.Description.1=componente x da posição -PointMass.Data.Description.2=componente y da posição -PointMass.Data.Description.3=intensidade da posição -PointMass.Data.Description.4=ângulo da posição -PointMass.Data.Description.5=componente x da velocidade -PointMass.Data.Description.6=componente y da velocidade -PointMass.Data.Description.7=intensidade da velocidade -PointMass.Data.Description.8=ângulo da velocidade -PointMass.Data.Description.9=componente x da aceleração -PointMass.Data.Description.10=componente y da aceleração -PointMass.Data.Description.11=intensidade da aceleração -PointMass.Data.Description.12=ângulo da aceleração -PointMass.Data.Description.13=ângulo de rotação -PointMass.Data.Description.14=velocidade angular -PointMass.Data.Description.15=aceleração angular -PointMass.Data.Description.16=número de pulos -PointMass.Data.Description.17=quadro número -PointMass.Data.Description.18=componente x do momento -PointMass.Data.Description.19=componente y do momento -PointMass.Data.Description.20=intensidade do momento -PointMass.Data.Description.21=ângulo do momento -PointMass.Data.Description.22=energia cinética -RGBRegion.Data.Description.0=tempo -RGBRegion.Data.Description.1=componente x da posição -RGBRegion.Data.Description.2=componente y da posição -RGBRegion.Data.Description.3=vermelho -RGBRegion.Data.Description.4=verde -RGBRegion.Data.Description.5=azul -RGBRegion.Data.Description.6=brilho distinguido -RGBRegion.Data.Description.7=contagem de pixel -RGBRegion.Data.Description.8=número da etapa -RGBRegion.Data.Description.9=número do quadro -TView.Menuitem.Define=Definir... -Vector.Data.Description.0=tempo -Vector.Data.Description.1=componente em x -Vector.Data.Description.2=componente em y -Vector.Data.Description.3=intensidade -Vector.Data.Description.4=ângulo -Vector.Data.Description.5=componente em x da origem vetor -Vector.Data.Description.6=componente em y da origem vetor -Vector.Data.Description.7=número da etapa -Vector.Data.Description.8=número do quadro -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Massa deste partícula -ParticleModel.Parameter.InitialTime.Description=Tempo Inicial -AnalyticParticle.PositionFunction.X.Description=Componente x da Posição -AnalyticParticle.PositionFunction.Y.Description=Componente y da Posição -DynamicParticle.ForceFunction.X.Description=Componente x da Força -DynamicParticle.ForceFunction.Y.Description=Componente y da Força -DynamicParticle.Parameter.InitialX.Description=Componente x da Posição Inicial -DynamicParticle.Parameter.InitialY.Description=Componente y da Posição Inicial -DynamicParticle.Parameter.InitialVelocityX.Description=Componente x da Velocidade Inicial -DynamicParticle.Parameter.InitialVelocityY.Description=Componente y da Velocidade Inicial -TrackerPanel.ModelBuilder.Title=Construtor de Modelos -TrackerPanel.DataBuilder.Title=Construtor de Dados -TrackControl.TrailMenu.NoTrail=Sem traços -TrackControl.TrailMenu.ShortTrail=Alguns traços -TrackControl.TrailMenu.LongTrail=Muitos traços -TrackControl.TrailMenu.FullTrail=Todos os traços -TrackerPanel.ModelBuilder.Spinner.Tooltip=Modelo selecionado no momento -TrackerPanel.ModelBuilder.LineButton.Text=Estilo da Linha -TrackerPanel.ModelBuilder.LineButton.Tooltip=Definir Estilo da Linha -ParticleModel.LineStyle.None=Sem Linha -ParticleModel.LineStyle.Connect=Conectar etapas -ParticleModel.LineStyle.Smooth=Linha Reta -ModelFunctionPanel.Label=Modelo -AnalyticFunctionPanel.FunctionEditor.Border.Title=Funções de Posição -DynamicFunctionPanel.FunctionEditor.Border.Title=Funções de Força - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Tabela de Colunas Visíveis -Tracker.About.ProjectOf=Um projeto de: -Tracker.About.TranslationBy=Tradução por -Tracker.About.Translator=Arthur Nunes Santana,\nArandi Ginane Bezerra Jr, Jorge Alberto Lenz -TMenuBar.Menu.SaveVideoAs=Salvar Como -TActions.SaveClipAs.ProgressMonitor.Message=Salvando Vídeo Como -TActions.SaveClipAs.ProgressMonitor.Progress=Completo - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sincronizar -PlotTrackView.Checkbox.Synchronize.Tooltip=Sincronizar eixos horizontais -RGBRegion.MenuItem.FixedRadius=Raio Definido -Tracker.VideoZoom.Hint=clique para aproximar, alt+clique para afastar, clique-duplo para auto ajuste -Tracker.PlotZoomIn.Hint=arraste para aproximar, clique-duplo para Escala para Caber -Tracker.PlotZoomOut.Hint=clique para afastar -Tracker.MenuItem.Hints=Mostrar Sugestão -TapeMeasure.Label.Length=Comprimento já em escala -TapeMeasure.Label.TapeAngle=ângulo da fita -TapeMeasure.Label.ArcAngle=ângulo do transferidor -TrackerIO.Dialog.NotAnImage.Title=Tipo de Arquivo Incorreto -TrackerIO.Dialog.NotAnImage.Message1=não é uma imagem JPG ou GIF. -TrackerIO.Dialog.NotAnImage.Message2=Você deseja continuar? -TToolBar.Button.Zoom.Tooltip=Ferramentas de Zoom (atalho: tecla Z) -TrackChooserTView.DropDown.Tooltip=Selecionar Trajetórias -TapeMeasure.Field.ArcAngle.Tooltip=Ângulo da fita para a do transferidor -TapeMeasure.Field.TapeAngle.Tooltip=Ângulo do eixo x positivo para a fita -TapeMeasure.Field.Magnitude.Tooltip=Comprimento da fita na escala do sistema universal -TapeMeasure.Readout.Magnitude.Name=leitura do comprimento -TapeMeasure.Readout.Magnitude.Hint=clique para definir a escala -TapeMeasure.Readout.Angle.Name=leitura do ângulo -TapeMeasure.Readout.Angle.Hint=clique para definir o ângulo -TapeMeasure.Arm.Name=transferidor -TapeMeasure.Arm.Hint=arraste para medir ângulos, reduzir para fechar -TapeMeasure.End.Name=fim -TapeMeasure.End.Hint=arraste para medir distâncias ou calibrar as escalas -TapeMeasure.Handle.Name=manipular -TapeMeasure.Handle.Hint=arraste para mover a fita -Vector.Tip.Name=ponta -Vector.Tip.Hint=arraste para entrar com as coordenadas ou alterar as componentes -Vector.Handle.Name=manipular -Vector.Handle.Hint=arraste para mover o vetor -Vector.ShortHandle.Hint=arraste para mover, alt+click para selecionar a ponta -PointMass.Position.Name=posição -PointMass.Position.Hint=arraste para entrar com as coordenadas ou alterar a posição -PointMass.Velocity.Name=velocidade -PointMass.Acceleration.Name=aceleração -PointMass.Vector.Hint=arraste para mover -PointMass.Position.Locked.Hint=clique para selecionar--não pode ser arrastado -CoordAxes.Handle.Name=eixo +x -CoordAxes.Handle.Hint=arraste para alterar a inclinação -CoordAxes.Origin.Name=origem -CoordAxes.Origin.Hint=arraste para trocar a posição -OffsetOrigin.Position.Name=posição -OffsetOrigin.Position.Hint=arraste ou entre com as coordenadas para mover a origem -Calibration.Point.Name=ponto -Calibration.Point.Hint=arraste para entrar com as coordenadas ou alterar eixos e escalas -RGBRegion.Position.Name=posição -RGBRegion.Position.Hint=arraste para entrar com as coordenadas ou alterar a posição -LineProfile.End.Name=fim -LineProfile.End.Hint=arraste para ajustar comprimento da linha -LineProfile.Handle.Name=manipular -LineProfile.Handle.Hint=arraste para mover a linha -PointMass.Hint=definir massa na barra de ferramentas -PointMass.Unmarked.Hint=, shift+clique para marcar as posições -TTrack.Unselected.Hint=clique para selecionar e/ou definir as propriedades -Vector.Unmarked.Hint=shift-arraste para arrastar os vetores -OffsetOrigin.Unmarked.Hint=shift-clique para marcar ponto de equilíbrio -Calibration.Unmarked.Hint=shift+clique para marcar o primeiro ponto -Calibration.Halfmarked.Hint=shift+clique para marcar o segundo ponto -CenterOfMass.Empty.Hint=selecionar massas para definir o sistema -VectorSum.Empty.Hint=selecionar vetores para definir soma -TapeMeasure.Hint=definir comprimento para alterar escala, definir ângulo para alterar inclinação do eixo x -CoordAxes.Hint=definir ângulo para alterar inclinação -ParticleModel.Hint=definir massa na barra de ferramentas, entrar com as expressões no Construtor de Modelos para animação -RGBRegion.Hint=entrar com o raio para alterar o tamanho -RGBRegion.Unmarked.Hint=shift+clique para marcar as posições -TTrack.ImportVideo.Hint=importar vídeo ou imagem para mensurar RGB -TTrack.Selected.Hint=selecionado -LineProfile.Hint=entrar com a amplitude para alterar a largura da linha -LineProfile.Unmarked.Hint=shift+arraste para arrastar a linha -LineProfile.Menu.Orientation=Orientação -LineProfile.MenuItem.Horizontal=Horizontal -LineProfile.MenuItem.XAxis=Paralelo ao Eixo x -Footprint.PositionVector=vetor -Footprint.BoldPositionVector=vetor em negrito -Tracker.Startup.Hint=olhe aqui para dicas (ou desligue dicas no menu Ajuda), presione a tecla F1 em qualquer momento da ajuda -TrackerPanel.NoVideo.Hint=abrir ou importar um vídeo ou imagem para analisar -TrackerPanel.CalibrateVideo.Hint=identificar uma característica de vídeo com comprimento conhecido e definir a escala usando a fita métrica -TrackerPanel.NoTracks.Hint=criar uma nova trajetória para medir as características de interesse do vídeo -TrackerPanel.SetClip.Hint=definir ou revisar configurações de ajustes de vîdeos no inspetor de ajustes -TrackerPanel.ShowAxes.Hint=definir a origem e ângulo das coordenadas dos eixos -VideoPlayer.Step.Hint=próxima etapa (atalho: tecla PageDown) -VideoPlayer.Back.Hint=etapa anterior (atalho: tecla PageUp ) -TrackerPanel.DVVideo.Hint=aplicar um filtro de redimensionamento para corregir distorções em vídeos de formato DV -TrackerIO.DataFileFilter.Description=Arquivos Tracker -Tracker.Button.PDFHelp=Versão PDF Imprimível -TToolbar.Button.TapeVisible.Tooltip=Fita Métrica com Transferidor - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Controle de Trajetórias -TMenuBar.MenuItem.Description=Nota -TrackPlottingPanel.RightDrag.Hint=botão-direito+arrasto para opções -TMenuBar.MenuItem.DeleteSelectedPoint=Pontos Selecionados -TFrame.InfoDialog.SaveChanges.Title=Salvar alterações -TFrame.InfoDialog.SaveChanges.Message=Você deseja salvar as alterações? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesiano -DynamicParticle.Editor.Button.Polar=Polar -DynamicParticle.Parameter.InitialR.Description=Raio inicial -DynamicParticle.Parameter.InitialTheta.Description=Ângulo Inicial -DynamicParticle.Parameter.InitialVelocityR.Description=Velocidade Radial Inicial -DynamicParticle.Parameter.InitialOmega.Description=Velocidade Angular Inicial -DynamicParticle.ForceFunction.R.Description=Componente de Força Radial -DynamicParticle.ForceFunction.Theta.Description=Componente de Força Tangencial -DynamicParticlePolar.Name=Modelo de Partícula Dinâmica (Polar) -DynamicTwoBody.Editor.Button.Particle1=Partícula 1 -DynamicTwoBody.Editor.Button.Particle2=Partícula 2 -DynamicTwoBody.Name=Modelo Dinâmico de Dois-Corpos -TMenuBar.Menu.DynamicParticle=Modelo de Partícula Dinâmica -TMenuBar.MenuItem.Cartesian=Cartesiano -TMenuBar.MenuItem.Polar=Polar - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Trajetória Automática... -Dialog.Button.Help=Ajuda -AutoTracker.Wizard.Title=Fazer Trajetória Automática: -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Voltar -AutoTracker.Wizard.Button.Next=Avançar -AutoTracker.Wizard.Button.Accept=Aceitar -AutoTracker.Wizard.Button.Search=Procurar -AutoTracker.Wizard.Button.Start=Play -AutoTracker.Wizard.Button.Pause=Pause -AutoTracker.Wizard.Button.Skip=Pular -AutoTracker.Label.Mask=Imagem de Máscara -AutoTracker.Label.Target=Alvo Fora de Alinhamento -AutoTracker.Label.AcceptLevel=Aceitar valores acima -AutoTracker.TabbedPane.TabTitle.Mask=Máscara -AutoTracker.TabbedPane.TabTitle.Target=Alvo -AutoTracker.TabbedPane.TabTitle.Settings=Aceitar -AutoTracker.TabbedPane.TabTitle.Search=Procurar -AutoTracker.Info.GetStarted=Favor shift+ctrl+clicar no recurso de vídeo que você deseja aplicar Autotracker. -AutoTracker.Info.Mask1=A máscara define a imagem a ser correspondida em cada quadro do vídeo. Mova ou redimensione a máscara arrastando o seu centro ou com o puxador, respectivamente. -AutoTracker.Info.Mask2=Dica: a máscara não precisa ser grande nem incluir todo o objeto. Um recurso que é único e inclui bordas de alto contraste, geralmente funciona melhor. -AutoTracker.Info.MaskLocked1=A máscara está em uso e bloqueada. -AutoTracker.Info.MaskLocked2=Clique no Botão Reset para limpar todas as etapas, desbloquear a máscara e começar de novo. -AutoTracker.Info.Target1=O alvo é onde as etapas serão marcadas em relação à máscara. Mova o alvo, arrastando-o. -AutoTracker.Info.Target2=Dica: Você pode ajustar a posição do alvo, mesmo depois que as etapas foram marcadas. As etapas existentes irão automaticamente mover-se junto com o alvo. -AutoTracker.Info.TargetLocked=O alvo está em uso e vinculado as posições das etapas existentes Movê-lo irá mover as outras etapas também. -AutoTracker.Info.Settings1=Valores acima do nível de aceitação mostrados serão marcadas automaticamente. -AutoTracker.Info.Settings2=Dica: reduzir o nível de aceitação acelera o processo de marcação, mas aumenta a probabilidade de erros. -AutoTracker.Info.Search1=O retângulo apresentado será procurado como a melhor opção. Mova ou redimensione a área de pesquisa, arrastando seu centro ou com o puxador, respectivamente. -AutoTracker.Info.Search2=Dica: A área de pesquisa não precisa ser grande. Depois de encontrar os dois primeiros pontos sequências, um algoritmo de antecipação movimenta a área de pesquisa para corresponder às posições previstas. -AutoTracker.Info.Frame=Quadro -AutoTracker.Info.Match=Os pontos apresentados foram marcados automaticamente na posição do alvo. -AutoTracker.Info.Possible=Uma possível correspondência foi encontrada na área de pesquisa mostrada. Suas opções são: -AutoTracker.Info.NoMatch=Nenhuma ocorrência foi encontrada na área de pesquisa mostrada. Suas opções são: -AutoTracker.Info.Outside=A área de pesquisa está fora da imagem. Suas opções são: -AutoTracker.Info.Accepted=A correspondência exibida foi aceita pelo usuário. -AutoTracker.Info.MarkedByUser=A etapa foi marcada manualmente pelo usuário. -AutoTracker.Info.NoVideo=A Trajetória Automática requer um vídeo. Por favor, importar um vídeo ou fechar esta Trajetória Automática. -AutoTracker.Info.Height=altura -AutoTracker.Info.Width=largura -AutoTracker.Info.Accept=--aceitar a correspondência -AutoTracker.Info.Retry=--mova a área de pesquisa e procure novamente -AutoTracker.Info.Mark=--shift+clique para marcar a etapa manualmente -AutoTracker.Info.Skip=--ignorar esse quadro e continue a trajetória -AutoTracker.Info.Reset=--reinicie e comece novamente com uma máscara modificada -AutoTracker.Info.MatchScore=correspondência de valores -AutoTracker.Dialog.MaskLocked.Title=Máscara Bloqueada -PointMass.Cursor.Autotrack.Description=Cursor da Trajetória Automática -VideoPlayer.StartFrame.Hint=arraste para definir o quadro inicial -VideoPlayer.EndFrame.Hint=arraste para definir o quadro final -VideoPlayer.Slider.Hint=arraste para fazer a varredura através do vídeo -FileDropHandler.Dialog.BadFile.Message=não pôde ser carregado. -FileDropHandler.Dialog.BadFile.Title=Arquivo não reconhecido - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Aplicar -DynamicParticle.Dialog.Delete.Message=Deletando esta partícula, ela será removida do sistema. Deseja continuar? -DynamicParticle.Dialog.Delete.Title=Sistema Dinâmico -DynamicParticle.System.In=em -DynamicSystem.Empty=vazio -DynamicSystem.Force.Name.Internal=interno -DynamicSystem.ForceFunction.R.Description=Componente de força radial interna -DynamicSystem.ForceFunction.Theta.Description=Componente de força tangencial interna -DynamicSystem.MenuItem.Inspector=Selecionar Partículas... -DynamicSystem.Name=Sistema Dinâmico de Dois Corpos -DynamicSystem.New.Name=sistema -DynamicSystem.Parameter.Of=de -DynamicSystem.Parameter.RelativeTo=relativo à -DynamicSystem.Parameter.Name.Relative=relativo -DynamicSystem.Parameter.ParticleMass.Description=Massa de -DynamicSystem.Parameter.Mass.Description=A massa total deste sistema -DynamicSystemInspector.Border.Title=Partícula -DynamicSystemInspector.Title=Sistema de Dois-Corpos -DynamicSystemInspector.Button.Change=Alterar para... -DynamicSystemInspector.ParticleName.None=(nenhum) -TMenuBar.MenuItem.Clone=Clone -TMenuBar.MenuItem.TwoBody=Sistema de Dois-Corpos -TrackerPanel.DataBuilder.Dropdown.Tooltip=Trajetória selecionada atualmente -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sincronizar Eixos Verticais -TrackControl.Button.Trace.ToolTip=Exibir/Esconder Trajetórias -TToolBar.Button.Open.Tooltip=Abrir um vídeo ou arquivo Tracker em uma nova aba -TToolBar.Button.Save.Tooltip=Salvar aba atual no arquivo -TToolBar.Button.SelectTrack=Selecionar -TToolBar.Button.SelectTrack.Tooltip=Selecionar uma trajetória existente -TTrack.MenuItem.ClearSteps=Limpar Dados -PointMass.MenuItem.Position=Posição -TMenuBar.MenuItem.Empty=(Vazio) -TTrackBar.Button.Memory=memória em uso: -TTrackBar.Button.Memory.Tooltip=Monitor e gerente de memória -TTrackBar.Memory.PopupItem.Launch=Lançar Tracker com memória -TButton.Track.ToolTip=Definir propriedades de -Tracker.Dialog.OutOfMemory.Message1=O Tracker ficou sem memória. -Tracker.Dialog.OutOfMemory.Message2=Clique no botão de memória para opções. -Tracker.Dialog.OutOfMemory.Title=Sem Memória - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Olhar à frente -AutoTracker.Label.Original=Inicial -AutoTracker.Label.NoMask=nenhum -AutoTracker.Label.Rate=Taxa de Evolução: -AutoTracker.Info.Mask3=Dica: o modelo não precisa ser grande nem incluir todo o objeto. Um recurso que é único e inclui bordas de alto contraste, geralmente funciona melhor. -AutoTracker.Wizard.Checkbox.XAxis=Eixo-X somente -AutoTracker.Info.SearchOnAxis1=O eixo x dentro do retângulo será mostrado como a melhor opção. Mova ou redimensione a área de pesquisa, arrastando seu centro ou o puxador, respectivamente. -AutoTracker.Info.PossibleOnAxis=Uma possível correspondência foi encontrada ao longo do eixo-x na área de pesquisa apresentada. Suas opções são: -AutoTracker.Info.NoMatchOnAxis=Nenhuma ocorrência foi encontrada ao longo do eixo-x na área de pesquisa apresentada. Suas opções são: -AutoTracker.Info.RetryOnAxis=--mova a área de pesquisa ou eixo-x e procure novamente -AutoTracker.Wizard.Button.Delete=Eliminar Este Ponto -AutoTracker.Wizard.Button.DeleteMore=Eliminar este e demais pontos mais tarde -Button.Define.Tooltip=Defina funções das variáveis da coluna existente -Calibration.Label.Point=ponto -CalibrationStick.Hint=defina comprimento ou arraste o fim para alterar a escala, defina o ângulo para alterar o eixo de inclinação -CalibrationStick.End.Hint=arraste para alterar a escala -CalibrationStick.New.Name=Bastão de Calibração -CalibrationTapeMeasure.New.Name=fita de calibração -CalibrationTapeMeasure.Readout.Magnitude.Hint=clique para inserir um comprimento conhecido às unidades de medida -CalibrationTapeMeasure.Hint=defina o comprimento para alterar a escala, defina o ângulo para a alterar a inclinação do eixo -DynamicSystem.Data.Description.0=distância relativa entre as partículas -DynamicSystem.Data.Description.1=ângulo relativo -DynamicSystem.Data.Description.2=velocidade radial relativa -DynamicSystem.Data.Description.3=velocidade angular relativa -ExportDataDialog.Subtitle.Table=Tabela de Dados -ExportDataDialog.Subtitle.Content=Células -ExportDataDialog.Subtitle.Format=Formatar Números -ExportDataDialog.Subtitle.Delimiter=Delimitador -ExportDataDialog.Title=Exportar Dados -ExportDataDialog.Delimiter.Add=Adicionar... -ExportDataDialog.Delimiter.Remove=Remover... -ExportDataDialog.Content.AllCells=Todas as Células -ExportDataDialog.Content.SelectedCells=Selecionar Células -ExportDataDialog.MenuItem.RemoveDelimiter=Remover delimitador personalizado -ExportDataDialog.Chooser.SaveData.Title=Salvar Dados Como -ExportVideoDialog.Button.SaveAs=Salvar Como... -ExportVideoDialog.Button.FullSize=Tamanho Original -ExportVideoDialog.Button.DrawnSize=Como desenhado -ExportVideoDialog.Content.VideoOnly=Somente Vídeo -ExportVideoDialog.Content.VideoAndGraphics=Vídeo e gráficos -ExportVideoDialog.Content.GraphicsOnly=Somente Gráficos -ExportVideoDialog.Title=Exportar Vídeo -ExportVideoDialog.Label.ClipSettings=Ferramentas de Corte do Vídeo -ExportVideoDialog.Subtitle.Size=Tamanho -ExportVideoDialog.Subtitle.Content=Conteúdo -ExportVideoDialog.Subtitle.View=Visualizar -ExportVideoDialog.Subtitle.Format=Formatar -ExportVideoDialog.Complete.Message1=O vídeo foi gravado como -ExportVideoDialog.Complete.Message2=Você deseja abri-lo no Tracker agora? -ExportVideoDialog.Complete.Title=Exportação Concluída -ExportVideoDialog.VideoSize=tamanho do vídeo -ExportVideoDialog.MatSize=tamanho da esteira -ExportVideo.Dialog.HiddenPlots.Message=As parcelas devem ser totalmente visíveis para exportação. -ExportVideo.Dialog.HiddenPlots.Title=Visualização incompleta -Footprint.DoubleTarget=mira dupla -Footprint.BoldDoubleTarget=mira dupla em negrito -OffsetOrigin.MenuItem.Fixed=Coordenadas gerais fixas -ParticleModel.Dialog.Offscreen.Message1=Algumas etapas do modelo estão vazias porque eles são muito fora da tela. -ParticleModel.Dialog.Offscreen.Message2=Para corrigir isso, altere o modelo ou redimensione o vídeo. -ParticleModel.Dialog.Offscreen.Title=Fora dos limites -PrefsDialog.Tab.Configuration.Title=Configuração -PrefsDialog.Memory.BorderTitle=Tamanho da Memória -PrefsDialog.Tab.General.Title=Outro -PrefsDialog.RecentFiles.BorderTitle=Abrir Menu de recentes -PrefsDialog.Label.RecentSize=Arquivo de contagem -PrefsDialog.Hints.BorderTitle=Dicas -PrefsDialog.Button.Relaunch=Relançar Agora -PrefsDialog.Button.ClearRecent=Limpar -PrefsDialog.Checkbox.DefaultSize=Usar padrão -PrefsDialog.Checkbox.HintsOn=Mostrar as dicas como padrão -PrefsDialog.Tab.Video.Title=Vídeo -PrefsDialog.VideoPref.BorderTitle=Mecanismo de Vídeo -PrefsDialog.Button.Xuggle=Xuggle (recomendado) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Gerenciamento de memória indisponível quando Web Start é utilizado. -PrefsDialog.Dialog.WebStart.Title=Modo Web Start -PrefsDialog.LookFeel.BorderTitle=Imagem e Impressão -PrefsDialog.Language.BorderTitle=Idioma -PrefsDialog.Upgrades.BorderTitle=Verificar Atualizações -PrefsDialog.Tab.Runtime.Title=Tempo de execução -PrefsDialog.Tab.Display.Title=Exibir -PrefsDialog.Language.Default=padrão -PrefsDialog.Upgrades.Always=Todas as Vezes -PrefsDialog.Upgrades.Weekly=Semanalmente -PrefsDialog.Upgrades.Monthly=Mensamente -PrefsDialog.Upgrades.Never=Nunca -PrefsDialog.Button.CheckForUpgrade=Verificar Agora -PrefsDialog.Xuggle.Speed.BorderTitle=Reprodução de Vídeo -PrefsDialog.Xuggle.Slow=Suave (pode ser lenta) -PrefsDialog.Xuggle.Fast=Rápida (pode ser grosseira) -PrefsDialog.CalibrationTool.BorderTitle=Ferramenta de Calibragem Padrão -Protractor.Name=Transferidor -Protractor.New.Name=transferidor -Protractor.Hint=arraste as extremidades para medir ângulos -Protractor.Label.Angle=ângulo -Protractor.Field.Angle.Tooltip=ângulo entre as extremidades do transferidor -Protractor.Vertex.Name=vértice -Protractor.Vertex.Hint=arraste para mover o vértice -Protractor.End.Name=extremidade final -Protractor.End.Hint=arraste para rotacionar a extremidade -Protractor.Handle.Name=puxador -Protractor.Handle.Hint=arraste para mover o transferidor -Protractor.Rotator.Name=rotor -Protractor.Rotator.Hint=arraste para rotacionar o transferidor -Protractor.Readout.Name=leitura -Protractor.Readout.Hint=ângulo entre as extremidades do transferidor -ProtractorFootprint.Circle3=círculo pequeno -ProtractorFootprint.Circle5=círculo grande -ProtractorFootprint.Circle3Bold=círculo pequeno em negrito -ProtractorFootprint.Circle5Bold=círculo grande em negrito -Stick.Name=Bastão de Medição -Stick.New.Name=bastão de medição -TableTrackView.MenuItem.Unformatted=Precisão total -TableTrackView.MenuItem.Formatted=Como formatado -TableTrackView.Menu.SetDelimiter=Definir Delimitador -TableTrackView.MenuItem.AddDelimiter=Adicionar... -TableTrackView.MenuItem.RemoveDelimiter=Remover... -TableTrackView.Dialog.CustomDelimiter.Message=Digite uma nova sequência delimitadora: -TableTrackView.Dialog.CustomDelimiter.Title=Adicionar Delimitador -TableTrackView.Header.Tooltip=Clique para ordenar ou duplo clique para selecionar a coluna -TableTrackView.MenuItem.CopySelectedData=Copie os dados selecionados -TableTrackView.Dialog.RemoveDelimiter.Message=Selecione o delimitador a ser removido: -TableTrackView.Dialog.RemoveDelimiter.Title=Remover Delimitador -TableTrackView.Radians.Tooltip=em radianos -TableTrackView.Degrees.Tooltip=em graus -TableTrackView.RadiansPerSecond.Tooltip=em radianos/s -TableTrackView.DegreesPerSecond.Tooltip=em graus/s -TableTrackView.RadiansPerSecondSquared.Tooltip=em radianos/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=em graus/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Apagar Função de Dados -TActions.Action.SaveFrame=Saval Tabset Como... -TActions.AboutVideo=Propriedades... -TActions.Dialog.AboutVideo.Title=Propriedades de Vídeo -TActions.Dialog.AboutVideo.Type=Modelo -TActions.Dialog.AboutVideo.Size=Dimensões -TActions.Dialog.AboutVideo.Length=Comprimento -TActions.Dialog.AboutVideo.Frames=quadros -TActions.Dialog.AboutVideo.Seconds=segundos -TActions.Dialog.AboutVideo.FrameRate=Taxa de Quadros -TActions.Dialog.AboutVideo.FramesPerSecond=qps -TActions.Dialog.AboutVideo.Path=Trajetória -TActions.Action.ImportTRK=Arquivo Tracker... -TActions.Action.ProtractorVisible=Visível -TapeMeasure.MenuItem.FixedLength=Comprimento Fixo -TextTView.Label.NoTab=Exibir texto e páginas em HTML aqui. -TextTView.NewTab.Text1=Dê um duplo clique para editar o texto ou título. Botão direito do mouse para mais opções. -TextTView.NewTab.Text2=Para exibir uma página HTML, digite a URL ou clique com o botão direito do mouse para abrir um arquivo. -TextTView.NewTab.Title=Sem Titulo -TextTView.Dialog.TabTitle.Title=Definir Título -TextTView.MenuItem.OpenHTML=Abrir HTML... -TextTView.MenuItem.SetTitle=Definir Título... -TextTView.Button.NewTab=Novo -TextTView.TextEdit.Description=Texto -TFrame.Dialog.FileNotFound.Message=O arquivo não pôde ser encontrado: -TFrame.Dialog.FileNotFound.Title=Arquivo não encontrado -TFrame.View.Text=Visualizar Texto/HTML -TFrame.View.Main=Visualização Principal -TMenuBar.Menu.OpenRecent=Abrir Recente -TMenuBar.Menu.Import=Importar -TMenuBar.Menu.Export=Exportar -TMenuBar.MenuItem.Video=Vídeo... -TMenuBar.MenuItem.Data=Arquivo de Dados... -TMenuBar.Menu.CopyObject=Copiar Objetos -TMenuBar.MenuItem.Coords=Sistema de Coordenadas -TMenuBar.MenuItem.VideoClip=Cortes do Vídeo -TMenuBar.Menu.MeasuringTools=Ferramentas de Medidas -TMenuBar.Menu.AngleUnits=Unidades de ângulo -TMenuBar.MenuItem.Degrees=Graus -TMenuBar.MenuItem.Radians=Radianos -Tracker.Dialog.NoXuggle.Title=Xuggle não encontrado -Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplataforma de mecanismo vídeo) não está instalada. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Sobre Xuggle... -Tracker.Dialog.AboutXuggle.Title=Sobre Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Versão do Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: -Tracker.Dialog.NoVideoEngine.Message1=Nenhum mecanismo de vídeo foi encontrado! Sem nenhum, o Tracker pode -Tracker.Dialog.NoVideoEngine.Message2=abrir apenas imagens, sequências de imagens e gifs animados. -Tracker.Dialog.NoVideoEngine.Message3=Para instalar o Xuggle, mecanismo de vídeo preferido pelo Tracker em -Tracker.Dialog.NoVideoEngine.Message4=todas as plataformas, faça o download da última versão do instalador do Tracker. -Tracker.Dialog.NoVideoEngine.Title=Falta de Mecanismo de Vídeo -Tracker.Dialog.NoXuggle.Message1=o Xuggle, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. -Tracker.Dialog.NoXuggle.Message2=Para instalar o Xuggle, faça o download da última versão do instalador do Tracker -Tracker.Dialog.NoXuggle.Title=faltando o Xuggle -Tracker.About.DefaultLocale=Local padrão -Tracker.About.CurrentLanguage=Idioma -Tracker.Dialog.InsufficientMemory.Title=Memória Insuficiente -Tracker.Dialog.InsufficientMemory.Message=O tamanho da memória requerida é muito grande. -TrackerIO.Dialog.TabMustBeSaved.Message1=Aba -TrackerIO.Dialog.TabMustBeSaved.Message2=deve ser salva como um arquivo de tracker para ser incluída no tabset. -TrackerIO.Dialog.TabMustBeSaved.Message3=Deseja salvá-lo? -TrackerIO.Dialog.TabMustBeSaved.Title=Aba não salva -TrackerIO.Dialog.NoTabs.Message=Não há abas para serem salvas! -TrackerIO.Dialog.NoTabs.Title=Esvaziar Tabset -TrackerIO.Dialog.SaveTabset.Title=Salvar Tabset -TrackerIO.Dialog.SaveTab.Title=Salvar Aba -TrackerIO.Delimiter.Tab=Aba -TrackerIO.Delimiter.Space=Espaço -TrackerIO.Delimiter.Comma=Vírgula -TrackerIO.Delimiter.Semicolon=Ponto e vírgula -TrackerIO.VideoAndDataFileFilter.Description=Vídeos e arquivos do Tracker -TrackerPanel.Dialog.Version.Message1=Você está abrindo um arquivo criado com o Tracker -TrackerPanel.Dialog.Version.Message2=o que pode significar que -TrackerPanel.Dialog.Version.Message3=características ausentes na versão que você está executando -TrackerPanel.Dialog.Version.Message4=está disponível na última versão do Tracker. -TrackerPanel.Dialog.Version.Title=Incompatibilidade de Versão -TrackerPanel.Label.ModelStart=Início -TrackerPanel.Label.ModelEnd=Fim -TrackerPanel.Spinner.ModelStart.Tooltip=Defina o quadro inicial para este modelo -TrackerPanel.Spinner.ModelEnd.Tooltip=Defina o quadro final para este modelo -TToolbar.Button.ProtractorVisible.Tooltip=Mostrar ou ocultar o transferidor -TToolbar.Button.AxesVisible.Tooltip=Mostrar ou ocultar os eixos de coordenadas -TToolBar.Button.TrackControl.Tooltip=Mostrar ou ocultar o controle de trajetória -TTrack.Dialog.StepSizeWarning.Message1=Atenção: algumas trajetórias foram marcadas em um tamanho maior do que uma outra etapa, ignorando quadros sem marcação. -TTrack.Dialog.StepSizeWarning.Message2=Alterar o tamanho da etapa, provavelmente resultará em lacunas no conjunto de dados. -TTrack.Dialog.StepSizeWarning.Message3=Velocidades e acelerações em torno das lacunas não podem ser determinadas até que todas as etapas sejam marcadas. -TTrack.Dialog.StepSizeWarning.Title=Aviso -TTrack.Dialog.SkippedStepWarning.Message1=Atenção: pulando etapas ao marcar posições deixará lacunas no conjunto de dados. -TTrack.Dialog.SkippedStepWarning.Title=Aviso -TTrack.Dialog.SkippedStepWarning.Checkbox=Não mostrar isto novamente -TTrack.Locked.Hint=bloqueado -TTrack.AngleField.Radians.Tooltip=ângulo em radianos -TTrack.AngleField.Degrees.Tooltip=ângulo em graus -TTrack.AngleField.Popup.Radians=Alternar para Radianos -TTrack.AngleField.Popup.Degrees=Alternar para Graus -TTrackBar.Memory.Menu.SetSize=Definir o tamanho da memória... -TTrackBar.Button.Version=Agora disponível: versão -TTrackBar.Popup.MenuItem.Upgrade=Atualizar Agora... -TTrackBar.Popup.MenuItem.Ignore=Ignorar -XuggleVideo.MenuItem.SmoothPlay=Executar Suavemente (poderá ser lento) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Fita de Calibração -CircleFootprint.Circle=círculo -CircleFootprint.FilledCircle=círculo preenchido -CircleFootprint.Dialog.Title=Círculo Footprint -CircleFootprint.Dialog.Label.Radius=Radianos -CircleFootprint.Dialog.Checkbox.Bold=Negrito -CircleFootprint.Dialog.Checkbox.CenterSpot=Ponto Central -LineProfile.Hint.Marking=Arreste o Mouse para marcar a linha de contorno -PageTView.Button.Page=Página -PageTView.MenuItem.ClosePage=Fechar Página -PointMass.Hint.Marking=clique com o mouse para marcar, aperte Enter para clonar o passo anterior -PrefsDialog.Dialog.NewVersion.Title=Atualizações -PrefsDialog.Dialog.NewVersion.Message1=Versão -PrefsDialog.Dialog.NewVersion.Message2=disponível em -PrefsDialog.Dialog.NewVersion.None.Message=Sem novas versões disponíveis no momento. -RGBRegion.Hint.Marking=clique com o mouse para marcar o centro da região -TMenuBar.MenuItem.Restore=Restaurar Views -TrackControl.StretchVectors.None=Sem extensãoo -TViewChooser.Maximize.Tooltip=Maximizar esta view -TViewChooser.Restore.Tooltip=Restaurar view -Vector.Hint.Marking=arraste o mouse, aperte Enter para clonar o passo anterior -WorldTView.Button.World=Mundo - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Avisos -PrefsDialog.Checkbox.WarnIfNoEngine=Sem mecanismos de Vídeo -PrefsDialog.Checkbox.WarnIfXuggleError=Erros do Xuggle -PropertiesDialog.Title=Propriedades -PropertiesDialog.Label.Author=Autor -PropertiesDialog.Label.Contact=Contato -TActions.Action.Properties=Propriedades... -TActions.Action.OpenBrowser=Abrir Navegador de Biblioteca... -TFrame.Progress.Xuggle=Xuggle carregando imagem -TFrame.Progress.ClickToCancel=(clique para cancelar) -TFrame.Dialog.StalledVideo.Title=Erro ao carregar Vídeo -TFrame.Dialog.StalledVideo.Message0=O vídeo travou durante o carregamento. Isto pode ser temporário. -TFrame.Dialog.StalledVideo.Message1=Escolher para o carregamento ou continuar esperando. -TFrame.Dialog.StalledVideo.Message2=Outras opções para abrir este vídeo são: -TFrame.Dialog.StalledVideo.Message3=1. Use o software de conversão de Vídeo para converter em um formato diferente. -TFrame.Dialog.StalledVideo.Message4=2. Selecionar QuickTime em um selecionador de vídeo ou caixa de preferências. -TFrame.Dialog.StalledVideo.MessageMac=2. Abrir o Tracker em uma Java VM 32-bit e abrir vídeos com o QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Parar -TFrame.Dialog.StalledVideo.Button.Wait=Esperar -Tracker.Dialog.NoVideoEngine.Checkbox=Não mostrar isto novamente -TrackerIO.ZipFileFilter.Description=Arquivos ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle encontrou o seguinte erro ao abrir este vídeo: -TrackerIO.Dialog.ErrorFFMPEG.Message2= Nem todos os erros são fatais. Para todas as mensagens de erro, escolha Ajuda | Log de mensagem -TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o Xuggle falhar, você deve habilitar o QuickTime para abrir vídeos -TrackerIO.Dialog.ErrorFFMPEG.MessageMac= Nota: No Mac OSX isso requer executar o Tracker em Java VM 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, habilitar os avisos Xuggle na janela de prefêrencias (Editar|Preferências). -TToolBar.Button.OpenBrowser.Tooltip=Abrir a Biblioteca Digital OSP - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=Arquivo não encontrado -TFrame.Dialog.NoTRKInComPADRE.Message=Nenhum arquivo Tracker foi encontrado - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Cinemática da Partícula -DynamicParticle.Builder.Title=Dinâmica da Partícula (Cartesiano) -DynamicParticlePolar.Builder.Title= Dinâmica da Partícula (Polar) -DynamicSystem.Builder.Title= Dinâmica do Sistema (Interno) -PropertiesDialog.Button.CopyFilePath=Copiar caminho do arquivo -PropertiesDialog.Button.CopyVideoPath=Copiar Caminho do Vídeo -PropertiesDialog.Tab.TrackerFile=Arquivo Tracker -PropertiesDialog.Tab.Metadata=Metadados -PropertiesDialog.Header.Property=Propriedades -PropertiesDialog.Header.Value=Valor -TActions.Action.OpenURL=Abrir URL... -TActions.Dialog.OpenURL.Title=Abrir URL -TActions.Dialog.OpenURL.Message=Digitar a URL de vídeo da web, de Arquivo Tracker ou Arquivo Tracker Zipado -TActions.Dialog.AboutVideo.Name=Nome - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Arquivos Web na Cache -PrefsDialog.Button.ClearCache=Limpar - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift+clique para remarcar posição de destaque -PointMass.Remarking.Hint=clique com o mouse para remarcar a posição -PointMass.PositionSelected.Hint=arraste ou digite a posição na barra de ferramenta -PointMass.VectorSelected.Hint=arraste para mover -Vector.Remark.Hint=shift+clique para remarcar o ponto destacada -Vector.TipSelected.Hint=arraste ou insira componentes na barra de ferramentas -Vector.HandleSelected.Hint=arraste para mover -Vector.Remarking.Hint=clique com o mouse para remarcar o ponto -AutoTracker.Label.Search=Pesquisar -AutoTracker.Label.Target=Alvo -AutoTracker.Label.Frame=Quadro -AutoTracker.Label.Point=Ponto -AutoTracker.Label.Template=Modelo -AutoTracker.Label.Track=Track -AutoTracker.Label.Match=Correspondência -AutoTracker.Label.NoTemplate=Sem modelo -AutoTracker.Label.EvolutionRate=Taxa de Evolução -AutoTracker.Label.Automark=Auto Marcação -AutoTracker.Info.Instructions=Clique no botão Pesquisar para buscar por uma correspondência na área de pesquisa mostrada. -AutoTracker.Info.KeyFrame.Instructions1=Este quadro chave define o modelo e alvo mostrados. Clique no botão Pesquisar para procurar por correspondência para o modelo. -AutoTracker.Info.KeyFrame.Instructions2=Você deve arrastar o alvo, modelo ou área de pesquisa, para mover ou redimensionar. -AutoTracker.Info.MouseOver.Instructions= Passe o mouse sobre os controles acima para saber mais sobre as configurações e ajustes. -AutoTracker.Info.Mask1=O modelo é a imagem a ser buscada(correspondência). Começa com um quadro chave e evolui para se adaptar às variações de formar e cor. -AutoTracker.Info.Mask2=O nível de Auto Marcação é o menor valor de correspondência necessário para ocorrer a marcação automática. -AutoTracker.Info.Mask.Instructions=Mova ou redimensione o modelo arrastando a borda ou canto (apenas teclas do quadro chave). Ajuste a taxa de evolução e níveis de Auto Marcação utilizando os spinners. -AutoTracker.Info.Mask.Tip= Baixos Níveis de Auto Marcação podem resultar em marcações falsas - experimente aumentar a taxa de evolução AutoTracker.Info.Search=A área de pesquisa digitalizada para melhorar a correspondência. -AutoTracker.Info.SearchOnAxis=A Coordenada X na área de pesquisa é inspecionada para a melhor correspondência. -AutoTracker.Info.Search.Instructions=Mova ou redimensione a área de pesquisa, arrastando o canto ou borda. Ajuste a coordenada X e pesquise opções de Olhar à Frente, clicando nas respectivas opções. -AutoTracker.Info.Search.Tip=Na maioria dos casos a área de pesquisa não precisa ser grande. A opção olhar à frente moverá automaticamente a área de pesquisa para mas possíveis posições de correspondência. -AutoTracker.Info.Target=O alvo está na posição onde o ponto desejado esta marcado. -AutoTracker.Info.Target.Instructions=Arraste o alvo para movê-lo (teclas do quadro chave apenas). Escolha o caminho alvo e aponte para as listas suspensas. -AutoTracker.Info.Title.Settings=Configurações -AutoTracker.Info.Title.Tip=Conselho -AutoTracker.Info.SelectTrack=Por favor, seleciona ou crie a pista e ponto em que deseja aplicar a Pesquisa Automática. -AutoTracker.Info.OutsideXAxis=A coordenada X não passa através da área de pesquisa. As opções são: -AutoTracker.Info.NewKeyFrame=--volte atrás e altere a taxa de evolução ou shift+ctrl+clique para definir um novo quadro chave -AutoTracker.Info.Replace=--aceite a correspondência e substitua o ponto existente -AutoTracker.Info.Keep=--Conservar o ponto existente -AutoTracker.Info.PossibleReplace=Uma possível correspondência foi encontrada para substituir o ponto existente. As opções são: -AutoTracker.Wizard.Button.Accept=Aceitar -AutoTracker.Wizard.Button.Stop=Parar -AutoTracker.Wizard.Button.Skip=Pular -AutoTracker.Wizard.Button.Replace=Substituir -AutoTracker.Wizard.Button.Keep=Manter -AutoTracker.Wizard.Button.Search=Pesquisar -AutoTracker.Wizard.Button.SearchThis=Pesquisar Este -AutoTracker.Wizard.Button.SearchNext=Pesquisar Próximo -AutoTracker.Wizard.Button.Delete=Deletar -AutoTracker.Wizard.Button.ShowKeyFrame=Mostrar Quadro Chave -AutoTracker.Wizard.Button.DeleteKeyFrame=Deletar Quadro Chave -AutoTracker.Wizard.Checkbox.LookAhead=Olhar à Frente -AutoTracker.Wizard.Checkbox.XAxis=Coordenada X apenas -AutoTracker.Wizard.Menuitem.DeleteThis=Este Ponto -AutoTracker.Wizard.Menuitem.DeleteLater=Últimos Pontos -AutoTracker.Wizard.Menuitem.DeleteAll=Todos Pontos -TToolBar.Button.AutoTracker.Tooltip=Mostrar ou Ocultar a Pesquisa Automática -MainTView.Popup.MenuItem.ZoomIn=Zoom In (Aproximar) -MainTView.Popup.MenuItem.ZoomOut=Zoom Out (Afastar) -MainTView.Popup.MenuItem.ZoomToFit=Zoom para Fit -TrackerIO.Dialog.DurationVaries.Title=Variável Quadro de Duração -TrackerIO.Dialog.DurationVaries.Message1=Este vídeo possui quadros com durações diferentes da média por -TrackerIO.Dialog.DurationVaries.Message2=Para precisão nas velocidades e acelerações, exclua os quadros de -TrackerIO.Dialog.DurationVaries.Message3=os cálculos, estão definindo o quadro inicial e o quadro final do vídeo. -TrackerIO.Dialog.DurationVaries.Message4=Quadros para Exclusão: -TrackerIO.Dialog.DurationVaries.Message5=Duração média e taxa de quadros, se a exclusão ocorrer: -TFrame.Dialog.LibraryError.Title=Erro -TFrame.Dialog.LibraryError.Message=Não foi carregado um recurso para o nó. - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift+clique para marcar -PrefsDialog.Label.Path=Caminho -PrefsDialog.Checkbox.ClearCacheOnExit=Limpar na Saída -PrefsDialog.FileChooser.Title.Cache=Definir Cache -PrefsDialog.FileFilter.Directories=Pastas -Tracker.Action.AboutThreads=Sobre Threads... -PrefsDialog.JRE.BorderTitle=Máquina Virtual Java -PrefsDialog.FileChooser.Title.JRE=Definir a Java VM -PrefsDialog.FileFilter.JRE=Pastas e Java VMs -PrefsDialog.Version.BorderTitle=Versão do Tracker -PrefsDialog.Version.Default=padrão -PrefsDialog.Tab.ClearCacheOnExit=Limpar na Saída -PrefsDialog.Run.BorderTitle=Programas executados na inicialização -PrefsDialog.FileChooser.Title.Run=Selecionar arquivo executável -PrefsDialog.Button.Save=Salvar -Tracker.Readme=Tracker LEIAME -Tracker.Readme.NotFound=LEIAME, Arquivo não encontrado -Popup.MenuItem.Algorithm=Algoritmos... -AlgorithmDialog.Button.FiniteDifference=Diferença Finita -AlgorithmDialog.Button.BounceDetect=Detector de Pulso -AlgorithmDialog.TitledBorder.Choose=Selecionar o algoritmo utilizado para calcular velocidade e aceleração: -AlgorithmDialog.Title=Algoritmos -AlgorithmDialog.FiniteDifference.Message1=Este é o algoritmo padrão. -AlgorithmDialog.FiniteDifference.Message2=Velocidade: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Aceleração: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Este algoritmo suaviza velocidades e acelerações mas também detecta mudanças bruscas na velocidade. -AlgorithmDialog.BounceDetect.Message2=Cuidado: pode produzir artefatos, para mais informações: -AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ -TMenuBar.Menu.Diagnostics=Diagnósticos - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=XML inválido -Tracker.Dialog.Invalid.Message=O Arquivo no pode ser lido. -TrackPlottingPanel.Popup.Menu.CompareWith=Comparar com -TrackerPanel.DataBuilder.TrackType.Unknown=desconhecido -TrackerPanel.DataBuilder.Button.Load.Tooltip=Carregar funções de dados para um arquivo XML -TrackerPanel.DataBuilder.Button.Save.Tooltip=Salvar funções de dados em um arquivo XML -TrackerPanel.DataBuilder.Load.Title=Carregar funções de dados -TrackerPanel.DataBuilder.Load.Message=Selecionar funções de dados para carregar: -TrackerPanel.DataBuilder.Save.Title=Salvar funções de dados -TrackerPanel.DataBuilder.Save.Message=Selecionar funções para salvar: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Carregar todas -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Carregar apenas -TrackerPanel.DataBuilder.Dialog.Load.Title=Seleção de Trajetória -TrackerPanel.DataBuilder.Dialog.Load.Message=Você deseja carrear as funções em todas as trajetórias semelhantes -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Tipo de Trajetória Incorreto -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=O arquivo define funções de dados para trajetórias do tipo -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Não podem ser carregados em tipo -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Tipo Incorreto -TrackerPanel.DataBuilder.Dialog.WrongType.Message=O arquivo não define funções de dados. -TToolbar.Button.Refresh=Atualizar dados e views - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=A nova aba foi salva como -ExportTRKDialog.Complete.Message2=Deseja abrir isto com o Tracker agora? -ExportTRKDialog.Complete.Title=Exportação Completa -ExportTRKDialog.Title=Exportar Aba Cortada -ExportTRKDialog.Message1=This (1) exporta o vídeo, (2) converte os dados da Aba para corresponder ao vídeo exportado (3) salva a aba convertida como um novo arquivo Tracker. -ExportTRKDialog.Message2=Os arquivos de Tracker e Vídeo são salvos na mesma pasta com o mesmo nome, porém com extensões diferentes. -TMenuBar.MenuItem.TabClip=Aba Cortada -TrackerIO.Dialog.DurationVaries.Button.SetClip=Clipe recomendado -TrackerIO.Dialog.DurationVaries.Start=Começo -TrackerIO.Dialog.DurationVaries.End=fim -TrackerIO.Dialog.DurationVaries.Recommended=Clipe recomendado -TMenuBar.Menu.CalibrationTools=Ferramentas de Calibração - -# Additions by Doug Brown 2012-05-07 -Protractor.Data.Description.0=tempo -Protractor.Data.Description.1=ângulo do transferidor -Protractor.Data.Description.2=comprimento do braço 1 -Protractor.Data.Description.3= comprimento do braço 2 -Protractor.Data.Description.4=número do passo -Protractor.Data.Description.5=número do quadro -TapeMeasure.Data.Description.0=tempo -TapeMeasure.Data.Description.1=comprimento -TapeMeasure.Data.Description.2=ângulo medido para a coordenada x -TapeMeasure.Data.Description.3=número do passo -TapeMeasure.Data.Description.4=número do quadro -AttachmentInspector.Title=Anexação finalizada -AttachmentInspector.Label.End=Fim -AttachmentInspector.Label.Vertex=Vértice -AttachmentInspector.Header.PointName=Nome -AttachmentInspector.Header.AttachedTo=Anexar para -MeasuringTool.MenuItem.Attach=Anexação Finalizada... -PerspectiveTrack.Corner=borda(canto) -ExportTRKDialog.Label.VideoFormat=Formato do Vídeo -PrefsDialog.LogLevel.BorderTitle=Mensagem de Log Startup - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=não encontrado -AutoTracker.Info.KeyFrame=Quadro Chave -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Este Frame Chave -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Esta Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Últimas Correspondências -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Trajetória Automática -Dialog.Button.Add=Adicionar -Dialog.Button.Remove=Remover -PrefsDialog.Button.ClearHost=Limpar Usuário -PrefsDialog.Button.ClearHost.Tooltip=deletar todos os arquivos associados com um usuário web do OSP cache -PrefsDialog.Button.ClearCache.Tooltip=deletar todos os arquivos do OSP cache -TActions.Action.SaveZip=Exportar ZIP -ThumbnailDialog.Title=Exportar Imagem em Miniatura -ThumbnailDialog.Settings.Title=Opções de Miniatura -ThumbnailDialog.Label.CurrentImage=Imagem Atual -ThumbnailDialog.Label.FrameNumber=quadro -ThumbnailDialog.Label.StepNumber=passo -ThumbnailDialog.View.VideoOnly=Apenas Vídeo -ThumbnailDialog.View.MainView=View Principal -ThumbnailDialog.View.WholeFrame=Quadro Completo -ThumbnailDialog.Format.PNG=Imagem PNG -ThumbnailDialog.Format.JPG=Imagem JPEG -ThumbnailDialog.Chooser.SaveThumbnail.Title=Salvar Miniatura -ThumbnailDialog.Subtitle.Image=Imagem -TMenuBar.MenuItem.Thumbnail=Imagem em Miniatura -TToolBar.Button.SaveZip.Tooltip=Exportar um arquivo ZIP para o Navegador da Biblioteca Digital OSP -TTrack.MenuItem.DeletePoint=Deletar Passo Selecionado -ZipResourceDialog.Title=Exportar para ZIP -ZipResourceDialog.Label.Format=Formato -ZipResourceDialog.Label.Title=Nome -ZipResourceDialog.Label.Description=Descrição -ZipResourceDialog.Label.Keywords=Senhas -ZipResourceDialog.Label.Link=Link Externo -ZipResourceDialog.Label.HTML=Fonte HTML -ZipResourceDialog.Complete.Message1=O arquivo ZIP foi salvo como -ZipResourceDialog.Complete.Message2=Você deseja Abrir isto no Tracker agora? -ZipResourceDialog.Complete.Title=Sucesso -ZipResourceDialog.Border.Title.Documentation=Documentação HTML -ZipResourceDialog.Border.Title.Video=Vídeo -ZipResourceDialog.Border.Title.Thumbnail=Miniatura -ZipResourceDialog.FileChooser.SaveZip.Title=Exportar ZIP -ZipResourceDialog.FileChooser.AddFile.Title=Adicionar arquivo para ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title=Abrir Arquivo HTML -ZipResourceDialog.Button.AddFiles=Adicionar Arquivos -ZipResourceDialog.Button.ThumbnailSettings=Opções de Miniatura -ZipResourceDialog.Checkbox.TrimVideo=Cortar para Clipe -ZipResourceDialog.AddHTMLInfo.Title=Adicionar Arquivo HTML Info -ZipResourceDialog.AddHTMLInfo.Message1=Você deseja adicionar o arquivo de HTML Info -ZipResourceDialog.AddHTMLInfo.Message2=para os arquivos ZIP? -ZipResourceDialog.HTMLField.DefaultText=Se não for especificado, o arquivo será criado para o rascunho) -ZipResourceDialog.Dialog.AddFiles.Title=Adicionar Arquivos PDF e HTML -ZipResourceDialog.Tooltip.HTML=Caminho para o arquivo fonte HTML (se não, será criado um rascunho) -ZipResourceDialog.Tooltip.Author=Autores destes recursos -ZipResourceDialog.Tooltip.Title=Mostrar nome deste recurso (não nome do arquivo) -ZipResourceDialog.Tooltip.Description=Uma descrição útil deste recurso -ZipResourceDialog.Tooltip.Keywords=Uma lista de palavras chave para pesquisar no navegador DL -ZipResourceDialog.Tooltip.Contact=Informação de contato do Autor (instituição, email, site, etc). -ZipResourceDialog.Tooltip.Link=URL para um arquivo HTML externo com mais informações sobre este recurso -ZipResourceDialog.Tooltip.ThumbnailSettings=Mudar a miniatura, tamanho ou tipo do arquivo -ZipResourceDialog.Tooltip.AddFiles=Adicionar arquivo HTML e -PDF para o ZIP -ZipResourceDialog.Tooltip.TrimVideo=Checar para exportar o vídeo clip, desmarcar para usar o arquivo original de vídeo -ZipResourceDialog.Tooltip.LoadHTML=Usar um selecionador de arquivo para carregar um arquivo Info HTML +# This is the Brazilian Portuguese tracker.properties file +# Translated by Arandi Ginane Bezerra Junior, Jorge Alberto Lenz, Leonardo Presoto de Oliveira, Arthur Nunes Santana + +Calibration.Name=Pontos de Calibração +Calibration.New.Name=calibração +CenterOfMass.Name=Centro de Massa +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Selecionar Massas... +CenterOfMassInspector.Title=Centro de Massa +CenterOfMassInspector.Border.Title=Selecionar Massas +ConfigInspector.Border.Title=Comparar Itens Desejados +ConfigInspector.Title=Preferências +ConfigInspector.Button.SaveAsDefault=Salvar Como Padrão +CoordAxes.Name=Eixos +CoordAxes.New.Name=eixos +Dialog.Button.Cancel=Cancelar +Dialog.Button.OK=Aceitar +Dialog.Button.Close=Fechar +Dialog.Button.All=Todos +Dialog.Button.None=Nenhum +Dialog.Button.Copy=Copiar +Dialog.Button.Update=Atualizar +Dialog.Button.SelectAll=Selecionar Todos +Footprint.Diamond=diamante +Footprint.BoldDiamond=diamante negrito +Footprint.SolidDiamond=diamante sólido +Footprint.Triangle=triângulo +Footprint.BoldTriangle=triângulo em negrito +Footprint.SolidTriangle=triângulo sólido +Footprint.Circle=círculo +Footprint.BoldCircle=círculo em negrito +Footprint.SolidCircle=círculo sólido +Footprint.VerticalLine=linha vertical +Footprint.BoldVerticalLine=linha vertical em negrito +Footprint.HorizontalLine=linha horizontal +Footprint.BoldHorizontalLine=linha horizontal em negrito +Footprint.Crosshair=cruz +Footprint.BoldCrosshair=cruz em negrito +Footprint.SimpleAxes=eixos simples +Footprint.BoldSimpleAxes=eixos simples em negrito +Footprint.Spot=ponto +Footprint.Line=linha +Footprint.BoldLine=linha em negrito +Footprint.Outline=contorno +Footprint.BoldOutline=contorno em negrito +Footprint.Arrow=flecha +Footprint.BoldArrow=flecha em negrito +Footprint.DoubleArrow=flecha dupla +Footprint.BoldDoubleArrow=flecha dupla em negrito +Footprint.2xArrow=flecha 2x +Footprint.Bold2xArrow=flecha 2x em negrito +Footprint.4xArrow=flecha 4x +Footprint.Bold4xArrow=flecha 4x em negrito +Footprint.DashArrow=flecha descontínua +Footprint.BoldDashArrow=flecha descontínua em negrito +Footprint.BigArrow=flecha grande +Footprint.BigDashArrow=flecha grande descontínua +LineProfile.Name=Perfil da Linha +LineProfile.New.Name=perfil +LineProfile.Data.Brightness=brilho +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=vermelho +LineProfile.Data.Green=verde +LineProfile.Data.Blue=azul +LineProfile.Data.Weighting=ponderando +MainTView.Popup.MenuItem.QTPlayer=Reprodutor QuickTime (Player) +MainTView.Popup.MenuItem.Zoom=Zoom +MainTView.Popup.MenuItem.ToFit=Para Ajustar +OffsetOrigin.Name=Origem de Compensação +OffsetOrigin.New.Name=compensação +PlotTrackView.Button.PlotCount=Diagrama +PlotTrackView.Button.PlotCount.ToolTip=Selecionar número de diagramas +PointMass.Name=Ponto de Massa +PointMass.New.Name=massa +PointMass.MenuItem.VectorsToPosition=Para Posição +PointMass.MenuItem.Velocity=Velocidade +PointMass.MenuItem.Acceleration=Aceleração +Star.Name=Estrela +Star.New.Name=estrela +TableTrackView.Action.CopyData=Copiar Dados +TableTrackView.Button.SelectTableData=Dados +TableTrackView.Button.SelectTableData.ToolTip=Escolher Dados +TableTrackView.Popup.MenuItem.Analyze=Analisar... +TableTrackView.Dialog.Border.Title=Mostrar: +TActions.Action.Description=Notas +TActions.Action.ClearTracks=Limpar +TActions.Action.NewTab=Novo +TActions.Action.Copy=Copiar +TActions.Action.Paste=Colar +TActions.Action.Open=Abrir... +TActions.Action.Close=Fechar +TActions.Action.Import=Importar... +TActions.Action.Save=Salvar +TActions.Action.SaveAs=Salvar Como... +TActions.Action.Export=Exportar... +TActions.Action.CaptureVideo=Capturar Vídeo... +TActions.Action.Delete=Deletar +TActions.Action.Config=Preferências... +TActions.Action.AxesVisible=Visível +TActions.Action.TapeVisible=Visível +TActions.Action.Print=Imprimir... +TActions.Action.ClearFilters=Limpar +TActions.Action.ImportVideo=Importar... +TActions.Action.CloseVideo=Fechar +TActions.Action.CloseAll=Fechar Todos +TActions.Action.Exit=Sair +TActions.Dialog.PrintError.Message=Ocorreu um erro de impressão. +TActions.Dialog.PrintError.Title=Erro de Impressão +TActions.Dialog.Description.Title=Notas: +TActions.Dialog.DeleteLockedTracks.Message=Algumas trajetórias estão bloqueadas. Deseja apagá-las mesmo assim? +TActions.Dialog.DeleteLockedTracks.Title=Apagar trajetórias bloqueadas? +TActions.Dialog.NewPointMass.Title=Novo Ponto de Massa +TapeMeasure.Name=Fita Métrica +TapeMeasure.New.Name=fita +TapeMeasure.MenuItem.Fixed=Definido +TFrame.View.Plot=Visualizar do Gráfico +TFrame.View.Table=Visualizar Tabelas +TFrame.View.World=Visualizar Tudo +TFrame.View.Video=Visualizar Vídeo +TFrame.Dialog.Help.Title=Ajuda do Tracker +TMenuBar.Menu.File=Arquivo +TMenuBar.Menu.Edit=Editar +TMenuBar.Menu.Video=Vídeo +TMenuBar.Menu.Tracks=Trajetórias +TMenuBar.Menu.Coords=Coordenadas +TMenuBar.Menu.Window=Janela +TMenuBar.Menu.Help=Ajuda +TMenuBar.MenuItem.EditProperties=Propriedades... +TMenuBar.MenuItem.VideoVisible=Visível +TMenuBar.MenuItem.VideoFilters=Filtros +TMenuBar.MenuItem.NewVideoFilter=Novo +TMenuBar.MenuItem.NewTrack=Novo +TMenuBar.MenuItem.CoordsLocked=Bloqueado +TMenuBar.MenuItem.CoordsFixedOrigin=Origem Definida +TMenuBar.MenuItem.CoordsFixedAngle=Ângulo Definido +TMenuBar.MenuItem.CoordsFixedScale=Escala Definida +TMenuBar.MenuItem.CoordsRefFrame=Quadro de Referência +TMenuBar.MenuItem.CoordsDefault=Padrão +TMenuBar.MenuItem.WindowRight=Vista Direita +TMenuBar.MenuItem.WindowBottom=Vista Inferior +TMenuBar.MenuItem.PlayAllSteps=Reproduzir Todos os Passos +TMenuBar.MenuItem.Record=Gravar Vídeo +TMenuBar.MenuItem.MatSize=Tamanho da Tela +TMenuBar.MenuItem.Language=Idioma +TMenuBar.MenuItem.DeleteTrack=Apagar +TMenuBar.MenuItem.TrackerHelp=Ajuda do Tracker... +TMenuBar.MenuItem.MessageLog=Registro de Mensagens... +TrackControl.Name=Controle de Trajetórias +TrackControl.Button.NewTrack=Novo +TrackControl.Button.NewTrack.ToolTip=Criar Nova Trajetória +TrackControl.Button.Trails.ToolTip=Traços +TrackControl.Button.Labels.ToolTip=Etiquetas +TrackControl.Button.StretchVectors.ToolTip=Estender vetores +TrackControl.Button.Accelerations.ToolTip=Acelerações +TrackControl.Button.Xmass.ToolTip=Multiplicar pela massa +TrackControl.Button.Vectors.ToolTip=Vetores +TrackControl.Button.Velocities.ToolTip=Velocidades +TrackControl.Button.Properties.ToolTip=Propriedades +TrackControl.Button.Positions.ToolTip=Posições +Tracker.Popup.MenuItem.Snapshot=Captura Instantânea +Tracker.Popup.MenuItem.Help=Ajuda... +Tracker.Cursor.Crosshair.Description=Cursor em cruz para marcar posições +Tracker.Action.AboutTracker=Sobre o Tracker... +Tracker.Dialog.AboutTracker.Title=Sobre o Tracker +Tracker.Action.AboutJava=Sobre o Java... +Tracker.Dialog.AboutJava.Title=Sobre o Java +Tracker.Dialog.AboutJava.UnknownVersion=desconhecido +Tracker.Dialog.AboutJava.Message=Versão do Java +Tracker.Action.AboutQT=Sobre o QuickTime... +Tracker.Dialog.AboutQT.Title=Sobre o QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=Versão do QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versão do QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=Caminho QTJava: +Tracker.Dialog.NoQT.Title=QTJava.zip não encontrado +Tracker.Dialog.NoQT.Message1=QuickTime para Java aparenta não estar instalado. +Tracker.Dialog.NoQT.Message2=Se você deseja analisar os vídeos do QuickTime, por favor reinstale o QuickTime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime para Java DEVE SER SELECIONADO quando o QuickTime for instalado. +Tracker.Dialog.UpdateQT.Title=Atualizar QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Uma nova versão do QTJava.zip foi encontrada +Tracker.Dialog.UpdateQT.Message2=Você deseja atualizar o arquivo existente? +Tracker.Dialog.CopyQT.Title=Copiar QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime está instalado, mas antes que o Tracker possa usá-lo: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip deve ser copiado de +Tracker.Dialog.CopyQT.Message3= para +Tracker.Dialog.CopyQT.Message4= 2. Tracker deve ser reiniciado. +Tracker.Dialog.CopyQT.Message5=Você deseja copiar o QTJava.zip agora? +Tracker.Dialog.CopyFailed.Title=Falha ao Copiar +Tracker.Dialog.CopyFailed.Message=QTJava.zip não pode ser aberto. +Tracker.Dialog.CopiedTo.Title=Copiado com Sucesso +Tracker.Dialog.CopiedTo.Message1=QTJava.zip foi copiado com sucesso para +Tracker.Dialog.CopiedTo.Message2=Tracker deve ser reiniciado e será finalizado agora. +Tracker.Splash.Loading=Carregando +TrackerIO.Dialog.Import.Title=Importar +TrackerIO.Dialog.Import.Message=Selecionar itens para importar +TrackerIO.Dialog.ImportVideo.Title=Importar Vídeo +TrackerIO.Dialog.Export.Title=Exportar +TrackerIO.Dialog.Export.Message=Selecionar itens para exportar +TrackerIO.Dialog.ReplaceFile.Title=Substituir Arquivo Existente? +TrackerIO.Dialog.ReplaceFile.Message=já existe. Deseja substituí-lo? +TrackerIO.Dialog.NotTrackerXML.Title=XML não correspondido +TrackerIO.Dialog.NotTrackerXML.Message=contém dados xml para uma aplicação diferente +TrackerIO.Dialog.BadVideo.Message=Vídeo não pode ser aberto: +TrackerPanel.NewTab.Name=Sem Título +TrackerPanel.DragToMark.Hint=Shift+Arrastar para marcar +TrackerPanel.ClickToMark.Hint=Shift+Clique para marcar +TrackerPanel.Dialog.LoadFailed.Title=Arquivo Não Carregado +TrackerPanel.Dialog.LoadFailed.Message=Arquivo não pode ser carregado: +TrackerPanel.Dialog.SaveChanges.Title=Salvar Alterações +TrackerPanel.Dialog.SaveChanges.Message=Salvar Alterações em +TrackPlottingPanel.Popup.MenuItem.Lines=Linhas +TrackPlottingPanel.Popup.MenuItem.Points=Pontos +TrackPlottingPanel.Popup.MenuItem.Scale=Escala... +TrackPlottingPanel.Popup.MenuItem.Print=Imprimir... +TrackPlottingPanel.Popup.MenuItem.Measure=Escala para Caber +TrackPlottingPanel.Popup.MenuItem.Analyze=Analisar... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Aproximar +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Afastar +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoescala +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom para Área +TrackPlottingPanelInspector.Title=Escala +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Definir Tipo de Marcação +TToolBar.Dropdown.SelectedTrack.Tooltip=Selecionar Trajetórias +TToolBar.Dropdown.SelectedTrack.None=sem seleção +TTrack.MenuItem.Delete=Deletar +TTrack.MenuItem.Color=Cores... +TTrack.Dialog.Color.Title=Escolher Cor de Trajetórias +TTrack.MenuItem.Name=Nome... +TTrack.MenuItem.Footprint=Tipo de Marcação +TTrack.MenuItem.Description=Notas... +TTrack.MenuItem.Visible=Visível +TTrack.MenuItem.TrailVisible=Traços Visíveis +TTrack.MenuItem.Autostep=Pulo Automático +TTrack.MenuItem.MarkByDefault=Marcar como Padrão +TTrack.MenuItem.Locked=Bloquear +TTrack.MenuItem.Delete=Apagar +TTrack.Name.None=sem nome +TTrack.Dialog.Description.Title=Notas: +TTrack.Dialog.Name.Title=Definir Nome +TTrack.Dialog.Name.Label=Nome: +TViewChooser.Button.Choose.Tooltip=Escolher uma Visualização +Vector.Name=Vetor +Vector.New.Name=vetor +Vector.MenuItem.ToOrigin=Para Origem +Vector.MenuItem.Label=Etiqueta Visível +VectorSum.Name=Soma de Vetores +VectorSum.New.Name=soma +VectorSum.MenuItem.Inspector=Selecionar Vetores... +VectorSumInspector.Title=Soma de Vetores +VectorSumInspector.Border.Title=Selecionar Vetores +WorldTView.Popup.MenuItem.Projectile=Modelo do Projétil + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Modelo Cinemático de Partícula +AnalyticParticle.Inspector.Title=Modelo Cinemático de Partícula +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=4 Raios +CircleFootprint.Circle_6=6 Raios +CircleFootprint.Circle_8=8 Raios +DynamicParticle.Name=Modelo Dinâmico de Partícula +DynamicParticle.Inspector.Title=Modelo Dinâmico de Partícula +DynamicParticle.Property.ForceX=força x +DynamicParticle.Property.ForceY=força y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocidadeX=vx +DynamicParticle.Property.InitialVelocidadeY=vy +LineProfile.MenuItem.Fixed=Definido +ParticleModel.New.Name=modelo +ParticleModel.MenuItem.InspectModel=Construtor de Modelos... +ParticleModel.Inspector.Button.Undo=Desfazer +ParticleModel.Inspector.Button.Redo=Refazer +ParticleModel.Inspector.Button.Close=Fechar +ParticleModel.Inspector.Button.Help=Ajuda + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=Somente X +Calibration.Axes.YOnly=Somente Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Selecionar eixos de calibração +Calibration.Label.Axes=Eixos +Calibration.Dialog.InvalidCoordinates.Title=Coordenadas Inválidas +Calibration.Dialog.InvalidCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas. +Calibration.Dialog.InvalidXCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas em x. +Calibration.Dialog.InvalidYCoordinates.Message=Os pontos não podem ter o mesmo valor das coordenadas em y. +SpectralLineFilter.Title=Espectro de Gás +SpectralLineFilter.H=Hidrogênio +SpectralLineFilter.He=Hélio +SpectralLineFilter.Ne=Neônio +SpectralLineFilter.Hg=Mercúrio +TFrame.View.Unknown=Visualizar +TMenuBar.MenuItem.Undo=Desfazer +TMenuBar.MenuItem.Redo=Refazer +TMenuBar.MenuItem.Replace=Substituir... +TMenuBar.Menu.AddImage=Importar Imagens +TMenuBar.MenuItem.AddBefore=Antes deste Quadro... +TMenuBar.MenuItem.AddAfter=Depois deste Quadro... +TMenuBar.MenuItem.RemoveImage=Remover este Quadro +TMenuBar.Menu.Tools=Ferramentas +TMenuBar.MenuItem.DataFunctionTool=Construtor de Dados +TMenuBar.MenuItem.DatasetTool=Ferramentas de Dados +TMenuBar.Menu.CopyImage=Copiar Imagem +TMenuBar.MenuItem.CopyMainView=Janela Principal +TMenuBar.MenuItem.CopyFrame=Quadro +TMenuBar.MenuItem.PrintFrame=Imprimir... +TrackerIO.Dialog.AddImage.Title=Importar Imagens (escolha uma ou mais) +TTrack.Dialog.Name.BadName=já existe! Por favor, escolha outro nome. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=força resultante +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=A Janela de Gráficos de Dados de Trajetória aparecerá aqui. +TableTView.Label.NoData=A Janela de Tabela de Dados de Trajetória aparecerá aqui. +TrackerPanel.Message.NoData0=A vista Principal de Vídeos aparecerá aqui. +TrackerPanel.Message.NoData1=Escolha Arquivo|Abrir ou Trajetórias|Novo para iniciar. +WorldTView.Label.NoData=A Janela Principal aparecerá aqui. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Algoritmo: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Multietapas Adaptáveis +DynamicParticle.Table.Force.Border.Title=Funções de Força (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Funções de Posição (t) +ParticleModel.Table.Initial.Border.Title=Valores Iniciais +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Colar Imagem +TMenuBar.MenuItem.PasteAfter=Depois deste Quadro +TMenuBar.MenuItem.PasteBefore=Antes desde Quadro +TMenuBar.MenuItem.PasteReplace=Substituir Vídeo + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Começando... +Tracker.Splash.HelpMessage=Novo usuário? Escolha + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=ângulo a partir da horizontal +LineProfile.Checkbox.Rotates=girar +LineProfile.Label.Spread=expandir +RGBRegion.Name=Região RGB +RGBRegion.New.Name=região +RGBRegion.MenuItem.Fixed=Posição Definida +RGBRegion.Label.Radius=pixel raios +TTrack.Label.Step=etapa + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=número da posição +LineProfile.Data.Description.1=número da posição em x +LineProfile.Data.Description.2=número da posição em y +LineProfile.Data.Description.3=vermelho +LineProfile.Data.Description.4=verde +LineProfile.Data.Description.5=azul +LineProfile.Data.Description.6=brilho distinguido +LineProfile.Data.Description.7=largura da linha +ParticleModel.MenuItem.TraceVisible=Traço Visível +ParticleModel.MenuItem.StepsVisible=Passos Visíveis +PointMass.Data.Description.0=tempo +PointMass.Data.Description.1=componente x da posição +PointMass.Data.Description.2=componente y da posição +PointMass.Data.Description.3=intensidade da posição +PointMass.Data.Description.4=ângulo da posição +PointMass.Data.Description.5=componente x da velocidade +PointMass.Data.Description.6=componente y da velocidade +PointMass.Data.Description.7=intensidade da velocidade +PointMass.Data.Description.8=ângulo da velocidade +PointMass.Data.Description.9=componente x da aceleração +PointMass.Data.Description.10=componente y da aceleração +PointMass.Data.Description.11=intensidade da aceleração +PointMass.Data.Description.12=ângulo da aceleração +PointMass.Data.Description.13=ângulo de rotação +PointMass.Data.Description.14=velocidade angular +PointMass.Data.Description.15=aceleração angular +PointMass.Data.Description.16=número de pulos +PointMass.Data.Description.17=quadro número +PointMass.Data.Description.18=componente x do momento +PointMass.Data.Description.19=componente y do momento +PointMass.Data.Description.20=intensidade do momento +PointMass.Data.Description.21=ângulo do momento +PointMass.Data.Description.22=energia cinética +RGBRegion.Data.Description.0=tempo +RGBRegion.Data.Description.1=componente x da posição +RGBRegion.Data.Description.2=componente y da posição +RGBRegion.Data.Description.3=vermelho +RGBRegion.Data.Description.4=verde +RGBRegion.Data.Description.5=azul +RGBRegion.Data.Description.6=brilho distinguido +RGBRegion.Data.Description.7=contagem de pixel +RGBRegion.Data.Description.8=número da etapa +RGBRegion.Data.Description.9=número do quadro +TView.Menuitem.Define=Definir... +Vector.Data.Description.0=tempo +Vector.Data.Description.1=componente em x +Vector.Data.Description.2=componente em y +Vector.Data.Description.3=intensidade +Vector.Data.Description.4=ângulo +Vector.Data.Description.5=componente em x da origem vetor +Vector.Data.Description.6=componente em y da origem vetor +Vector.Data.Description.7=número da etapa +Vector.Data.Description.8=número do quadro +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Massa deste partícula +ParticleModel.Parameter.InitialTime.Description=Tempo Inicial +AnalyticParticle.PositionFunction.X.Description=Componente x da Posição +AnalyticParticle.PositionFunction.Y.Description=Componente y da Posição +DynamicParticle.ForceFunction.X.Description=Componente x da Força +DynamicParticle.ForceFunction.Y.Description=Componente y da Força +DynamicParticle.Parameter.InitialX.Description=Componente x da Posição Inicial +DynamicParticle.Parameter.InitialY.Description=Componente y da Posição Inicial +DynamicParticle.Parameter.InitialVelocityX.Description=Componente x da Velocidade Inicial +DynamicParticle.Parameter.InitialVelocityY.Description=Componente y da Velocidade Inicial +TrackerPanel.ModelBuilder.Title=Construtor de Modelos +TrackerPanel.DataBuilder.Title=Construtor de Dados +TrackControl.TrailMenu.NoTrail=Sem traços +TrackControl.TrailMenu.ShortTrail=Alguns traços +TrackControl.TrailMenu.LongTrail=Muitos traços +TrackControl.TrailMenu.FullTrail=Todos os traços +TrackerPanel.ModelBuilder.Spinner.Tooltip=Modelo selecionado no momento +TrackerPanel.ModelBuilder.LineButton.Text=Estilo da Linha +TrackerPanel.ModelBuilder.LineButton.Tooltip=Definir Estilo da Linha +ParticleModel.LineStyle.None=Sem Linha +ParticleModel.LineStyle.Connect=Conectar etapas +ParticleModel.LineStyle.Smooth=Linha Reta +ModelFunctionPanel.Label=Modelo +AnalyticFunctionPanel.FunctionEditor.Border.Title=Funções de Posição +DynamicFunctionPanel.FunctionEditor.Border.Title=Funções de Força + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Tabela de Colunas Visíveis +Tracker.About.ProjectOf=Um projeto de: +Tracker.About.TranslationBy=Tradução por +Tracker.About.Translator=Arthur Nunes Santana,\nArandi Ginane Bezerra Jr, Jorge Alberto Lenz +TMenuBar.Menu.SaveVideoAs=Salvar Como +TActions.SaveClipAs.ProgressMonitor.Message=Salvando Vídeo Como +TActions.SaveClipAs.ProgressMonitor.Progress=Completo + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sincronizar +PlotTrackView.Checkbox.Synchronize.Tooltip=Sincronizar eixos horizontais +RGBRegion.MenuItem.FixedRadius=Raio Definido +Tracker.VideoZoom.Hint=clique para aproximar, alt+clique para afastar, clique-duplo para auto ajuste +Tracker.PlotZoomIn.Hint=arraste para aproximar, clique-duplo para Escala para Caber +Tracker.PlotZoomOut.Hint=clique para afastar +Tracker.MenuItem.Hints=Mostrar Sugestão +TapeMeasure.Label.Length=Comprimento já em escala +TapeMeasure.Label.TapeAngle=ângulo da fita +TapeMeasure.Label.ArcAngle=ângulo do transferidor +TrackerIO.Dialog.NotAnImage.Title=Tipo de Arquivo Incorreto +TrackerIO.Dialog.NotAnImage.Message1=não é uma imagem JPG ou GIF. +TrackerIO.Dialog.NotAnImage.Message2=Você deseja continuar? +TToolBar.Button.Zoom.Tooltip=Ferramentas de Zoom (atalho: tecla Z) +TrackChooserTView.DropDown.Tooltip=Selecionar Trajetórias +TapeMeasure.Field.ArcAngle.Tooltip=Ângulo da fita para a do transferidor +TapeMeasure.Field.TapeAngle.Tooltip=Ângulo do eixo x positivo para a fita +TapeMeasure.Field.Magnitude.Tooltip=Comprimento da fita na escala do sistema universal +TapeMeasure.Readout.Magnitude.Name=leitura do comprimento +TapeMeasure.Readout.Magnitude.Hint=clique para definir a escala +TapeMeasure.Readout.Angle.Name=leitura do ângulo +TapeMeasure.Readout.Angle.Hint=clique para definir o ângulo +TapeMeasure.Arm.Name=transferidor +TapeMeasure.Arm.Hint=arraste para medir ângulos, reduzir para fechar +TapeMeasure.End.Name=fim +TapeMeasure.End.Hint=arraste para medir distâncias ou calibrar as escalas +TapeMeasure.Handle.Name=manipular +TapeMeasure.Handle.Hint=arraste para mover a fita +Vector.Tip.Name=ponta +Vector.Tip.Hint=arraste para entrar com as coordenadas ou alterar as componentes +Vector.Handle.Name=manipular +Vector.Handle.Hint=arraste para mover o vetor +Vector.ShortHandle.Hint=arraste para mover, alt+click para selecionar a ponta +PointMass.Position.Name=posição +PointMass.Position.Hint=arraste para entrar com as coordenadas ou alterar a posição +PointMass.Velocity.Name=velocidade +PointMass.Acceleration.Name=aceleração +PointMass.Vector.Hint=arraste para mover +PointMass.Position.Locked.Hint=clique para selecionar--não pode ser arrastado +CoordAxes.Handle.Name=eixo +x +CoordAxes.Handle.Hint=arraste para alterar a inclinação +CoordAxes.Origin.Name=origem +CoordAxes.Origin.Hint=arraste para trocar a posição +OffsetOrigin.Position.Name=posição +OffsetOrigin.Position.Hint=arraste ou entre com as coordenadas para mover a origem +Calibration.Point.Name=ponto +Calibration.Point.Hint=arraste para entrar com as coordenadas ou alterar eixos e escalas +RGBRegion.Position.Name=posição +RGBRegion.Position.Hint=arraste para entrar com as coordenadas ou alterar a posição +LineProfile.End.Name=fim +LineProfile.End.Hint=arraste para ajustar comprimento da linha +LineProfile.Handle.Name=manipular +LineProfile.Handle.Hint=arraste para mover a linha +PointMass.Hint=definir massa na barra de ferramentas +PointMass.Unmarked.Hint=, shift+clique para marcar as posições +TTrack.Unselected.Hint=clique para selecionar e/ou definir as propriedades +Vector.Unmarked.Hint=shift-arraste para arrastar os vetores +OffsetOrigin.Unmarked.Hint=shift-clique para marcar ponto de equilíbrio +Calibration.Unmarked.Hint=shift+clique para marcar o primeiro ponto +Calibration.Halfmarked.Hint=shift+clique para marcar o segundo ponto +CenterOfMass.Empty.Hint=selecionar massas para definir o sistema +VectorSum.Empty.Hint=selecionar vetores para definir soma +TapeMeasure.Hint=definir comprimento para alterar escala, definir ângulo para alterar inclinação do eixo x +CoordAxes.Hint=definir ângulo para alterar inclinação +ParticleModel.Hint=definir massa na barra de ferramentas, entrar com as expressões no Construtor de Modelos para animação +RGBRegion.Hint=entrar com o raio para alterar o tamanho +RGBRegion.Unmarked.Hint=shift+clique para marcar as posições +TTrack.ImportVideo.Hint=importar vídeo ou imagem para mensurar RGB +TTrack.Selected.Hint=selecionado +LineProfile.Hint=entrar com a amplitude para alterar a largura da linha +LineProfile.Unmarked.Hint=shift+arraste para arrastar a linha +LineProfile.Menu.Orientation=Orientação +LineProfile.MenuItem.Horizontal=Horizontal +LineProfile.MenuItem.XAxis=Paralelo ao Eixo x +Footprint.PositionVector=vetor +Footprint.BoldPositionVector=vetor em negrito +Tracker.Startup.Hint=olhe aqui para dicas (ou desligue dicas no menu Ajuda), presione a tecla F1 em qualquer momento da ajuda +TrackerPanel.NoVideo.Hint=abrir ou importar um vídeo ou imagem para analisar +TrackerPanel.CalibrateVideo.Hint=identificar uma característica de vídeo com comprimento conhecido e definir a escala usando a fita métrica +TrackerPanel.NoTracks.Hint=criar uma nova trajetória para medir as características de interesse do vídeo +TrackerPanel.SetClip.Hint=definir ou revisar configurações de ajustes de vîdeos no inspetor de ajustes +TrackerPanel.ShowAxes.Hint=definir a origem e ângulo das coordenadas dos eixos +VideoPlayer.Step.Hint=próxima etapa (atalho: tecla PageDown) +VideoPlayer.Back.Hint=etapa anterior (atalho: tecla PageUp ) +TrackerPanel.DVVideo.Hint=aplicar um filtro de redimensionamento para corregir distorções em vídeos de formato DV +TrackerIO.DataFileFilter.Description=Arquivos Tracker +Tracker.Button.PDFHelp=Versão PDF Imprimível +TToolbar.Button.TapeVisible.Tooltip=Fita Métrica com Transferidor + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Controle de Trajetórias +TMenuBar.MenuItem.Description=Nota +TrackPlottingPanel.RightDrag.Hint=botão-direito+arrasto para opções +TMenuBar.MenuItem.DeleteSelectedPoint=Pontos Selecionados +TFrame.InfoDialog.SaveChanges.Title=Salvar alterações +TFrame.InfoDialog.SaveChanges.Message=Você deseja salvar as alterações? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesiano +DynamicParticle.Editor.Button.Polar=Polar +DynamicParticle.Parameter.InitialR.Description=Raio inicial +DynamicParticle.Parameter.InitialTheta.Description=Ângulo Inicial +DynamicParticle.Parameter.InitialVelocityR.Description=Velocidade Radial Inicial +DynamicParticle.Parameter.InitialOmega.Description=Velocidade Angular Inicial +DynamicParticle.ForceFunction.R.Description=Componente de Força Radial +DynamicParticle.ForceFunction.Theta.Description=Componente de Força Tangencial +DynamicParticlePolar.Name=Modelo de Partícula Dinâmica (Polar) +DynamicTwoBody.Editor.Button.Particle1=Partícula 1 +DynamicTwoBody.Editor.Button.Particle2=Partícula 2 +DynamicTwoBody.Name=Modelo Dinâmico de Dois-Corpos +TMenuBar.Menu.DynamicParticle=Modelo de Partícula Dinâmica +TMenuBar.MenuItem.Cartesian=Cartesiano +TMenuBar.MenuItem.Polar=Polar + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Trajetória Automática... +Dialog.Button.Help=Ajuda +AutoTracker.Wizard.Title=Fazer Trajetória Automática: +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Voltar +AutoTracker.Wizard.Button.Next=Avançar +AutoTracker.Wizard.Button.Accept=Aceitar +AutoTracker.Wizard.Button.Search=Procurar +AutoTracker.Wizard.Button.Start=Play +AutoTracker.Wizard.Button.Pause=Pause +AutoTracker.Wizard.Button.Skip=Pular +AutoTracker.Label.Mask=Imagem de Máscara +AutoTracker.Label.Target=Alvo Fora de Alinhamento +AutoTracker.Label.AcceptLevel=Aceitar valores acima +AutoTracker.TabbedPane.TabTitle.Mask=Máscara +AutoTracker.TabbedPane.TabTitle.Target=Alvo +AutoTracker.TabbedPane.TabTitle.Settings=Aceitar +AutoTracker.TabbedPane.TabTitle.Search=Procurar +AutoTracker.Info.GetStarted=Favor shift+ctrl+clicar no recurso de vídeo que você deseja aplicar Autotracker. +AutoTracker.Info.Mask1=A máscara define a imagem a ser correspondida em cada quadro do vídeo. Mova ou redimensione a máscara arrastando o seu centro ou com o puxador, respectivamente. +AutoTracker.Info.Mask2=Dica: a máscara não precisa ser grande nem incluir todo o objeto. Um recurso que é único e inclui bordas de alto contraste, geralmente funciona melhor. +AutoTracker.Info.MaskLocked1=A máscara está em uso e bloqueada. +AutoTracker.Info.MaskLocked2=Clique no Botão Reset para limpar todas as etapas, desbloquear a máscara e começar de novo. +AutoTracker.Info.Target1=O alvo é onde as etapas serão marcadas em relação à máscara. Mova o alvo, arrastando-o. +AutoTracker.Info.Target2=Dica: Você pode ajustar a posição do alvo, mesmo depois que as etapas foram marcadas. As etapas existentes irão automaticamente mover-se junto com o alvo. +AutoTracker.Info.TargetLocked=O alvo está em uso e vinculado as posições das etapas existentes Movê-lo irá mover as outras etapas também. +AutoTracker.Info.Settings1=Valores acima do nível de aceitação mostrados serão marcadas automaticamente. +AutoTracker.Info.Settings2=Dica: reduzir o nível de aceitação acelera o processo de marcação, mas aumenta a probabilidade de erros. +AutoTracker.Info.Search1=O retângulo apresentado será procurado como a melhor opção. Mova ou redimensione a área de pesquisa, arrastando seu centro ou com o puxador, respectivamente. +AutoTracker.Info.Search2=Dica: A área de pesquisa não precisa ser grande. Depois de encontrar os dois primeiros pontos sequências, um algoritmo de antecipação movimenta a área de pesquisa para corresponder às posições previstas. +AutoTracker.Info.Frame=Quadro +AutoTracker.Info.Match=Os pontos apresentados foram marcados automaticamente na posição do alvo. +AutoTracker.Info.Possible=Uma possível correspondência foi encontrada na área de pesquisa mostrada. Suas opções são: +AutoTracker.Info.NoMatch=Nenhuma ocorrência foi encontrada na área de pesquisa mostrada. Suas opções são: +AutoTracker.Info.Outside=A área de pesquisa está fora da imagem. Suas opções são: +AutoTracker.Info.Accepted=A correspondência exibida foi aceita pelo usuário. +AutoTracker.Info.MarkedByUser=A etapa foi marcada manualmente pelo usuário. +AutoTracker.Info.NoVideo=A Trajetória Automática requer um vídeo. Por favor, importar um vídeo ou fechar esta Trajetória Automática. +AutoTracker.Info.Height=altura +AutoTracker.Info.Width=largura +AutoTracker.Info.Accept=--aceitar a correspondência +AutoTracker.Info.Retry=--mova a área de pesquisa e procure novamente +AutoTracker.Info.Mark=--shift+clique para marcar a etapa manualmente +AutoTracker.Info.Skip=--ignorar esse quadro e continue a trajetória +AutoTracker.Info.Reset=--reinicie e comece novamente com uma máscara modificada +AutoTracker.Info.MatchScore=correspondência de valores +AutoTracker.Dialog.MaskLocked.Title=Máscara Bloqueada +PointMass.Cursor.Autotrack.Description=Cursor da Trajetória Automática +VideoPlayer.StartFrame.Hint=arraste para definir o quadro inicial +VideoPlayer.EndFrame.Hint=arraste para definir o quadro final +VideoPlayer.Slider.Hint=arraste para fazer a varredura através do vídeo +FileDropHandler.Dialog.BadFile.Message=não pôde ser carregado. +FileDropHandler.Dialog.BadFile.Title=Arquivo não reconhecido + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Aplicar +DynamicParticle.Dialog.Delete.Message=Deletando esta partícula, ela será removida do sistema. Deseja continuar? +DynamicParticle.Dialog.Delete.Title=Sistema Dinâmico +DynamicParticle.System.In=em +DynamicSystem.Empty=vazio +DynamicSystem.Force.Name.Internal=interno +DynamicSystem.ForceFunction.R.Description=Componente de força radial interna +DynamicSystem.ForceFunction.Theta.Description=Componente de força tangencial interna +DynamicSystem.MenuItem.Inspector=Selecionar Partículas... +DynamicSystem.Name=Sistema Dinâmico de Dois Corpos +DynamicSystem.New.Name=sistema +DynamicSystem.Parameter.Of=de +DynamicSystem.Parameter.RelativeTo=relativo à +DynamicSystem.Parameter.Name.Relative=relativo +DynamicSystem.Parameter.ParticleMass.Description=Massa de +DynamicSystem.Parameter.Mass.Description=A massa total deste sistema +DynamicSystemInspector.Border.Title=Partícula +DynamicSystemInspector.Title=Sistema de Dois-Corpos +DynamicSystemInspector.Button.Change=Alterar para... +DynamicSystemInspector.ParticleName.None=(nenhum) +TMenuBar.MenuItem.Clone=Clone +TMenuBar.MenuItem.TwoBody=Sistema de Dois-Corpos +TrackerPanel.DataBuilder.Dropdown.Tooltip=Trajetória selecionada atualmente +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sincronizar Eixos Verticais +TrackControl.Button.Trace.ToolTip=Exibir/Esconder Trajetórias +TToolBar.Button.Open.Tooltip=Abrir um vídeo ou arquivo Tracker em uma nova aba +TToolBar.Button.Save.Tooltip=Salvar aba atual no arquivo +TToolBar.Button.SelectTrack=Selecionar +TToolBar.Button.SelectTrack.Tooltip=Selecionar uma trajetória existente +TTrack.MenuItem.ClearSteps=Limpar Dados +PointMass.MenuItem.Position=Posição +TMenuBar.MenuItem.Empty=(Vazio) +TTrackBar.Button.Memory=memória em uso: +TTrackBar.Button.Memory.Tooltip=Monitor e gerente de memória +TTrackBar.Memory.PopupItem.Launch=Lançar Tracker com memória +TButton.Track.ToolTip=Definir propriedades de +Tracker.Dialog.OutOfMemory.Message1=O Tracker ficou sem memória. +Tracker.Dialog.OutOfMemory.Message2=Clique no botão de memória para opções. +Tracker.Dialog.OutOfMemory.Title=Sem Memória + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Olhar à frente +AutoTracker.Label.Original=Inicial +AutoTracker.Label.NoMask=nenhum +AutoTracker.Label.Rate=Taxa de Evolução: +AutoTracker.Info.Mask3=Dica: o modelo não precisa ser grande nem incluir todo o objeto. Um recurso que é único e inclui bordas de alto contraste, geralmente funciona melhor. +AutoTracker.Wizard.Checkbox.XAxis=Eixo-X somente +AutoTracker.Info.SearchOnAxis1=O eixo x dentro do retângulo será mostrado como a melhor opção. Mova ou redimensione a área de pesquisa, arrastando seu centro ou o puxador, respectivamente. +AutoTracker.Info.PossibleOnAxis=Uma possível correspondência foi encontrada ao longo do eixo-x na área de pesquisa apresentada. Suas opções são: +AutoTracker.Info.NoMatchOnAxis=Nenhuma ocorrência foi encontrada ao longo do eixo-x na área de pesquisa apresentada. Suas opções são: +AutoTracker.Info.RetryOnAxis=--mova a área de pesquisa ou eixo-x e procure novamente +AutoTracker.Wizard.Button.Delete=Eliminar Este Ponto +AutoTracker.Wizard.Button.DeleteMore=Eliminar este e demais pontos mais tarde +Button.Define.Tooltip=Defina funções das variáveis da coluna existente +Calibration.Label.Point=ponto +CalibrationStick.Hint=defina comprimento ou arraste o fim para alterar a escala, defina o ângulo para alterar o eixo de inclinação +CalibrationStick.End.Hint=arraste para alterar a escala +CalibrationStick.New.Name=Bastão de Calibração +CalibrationTapeMeasure.New.Name=fita de calibração +CalibrationTapeMeasure.Readout.Magnitude.Hint=clique para inserir um comprimento conhecido às unidades de medida +CalibrationTapeMeasure.Hint=defina o comprimento para alterar a escala, defina o ângulo para a alterar a inclinação do eixo +DynamicSystem.Data.Description.0=distância relativa entre as partículas +DynamicSystem.Data.Description.1=ângulo relativo +DynamicSystem.Data.Description.2=velocidade radial relativa +DynamicSystem.Data.Description.3=velocidade angular relativa +ExportDataDialog.Subtitle.Table=Tabela de Dados +ExportDataDialog.Subtitle.Content=Células +ExportDataDialog.Subtitle.Format=Formatar Números +ExportDataDialog.Subtitle.Delimiter=Delimitador +ExportDataDialog.Title=Exportar Dados +ExportDataDialog.Delimiter.Add=Adicionar... +ExportDataDialog.Delimiter.Remove=Remover... +ExportDataDialog.Content.AllCells=Todas as Células +ExportDataDialog.Content.SelectedCells=Selecionar Células +ExportDataDialog.MenuItem.RemoveDelimiter=Remover delimitador personalizado +ExportDataDialog.Chooser.SaveData.Title=Salvar Dados Como +ExportVideoDialog.Button.SaveAs=Salvar Como... +ExportVideoDialog.Button.FullSize=Tamanho Original +ExportVideoDialog.Button.DrawnSize=Como desenhado +ExportVideoDialog.Content.VideoOnly=Somente Vídeo +ExportVideoDialog.Content.VideoAndGraphics=Vídeo e gráficos +ExportVideoDialog.Content.GraphicsOnly=Somente Gráficos +ExportVideoDialog.Title=Exportar Vídeo +ExportVideoDialog.Label.ClipSettings=Ferramentas de Corte do Vídeo +ExportVideoDialog.Subtitle.Size=Tamanho +ExportVideoDialog.Subtitle.Content=Conteúdo +ExportVideoDialog.Subtitle.View=Visualizar +ExportVideoDialog.Subtitle.Format=Formatar +ExportVideoDialog.Complete.Message1=O vídeo foi gravado como +ExportVideoDialog.Complete.Message2=Você deseja abri-lo no Tracker agora? +ExportVideoDialog.Complete.Title=Exportação Concluída +ExportVideoDialog.VideoSize=tamanho do vídeo +ExportVideoDialog.MatSize=tamanho da esteira +ExportVideo.Dialog.HiddenPlots.Message=As parcelas devem ser totalmente visíveis para exportação. +ExportVideo.Dialog.HiddenPlots.Title=Visualização incompleta +Footprint.DoubleTarget=mira dupla +Footprint.BoldDoubleTarget=mira dupla em negrito +OffsetOrigin.MenuItem.Fixed=Coordenadas gerais fixas +ParticleModel.Dialog.Offscreen.Message1=Algumas etapas do modelo estão vazias porque eles são muito fora da tela. +ParticleModel.Dialog.Offscreen.Message2=Para corrigir isso, altere o modelo ou redimensione o vídeo. +ParticleModel.Dialog.Offscreen.Title=Fora dos limites +PrefsDialog.Tab.Configuration.Title=Configuração +PrefsDialog.Memory.BorderTitle=Tamanho da Memória +PrefsDialog.Tab.General.Title=Outro +PrefsDialog.RecentFiles.BorderTitle=Abrir Menu de recentes +PrefsDialog.Label.RecentSize=Arquivo de contagem +PrefsDialog.Hints.BorderTitle=Dicas +PrefsDialog.Button.Relaunch=Relançar Agora +PrefsDialog.Button.ClearRecent=Limpar +PrefsDialog.Checkbox.DefaultSize=Usar padrão +PrefsDialog.Checkbox.HintsOn=Mostrar as dicas como padrão +PrefsDialog.Tab.Video.Title=Vídeo +PrefsDialog.VideoPref.BorderTitle=Mecanismo de Vídeo +PrefsDialog.Button.Xuggle=Xuggle (recomendado) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Gerenciamento de memória indisponível quando Web Start é utilizado. +PrefsDialog.Dialog.WebStart.Title=Modo Web Start +PrefsDialog.LookFeel.BorderTitle=Imagem e Impressão +PrefsDialog.Language.BorderTitle=Idioma +PrefsDialog.Upgrades.BorderTitle=Verificar Atualizações +PrefsDialog.Tab.Runtime.Title=Tempo de execução +PrefsDialog.Tab.Display.Title=Exibir +PrefsDialog.Language.Default=padrão +PrefsDialog.Upgrades.Always=Todas as Vezes +PrefsDialog.Upgrades.Weekly=Semanalmente +PrefsDialog.Upgrades.Monthly=Mensamente +PrefsDialog.Upgrades.Never=Nunca +PrefsDialog.Button.CheckForUpgrade=Verificar Agora +PrefsDialog.Xuggle.Speed.BorderTitle=Reprodução de Vídeo +PrefsDialog.Xuggle.Slow=Suave (pode ser lenta) +PrefsDialog.Xuggle.Fast=Rápida (pode ser grosseira) +PrefsDialog.CalibrationTool.BorderTitle=Ferramenta de Calibragem Padrão +Protractor.Name=Transferidor +Protractor.New.Name=transferidor +Protractor.Hint=arraste as extremidades para medir ângulos +Protractor.Label.Angle=ângulo +Protractor.Field.Angle.Tooltip=ângulo entre as extremidades do transferidor +Protractor.Vertex.Name=vértice +Protractor.Vertex.Hint=arraste para mover o vértice +Protractor.End.Name=extremidade final +Protractor.End.Hint=arraste para rotacionar a extremidade +Protractor.Handle.Name=puxador +Protractor.Handle.Hint=arraste para mover o transferidor +Protractor.Rotator.Name=rotor +Protractor.Rotator.Hint=arraste para rotacionar o transferidor +Protractor.Readout.Name=leitura +Protractor.Readout.Hint=ângulo entre as extremidades do transferidor +ProtractorFootprint.Circle3=círculo pequeno +ProtractorFootprint.Circle5=círculo grande +ProtractorFootprint.Circle3Bold=círculo pequeno em negrito +ProtractorFootprint.Circle5Bold=círculo grande em negrito +Stick.Name=Bastão de Medição +Stick.New.Name=bastão de medição +TableTrackView.MenuItem.Unformatted=Precisão total +TableTrackView.MenuItem.Formatted=Como formatado +TableTrackView.Menu.SetDelimiter=Definir Delimitador +TableTrackView.MenuItem.AddDelimiter=Adicionar... +TableTrackView.MenuItem.RemoveDelimiter=Remover... +TableTrackView.Dialog.CustomDelimiter.Message=Digite uma nova sequência delimitadora: +TableTrackView.Dialog.CustomDelimiter.Title=Adicionar Delimitador +TableTrackView.Header.Tooltip=Clique para ordenar ou duplo clique para selecionar a coluna +TableTrackView.MenuItem.CopySelectedData=Copie os dados selecionados +TableTrackView.Dialog.RemoveDelimiter.Message=Selecione o delimitador a ser removido: +TableTrackView.Dialog.RemoveDelimiter.Title=Remover Delimitador +TableTrackView.Radians.Tooltip=em radianos +TableTrackView.Degrees.Tooltip=em graus +TableTrackView.RadiansPerSecond.Tooltip=em radianos/s +TableTrackView.DegreesPerSecond.Tooltip=em graus/s +TableTrackView.RadiansPerSecondSquared.Tooltip=em radianos/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=em graus/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Apagar Função de Dados +TActions.Action.SaveFrame=Saval Tabset Como... +TActions.AboutVideo=Propriedades... +TActions.Dialog.AboutVideo.Title=Propriedades de Vídeo +TActions.Dialog.AboutVideo.Type=Modelo +TActions.Dialog.AboutVideo.Size=Dimensões +TActions.Dialog.AboutVideo.Length=Comprimento +TActions.Dialog.AboutVideo.Frames=quadros +TActions.Dialog.AboutVideo.Seconds=segundos +TActions.Dialog.AboutVideo.FrameRate=Taxa de Quadros +TActions.Dialog.AboutVideo.FramesPerSecond=qps +TActions.Dialog.AboutVideo.Path=Trajetória +TActions.Action.ImportTRK=Arquivo Tracker... +TActions.Action.ProtractorVisible=Visível +TapeMeasure.MenuItem.FixedLength=Comprimento Fixo +TextTView.Label.NoTab=Exibir texto e páginas em HTML aqui. +TextTView.NewTab.Text1=Dê um duplo clique para editar o texto ou título. Botão direito do mouse para mais opções. +TextTView.NewTab.Text2=Para exibir uma página HTML, digite a URL ou clique com o botão direito do mouse para abrir um arquivo. +TextTView.NewTab.Title=Sem Titulo +TextTView.Dialog.TabTitle.Title=Definir Título +TextTView.MenuItem.OpenHTML=Abrir HTML... +TextTView.MenuItem.SetTitle=Definir Título... +TextTView.Button.NewTab=Novo +TextTView.TextEdit.Description=Texto +TFrame.Dialog.FileNotFound.Message=O arquivo não pôde ser encontrado: +TFrame.Dialog.FileNotFound.Title=Arquivo não encontrado +TFrame.View.Text=Visualizar Texto/HTML +TFrame.View.Main=Visualização Principal +TMenuBar.Menu.OpenRecent=Abrir Recente +TMenuBar.Menu.Import=Importar +TMenuBar.Menu.Export=Exportar +TMenuBar.MenuItem.Video=Vídeo... +TMenuBar.MenuItem.Data=Arquivo de Dados... +TMenuBar.Menu.CopyObject=Copiar Objetos +TMenuBar.MenuItem.Coords=Sistema de Coordenadas +TMenuBar.MenuItem.VideoClip=Cortes do Vídeo +TMenuBar.Menu.MeasuringTools=Ferramentas de Medidas +TMenuBar.Menu.AngleUnits=Unidades de ângulo +TMenuBar.MenuItem.Degrees=Graus +TMenuBar.MenuItem.Radians=Radianos +Tracker.Dialog.NoXuggle.Title=Xuggle não encontrado +Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplataforma de mecanismo vídeo) não está instalada. +Tracker.Dialog.NoXuggle.Message2=Download Xuggle de http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=Sobre Xuggle... +Tracker.Dialog.AboutXuggle.Title=Sobre Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Versão do Xuggle +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoVideoEngine.Message1=Nenhum mecanismo de vídeo foi encontrado! Sem nenhum, o Tracker pode +Tracker.Dialog.NoVideoEngine.Message2=abrir apenas imagens, sequências de imagens e gifs animados. +Tracker.Dialog.NoVideoEngine.Message3=Para instalar o Xuggle, mecanismo de vídeo preferido pelo Tracker em +Tracker.Dialog.NoVideoEngine.Message4=todas as plataformas, faça o download da última versão do instalador do Tracker. +Tracker.Dialog.NoVideoEngine.Title=Falta de Mecanismo de Vídeo +Tracker.Dialog.NoXuggle.Message1=o Xuggle, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. +Tracker.Dialog.NoXuggle.Message2=Para instalar o Xuggle, faça o download da última versão do instalador do Tracker +Tracker.Dialog.NoXuggle.Title=faltando o Xuggle +Tracker.About.DefaultLocale=Local padrão +Tracker.About.CurrentLanguage=Idioma +Tracker.Dialog.InsufficientMemory.Title=Memória Insuficiente +Tracker.Dialog.InsufficientMemory.Message=O tamanho da memória requerida é muito grande. +TrackerIO.Dialog.TabMustBeSaved.Message1=Aba +TrackerIO.Dialog.TabMustBeSaved.Message2=deve ser salva como um arquivo de tracker para ser incluída no tabset. +TrackerIO.Dialog.TabMustBeSaved.Message3=Deseja salvá-lo? +TrackerIO.Dialog.TabMustBeSaved.Title=Aba não salva +TrackerIO.Dialog.NoTabs.Message=Não há abas para serem salvas! +TrackerIO.Dialog.NoTabs.Title=Esvaziar Tabset +TrackerIO.Dialog.SaveTabset.Title=Salvar Tabset +TrackerIO.Dialog.SaveTab.Title=Salvar Aba +TrackerIO.Delimiter.Tab=Aba +TrackerIO.Delimiter.Space=Espaço +TrackerIO.Delimiter.Comma=Vírgula +TrackerIO.Delimiter.Semicolon=Ponto e vírgula +TrackerIO.VideoAndDataFileFilter.Description=Vídeos e arquivos do Tracker +TrackerPanel.Dialog.Version.Message1=Você está abrindo um arquivo criado com o Tracker +TrackerPanel.Dialog.Version.Message2=o que pode significar que +TrackerPanel.Dialog.Version.Message3=características ausentes na versão que você está executando +TrackerPanel.Dialog.Version.Message4=está disponível na última versão do Tracker. +TrackerPanel.Dialog.Version.Title=Incompatibilidade de Versão +TrackerPanel.Label.ModelStart=Início +TrackerPanel.Label.ModelEnd=Fim +TrackerPanel.Spinner.ModelStart.Tooltip=Defina o quadro inicial para este modelo +TrackerPanel.Spinner.ModelEnd.Tooltip=Defina o quadro final para este modelo +TToolbar.Button.ProtractorVisible.Tooltip=Mostrar ou ocultar o transferidor +TToolbar.Button.AxesVisible.Tooltip=Mostrar ou ocultar os eixos de coordenadas +TToolBar.Button.TrackControl.Tooltip=Mostrar ou ocultar o controle de trajetória +TTrack.Dialog.StepSizeWarning.Message1=Atenção: algumas trajetórias foram marcadas em um tamanho maior do que uma outra etapa, ignorando quadros sem marcação. +TTrack.Dialog.StepSizeWarning.Message2=Alterar o tamanho da etapa, provavelmente resultará em lacunas no conjunto de dados. +TTrack.Dialog.StepSizeWarning.Message3=Velocidades e acelerações em torno das lacunas não podem ser determinadas até que todas as etapas sejam marcadas. +TTrack.Dialog.StepSizeWarning.Title=Aviso +TTrack.Dialog.SkippedStepWarning.Message1=Atenção: pulando etapas ao marcar posições deixará lacunas no conjunto de dados. +TTrack.Dialog.SkippedStepWarning.Title=Aviso +TTrack.Dialog.SkippedStepWarning.Checkbox=Não mostrar isto novamente +TTrack.Locked.Hint=bloqueado +TTrack.AngleField.Radians.Tooltip=ângulo em radianos +TTrack.AngleField.Degrees.Tooltip=ângulo em graus +TTrack.AngleField.Popup.Radians=Alternar para Radianos +TTrack.AngleField.Popup.Degrees=Alternar para Graus +TTrackBar.Memory.Menu.SetSize=Definir o tamanho da memória... +TTrackBar.Button.Version=Agora disponível: versão +TTrackBar.Popup.MenuItem.Upgrade=Atualizar Agora... +TTrackBar.Popup.MenuItem.Ignore=Ignorar +XuggleVideo.MenuItem.SmoothPlay=Executar Suavemente (poderá ser lento) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Fita de Calibração +CircleFootprint.Circle=círculo +CircleFootprint.FilledCircle=círculo preenchido +CircleFootprint.Dialog.Title=Círculo Footprint +CircleFootprint.Dialog.Label.Radius=Radianos +CircleFootprint.Dialog.Checkbox.Bold=Negrito +CircleFootprint.Dialog.Checkbox.CenterSpot=Ponto Central +LineProfile.Hint.Marking=Arreste o Mouse para marcar a linha de contorno +PageTView.Button.Page=Página +PageTView.MenuItem.ClosePage=Fechar Página +PointMass.Hint.Marking=clique com o mouse para marcar, aperte Enter para clonar o passo anterior +PrefsDialog.Dialog.NewVersion.Title=Atualizações +PrefsDialog.Dialog.NewVersion.Message1=Versão +PrefsDialog.Dialog.NewVersion.Message2=disponível em +PrefsDialog.Dialog.NewVersion.None.Message=Sem novas versões disponíveis no momento. +RGBRegion.Hint.Marking=clique com o mouse para marcar o centro da região +TMenuBar.MenuItem.Restore=Restaurar Views +TrackControl.StretchVectors.None=Sem extensãoo +TViewChooser.Maximize.Tooltip=Maximizar esta view +TViewChooser.Restore.Tooltip=Restaurar view +Vector.Hint.Marking=arraste o mouse, aperte Enter para clonar o passo anterior +WorldTView.Button.World=Mundo + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Avisos +PrefsDialog.Checkbox.WarnIfNoEngine=Sem mecanismos de Vídeo +PrefsDialog.Checkbox.WarnIfXuggleError=Erros do Xuggle +PropertiesDialog.Title=Propriedades +PropertiesDialog.Label.Author=Autor +PropertiesDialog.Label.Contact=Contato +TActions.Action.Properties=Propriedades... +TActions.Action.OpenBrowser=Abrir Navegador de Biblioteca... +TFrame.Progress.Xuggle=Xuggle carregando imagem +TFrame.Progress.ClickToCancel=(clique para cancelar) +TFrame.Dialog.StalledVideo.Title=Erro ao carregar Vídeo +TFrame.Dialog.StalledVideo.Message0=O vídeo travou durante o carregamento. Isto pode ser temporário. +TFrame.Dialog.StalledVideo.Message1=Escolher para o carregamento ou continuar esperando. +TFrame.Dialog.StalledVideo.Message2=Outras opções para abrir este vídeo são: +TFrame.Dialog.StalledVideo.Message3=1. Use o software de conversão de Vídeo para converter em um formato diferente. +TFrame.Dialog.StalledVideo.Message4=2. Selecionar QuickTime em um selecionador de vídeo ou caixa de preferências. +TFrame.Dialog.StalledVideo.MessageMac=2. Abrir o Tracker em uma Java VM 32-bit e abrir vídeos com o QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Parar +TFrame.Dialog.StalledVideo.Button.Wait=Esperar +Tracker.Dialog.NoVideoEngine.Checkbox=Não mostrar isto novamente +TrackerIO.ZipFileFilter.Description=Arquivos ZIP +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle encontrou o seguinte erro ao abrir este vídeo: +TrackerIO.Dialog.ErrorFFMPEG.Message2= Nem todos os erros são fatais. Para todas as mensagens de erro, escolha Ajuda | Log de mensagem +TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o Xuggle falhar, você deve habilitar o QuickTime para abrir vídeos +TrackerIO.Dialog.ErrorFFMPEG.MessageMac= Nota: No Mac OSX isso requer executar o Tracker em Java VM 32-bit. +TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no Xuggle +TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, habilitar os avisos Xuggle na janela de prefêrencias (Editar|Preferências). +TToolBar.Button.OpenBrowser.Tooltip=Abrir a Biblioteca Digital OSP + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=Arquivo não encontrado +TFrame.Dialog.NoTRKInComPADRE.Message=Nenhum arquivo Tracker foi encontrado + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Cinemática da Partícula +DynamicParticle.Builder.Title=Dinâmica da Partícula (Cartesiano) +DynamicParticlePolar.Builder.Title= Dinâmica da Partícula (Polar) +DynamicSystem.Builder.Title= Dinâmica do Sistema (Interno) +PropertiesDialog.Button.CopyFilePath=Copiar caminho do arquivo +PropertiesDialog.Button.CopyVideoPath=Copiar Caminho do Vídeo +PropertiesDialog.Tab.TrackerFile=Arquivo Tracker +PropertiesDialog.Tab.Metadata=Metadados +PropertiesDialog.Header.Property=Propriedades +PropertiesDialog.Header.Value=Valor +TActions.Action.OpenURL=Abrir URL... +TActions.Dialog.OpenURL.Title=Abrir URL +TActions.Dialog.OpenURL.Message=Digitar a URL de vídeo da web, de Arquivo Tracker ou Arquivo Tracker Zipado +TActions.Dialog.AboutVideo.Name=Nome + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Arquivos Web na Cache +PrefsDialog.Button.ClearCache=Limpar + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift+clique para remarcar posição de destaque +PointMass.Remarking.Hint=clique com o mouse para remarcar a posição +PointMass.PositionSelected.Hint=arraste ou digite a posição na barra de ferramenta +PointMass.VectorSelected.Hint=arraste para mover +Vector.Remark.Hint=shift+clique para remarcar o ponto destacada +Vector.TipSelected.Hint=arraste ou insira componentes na barra de ferramentas +Vector.HandleSelected.Hint=arraste para mover +Vector.Remarking.Hint=clique com o mouse para remarcar o ponto +AutoTracker.Label.Search=Pesquisar +AutoTracker.Label.Target=Alvo +AutoTracker.Label.Frame=Quadro +AutoTracker.Label.Point=Ponto +AutoTracker.Label.Template=Modelo +AutoTracker.Label.Track=Track +AutoTracker.Label.Match=Correspondência +AutoTracker.Label.NoTemplate=Sem modelo +AutoTracker.Label.EvolutionRate=Taxa de Evolução +AutoTracker.Label.Automark=Auto Marcação +AutoTracker.Info.Instructions=Clique no botão Pesquisar para buscar por uma correspondência na área de pesquisa mostrada. +AutoTracker.Info.KeyFrame.Instructions1=Este quadro chave define o modelo e alvo mostrados. Clique no botão Pesquisar para procurar por correspondência para o modelo. +AutoTracker.Info.KeyFrame.Instructions2=Você deve arrastar o alvo, modelo ou área de pesquisa, para mover ou redimensionar. +AutoTracker.Info.MouseOver.Instructions= Passe o mouse sobre os controles acima para saber mais sobre as configurações e ajustes. +AutoTracker.Info.Mask1=O modelo é a imagem a ser buscada(correspondência). Começa com um quadro chave e evolui para se adaptar às variações de formar e cor. +AutoTracker.Info.Mask2=O nível de Auto Marcação é o menor valor de correspondência necessário para ocorrer a marcação automática. +AutoTracker.Info.Mask.Instructions=Mova ou redimensione o modelo arrastando a borda ou canto (apenas teclas do quadro chave). Ajuste a taxa de evolução e níveis de Auto Marcação utilizando os spinners. +AutoTracker.Info.Mask.Tip= Baixos Níveis de Auto Marcação podem resultar em marcações falsas - experimente aumentar a taxa de evolução AutoTracker.Info.Search=A área de pesquisa digitalizada para melhorar a correspondência. +AutoTracker.Info.SearchOnAxis=A Coordenada X na área de pesquisa é inspecionada para a melhor correspondência. +AutoTracker.Info.Search.Instructions=Mova ou redimensione a área de pesquisa, arrastando o canto ou borda. Ajuste a coordenada X e pesquise opções de Olhar à Frente, clicando nas respectivas opções. +AutoTracker.Info.Search.Tip=Na maioria dos casos a área de pesquisa não precisa ser grande. A opção olhar à frente moverá automaticamente a área de pesquisa para mas possíveis posições de correspondência. +AutoTracker.Info.Target=O alvo está na posição onde o ponto desejado esta marcado. +AutoTracker.Info.Target.Instructions=Arraste o alvo para movê-lo (teclas do quadro chave apenas). Escolha o caminho alvo e aponte para as listas suspensas. +AutoTracker.Info.Title.Settings=Configurações +AutoTracker.Info.Title.Tip=Conselho +AutoTracker.Info.SelectTrack=Por favor, seleciona ou crie a pista e ponto em que deseja aplicar a Pesquisa Automática. +AutoTracker.Info.OutsideXAxis=A coordenada X não passa através da área de pesquisa. As opções são: +AutoTracker.Info.NewKeyFrame=--volte atrás e altere a taxa de evolução ou shift+ctrl+clique para definir um novo quadro chave +AutoTracker.Info.Replace=--aceite a correspondência e substitua o ponto existente +AutoTracker.Info.Keep=--Conservar o ponto existente +AutoTracker.Info.PossibleReplace=Uma possível correspondência foi encontrada para substituir o ponto existente. As opções são: +AutoTracker.Wizard.Button.Accept=Aceitar +AutoTracker.Wizard.Button.Stop=Parar +AutoTracker.Wizard.Button.Skip=Pular +AutoTracker.Wizard.Button.Replace=Substituir +AutoTracker.Wizard.Button.Keep=Manter +AutoTracker.Wizard.Button.Search=Pesquisar +AutoTracker.Wizard.Button.SearchThis=Pesquisar Este +AutoTracker.Wizard.Button.SearchNext=Pesquisar Próximo +AutoTracker.Wizard.Button.Delete=Deletar +AutoTracker.Wizard.Button.ShowKeyFrame=Mostrar Quadro Chave +AutoTracker.Wizard.Button.DeleteKeyFrame=Deletar Quadro Chave +AutoTracker.Wizard.Checkbox.LookAhead=Olhar à Frente +AutoTracker.Wizard.Checkbox.XAxis=Coordenada X apenas +AutoTracker.Wizard.Menuitem.DeleteThis=Este Ponto +AutoTracker.Wizard.Menuitem.DeleteLater=Últimos Pontos +AutoTracker.Wizard.Menuitem.DeleteAll=Todos Pontos +TToolBar.Button.AutoTracker.Tooltip=Mostrar ou Ocultar a Pesquisa Automática +MainTView.Popup.MenuItem.ZoomIn=Zoom In (Aproximar) +MainTView.Popup.MenuItem.ZoomOut=Zoom Out (Afastar) +MainTView.Popup.MenuItem.ZoomToFit=Zoom para Fit +TrackerIO.Dialog.DurationVaries.Title=Variável Quadro de Duração +TrackerIO.Dialog.DurationVaries.Message1=Este vídeo possui quadros com durações diferentes da média por +TrackerIO.Dialog.DurationVaries.Message2=Para precisão nas velocidades e acelerações, exclua os quadros de +TrackerIO.Dialog.DurationVaries.Message3=os cálculos, estão definindo o quadro inicial e o quadro final do vídeo. +TrackerIO.Dialog.DurationVaries.Message4=Quadros para Exclusão: +TrackerIO.Dialog.DurationVaries.Message5=Duração média e taxa de quadros, se a exclusão ocorrer: +TFrame.Dialog.LibraryError.Title=Erro +TFrame.Dialog.LibraryError.Message=Não foi carregado um recurso para o nó. + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift+clique para marcar +PrefsDialog.Label.Path=Caminho +PrefsDialog.Checkbox.ClearCacheOnExit=Limpar na Saída +PrefsDialog.FileChooser.Title.Cache=Definir Cache +PrefsDialog.FileFilter.Directories=Pastas +Tracker.Action.AboutThreads=Sobre Threads... +PrefsDialog.JRE.BorderTitle=Máquina Virtual Java +PrefsDialog.FileChooser.Title.JRE=Definir a Java VM +PrefsDialog.FileFilter.JRE=Pastas e Java VMs +PrefsDialog.Version.BorderTitle=Versão do Tracker +PrefsDialog.Version.Default=padrão +PrefsDialog.Tab.ClearCacheOnExit=Limpar na Saída +PrefsDialog.Run.BorderTitle=Programas executados na inicialização +PrefsDialog.FileChooser.Title.Run=Selecionar arquivo executável +PrefsDialog.Button.Save=Salvar +Tracker.Readme=Tracker LEIAME +Tracker.Readme.NotFound=LEIAME, Arquivo não encontrado +Popup.MenuItem.Algorithm=Algoritmos... +AlgorithmDialog.Button.FiniteDifference=Diferença Finita +AlgorithmDialog.Button.BounceDetect=Detector de Pulso +AlgorithmDialog.TitledBorder.Choose=Selecionar o algoritmo utilizado para calcular velocidade e aceleração: +AlgorithmDialog.Title=Algoritmos +AlgorithmDialog.FiniteDifference.Message1=Este é o algoritmo padrão. +AlgorithmDialog.FiniteDifference.Message2=Velocidade: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Aceleração: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Este algoritmo suaviza velocidades e acelerações mas também detecta mudanças bruscas na velocidade. +AlgorithmDialog.BounceDetect.Message2=Cuidado: pode produzir artefatos, para mais informações: +AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ +TMenuBar.Menu.Diagnostics=Diagnósticos + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=XML inválido +Tracker.Dialog.Invalid.Message=O Arquivo no pode ser lido. +TrackPlottingPanel.Popup.Menu.CompareWith=Comparar com +TrackerPanel.DataBuilder.TrackType.Unknown=desconhecido +TrackerPanel.DataBuilder.Button.Load.Tooltip=Carregar funções de dados para um arquivo XML +TrackerPanel.DataBuilder.Button.Save.Tooltip=Salvar funções de dados em um arquivo XML +TrackerPanel.DataBuilder.Load.Title=Carregar funções de dados +TrackerPanel.DataBuilder.Load.Message=Selecionar funções de dados para carregar: +TrackerPanel.DataBuilder.Save.Title=Salvar funções de dados +TrackerPanel.DataBuilder.Save.Message=Selecionar funções para salvar: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Carregar todas +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Carregar apenas +TrackerPanel.DataBuilder.Dialog.Load.Title=Seleção de Trajetória +TrackerPanel.DataBuilder.Dialog.Load.Message=Você deseja carrear as funções em todas as trajetórias semelhantes +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Tipo de Trajetória Incorreto +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=O arquivo define funções de dados para trajetórias do tipo +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Não podem ser carregados em tipo +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Tipo Incorreto +TrackerPanel.DataBuilder.Dialog.WrongType.Message=O arquivo não define funções de dados. +TToolbar.Button.Refresh=Atualizar dados e views + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=A nova aba foi salva como +ExportTRKDialog.Complete.Message2=Deseja abrir isto com o Tracker agora? +ExportTRKDialog.Complete.Title=Exportação Completa +ExportTRKDialog.Title=Exportar Aba Cortada +ExportTRKDialog.Message1=This (1) exporta o vídeo, (2) converte os dados da Aba para corresponder ao vídeo exportado (3) salva a aba convertida como um novo arquivo Tracker. +ExportTRKDialog.Message2=Os arquivos de Tracker e Vídeo são salvos na mesma pasta com o mesmo nome, porém com extensões diferentes. +TMenuBar.MenuItem.TabClip=Aba Cortada +TrackerIO.Dialog.DurationVaries.Button.SetClip=Clipe recomendado +TrackerIO.Dialog.DurationVaries.Start=Começo +TrackerIO.Dialog.DurationVaries.End=fim +TrackerIO.Dialog.DurationVaries.Recommended=Clipe recomendado +TMenuBar.Menu.CalibrationTools=Ferramentas de Calibração + +# Additions by Doug Brown 2012-05-07 +Protractor.Data.Description.0=tempo +Protractor.Data.Description.1=ângulo do transferidor +Protractor.Data.Description.2=comprimento do braço 1 +Protractor.Data.Description.3= comprimento do braço 2 +Protractor.Data.Description.4=número do passo +Protractor.Data.Description.5=número do quadro +TapeMeasure.Data.Description.0=tempo +TapeMeasure.Data.Description.1=comprimento +TapeMeasure.Data.Description.2=ângulo medido para a coordenada x +TapeMeasure.Data.Description.3=número do passo +TapeMeasure.Data.Description.4=número do quadro +AttachmentInspector.Title=Anexação finalizada +AttachmentInspector.Label.End=Fim +AttachmentInspector.Label.Vertex=Vértice +AttachmentInspector.Header.PointName=Nome +AttachmentInspector.Header.AttachedTo=Anexar para +MeasuringTool.MenuItem.Attach=Anexação Finalizada... +PerspectiveTrack.Corner=borda(canto) +ExportTRKDialog.Label.VideoFormat=Formato do Vídeo +PrefsDialog.LogLevel.BorderTitle=Mensagem de Log Startup + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=não encontrado +AutoTracker.Info.KeyFrame=Quadro Chave +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Este Frame Chave +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Esta Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Últimas Correspondências +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Trajetória Automática +Dialog.Button.Add=Adicionar +Dialog.Button.Remove=Remover +PrefsDialog.Button.ClearHost=Limpar Usuário +PrefsDialog.Button.ClearHost.Tooltip=deletar todos os arquivos associados com um usuário web do OSP cache +PrefsDialog.Button.ClearCache.Tooltip=deletar todos os arquivos do OSP cache +TActions.Action.SaveZip=Exportar ZIP +ThumbnailDialog.Title=Exportar Imagem em Miniatura +ThumbnailDialog.Settings.Title=Opções de Miniatura +ThumbnailDialog.Label.CurrentImage=Imagem Atual +ThumbnailDialog.Label.FrameNumber=quadro +ThumbnailDialog.Label.StepNumber=passo +ThumbnailDialog.View.VideoOnly=Apenas Vídeo +ThumbnailDialog.View.MainView=View Principal +ThumbnailDialog.View.WholeFrame=Quadro Completo +ThumbnailDialog.Format.PNG=Imagem PNG +ThumbnailDialog.Format.JPG=Imagem JPEG +ThumbnailDialog.Chooser.SaveThumbnail.Title=Salvar Miniatura +ThumbnailDialog.Subtitle.Image=Imagem +TMenuBar.MenuItem.Thumbnail=Imagem em Miniatura +TToolBar.Button.SaveZip.Tooltip=Exportar um arquivo ZIP para o Navegador da Biblioteca Digital OSP +TTrack.MenuItem.DeletePoint=Deletar Passo Selecionado +ZipResourceDialog.Title=Exportar para ZIP +ZipResourceDialog.Label.Format=Formato +ZipResourceDialog.Label.Title=Nome +ZipResourceDialog.Label.Description=Descrição +ZipResourceDialog.Label.Keywords=Senhas +ZipResourceDialog.Label.Link=Link Externo +ZipResourceDialog.Label.HTML=Fonte HTML +ZipResourceDialog.Complete.Message1=O arquivo ZIP foi salvo como +ZipResourceDialog.Complete.Message2=Você deseja Abrir isto no Tracker agora? +ZipResourceDialog.Complete.Title=Sucesso +ZipResourceDialog.Border.Title.Documentation=Documentação HTML +ZipResourceDialog.Border.Title.Video=Vídeo +ZipResourceDialog.Border.Title.Thumbnail=Miniatura +ZipResourceDialog.FileChooser.SaveZip.Title=Exportar ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Adicionar arquivo para ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Abrir Arquivo HTML +ZipResourceDialog.Button.AddFiles=Adicionar Arquivos +ZipResourceDialog.Button.ThumbnailSettings=Opções de Miniatura +ZipResourceDialog.Checkbox.TrimVideo=Cortar para Clipe +ZipResourceDialog.AddHTMLInfo.Title=Adicionar Arquivo HTML Info +ZipResourceDialog.AddHTMLInfo.Message1=Você deseja adicionar o arquivo de HTML Info +ZipResourceDialog.AddHTMLInfo.Message2=para os arquivos ZIP? +ZipResourceDialog.HTMLField.DefaultText=Se não for especificado, o arquivo será criado para o rascunho) +ZipResourceDialog.Dialog.AddFiles.Title=Adicionar Arquivos PDF e HTML +ZipResourceDialog.Tooltip.HTML=Caminho para o arquivo fonte HTML (se não, será criado um rascunho) +ZipResourceDialog.Tooltip.Author=Autores destes recursos +ZipResourceDialog.Tooltip.Title=Mostrar nome deste recurso (não nome do arquivo) +ZipResourceDialog.Tooltip.Description=Uma descrição útil deste recurso +ZipResourceDialog.Tooltip.Keywords=Uma lista de palavras chave para pesquisar no navegador DL +ZipResourceDialog.Tooltip.Contact=Informação de contato do Autor (instituição, email, site, etc). +ZipResourceDialog.Tooltip.Link=URL para um arquivo HTML externo com mais informações sobre este recurso +ZipResourceDialog.Tooltip.ThumbnailSettings=Mudar a miniatura, tamanho ou tipo do arquivo +ZipResourceDialog.Tooltip.AddFiles=Adicionar arquivo HTML e +PDF para o ZIP +ZipResourceDialog.Tooltip.TrimVideo=Checar para exportar o vídeo clip, desmarcar para usar o arquivo original de vídeo +ZipResourceDialog.Tooltip.LoadHTML=Usar um selecionador de arquivo para carregar um arquivo Info HTML diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties index 9643e807..b0102b22 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties @@ -1,1283 +1,1283 @@ -# This is the Slovak beta version of tracker.properties -# Translated by M.Han\u010dov\u00e1, J.Han\u010d - -Calibration.Name=Kalibra\u010dn\u00e9 body -Calibration.New.Name=kalibra\u010dn\u00e9 body -CenterOfMass.Name=\u0165a\u017eisko -CenterOfMass.New.Name=\u0165a\u017eisko -CenterOfMass.MenuItem.Inspector=Vyberte hmotnosti ... -CenterOfMassInspector.Title=\u0165a\u017eisko -CenterOfMassInspector.Border. title=Vyberte hmotnosti -ConfigInspector.Border.Title=po\u017eadovan\u00e9 vlastnosti -ConfigInspector.Title=Predvo\u013eby -ConfigInspector.Button.SaveAsDefault=Ulo\u017ei\u0165 ako predvolen\u00e9 -CoordAxes.Name=osi -CoordAxes.New.Name=osi -Dialog.Button.Cancel=Zru\u0161i\u0165 -Dialog.Button.OK=OK -Dialog.Button.Close=Zavrie\u0165 -Dialog.Button.All=V\u0161etky -Dialog.Button.None=\u017diadne -Dialog.Button.Copy=Kop\u00edrova\u0165 -Dialog.Button.Update=Aktualizova\u0165 -Dialog.Button.SelectAll=Vybra\u0165 v\u0161etko -Footprint.Diamond=koso\u0161tvorec -Footprint.BoldDiamond=zv\u00fdraznen\u00fd koso\u0161tvorec -Footprint.SolidDiamond=pln\u00fd koso\u0161tvorec -Footprint.Triangle=trojuholn\u00edk -Footprint.BoldTriangle=zv\u00fdraznen\u00fd trojuholn\u00edk -Footprint.SolidTriangle=pln\u00fd trojuholn\u00edk -Footprint.Circle=kruh -Footprint.BoldCircle=zv\u00fdraznen\u00fd kruh -Footprint.SolidCircle=pln\u00fd kruh -Footprint.VerticalLine=zvisl\u00e1 \u010diara -Footprint.BoldVerticalLine=zv\u00fdraznen\u00e1 zvisl\u00e1 \u010diara -Footprint.HorizontalLine=horizont\u00e1lna \u010diara -Footprint.BoldHorizontalLine=zv\u00fdraznen\u00e1 horizont\u00e1lna \u010diara -Footprint.Crosshair=ter\u010d\u00edk -Footprint.BoldCrosshair=zv\u00fdraznen\u00fd ter\u010d\u00edk -Footprint.SimpleAxes=jednoduch\u00e9 osi -Footprint.BoldSimpleAxes=zv\u00fdraznen\u00e9 jednoduch\u00e9 osi -Footprint.Spot=bod -Footprint.Line=\u010diara -Footprint.BoldLine=zv\u00fdraznen\u00e1 \u010diara -Footprint.Outline=obrys -Footprint.BoldOutline=zv\u00fdrazenen\u00fd obrys -Footprint.Arrow=\u0161\u00edpka -Footprint.BoldArrow=zv\u00fdraznen\u00e1 \u0161\u00edpka -Footprint.DoubleArrow=dvojit\u00e1 \u0161\u00edpka -Footprint.BoldDoubleArrow=zv\u00fdraznen\u00e1 dvojit\u00e1 \u0161\u00edpka -Footprint.2xArrow=2x \u0161\u00edpka -Footprint.Bold2xArrow=zv\u00fdraznen\u00e1 2x \u0161\u00edpka -Footprint.4xArrow=4x \u0161\u00edpka -Footprint.Bold4xArrow=zv\u00fdraznen\u00e1 4x \u0161\u00edpka -Footprint.DashArrow=\u010diarkovan\u00e1 \u0161\u00edpka -Footprint.BoldDashArrow=zv\u00fdraznen\u00e1 \u010diarkovan\u00e1 \u0161\u00edpka -Footprint.BigArrow=ve\u013ek\u00e1 \u0161\u00edpka -Footprint.BigDashArrow=ve\u013ek\u00e1 \u010diarkovan\u00e1 \u0161\u00edpka -LineProfile.Name=\u010ciarov\u00fd profil -LineProfile.New.Name=profil -LineProfile.Data.Brightness=jas -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=\u010derven\u00e1 -LineProfile.Data.Green=zelen\u00e1 -LineProfile.Data.Blue=modr\u00e1 -LineProfile.Data.Weighting=po\u010det -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=Lupa -MainTView.Popup.MenuItem.ToFit=Prisp\u00f4sobi\u0165 -OffsetOrigin.Name=po\u010diatok mimo okna -OffsetOrigin.New.Name=po\u010diatok mimo okna -PlotTrackView.Button.PlotCount=graf -PlotTrackView.Button.PlotCount.ToolTip=Nastavi\u0165 po\u010det grafov -PointMass.Name=hmotn\u00fd bod -PointMass.New.Name=hmotnos\u0165 -PointMass.MenuItem.VectorsToPosition=poloha -PointMass.MenuItem.Velocity=r\u00fdchlos\u0165 -PointMass.MenuItem.Acceleration=zr\u00fdchlenie -Star.Name=hviezdi\u010dka -Star.New.Name=hviezdi\u010dka -TableTrackView.Action.CopyData=kop\u00edrova\u0165 d\u00e1ta -TableTrackView.Button.SelectTableData=Tabu\u013eka -TableTrackView.Button.SelectTableData.ToolTip=Vyberte st\u013apce tabu\u013eky -TableTrackView.Popup.MenuItem.Analyze=Analyzova\u0165 ... -TableTrackView.Dialog.Border.Title=Vidite\u013en\u00fd: -TActions.Action.Description=Pozn\u00e1mky -TActions.Action.ClearTracks=Vymaza\u0165 -TActions.Action.NewTab=Nov\u00e1 z\u00e1lo\u017eka -TActions.Action.Copy=Kop\u00edrova\u0165 -TActions.Action.Paste=Vlo\u017ei\u0165 -TActions.Action. Otvori\u0165=Otvori\u0165 ... -TActions.Action.Close=Zavrie\u0165 z\u00e1lo\u017eku -TActions.Action.Import=Importova\u0165 ... -TActions.Action.Save=Ulo\u017ei\u0165 z\u00e1lo\u017eku -TActions.Action.SaveAs=Ulo\u017ei\u0165 z\u00e1lo\u017eku ako ... -TActions.Action.Export=Exportova\u0165 ... -TActions.Action.CaptureVideo=Nahra\u0165 Video ... -TActions.Action.Delete=Zmaza\u0165 -TActions.Action.Config=Nastavenia ... -TActions.Action.AxesVisible=vidite\u013en\u00fd -TActions.Action.TapeVisible=vidite\u013en\u00fd -TActions.Action.Print=Tla\u010d ... -TActions.Action.ClearFilters=Vymaza\u0165 -TActions.Action.ImportVideo=Importova\u0165 ... -TActions.Action.CloseVideo=Zatvori\u0165 -TActions.Action.CloseAll=Zatvori\u0165 v\u0161etko -TActions.Action.Exit=Koniec -TActions.Dialog.PrintError.Message=Vyskytla sa chyba tla\u010de -TActions.Dialog.PrintError.Title=Chyba tla\u010de -TActions.Dialog.Description.Title=Pozn\u00e1mky -TActions.Dialog.DeleteLockedTracks.Message=Niektor\u00e9 stopy s\u00fa zamknut\u00e9. Odstr\u00e1ni\u0165 aj tak? -TActions.Dialog.DeleteLockedTracks.Title=Odstr\u00e1ni\u0165 zamknut\u00e9 stopy? -TActions.Dialog.NewPointMass.Title=Nov\u00fd hmotn\u00fd bod -TapeMeasure.Name=posuvn\u00e9 meradlo -TapeMeasure.New.Name=meradlo -TapeMeasure.MenuItem.Fixed=pevn\u00e1 poloha -TFrame.View.Plot=graf -TFrame.View.Table=tabu\u013eka -TFrame.View.World=re\u00e1lny poh\u013ead -TFrame.View.Video=video -TFrame.Dialog.Help.Title=Tracker N\u00e1pove\u010f -TMenuBar.Menu.File=S\u00fabor -TMenuBar.Menu.Edit=Upravi\u0165 -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Stopy -TMenuBar.Menu.Coords=s\u00faradnicov\u00fd syst\u00e9m -TMenuBar.Menu.Window=Okno -TMenuBar.Menu.Help=Pomocn\u00edk -TMenuBar.MenuItem.EditProperties=Vlastnosti ... -TMenuBar.MenuItem.VideoVisible=Vidite\u013en\u00e9 -TMenuBar.MenuItem.VideoFilters=Filtre -TMenuBar.MenuItem.NewVideoFilter=Nov\u00fd -TMenuBar.MenuItem.NewTrack=Nov\u00fd -TMenuBar.MenuItem.CoordsLocked=Zamknut\u00fd -TMenuBar.MenuItem.CoordsFixedOrigin=Pevn\u00fd po\u010diatok -TMenuBar.MenuItem.CoordsFixedAngle=Pevn\u00fd uhol -TMenuBar.MenuItem.CoordsFixedScale=pevn\u00e1 mierka -TMenuBar.MenuItem.CoordsRefFrame=Vz\u0165a\u017en\u00e1 s\u00fastava -TMenuBar.MenuItem.CoordsDefault=Predvolen\u00e9 -TMenuBar.MenuItem.WindowRight=Poh\u013ead zboku -TMenuBar.MenuItem.WindowBottom=Poh\u013ead zdola -TMenuBar.MenuItem.PlayAllSteps=Prehra\u0165 v\u0161etky kroky -TMenuBar.MenuItem.Record=Nahra\u0165 -TMenuBar.MenuItem.MatSize=Mat Ve\u013ekos\u0165 -TMenuBar.MenuItem.Language=Jazyk -TMenuBar.MenuItem.DeleteTrack=Zmaza\u0165 -TMenuBar.MenuItem.TrackerHelp=Tracker N\u00e1pove\u010f ... -TMenuBar.MenuItem.MessageLog=Spr\u00e1va Prihl\u00e1senie ... -TrackControl.Name=Kontrola stopy -TrackControl.Button.NewTrack=Vytvori\u0165 -TrackControl.Button.NewTrack.ToolTip=Vytvori\u0165 nov\u00fa stopu -TrackControl.Button.Trails.ToolTip=Nastavi\u0165 d\u013a\u017eku cesty -TrackControl.Button.Labels.ToolTip=Zobrazi\u0165 alebo skry\u0165 \u010d\u00edslovanie -TrackControl.Button.StretchVectors.ToolTip=Natiahnu\u0165 vektory -TrackControl.Button.Accelerations.ToolTip=Zobrazi\u0165 alebo skry\u0165 vektory zr\u00fdchleniaTrackControl.Button.Xmass.ToolTip=Vyn\u00e1sobte vektory hmotnos\u0165ou -TrackControl.Button.Vectors.ToolTip=Vektory -TrackControl.Button.Velocities.ToolTip=Zobrazi\u0165 alebo skry\u0165 vektory r\u00fdchlosti -TrackControl.Button.Properties.ToolTip=Kliknut\u00edm vyberte -TrackControl.Button.Positions.ToolTip=Zobrazi\u0165 alebo skry\u0165 polohu -Tracker.Popup.MenuItem.Snapshot=Sn\u00edmka ... -Tracker.Popup.MenuItem.Help=Pomocn\u00edk .. . -Tracker.Cursor.Crosshair.Description=ter\u010d\u00edkov\u00fd kurzor -Tracker.Action.AboutTracker=O Trackeri ... -Tracker.Dialog.AboutTracker.Title=O Trackeri -Tracker.Action.AboutJava=O Jave ... -Tracker.Dialog.AboutJava.Title=O Jave -Tracker.Dialog.AboutJava.UnknownVersion=nezn\u00e1my -Tracker.Dialog.AboutJava.Message=Java verzia -Tracker.Action.AboutQT=O QuickTime ... -Tracker.Dialog.AboutQT.Title=O QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime verzia -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava verzia -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava cesta: -Tracker.Dialog.NoQT.Title=QTJava.zip nebol n\u00e1jden\u00fd -Tracker.Dialog.NoQT.Message1=QuickTime for Java zrejme nie je nain\u0161talovan\u00fd -Tracker.Dialog.NoQT.Message2=Ak chcete analyzova\u0165 QuickTime filmy, pros\u00edm prein\u0161talujte QuickTime. -Tracker.Dialog.NoQT.Message3=POZN\u00c1MKA: QuickTime for Java mus\u00ed by\u0165 pri in\u0161tal\u00e1cii QuickTime ozna\u010den\u00fd. -Tracker.Dialog.UpdateQT.Title=Aktualiz\u00e1cia QTJava.zip -Tracker.Dialog.UpdateQT.Message1=nov\u0161ia verzia QTJava.zip bola n\u00e1jden\u00e1 na -Tracker.Dialog.UpdateQT.Message2=Prajete si aktualizova\u0165 existuj\u00faci s\u00fabor? -Tracker.Dialog.CopyQT.Title=Kop\u00edrova\u0165 QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime je nain\u0161talovan\u00fd, ale k\u00fdm ho Tracker m\u00f4\u017ee pou\u017ei\u0165: -Tracker.Dialog.CopyQT.Message2=1. QTJava.zip mus\u00ed by\u0165 skop\u00edrovan\u00fd z -Tracker.Dialog.CopyQT.Message3=k -Tracker.Dialog.CopyQT.Message4=2. Tracker je potrebn\u00e9 re\u0161tartova\u0165. -Tracker.Dialog.CopyQT.Message5=Prajete si skop\u00edrova\u0165 QTJava.zip teraz? -Tracker.Dialog.CopyFailed.Title=Kop\u00edrovanie sa nepodarilo -Tracker.Dialog.CopyFailed.Message=QTJava.zip sa ned\u00e1 skop\u00edrova\u0165. -Tracker.Dialog.CopiedTo.Title=Kop\u00edrovanie \u00faspe\u0161n\u00e9 -Tracker.Dialog.CopiedTo.Message1=QTJava.zip bola \u00faspe\u0161ne skop\u00edrovan\u00e1 do -Tracker.Dialog.CopiedTo.Message2=Tracker mus\u00ed by\u0165 re\u0161tartovan\u00fd a bude teraz ukon\u010den\u00fd. -Tracker.Splash.Loading=Na\u010d\u00edtanie -TrackerIO.Dialog.Import.Title=Importova\u0165 s\u00fabor Tracker -TrackerIO.Dialog.Import.Message=Vyberte polo\u017eky na import -TrackerIO.Dialog.ImportVideo.Title=Import videa -TrackerIO.Dialog.Export.Title=Export -TrackerIO.Dialog.Export.Message=Vyberte polo\u017eky pre export -TrackerIO.Dialog.ReplaceFile.Title=Nahradi\u0165 existuj\u00faci s\u00fabor? -TrackerIO.Dialog.ReplaceFile.Message=u\u017e existuje. Chcete ho nahradi\u0165 -TrackerIO.Dialog.NotTrackerXML.Title=nezodpovedaj\u00face XML -TrackerIO.Dialog.NotTrackerXML.Message=obsahuje xml d\u00e1ta pre in\u00fa aplik\u00e1ciu. -TrackerIO.Dialog.BadVideo.Message=S\u00fabor nie je rozpoznate\u013en\u00e9 video -TrackerIO.Dialog.BadVideo.Title=Nerozpoznan\u00fd video s\u00fabor -UntitledTrackerPanel.NewTab.Name=Nepomenovan\u00fd -TrackerPanel.DragToMark.Hint= Shift-\u0165ahom ozna\u010di\u0165 -TrackerPanel.ClickToMark.Hint=Shift-ozna\u010di\u0165 kliknut\u00edm -TrackerPanel.Dialog.LoadFailed.Title=Neplatn\u00fd s\u00fabor Tracker -TrackerPanel.Dialog.LoadFailed.Message=S\u00fabor nie je platn\u00fd Tracker s\u00fabor: -TrackerPanel.Dialog.SaveChanges.Title=Ulo\u017ei\u0165 zmeny -TrackerPanel.Dialog.SaveChanges.Message=Ulo\u017ei\u0165 zmeny -TrackPlottingPanel.Popup.MenuItem.Lines=\u010ciary -TrackPlottingPanel.Popup.MenuItem.Points=Body -TrackPlottingPanel.Popup.MenuItem.Scale=Mierka... -TrackPlottingPanel.Popup.MenuItem.Print=Tla\u010d ... -TrackPlottingPanel.Popup.MenuItem.Measure=Prisp\u00f4sobi\u0165 -TrackPlottingPanel.Popup.MenuItem.Analyze=Analyzova\u0165. .. -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Pribl\u00ed\u017ei\u0165 -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Oddiali\u0165 -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=autoscale -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zv\u00e4\u010d\u0161i\u0165 v obd\u013a\u017eniku -TrackPlottingPanelInspector.Title=mierka -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Nastavenie stopy -TToolBar.Dropdown.SelectedTrack.Tooltip=Vyberte stopu -TToolBar.Dropdown.SelectedTrack.None=\u017eiadny -TTrack.MenuItem.Delete=Zmaza\u0165 -TTrack.MenuItem.Color=Farba ... -TTrack.Dialog.Color.Title=Vyberte farbu stopy -TTrack.MenuItem.Name=N\u00e1zov ... -TTrack.MenuItem.Footprint=stopa -TTrack.MenuItem.Description=Pozn\u00e1mky ... -TTrack.MenuItem.Visible=Vidite\u013en\u00fd -TTrack.MenuItem.TrailVisible=Stopa vidite\u013en\u00e1 -TTrack.MenuItem.Autostep=automatick\u00fd krok -TTrack.MenuItem.MarkByDefault=Ozna\u010di\u0165 v predvolenom nastaven\u00ed -TTrack.MenuItem.Locked=Zamknut\u00e1 -TTrack.MenuItem.Delete=Odstr\u00e1ni\u0165 -TTrack.Name.None=bez n\u00e1zvu -TTrack.Dialog.Description.Title=Pozn\u00e1mky: -TTrack.Dialog.Name.Title=Nastavi\u0165 n\u00e1zov -TTrack.Dialog.Name.Label=N\u00e1zov: -TViewChooser.Button.Choose.Tooltip=Vyberte poh\u013ead -Vector.Name=Vector -Vector.New.Name=vektor -Vector.MenuItem.ToOrigin=do po\u010diatku -Vector.MenuItem.Label=ozna\u010denie vidite\u013en\u00e9 -VectorSum.Name=vektorov\u00fd s\u00fa\u010det -VectorSum.New.Name=s\u00fa\u010det -VectorSum.MenuItem.Inspector=Vyberte Vektory ... -VectorSumInspector.Title=vektorov\u00fd s\u00fa\u010det -VectorSumInspector.Border.Title=Vybra\u0165 Vektory -WorldTView.Popup.MenuItem.Projectile=N\u00e1bojov\u00fd model - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Analytick\u00fd \u010dasticov\u00fd Model -AnalyticParticle.Inspector.Title=Analytick\u00fd \u010dasticov\u00fd model -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=polomer 4 -CircleFootprint.Circle_6=polomer 6 -CircleFootprint.Circle_8=polomer 8 -DynamicParticle.Name=dynamick\u00fd \u010dasticov\u00fd model (Kartezi\u00e1nsky) -DynamicParticle.Inspector.Title=Dynamick\u00fd \u010dasticov\u00fd model -DynamicParticle.Property.ForceX=sila x -DynamicParticle.Property.ForceY=sila y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX= vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=pevn\u00e1 poloha -ParticleModel.New.Name=model -ParticleModel.MenuItem.InspectModel=Model Builder ... -ParticleModel.Inspector.Button.Undo=Sp\u00e4\u0165 -ParticleModel.Inspector.Button.Redo=Znovu -ParticleModel.Inspector.Button.Close=Zavrie\u0165 -ParticleModel.Inspector.Button.Help=Pomocn\u00edk - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=iba X -Calibration.Axes.YOnly=iba Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Vyberte kalibr\u00e1ciu os\u00ed -Calibration.Label.Axes=osi -Calibration.Dialog.InvalidCoordinates.Title=Neplatn\u00e9 s\u00faradnice -Calibration.Dialog.InvalidCoordinates.Message=body nem\u00f4\u017eu ma\u0165 rovnak\u00e9 re\u00e1lne s\u00faradnice. -Calibration.Dialog.InvalidXCoordinates.Message=Body nem\u00f4\u017eu ma\u0165 rovnak\u00e9re\u00e1lne x-ov\u00e9 s\u00faradnice. -Calibration.Dialog.InvalidYCoordinates.Message=Body nem\u00f4\u017eu ma\u0165 rovnak\u00e9 re\u00e1lne y-ov\u00e9 s\u00faradnice. -SpectralLineFilter.Title=plyn Spectra -SpectralLineFilter.H=vod\u00edk -SpectralLineFilter.He=h\u00e9lium -SpectralLineFilter.Ne= Ne\u00f3n -SpectralLineFilter.Hg=Ortu\u0165 -TFrame.View.Unknown=Zobrazi\u0165 -TMenuBar.MenuItem. Sp\u00e4\u0165=Sp\u00e4\u0165 -TMenuBar.MenuItem.Redo=Znovu -TMenuBar.MenuItem.Replace=Nahradi\u0165 ... -TMenuBar.Menu.AddImage=Import obr\u00e1zkov -TMenuBar.MenuItem.AddBefore=Pred t\u00fato sn\u00edmku... -TMenuBar.MenuItem.AddAfter=Po tejto sn\u00edmke. .. -TMenuBar.MenuItem.RemoveImage=Odstr\u00e1ni\u0165 t\u00fato sn\u00edmku -TMenuBar.Menu.Tools=N\u00e1stroje -TMenuBar.MenuItem.DataFunctionTool=Data Builder -TMenuBar.MenuItem.DatasetTool=D\u00e1ta n\u00e1stroj -TMenuBar.Menu.CopyImage=Kop\u00edrova\u0165 obr\u00e1zok -TMenuBar.MenuItem.CopyMainView=Hlavn\u00fd n\u00e1h\u013ead -TMenuBar.MenuItem.CopyFrame=sn\u00edmka -TMenuBar.MenuItem.PrintFrame=Tla\u010d ... -TrackerIO.Dialog.AddImage.Title=Import obr\u00e1zkov (vyberte jeden alebo viac) -TTrack.Dialog.Name.BadName=U\u017e sa pou\u017e\u00edva. Pros\u00edm, vyberte in\u00fd n\u00e1zov. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=\u010dist\u00e1 sila -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Graf pozorovan\u00fdch d\u00e1t sa objav\u00ed tu. -TableTView.Label.NoData=Tabu\u013eka pozorovan\u00fdch d\u00e1t sa objav\u00ed tu. -TrackerPanel.Message.NoData0=Hlavn\u00fd n\u00e1h\u013ead na video a stopy sa objav\u00ed tu -TrackerPanel.Message.NoData1=Na za\u010diatku Vyberte S\u00fabor|Otvori\u0165 alebo Stopy|Nov\u00e1 -WorldTView.Label.NoData=Re\u00e1lny n\u00e1h\u013ead na video a stopy sa objav\u00ed tu. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Rie\u0161ite\u013e: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=adapt\u00edvny viackrokov\u00fd -DynamicParticle.Table.Force.Border.Title=Funkcie sily (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Funkcie polohy(t) -ParticleModel.Table.Initial.Border.Title=po\u010diato\u010dn\u00e9 hodnoty -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Vlo\u017ei\u0165 obr\u00e1zok -TMenuBar.MenuItem.PasteAfter=Po tejto sn\u00edmke -TMenuBar.MenuItem.PasteBefore=Pred touto sn\u00edmkou -TMenuBar.MenuItem.PasteReplace=Nahradi\u0165 Video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Za\u010d\u00edname ... -Tracker.Splash.HelpMessage=Nov\u00fd u\u017e\u00edvate\u013e? Pozri - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=uhol od vodorovnej -LineProfile.Checkbox.Rotates=ot\u00e1\u010da -LineProfile.Label.Spread=roz\u0161\u00edrenie -RGBRegion.Name=RGB rozsah -RGBRegion.New.Name=rozsah -RGBRegion.MenuItem.Fixed=pevn\u00e1 poloha -RGBRegion.Label.Radius=pixel polomer -TTrack.Label.Step=krok - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=\u010d\u00edslo polohy -LineProfile.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy -LineProfile.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy -LineProfile.Data.Description.3=\u010derven\u00e1 -LineProfile.Data.Description.4=zelen\u00e1 -LineProfile.Data.Description.5=modr\u00e1 -LineProfile.Data.Description.6=vn\u00edman\u00fd jas -LineProfile.Data.Description.7=\u0161\u00edrka riadka -ParticleModel.MenuItem.TraceVisible=Stopa vidite\u013en\u00e1 -ParticleModel.MenuItem.StepsVisible=Kroky vidite\u013en\u00e9 -PointMass.Data.Description.0=\u010das -PointMass.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy -PointMass.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy -PointMass.Data.Description.3=ve\u013ekos\u0165 polohov\u00e9ho vektora -PointMass.Data.Description.4=uhol polohov\u00e9ho vektora -PointMass.Data.Description.5= x-ov\u00e1 zlo\u017eka r\u00fdchlosti -PointMass.Data.Description.6=y-ov\u00e1 zlo\u017eka r\u00fdchlosti -PointMass.Data.Description.7=ve\u013ekos\u0165 r\u00fdchlosti -PointMass.Data.Description.8=uhol r\u00fdchlosti -PointMass.Data.Description.9=x-ov\u00e1 zlo\u017eka zr\u00fdchlenia -PointMass.Data.Description.10=y-ov\u00e1 zlo\u017eka zr\u00fdchlenia -PointMass.Data.Description.11=ve\u013ekos\u0165 zr\u00fdchlenia -PointMass.Data.Description.12=uhol zr\u00fdchlenia -PointMass.Data.Description.13=uhol nato\u010denia -PointMass.Data.Description.14=uhlov\u00e1 r\u00fdchlos\u0165 -PointMass.Data.Description.15=uhlov\u00e9 zr\u00fdchlenie -PointMass.Data.Description.16=\u010d\u00edslo kroku -PointMass.Data.Description.17=\u010d\u00edslo sn\u00edmky -PointMass.Data.Description.18=x-ov\u00e1 zlo\u017eka hybnosti -PointMass.Data.Description.19=y-ov\u00e1 zlo\u017eka hybnosti -PointMass.Data.Description.20=ve\u013ekos\u0165 hybnosti -PointMass.Data.Description.21=uhol hybnosti -PointMass.Data.Description.22= kinetick\u00e1 energia -RGBRegion.Data.Description.0=\u010das -RGBRegion.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy -RGBRegion.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy -RGBRegion.Data.Description.3=\u010derven\u00e1 -RGBRegion.Data.Description.4=zelen\u00e1 -RGBRegion.Data.Description.5=modr\u00e1 -RGBRegion.Data.Description.6=vn\u00edman\u00fd jas -RGBRegion.Data.Description.7=po\u010det pixelov -RGBRegion.Data.Description.8=\u010d\u00edslo kroku -RGBRegion.Data.Description.9= \u010d\u00edslo sn\u00edmky -TView.Menuitem.Define=Definova\u0165 ... -Vector.Data.Description.0=\u010das -Vector.Data.Description.1=x-ov\u00e1 zlo\u017eka -Vector.Data.Description.2=y-ov\u00e1 zlo\u017eka -Vector.Data.Description.3=ve\u013ekos\u0165 -Vector.Data.Description.4=uhol -Vector.Data.Description.5=x-ov\u00e1 zlo\u017eka po\u010diatku vektora -Vector.Data.Description.6=y-ov\u00e1 zlo\u017eka po\u010diatku vektora -Vector.Data.Description.7=\u010d\u00edslo kroku -Vector.Data.Description.8=\u010d\u00edslo sn\u00edmky - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=hmotnos\u0165 tejto \u010dastice -ParticleModel.Parameter.InitialTime.Description=Po\u010diato\u010dn\u00fd \u010das -AnalyticParticle.PositionFunction.X.Description=x-ov\u00e1 zlo\u017eka polohy -AnalyticParticle.PositionFunction.Y.Description=Y-ov\u00e1 zlo\u017eka polohy -DynamicParticle.ForceFunction.X.Description=x-ov\u00e1 zlo\u017eka sily -DynamicParticle.ForceFunction.Y.Description=y-ov\u00e1 zlo\u017eka sily -DynamicParticle.Parameter.InitialX.Description=x-ov\u00e1 zlo\u017eka po\u010diato\u010dnej polohy -DynamicParticle.Parameter.InitialY.Description=y-ov\u00e1 zlo\u017eka po\u010diato\u010dnej polohy -DynamicParticle.Parameter.InitialVelocityX.Description=x-ov\u00e1 zlo\u017eka po\u010diato\u010dnej r\u00fdchlosti -DynamicParticle.Parameter.InitialVelocityY.Description=y-ov\u00e1 zlo\u017eka po\u010diato\u010dnej r\u00fdchlosti -TrackerPanel.ModelBuilder.Title=Model Builder -TrackerPanel.DataBuilder . Title=Data Builder -TrackControl.TrailMenu.NoTrail=Bez stopy -TrackControl.TrailMenu.ShortTrail=Kr\u00e1tke stopy -TrackControl.TrailMenu.LongTrail=Dlh\u00e9 stopy -TrackControl.TrailMenu.FullTrail=V\u0161etky kroky -TrackerPanel.ModelBuilder.Spinner.Tooltip=Aktu\u00e1lne vybran\u00fd model -TrackerPanel.ModelBuilder.LineButton.Text=\u0160t\u00fdl \u010diary -TrackerPanel.ModelBuilder.LineButton.Tooltip=Nastavenie \u0161t\u00fdlu \u010diary -ParticleModel.LineStyle.None=bez \u010diar -ParticleModel.LineStyle.Connect=Pripoji\u0165 kroky -ParticleModel.LineStyle.Smooth=Hladk\u00e1 krivka -ModelFunctionPanel.Label=Model -AnalyticFunctionPanel.FunctionEditor.Border.Title=Funkcie polohy -DynamicFunctionPanel.FunctionEditor.Border.Title=Funkcie sily - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Vidite\u013en\u00e9 st\u013apce tabu\u013eky -Tracker.About.ProjectOf=projekt: -Tracker.About.TranslationBy=Preklad -Tracker.About.Translator=M.Hancova, J.Hanc -TMenuBar.Menu.SaveVideoAs=Ulo\u017ei\u0165 klip ako -TActions.SaveClipAs.ProgressMonitor.Message=Ukladanie klipu ako -TActions.SaveClipAs.ProgressMonitor.Progress=Dokon\u010den\u00e9 - -# Additions Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sync -PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronizova\u0165 horizont\u00e1lne osi -RGBRegion.MenuItem.FixedRadius=Pevn\u00fd Polomer -Tracker.VideoZoom.Hint=kliknite pre zv\u00e4\u010d\u0161enie alebo zmen\u0161enie, dvojklik-pre zv\u00e4\u010d\u0161enie, prisp\u00f4sobenie -Tracker.PlotZoomIn.Hint=\u0165ahan\u00edm pribl\u00ed\u017ei\u0165, dvojklik-automatick\u00fd rozsah -Tracker.PlotZoomOut.Hint=kliknut\u00edm oddiali\u0165 -Tracker.MenuItem.Hints=Zobrazi\u0165 tipy -TapeMeasure.Label.Length=d\u013a\u017eka -TapeMeasure.Label.TapeAngle=uhol od x-ovej osi -TapeMeasure.Label.ArcAngle=uhlomer uhla -TrackerIO.Dialog.NotAnImage.Title=nespr\u00e1vny typ s\u00faboru -TrackerIO.Dialog.NotAnImage.Message1=nie je to JPG alebo GIF obr\u00e1zok. -TrackerIO.Dialog.NotAnImage.Message2=Prajete si pokra\u010dova\u0165? -TToolBar.Button.Zoom.Tooltip=n\u00e1stroj lupa (skratka: kl\u00e1vesa Z) -TrackChooserTView.DropDown.Tooltip=Vyberte stopu -TapeMeasure.Field.TapeAngle.Tooltip=uhol od pozit\u00edvnej \u010dasti x-ovej osi -TapeMeasure.Field.Magnitude.Tooltip=d\u013a\u017eka v \u0161k\u00e1lovan\u00fdch re\u00e1lnych jednotk\u00e1ch -TapeMeasure.Readout.Magnitude.Name= d\u013a\u017eka -TapeMeasure.Readout.Magnitude.Hint=re\u00e1lne jednotky -TapeMeasure.Readout.Angle.Name=uhol od\u010d\u00edtanie -TapeMeasure.Readout.Angle.Hint=uhol meran\u00fd od x-ovej osi -TapeMeasure.End.Name=koniec -TapeMeasure.End.Hint=kv\u00f4li meraniu vzdialenost\u00ed a uhlov \u0165aha\u0165 -TapeMeasure.Handle.Name=rukov\u00e4\u0165 -TapeMeasure.Handle.Hint=\u0165ahan\u00edm presun\u00fa\u0165 -Vector.Tip.Name=hrot -Vector.Tip.Hint=pre zmenu zlo\u017eiek \u0165aha\u0165 alebo zada\u0165 s\u00faradnice -Vector.Handle.Name=po\u010diatok -Vector.Handle.Hint=vektor presun\u00fa\u0165 \u0165ahan\u00edm -Vector.ShortHandle.Hint=presun\u00fa\u0165 \u0165ahan\u00edm, hrot ozna\u010di\u0165 alt-klik -PointMass.Position.Name=poloha -PointMass.Position.Hint=pre zmenu polohy \u0165aha\u0165 alebo zada\u0165 s\u00faradnice -PointMass.Velocity.Name=r\u00fdchlos\u0165 -PointMass.Acceleration.Name=zr\u00fdchlenie -PointMass.Vector.Hint=\u0165ahan\u00edm presun\u00fa\u0165 -PointMass.Position.Locked.Hint=ozna\u010di\u0165 kliknut\u00edm - ned\u00e1 sa \u0165aha\u0165 -CoordAxes.Handle.Name=+ x-ov\u00e1 os -CoordAxes.Handle.Hint=pre zmenu sklonu \u0165aha\u0165 -CoordAxes.Origin.Name=po\u010diatok -CoordAxes.Origin.Hint=pre zmenu polohy \u0165aha\u0165 -OffsetOrigin.Position.Name=poloha -OffsetOrigin.Position . Hint=pre premiestnenie po\u010diatku \u0165aha\u0165 alebo zada\u0165 s\u00faradnice -Calibration.Point.Name=bod -Calibration.Point.Hint=pre zmenu os\u00ed a mierky osi \u0165ahajte, alebo zadajte s\u00faradnice -RGBRegion.Position.Name=poloha -RGBRegion.Position.Hint=pre zmenu polohy \u0165ahajte alebo zadajte s\u00faradnice -LineProfile.End.Name=koniec -LineProfile.End.Hint=d\u013a\u017eku \u010diary nastavte \u0165ahan\u00edm -LineProfile.Handle.Name=rukov\u00e4\u0165 -LineProfile.Handle.Hint=\u0165ahan\u00edm presun\u00fa\u0165 riadok -PointMass.Hint=nastavte hmotnos\u0165 na paneli n\u00e1strojov -PointMass.Unmarked.Hint =, ozna\u010di\u0165 polohu pomocou Shift-klik -TTrack.Unselected.Hint=pre v\u00fdber a / alebo nastavenie vlastnost\u00ed kliknite -Vector.Unmarked.Hint=kreslenie vektorov pomocou shift-\u0165aha\u0165 -OffsetOrigin.Unmarked.Hint=pre ozna\u010denie offset bodu pou\u017eite shift-klik -Calibration.Unmarked.Hint=pre ozna\u010denie prv\u00e9ho bodu pou\u017eite shift-klik -Calibration.Halfmarked.Hint=pre ozna\u010denie druh\u00e9ho bodu pou\u017eite shift-klik -CenterOfMass.Empty.Hint=vyberte hmotnosti pre definovanie syst\u00e9mu -VectorSum.Empty.Hint=vyberte vektory pre definovanie s\u00fa\u010dtu -TapeMeasure.Hint=pre meranie vzdialenost\u00ed a uhlov \u0165ahajte konce -CoordAxes.Hint=pre zmenu sklonu nastavte uhol -ParticleModel.Hint=nastavte hmotnos\u0165 na paneli n\u00e1strojov, kv\u00f4li anim\u00e1cii zadajte vzorce v Model Builder -RGBRegion.Hint=pre zmenu ve\u013ekosti zadajte polomer -RGBRegion.Unmarked.Hint=na ozna\u010denie polohy pou\u017eite shift-klik -TTrack.ImportVideo.Hint=importova\u0165 video alebo obr\u00e1zok na meranie RGB -TTrack.Selected.Hint= vybran\u00fd -LineProfile.Hint=pre zmenu hr\u00fabky \u010diary zadajte \u0161\u00edrku -LineProfile.Unmarked.Hint=nakreslite \u010diaru pomocou shift-\u0165aha\u0165 -LineProfile.Menu.Orient\u00e1cia=Orient\u00e1cia -LineProfile.MenuItem.Horizontal=Horizont\u00e1lne -LineProfile.MenuItem.XAxis=pozd\u013a\u017e X-ovej osi -Footprint.PositionVector=vektor -Footprint.BoldPositionVector=zv\u00fdraznen\u00fd vektor -Tracker.Startup.Hint=tu n\u00e1jdete rady (alebo vypn\u00fa\u0165 rady v n\u00e1povede menu), kv\u00f4li n\u00e1povedi stla\u010dte kedyko\u013evek kl\u00e1ves F1 -TrackerPanel.NoVideo.Hint=otvori\u0165 alebo importova\u0165 video alebo obr\u00e1zok k anal\u00fdze -TrackerPanel.CalibrateVideo.Hint=kalibrujte video pomocou kalibra\u010dn\u00e9ho n\u00e1stroja -TrackerPanel.NoTracks.Hint=pre meranie sledovan\u00fdch vlastnost\u00ed vytvorte nov\u00fa stopu -TrackerPanel.SetClip.Hint=nastavte alebo obnovte nastavenia videoz\u00e1znamu -TrackerPanel.ShowAxes.Hint=nastavte po\u010diatok a uhol s\u00faradnicov\u00fdch os\u00ed -VideoPlayer.Step.Hint=krok vpred (skratka: PageDown) -VideoPlayer.Back.Hint=krok sp\u00e4\u0165 (skratka: PageUp) -TrackerPanel.DVVideo.Hint=pou\u017eite resize filter na n\u00e1pravu naru\u0161enia DV-form\u00e1t videa -TrackerIO.DataFileFilter.Description=Tracker S\u00fabory -Tracker.Button.PDFHelp=PDF verzia pre tla\u010d -TToolbar.Button.TapeVisible.Tooltip=Zobrazi\u0165, skry\u0165 alebo vybra\u0165 kalibra\u010dn\u00e9 n\u00e1stroje - -# Additions Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=kontrola stopy -TMenuBar.MenuItem.Description=Pozn\u00e1mky -TrackPlottingPanel.RightDrag.Hint=\u0165aha\u0165 prav\u00fdm pre vo\u013eby -TMenuBar.MenuItem.DeleteSelectedPoint=Vybran\u00fd bod -TFrame.InfoDialog.SaveChanges.Title=Ulo\u017ei\u0165 zmeny -TFrame.InfoDialog.SaveChanges.Message=Prajete si ulo\u017ei\u0165 zmeny? - -# Additions Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Kartezi\u00e1nske -DynamicParticle.Editor.Button.Polar =Pol\u00e1rne -DynamicParticle.Parameter.InitialR.Description= Po\u010diato\u010dn\u00fd polomer -DynamicParticle.Parameter.InitialTheta.Description=Po\u010diato\u010dn\u00fd uhol -DynamicParticle.Parameter.InitialVelocityR.Description=Po\u010diato\u010dn\u00e1 radi\u00e1lna r\u00fdchlos\u0165 -DynamicParticle.Parameter.InitialOmega.Description=po\u010diato\u010dn\u00e1 uhlov\u00e1 r\u00fdchlos\u0165 -DynamicParticle.ForceFunction.R.Description=radi\u00e1lna zlo\u017eka sily -DynamicParticle.ForceFunction.Theta.Description=tangenci\u00e1lna zlo\u017eka sily -DynamicParticlePolar.Name=dynamick\u00fd \u010dasticov\u00fd model (Pol\u00e1rny) -DynamicTwoBody.Editor.Button.Particle1=\u010dastica 1 -DynamicTwoBody.Editor.Button.Particle2=\u010dastica 2 -DynamicTwoBody.Name=Dynamick\u00fd dvoj-telesov\u00fd model -TMenuBar.Menu.DynamicParticle=Dynamick\u00fd \u010dasticov\u00fd model -TMenuBar.MenuItem.Cartesian=kartezi\u00e1nsky -TMenuBar.MenuItem.Polar=pol\u00e1rny - -# Additions Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=AUTOTRACK ... -Dialog.Button.Help=Pomocn\u00edk -AutoTracker.Wizard.Title=Autotracker: -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Sp\u00e4\u0165 -AutoTracker.Wizard.Button.Next=\u010eal\u0161\u00ed -AutoTracker.Wizard.Button.Accept=Akceptova\u0165 -AutoTracker.Wizard.Button.Search=H\u013eada\u0165 -AutoTracker.Wizard.Button.Pause=Pauza -AutoTracker.Wizard.Button.Skip=Presko\u010di\u0165 -AutoTracker.Label.Mask=\u0160abl\u00f3na Obr\u00e1zok -AutoTracker.Label.Target= Cie\u013eov\u00e1 Offset -AutoTracker.Label.AcceptLevel=Akceptova\u0165 sk\u00f3re nad -AutoTracker.TabbedPane.TabTitle.Mask=\u0160abl\u00f3na -AutoTracker.TabbedPane.TabTitle.Target=Cie\u013e -AutoTracker.TabbedPane.TabTitle.Settings=Akceptova\u0165 -AutoTracker.TabbedPane.TabTitle.Search=H\u013eada\u0165 -AutoTracker.Info.GetStarted=Pros\u00edm, kliknite na vlastnos\u0165 videa, ktor\u00fa chcete sledova\u0165. -AutoTracker.Info.Mask1=\u0160abl\u00f3na definuje obr\u00e1zok, ktor\u00fd bude zodpoveda\u0165 ka\u017edej video sn\u00edmke. Potiahnut\u00edm za stred resp. rukov\u00e4\u0165 premiestnite alebo zme\u0148te ve\u013ekos\u0165 \u0161abl\u00f3ny. -AutoTracker.Info.Mask2=\u0160abl\u00f3na sa m\u00f4\u017ee prisp\u00f4sobi\u0165 zmen\u00e1m tvaru a farby v priebehu \u010dasu. Vy\u0161\u0161ia r\u00fdchlos\u0165 v\u00fdvoja sleduje rap\u00eddnej\u0161ie zmeny, ale s\u00fa menej presn\u00e9 pri dlh\u0161om \u010dase. -AutoTracker.Info.MaskLocked1=\u0160abl\u00f3na sa pou\u017e\u00edva a je uzamknut\u00e1 -AutoTracker.Info.MaskLocked2=Kliknut\u00edm na tla\u010didlo Reset zma\u017ete v\u0161etky kroky a za\u010dnite znova. -AutoTracker.Info.Target1=Cie\u013e je miesto, kde bud\u00fa ozna\u010den\u00e9 kroky vo vz\u0165ahu k \u0161abl\u00f3ne. Presu\u0148te ciele potiahnut\u00edm. -AutoTracker.Info.Target2=Tip: M\u00f4\u017eete nastavi\u0165 cie\u013eov\u00fa polohu aj potom ako boli kroky ozna\u010den\u00e9. Existuj\u00face kroky sa bud\u00fa automaticky pohybova\u0165 spolu s cie\u013eom. -AutoTracker.Info.TargetLocked=Cie\u013e sa pou\u017e\u00edva a je viazan\u00fd na existuj\u00face kroky polohy. Ak premiestnite cie\u013e, premiestnia sa aj kroky. -AutoTracker.Info.Settings1=Sk\u00f3re zobrazen\u00e9 nad prijate\u013enou \u00farov\u0148ou je ozna\u010den\u00e9 automaticky. -AutoTracker.Info.Settings2=Tip: zn\u00ed\u017eenie prijate\u013enej \u00farovne zvy\u0161uje pravdepodobnos\u0165 ch\u00fdb. -AutoTracker.Info.Search1.= K uk\u00e1zan\u00e9mu obd\u013a\u017eniku bude vyh\u013eadan\u00e1 najlep\u0161ia zhoda. Potiahnut\u00edm stredu resp. rukov\u00e4te, premiestnite alebo zme\u0148te ve\u013ekos\u0165i preh\u013ead\u00e1vanej oblasti. -AutoTracker.Info.Search2=Tip: preh\u013ead\u00e1van\u00e1 oblas\u0165 nemus\u00ed by\u0165 ve\u013ek\u00e1, ak je zr\u00fdchlenie mal\u00e9 alebo kon\u0161tantn\u00e9. Vo\u013eba "h\u013eada\u0165 dopredu" automaticky presunie preh\u013ead\u00e1van\u00fa oblas\u0165 na predpokladan\u00e9 zodpovedaj\u00face polohy. -AutoTracker.Info.Frame=Sn\u00edmka -AutoTracker.Info.Match=N\u00e1jden\u00e1 zhoda bude automaticky ozna\u010den\u00e1 na cie\u013eovej polohe. -AutoTracker.Info.Possible=V preh\u013ead\u00e1vanej oblasti bola n\u00e1jden\u00e1 mo\u017en\u00e1 zhoda. Va\u0161e mo\u017enosti s\u00fa: -AutoTracker.Info.NoMatch=V preh\u013ead\u00e1vanej oblasti nebola n\u00e1jden\u00e1 \u017eiadna zhoda. Va\u0161e mo\u017enosti s\u00fa: -AutoTracker.Info.Outside=Preh\u013ead\u00e1van\u00e1 oblas\u0165 je mimo obraz. Va\u0161e mo\u017enosti s\u00fa: -AutoTracker.Info.Accepted=Zobrazen\u00e1 zhoda bola u\u017e\u00edvate\u013eom akceptovan\u00e1. -AutoTracker.Info.MarkedByUser=Krok bol ozna\u010den\u00fd u\u017e\u00edvate\u013eom manu\u00e1lne. -AutoTracker.Info.NoVideo=Autotracking vy\u017eaduje video. Pros\u00edm, importujte video alebo zatvorte Autotracker. -AutoTracker.Info.Height=v\u00fd\u0161ka -AutoTracker.Info.Width=\u0161\u00edrka -AutoTracker.Info.Accept =-- akceptova\u0165 zhodu -AutoTracker.Info.Retry =-- presu\u0148te preh\u013ead\u00e1van\u00fa oblas\u0165 a op\u00e4\u0165 za\u010dnite h\u013eadanie -AutoTracker.Info.Mark =-- pre manu\u00e1lne ozna\u010denie kroku pou\u017eite Shift-klik -AutoTracker.Info.Skip =-- presko\u010dte t\u00fato sn\u00edmku a pokra\u010dujte v sledovan\u00ed -AutoTracker.Info.Reset =-- pre zmazanie v\u0161etk\u00fdch krokov pou\u017eite reset a za\u010dnite odznova -AutoTracker.Info.MatchScore=zhoda sk\u00f3re -AutoTracker.Dialog.MaskLocked.Title=\u0160abl\u00f3na zamknut\u00e1 PointMass.Cursor.Autotrack.Description=Autotracker kurzor -VideoPlayer.StartFrame.Hint=pre nastavenie po\u010diato\u010dnej sn\u00edmky potiahnite -VideoPlayer.EndFrame.Hint=pre nastavenie koncovej sn\u00edmky potiahnite -VideoPlayer.Slider.Hint=pre skenovanie videa potiahnite -FileDropHandler.Dialog.BadFile.Message=Ned\u00e1 sa na\u010d\u00edta\u0165 -FileDropHandler.Dialog.BadFile.Title=Nerozpoznate\u013en\u00fd s\u00fabor - -# Additions Doug Brown 2009-10-27 -Dialog.Button.Apply=Pou\u017ei\u0165 -DynamicParticle.Dialog.Delete.Message=Zmazanie tejto \u010dastice sp\u00f4sob\u00ed odstr\u00e1nenie zo syst\u00e9mu. Odstr\u00e1ni\u0165 aj tak? -DynamicParticle.Dialog.Delete.Title=dynamick\u00fd syst\u00e9m -DynamicParticle.System.In=v -DynamicSystem.Empty=pr\u00e1zdny -DynamicSystem.Force.Name.Internal=vn\u00fatorn\u00fd -DynamicSystem.ForceFunction.R.Description=radi\u00e1lne zlo\u017eka vn\u00fatornej sily -DynamicSystem.ForceFunction.Theta.Description=tangenci\u00e1lna zlo\u017eka vn\u00fatornej sily -DynamicSystem.MenuItem.Inspector=Vyberte \u010castice ... -DynamicSystem.Name=Dynamick\u00fd dvoj-telesov\u00fd syst\u00e9m -DynamicSystem.New.Name=syst\u00e9m -DynamicSystem.Parameter.Of=o -DynamicSystem.Parameter.RelativeTo=vo vz\u0165ahu k -DynamicSystem.Parameter.Name.Relative=relat\u00edvne -DynamicSystem.Parameter.ParticleMass.Description=Hmotnos\u0165 -DynamicSystem.Parameter.Mass.Description=Celkov\u00e1 hmotnos\u0165 tohto syst\u00e9mu -DynamicSystemInspector.Border.Title=\u010dastica -DynamicSystemInspector.Title=dvoj-telesov\u00fd syst\u00e9m -DynamicSystemInspector.Button.Change=Zmeni\u0165 na ... -DynamicSystemInspector.ParticleName.None=(\u017eiadna) -TMenuBar.MenuItem.Clone=Klonova\u0165 -TMenuBar.MenuItem.TwoBody=dvoj-telesov\u00fd syst\u00e9m -TrackerPanel.DataBuilder.Dropdown.Tooltip=aktu\u00e1lne vybran\u00e1 stopa -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync vertik\u00e1lnej osi -TrackControl.Button.Trace.ToolTip=Zobrazi\u0165 alebo skry\u0165 cesty -TToolBar.Button.Open.Tooltip=Otvori\u0165 video alebo tracker s\u00fabor na novej z\u00e1lo\u017eke -TToolBar.Button.Save.Tooltip=Ulo\u017ei\u0165 aktu\u00e1lnu z\u00e1lo\u017eku do s\u00faboru -TToolBar.Button.SelectTrack=Vybra\u0165 -TToolBar.Button.SelectTrack.Tooltip=Vybra\u0165 existuj\u00facu stopu -TTrack.MenuItem.ClearSteps=Zmaza\u0165 kroky -PointMass.MenuItem.Position=poloha -TMenuBar.MenuItem.Empty=(Pr\u00e1zdne) -TTrackBar.Button.Memory=vyu\u017e\u00edvan\u00e1 pam\u00e4\u0165: -TTrackBar.Button.Memory.Tooltip=Monitoruj a spravuj pam\u00e4\u0165 -TTrackBar.Memory.PopupItem.Launch1=Spusti\u0165 -TTrackBar.Memory.PopupItem.Launch2=s pam\u00e4\u0165ou -TButton.Track.ToolTip=Nastavenie vlastnosti -Tracker.Dialog.OutOfMemory.Message1=Tracker m\u00e1 k vy\u010derpan\u00fa pam\u00e4\u0165. -Tracker.Dialog.OutOfMemory.Message2=Kliknite na tla\u010didlo pam\u00e4te pre \u010fal\u0161ie mo\u017enosti. -Tracker.Dialog.OutOfMemory.Title=Nedostatok pam\u00e4te - -# Additions Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Poh\u013ead dopredu -AutoTracker.Label.Original=Po\u010diato\u010dn\u00e1 -AutoTracker.Label.NoMask=\u017eiadny -AutoTracker.Label.Rate=r\u00fdchlos\u0165 v\u00fdvoja: -AutoTracker.Info.Mask3=Tip: \u0161abl\u00f3na nemus\u00ed by\u0165 ve\u013ek\u00e1, ani obsahova\u0165 cel\u00fd objekt. Funkcia, ktor\u00e1 je unik\u00e1tna a zah\u0155\u0148a vysoko-kontrastn\u00e9 hrany v\u0161eobecne funguje najlep\u0161ie. -AutoTracker.Wizard.Checkbox.XAxis=len X-ov\u00e1 os -AutoTracker.Info.SearchOnAxis1=pre x-ov\u00fa os vn\u00fatri zobrazen\u00e9ho obd\u013a\u017enika bude h\u013eadan\u00e1 najlep\u0161ia zhoda. Pre premiestnenie alebo zmenu ve\u013ekosti preh\u013ead\u00e1vanej oblasti potiahnite jej stred resp. rukov\u00e4\u0165. -AutoTracker.Info.PossibleOnAxis=V preh\u013ead\u00e1vanej oblasti pozd\u013a\u017e x-ovej osi bola n\u00e1jden\u00e1 mo\u017en\u00e1 zhoda. Va\u0161e mo\u017enosti s\u00fa: -AutoTracker.Info.NoMatchOnAxis=V preh\u013ead\u00e1vanej oblasti pozd\u013a\u017e x-ovej osi nebola n\u00e1jden\u00e1 \u017eiadna zhoda. Va\u0161e mo\u017enosti s\u00fa: -AutoTracker.Info.RetryOnAxis=--presu\u0148te preh\u013ead\u00e1van\u00fa oblas\u0165 alebo x-ov\u00fa os a h\u013eadajte znovu -AutoTracker.Wizard.Button.Delete=Zmaza\u0165 tento bod -AutoTracker.Wizard.Button.DeleteMore=Zmaza\u0165 tento a nasleduj\u00face body -Button.Define.Tooltip=Definujte funkcie alebo existuj\u00face st\u013apcov\u00e9 premenn\u00e9 -Calibration.Label.Point=body -CalibrationStick.Hint=kv\u00f4li zmene mierky nastavte d\u013a\u017eku alebo potiahnite koniec, kv\u00f4li zmene sklonu osi nastavte uhol -CalibrationStick.End.Hint=zme\u0148te \u0161k\u00e1lu potiahnut\u00edm -CalibrationStick.New.Name=kalibra\u010dn\u00e1 ty\u010d -CalibrationTapeMeasure.New.Name=kalibra\u010dn\u00e9 meradlo -CalibrationTapeMeasure.Readout.Magnitude.Hint=pre vlo\u017eenie zn\u00e1mych re\u00e1lnych jednotiek kliknite -CalibrationTapeMeasure.Hint=pre zmenu mierky nastavte d\u013a\u017eku, pre zmenu sklonu osi nastavte uhol -DynamicSystem.Data.Description.0=relat\u00edvna vzdialenos\u0165 medzi \u010dasticami -DynamicSystem.Data.Description.1=relat\u00edvny uhol -DynamicSystem.Data.Description.2=relat\u00edvna radi\u00e1lna r\u00fdchlos\u0165 -DynamicSystem.Data.Description.3=relat\u00edvna uhlov\u00e1 r\u00fdchlos\u0165 -ExportDataDialog.Subtitle.Table=Tabu\u013eka d\u00e1t -ExportDataDialog.Subtitle.Content=Bunky -ExportDataDialog.Subtitle.Format=Form\u00e1t \u010d\u00edsel -ExportDataDialog.Subtitle.Delimiter=Odde\u013eova\u010d -ExportDataDialog.Title=Exportova\u0165 d\u00e1ta -ExportDataDialog.Delimiter.Add=Prida\u0165... -ExportDataDialog.Delimiter.Remove=Odstr\u00e1ni\u0165... -ExportDataDialog.Content.AllCells=V\u0161etky bunky -ExportDataDialog.Content.SelectedCells=Vybran\u00e9 bunky -ExportDataDialog.MenuItem.RemoveDelimiter=Odstr\u00e1ni\u0165 u\u017e\u00edvate\u013esk\u00fd odde\u013eova\u010d -ExportDataDialog.Chooser.SaveData.Title=Ulo\u017ei\u0165 d\u00e1ta ako -ExportVideoDialog.Button.SaveAs=Ulo\u017ei\u0165 ako... -ExportVideoDialog.Button.FullSize=Skuto\u010dn\u00e1 ve\u013ekos\u0165 -ExportVideoDialog.Button.DrawnSize=Ako je nakreslen\u00e9 -ExportVideoDialog.Content.VideoOnly=Len video ExportVideoDialog.Content.VideoAndGraphics=Video a grafika -ExportVideoDialog.Content.GraphicsOnly=Iba grafika -ExportVideoDialog.Title=Exportova\u0165 Video klip -ExportVideoDialog.Label.ClipSettings=Nastavenia klipu -ExportVideoDialog.Subtitle.Size=Ve\u013ekos\u0165 -ExportVideoDialog.Subtitle.Content=Obsah -ExportVideoDialog.Subtitle.View=N\u00e1h\u013ead -ExportVideoDialog.Subtitle.Format=Form\u00e1t -ExportVideoDialog.Complete.Message1=Video bolo ulo\u017een\u00e9 ako -ExportVideoDialog.Complete.Message2=Prajete si otvori\u0165 to v Trackeri teraz? -ExportVideoDialog.Complete.Title=Export ukon\u010den\u00fd -ExportVideoDialog.VideoSize=ve\u013ekos\u0165 videa -ExportVideoDialog.MatSize=ve\u013ekos\u0165 r\u00e1mu -ExportVideo.Dialog.HiddenPlots.Message=Pri exportovan\u00ed musia by\u0165 grafy plne vidite\u013en\u00e9 -ExportVideo.Dialog.HiddenPlots.Title=Ne\u00fapln\u00fd n\u00e1h\u013ead -Footprint.DoubleTarget=dvojit\u00fd ter\u010d\u00edk -Footprint.BoldDoubleTarget=zv\u00fdraznen\u00fd dvojit\u00fd ter\u010d\u00edk -OffsetOrigin.MenuItem.Fixed=pevn\u00e9 re\u00e1lne s\u00faradnice -ParticleModel.Dialog.Offscreen.Message1=Niektor\u00e9 kroky modelu s\u00fa pr\u00e1zdne, lebo s\u00fa pr\u00edli\u0161 vzdielen\u00e9 z obrazovky -ParticleModel.Dialog.Offscreen.Message2=Pre n\u00e1pravu zme\u0148te model alebo pre\u0161k\u00e1lujte video. -ParticleModel.Dialog.Offscreen.Title=Mimo hran\u00edc -PrefsDialog.Tab.Configuration.Title=Konfigur\u00e1cia -PrefsDialog.Memory.BorderTitle=Ve\u013ekos\u0165 pam\u00e4te -PrefsDialog.Tab.General.Title=\u010eal\u0161\u00ed -PrefsDialog.RecentFiles.BorderTitle=Otvori\u0165 s\u00fa\u010dasn\u00e9 menu -PrefsDialog.Label.RecentSize=Po\u010det s\u00faborov -PrefsDialog.Hints.BorderTitle=N\u00e1povede -PrefsDialog.Button.Relaunch=Znovu na\u010d\u00edta\u0165 -PrefsDialog.Button.ClearRecent=Vymaza\u0165 -PrefsDialog.Checkbox.DefaultSize=Pou\u017ei\u0165 prednastaven\u00e9 -PrefsDialog.Checkbox.HintsOn=Zobrazi\u0165 prednastaven\u00e9 n\u00e1povede -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle (recommended) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Spr\u00e1va pa\u00e4te je nepr\u00edstupn\u00e1 pri pou\u017e\u00edvan\u00ed Web \u0161tartu -PrefsDialog.Dialog.WebStart.Title=Web \u0161tart m\u00f3d -PrefsDialog.LookFeel.BorderTitle=Look And Feel -PrefsDialog.Language.BorderTitle=Jazyk -PrefsDialog.Upgrades.BorderTitle=H\u013eadaj vy\u0161\u0161iu verziu -PrefsDialog.Tab.Runtime.Title=\u010das programu -PrefsDialog.Tab.Display.Title=Display -PrefsDialog.Language.Default=Predvolen\u00e9 -PrefsDialog.Upgrades.Always=V\u017edy -PrefsDialog.Upgrades.Weekly=t\u00fd\u017edenne -PrefsDialog.Upgrades.Monthly=mesa\u010dne -PrefsDialog.Upgrades.Never=nikdy -PrefsDialog.Button.CheckForUpgrade=H\u013eadaj teraz -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Hladko (m\u00f4\u017ee by\u0165 pomal\u00e9) -PrefsDialog.Xuggle.Fast=r\u00fdchlo (m\u00f4\u017ee by\u0165 trhan\u00e9) -PrefsDialog.CalibrationTool.BorderTitle=Predvolen\u00fd kalibra\u010dn\u00fd n\u00e1stroj -Protractor.Name=Uhlomer -Protractor.New.Name=Uhlomer -Protractor.Hint=pre meranie uhla potiahnite ramen\u00e1 -Protractor.Label.Angle=uhol -Protractor.Field.Angle.Tooltip=uhol medzi ramenami uhlomera -Protractor.Vertex.Name=vrchol -Protractor.Vertex.Hint=pre premiestnenie uhla potiahnite -Protractor.End.Name=koniec ramena -Protractor.End.Hint=pre oto\u010denie ramena potiahnite -Protractor.Handle.Name=rukov\u00e4\u0165 -Protractor.Handle.Hint=pre premiestnenie uhlomera potiahnite -Protractor.Rotator.Name=rot\u00e1tor -Protractor.Rotator.Hint=pre oto\u010denie uhlomera potiahnite -Protractor.Readout.Name=v\u00fdstup -Protractor.Readout.Hint=uhol medzi ramenami uhlomera -ProtractorFootprint.Circle3=mal\u00fd kr\u00fa\u017eok -ProtractorFootprint.Circle5=ve\u013ek\u00fd kr\u00fa\u017eok -ProtractorFootprint.Circle3Bold=zv\u00fdraznen\u00fd mal\u00fd kr\u00fa\u017eok -ProtractorFootprint.Circle5Bold=zv\u00fdraznen\u00fd ve\u013ek\u00fd kr\u00fa\u017eok -Stick.Name=kalibra\u010dn\u00e1 ty\u010d -Stick.New.Name=kalibra\u010dn\u00e1 ty\u010d -TableTrackView.MenuItem.Unformatted=Pln\u00e1 presnos\u0165 -TableTrackView.MenuItem.Formatted=Ako je formatovan\u00e9 -TableTrackView.Menu.SetDelimiter=Nastavi\u0165 odde\u013eova\u010d -TableTrackView.MenuItem.AddDelimiter=Prida\u0165... -TableTrackView.MenuItem.RemoveDelimiter=Odstr\u00e1ni\u0165... -TableTrackView.Dialog.CustomDelimiter.Message=Vlo\u017ete nov\u00fd re\u0165azec odde\u013eova\u010da: -TableTrackView.Dialog.CustomDelimiter.Title=Prida\u0165 odde\u013eova\u010d -TableTrackView.Header.Tooltip=Pre usporiadanie kliknite, pre ozna\u010denie kliknite dvakr\u00e1t. -TableTrackView.MenuItem.CopySelectedData=Kop\u00edrova\u0165 vybran\u00e9 d\u00e1ta -TableTrackView.Dialog.RemoveDelimiter.Message=Vybra\u0165 odde\u013eova\u010d pre odstr\u00e1nenie: -TableTrackView.Dialog.RemoveDelimiter.Title=Odstr\u00e1ni\u0165 odde\u013eova\u010d -TableTrackView.Radians.Tooltip=v radi\u00e1noch -TableTrackView.Degrees.Tooltip=v stup\u0148och -TableTrackView.RadiansPerSecond.Tooltip=v radi\u00e1noch za sekundu -TableTrackView.DegreesPerSecond.Tooltip=v stup\u0148och za sekundu -TableTrackView.RadiansPerSecondSquared.Tooltip=v radi\u00e1noch/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=v stup\u0148och/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Zmaz\u0165 funkciu d\u00e1t -TActions.Action.SaveFrame=Ulo\u017ei\u0165 Tabset ako... -TActions.AboutVideo=Vlastnosti... -TActions.Dialog.AboutVideo.Title=Vlastnosti videa -TActions.Dialog.AboutVideo.Type=Typ -TActions.Dialog.AboutVideo.Size=Rozmery -TActions.Dialog.AboutVideo.Length=D\u013a\u017eka -TActions.Dialog.AboutVideo.Frames=Sn\u00edmky -TActions.Dialog.AboutVideo.Seconds=Sekundy -TActions.Dialog.AboutVideo.FrameRate=R\u00fdchlos\u017e sn\u00edmok -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Cesta -TActions.Action.ImportTRK=Tracker s\u00fabor... -TActions.Action.ProtractorVisible=Vidite\u013en\u00fd -TapeMeasure.MenuItem.FixedLength=Fixn\u00e1 d\u013a\u017eka -TextTView.Label.NoTab=Kliknite na "Str\u00e1nka" pre pridanie textu alebo HTML str\u00e1nky -TextTView.NewTab.Text1=Pre zmenu textu alebo n\u00e1zvu urobte dvojklik. Kliknite prav\u00fdm tla\u010didlom pre viac mo\u017enost\u00ed. -TextTView.NewTab.Text2=Pre zobrazenie HTML str\u00e1nky vlo\u017ete url alebo kliknite prav\u00fdm tla\u010didlom a otvorte s\u00fabor -TextTView.NewTab.Title=Nepomenovan\u00fd -TextTView.Dialog.TabTitle.Title=Nastavi\u0165 nadpis -TextTView.MenuItem.OpenHTML=Otvori\u0165 HTML... -TextTView.MenuItem.SetTitle=Nastavi\u0165 nadpis... -TextTView.Button.NewTab=Nov\u00fd -TextTView.TextEdit.Description=Text -TFrame.Dialog.FileNotFound.Message=S\u00fabor nemo\u017emo n\u00e1js\u0165: -TFrame.Dialog.FileNotFound.Title=S\u00fabor nen\u00e1jden\u00fd -TFrame.View.Text=N\u00e1h\u013ead na str\u00e1nku -TFrame.View.Main=Hlavn\u00fd n\u00e1h\u013ead -TMenuBar.Menu.OpenRecent=Otvori\u0165 s\u00fa\u010dasn\u00fd -TMenuBar.Menu.Import=Importova\u0165 -TMenuBar.Menu.Export=Exportova\u0165 -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=D\u00e1tov\u00fd s\u00fabor... -TMenuBar.Menu.CopyObject=Kop\u00edrova\u0165 objekt -TMenuBar.MenuItem.Coords=Koordinova\u0165 syst\u00e9m -TMenuBar.MenuItem.VideoClip=Video klip -TMenuBar.Menu.MeasuringTools=Meracie n\u00e1stroje -TMenuBar.Menu.AngleUnits=Jednotky uhla -TMenuBar.MenuItem.Degrees=Stupne -TMenuBar.MenuItem.Radians=Radi\u00e1ny -Tracker.Dialog.NoXuggle.Title=Xuggle nen\u00e1jden\u00fd -Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplatformov\u00fd n\u00e1stroj na spracovanie video) nie je nain\u0161talovan\u00fd -Tracker.Dialog.NoXuggle.Message2=Stiahnu\u0165 Xuggle z http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=O programe Xuggle... -Tracker.Dialog.AboutXuggle.Title=O programe Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle verzia -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: -Tracker.Dialog.NoVideoEngine.Message1=Nebol n\u00e1jden\u00fd \u017eiaden program pre spracovanie Videa! Bez neho,Tracker m\u00f4\u017ee -Tracker.Dialog.NoVideoEngine.Message2=otvori\u0165 len obr\u00e1zky, sekvencie obr\u00e1zkov a animovan\u00e9 gif s\u00fabory -Tracker.Dialog.NoVideoEngine.Message3=V pr\u00edpade in\u0161tal\u00e1cie Xuggle, Trackerom preferovan\u00fd program pre spracovanie Videa -Tracker.Dialog.NoVideoEngine.Message4=v r\u00e1mci v\u0161etk\u00fdch platforiem, stiahnite pre Tracker posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z -Tracker.Dialog.NoVideoEngine.Title=Ch\u00fdbaj\u00faci program pre spracovanie Videa -Tracker.Dialog.NoXuggle.Message1=Xuggle, program pre spracovanie Videa preferovan\u00fd Trackerom, nebol dosia\u013e nain\u0161talovn\u00fd. -Tracker.Dialog.NoXuggle.Message2=Pre in\u0161tal\u00e1ciu Xuggle, stiahnite posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z -Tracker.Dialog.NoXuggle.Title=Ch\u00fdbaj\u00faci program Xuggle pre spracovanie videa -Tracker.About.DefaultLocale=Prednastaven\u00e9 umiestnenie -Tracker.About.CurrentLanguage=jazyk -Tracker.Dialog.InsufficientMemory.Title=Nedostatok pam\u00e4te -Tracker.Dialog.InsufficientMemory.Message=Po\u017eadovan\u00e1 pam\u00e4\u0165 je pr\u00edli\u0161 ve\u013ek\u00e1. -TrackerIO.Dialog.TabMustBeSaved.Message1=Pre otvorenie z\u00e1lo\u017eka v ponuke z\u00e1lo\u017eiek -TrackerIO.Dialog.TabMustBeSaved.Message2=mus\u00edte ulo\u017ei\u0165 z\u00e1loi\u017eku ako Trackerovsk\u00fd s\u00fabor. -TrackerIO.Dialog.TabMustBeSaved.Message3=Chcete to ulo\u017ei\u0165? -TrackerIO.Dialog.TabMustBeSaved.Title=Neulo\u017een\u00e1 z\u00e1lo\u017eka -TrackerIO.Dialog.NoTabs.Message=Niet \u017eiadnych z\u00e1lo\u017eiek, ktor\u00e9 by neboli ulo\u017een\u00e9! -TrackerIO.Dialog.NoTabs.Title=Pr\u00e1zdna ponuka z\u00e1lo\u017eiek -TrackerIO.Dialog.SaveTabset.Title=Ulo\u017ei\u0165 ponuku z\u00e1lo\u017eiek -TrackerIO.Dialog.SaveTab.Title=Ulo\u017ei\u0165 z\u00e1lo\u017eku -TrackerIO.Delimiter.Tab=Z\u00e1lo\u017eka -TrackerIO.Delimiter.Space=medzera -TrackerIO.Delimiter.Comma=\u010diarka -TrackerIO.Delimiter.Semicolon=bodko\u010diarka -TrackerIO.VideoAndDataFileFilter.Description=Video a trackerovsk\u00e9 s\u00fabory -TrackerPanel.Dialog.Version.Message1=Chcete otvori\u0165 s\u00fabor vytvoren\u00fd Trackerom -TrackerPanel.Dialog.Version.Message2=ktor\u00fd m\u00f4\u017ee obsahova\u0165 -TrackerPanel.Dialog.Version.Message3=vlastnosti ch\u00fdbaj\u00face v pr\u00e1ve be\u017eiacej verzii Trackera. -TrackerPanel.Dialog.Version.Message4=Posledn\u00e1 verzia je dostupn\u00e1 na -TrackerPanel.Dialog.Version.Title=Nes\u00falad medzi programom a verziou Trackera -TrackerPanel.Label.ModelStart=Spusti\u0165 -TrackerPanel.Label.ModelEnd=Ukon\u010di\u0165 -TrackerPanel.Spinner.ModelStart.Tooltip=Nastavi\u0165 \u0161tartovaciu sn\u00edmku pre tento model -TrackerPanel.Spinner.ModelEnd.Tooltip=Nastavi\u0165 koncov\u00fa sn\u00edmku pre tento model -TToolbar.Button.ProtractorVisible.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 uhlomer -TToolbar.Button.AxesVisible.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 s\u00faradnicov\u00e9 osi -TToolBar.Button.TrackControl.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 ovl\u00e1danie stopy -TTrack.Dialog.StepSizeWarning.Message1=Upozornnenie: niektor\u00e9 stopy boli ozna\u010den\u00e9 s v\u00e4\u010d\u0161\u00edm krokom ne\u017e jedna a to bez ozna\u010denia vynechan\u00fdch sn\u00edmok. -TTrack.Dialog.StepSizeWarning.Message2=Zmena kroku je poravdepodobne v\u00fdsledkom niektor\u00fdch ch\u00fdbaj\u00facich d\u00e1t. -TTrack.Dialog.StepSizeWarning.Message3=V\u0161etky r\u00fdchlosti a zr\u00fdchlenia nie je mo\u017en\u00e9 vypo\u010d\u00edta\u0165 pokia\u013e neozna\u010d\u00edte v\u0161etky kroky. -TTrack.Dialog.StepSizeWarning.Title=Upozornenie -TTrack.Dialog.SkippedStepWarning.Message1=Upozornenie: presko\u010denie krokov pri ozna\u010dovan\u00ed pol\u00f4h zanech\u00e1va ch\u00fdbaj\u00face d\u00e1ta. -TTrack.Dialog.SkippedStepWarning.Title=Upozornenie -TTrack.Dialog.SkippedStepWarning.Checkbox=Neukazova\u0165 pri nasled\u00facom spusten\u00ed -TTrack.Locked.Hint=zamknut\u00e9 -TTrack.AngleField.Radians.Tooltip=Uhol v radi\u00e1noch -TTrack.AngleField.Degrees.Tooltip=Uhol v stup\u0148och -TTrack.AngleField.Popup.Radians=Prepn\u00fa\u0165 na radi\u00e1ny -TTrack.AngleField.Popup.Degrees=Prepn\u00fa\u0165 na stupne -TTrackBar.Memory.Menu.SetSize=Set memory size... -TTrackBar.Button.Version=Moment\u00e1lne dostupn\u00e1:verzia -TTrackBar.Popup.MenuItem.Upgrade=Aktualizova\u0165 teraz... -TTrackBar.Popup.MenuItem.Ignore=Ignorova\u0165 -XuggleVideo.MenuItem.SmoothPlay=Plynul\u00e9 prehr\u00e1vanie (m\u00f4\u017ee by\u0165 pomal\u00e9) - -# Additions by Doug Brown -CircleFootprint.Circle=kr\u00fa\u017eok -CircleFootprint.FilledCircle=pln\u00fd kr\u00fa\u017eok -CircleFootprint.Dialog.Title=Stopa v tvare kr\u00fa\u017eku -CircleFootprint.Dialog.Label.Radius=Polomer -CircleFootprint.Dialog.Checkbox.Bold=Zv\u00fdrazni\u0165 -CircleFootprint.Dialog.Checkbox.CenterSpot=Vycentrovan\u00e1 bodka -TrackControl.StretchVectors.None=Bez natiahnutia -TViewChooser.Maximize.Tooltip=Maximalizova\u0165 n\u00e1h\u013ead -TViewChooser.Restore.Tooltip=Obnovi\u0165 n\u00e1h\u013ead -PageTView.Button.Page=Str\u00e1nka -PageTView.MenuItem.ClosePage=Zatvori\u0165 str\u00e1nku -PointMass.Hint.Marking=Pre ozna\u010denie nov\u00e9ho bodu kliknite my\u0161ou. Stla\u010dte Enter pre opakovanie predch\u00e1dzaj\u00faceho kroku -Vector.Hint.Marking=Pre ozna\u010denie nov\u00e9ho vektora potiahnite my\u0161ou. Stla\u010dte Enter pre opakovanie predch\u00e1dzaj\u00faceho kroku -LineProfile.Hint.Marking=Pre ozna\u010denie nov\u00e9ho \u010diarov\u00e9ho profilu potiahnite my\u0161ou. -RGBRegion.Hint.Marking=Pre ozna\u010denie stredu oblasti kliknite my\u0161ou. -PrefsDialog.Dialog.NewVersion.Title=Aktualiz\u00e1cie -PrefsDialog.Dialog.NewVersion.Message1=Nov\u00e1 Verzia -PrefsDialog.Dialog.NewVersion.Message2=je pr\u00edstupn\u00e1 na -PrefsDialog.Dialog.NewVersion.None.Message=Moment\u00e1lne nie je pr\u00edstupn\u00e1 \u017eiadna nov\u00e1 verzia. -TMenuBar.MenuItem.Restore=Obnovi\u0165 n\u00e1h\u013ead -CalibrationTapeMeasure.Name=Kalibra\u010dn\u00e9 meradlo -WorldTView.Button.World=Re\u00e1lny poh\u013ead - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Warnings -PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors -PropertiesDialog.Title=Properties -PropertiesDialog.Label.Author=Author -PropertiesDialog.Label.Contact=Contact -TActions.Action.Properties=Properties... -TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame -TFrame.Progress.ClickToCancel=(click to cancel) -TFrame.Dialog.StalledVideo.Title=Error Loading Video -TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. -TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. -TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: -TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. -TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. -TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stop -TFrame.Dialog.StalledVideo.Button.Wait=Wait -Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again -TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found -TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinematic Particle -DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) -DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) -DynamicSystem.Builder.Title=Dynamic System (Internal) -PropertiesDialog.Button.CopyFilePath=Copy File Path -PropertiesDialog.Button.CopyVideoPath=Copy Video Path -PropertiesDialog.Tab.TrackerFile=Tracker File -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=Property -PropertiesDialog.Header.Value=Value -TActions.Action.OpenURL=Open URL... -TActions.Dialog.OpenURL.Title=Open URL -TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file -TActions.Dialog.AboutVideo.Name=Name - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cached Web Files -PrefsDialog.Button.ClearCache=Clear - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-click to re-mark highlighted position -PointMass.Remarking.Hint=click mouse to re-mark position -PointMass.PositionSelected.Hint=drag or enter position on toolbar -PointMass.VectorSelected.Hint=drag to move -Vector.Remark.Hint=shift-click to re-mark highlighted tip -Vector.TipSelected.Hint=drag or enter components on toolbar -Vector.HandleSelected.Hint=drag to move -Vector.Remarking.Hint=click mouse to re-mark tip -AutoTracker.Label.Search=Search -AutoTracker.Label.Target=Target -AutoTracker.Label.Frame=Frame -AutoTracker.Label.Point=Point -AutoTracker.Label.Template=Template -AutoTracker.Label.Track=Track -AutoTracker.Label.Match=Match -AutoTracker.Label.NoTemplate=No Template -AutoTracker.Label.EvolutionRate=Evolution Rate -AutoTracker.Label.Automark=Automark -AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. -AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. -AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. -AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. -AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. -AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. -AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. -AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. -AutoTracker.Info.Search=The search area is scanned for the best match. -AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. -AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. -AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. -AutoTracker.Info.Target=The target is where the targeted track point is marked. -AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. -AutoTracker.Info.Title.Settings=Settings -AutoTracker.Info.Title.Tip=Tip -AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. -AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: -AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame -AutoTracker.Info.Replace=--accept the match and replace the existing point -AutoTracker.Info.Keep=--keep the existing point -AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Wizard.Button.Replace=Replace -AutoTracker.Wizard.Button.Keep=Keep -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.SearchThis=Search This -AutoTracker.Wizard.Button.SearchNext=Search Next -AutoTracker.Wizard.Button.Delete=Delete -AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Wizard.Menuitem.DeleteThis=This Point -AutoTracker.Wizard.Menuitem.DeleteLater=Later Points -AutoTracker.Wizard.Menuitem.DeleteAll=All Points -TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker -MainTView.Popup.MenuItem.ZoomIn=Zoom In -MainTView.Popup.MenuItem.ZoomOut=Zoom Out -MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit -TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration -TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than -TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from -TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. -TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: -TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=No resource could be loaded for node - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift-click to mark -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Directories -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Clear on exit -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=Save -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=Algorithms... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: -AlgorithmDialog.Title=Algorithms -AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. -AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i]=(x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i]=(2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. -AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=The file cannot be read. -TrackPlottingPanel.Popup.Menu.CompareWith=Compare With -TrackerPanel.DataBuilder.TrackType.Unknown=unknown -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=Load Data Functions -TrackerPanel.DataBuilder.Load.Message=Select functions to load: -TrackerPanel.DataBuilder.Save.Title=Save Data Functions -TrackerPanel.DataBuilder.Save.Message=Select functions to save: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into -TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection -TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type -TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. -TToolbar.Button.Refresh=Refresh data and views - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as -ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportTRKDialog.Complete.Title=Export Complete -ExportTRKDialog.Title=Export ZIP Resource -ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. -ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. -TMenuBar.MenuItem.TabClip=ZIP Resource -TMenuBar.Menu.CalibrationTools=Calibration Tools -TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=end -TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Attach Ends -AttachmentInspector.Label.End=End -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Name -AttachmentInspector.Header.AttachedTo=Attach To -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Attach Ends... -PerspectiveTrack.Corner=corner -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=time -Protractor.Data.Description.1=protractor angle -Protractor.Data.Description.2=length of arm 1 -Protractor.Data.Description.3=length of arm 2 -Protractor.Data.Description.4=step number -Protractor.Data.Description.5=frame number -TapeMeasure.Data.Description.0=time -TapeMeasure.Data.Description.1=length -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=step number -TapeMeasure.Data.Description.4=frame number - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Add -Dialog.Button.Remove=Remove -PrefsDialog.Button.ClearHost=Clear Host -PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache -PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache -TActions.Action.SaveZip=Export ZIP Resource -ThumbnailDialog.Title=Export Thumbnail Image -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Current image -ThumbnailDialog.Label.FrameNumber=frame -ThumbnailDialog.Label.StepNumber=step -ThumbnailDialog.View.VideoOnly=Video Only -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Thumbnail Image -TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser -TTrack.MenuItem.DeletePoint=Delete Selected Step -ZipResourceDialog.Title=Export ZIP Resource -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Name -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Keywords -ZipResourceDialog.Label.Link=External Link -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Success -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource -ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource -ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File -ZipResourceDialog.Button.AddFiles=Add Files -ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File -ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file -ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? -ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch -ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files -ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) -ZipResourceDialog.Tooltip.Author=Authors of this resource -ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) -ZipResourceDialog.Tooltip.Description=A useful description of this resource -ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser -ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource -ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type -ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource -ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video -ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file - -# Additions by Doug Brown 2012-12-10 -PrefsDialog.Checkbox.32BitVM=32-bit -PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations -PrefsDialog.Button.NoEngine=None -PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. -PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed -PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. -PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. -PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. -PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. -PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required -PrefsDialog.Button.ShowHelpNow=Show Help Now -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT -TMenuBar.MenuItem.CheckFrameDurations=Frame Durations -TMenuBar.MenuItem.ExportZIP=Tracker Zip -Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. -Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they -Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. -Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? -Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now -Tracker.Dialog.Button.ShowPrefs=No, but show preferences -Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video -Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. -TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). -TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) -TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents -ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the -ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the -ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. -ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? -ZipResourceDialog.BadModels.Title=Clip-Model Conflicts -TMenuBar.MenuItem.EditVideoFrames=Load All Images -TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. -TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. -TMenuBar.Dialog.RequiresMemory.Title=Memory - -# Additions by Doug Brown 2013-01-25 -PointMass.Data.Description.PixelX=pixel x-component -PointMass.Data.Description.PixelY=pixel y-component -ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video -ExportVideoDialog.Deinterlace.OddFirst=Odd field first -ExportVideoDialog.Deinterlace.EvenFirst=Even field first -ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order -TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found -TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file -TrackerPanel.DataBuilder.Button.Autoload=Autoload -TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage data function autoloading -TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions -TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: -TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files -TrackerIO.Dialog.Open.Title=Open -TToolbar.Button.Refresh.Popup.RefreshNow=Refresh -TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh -TToolbar.Button.Refresh.Tooltip=Refresh data and views - -# Additions by Doug Brown 2013-05-10 -CoordAxes.Origin.Label=origin pixel position -CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video - -# Additions by Doug Brown 2013-08-24 -MainTView.Popup.MenuItem.Select=Select Points -MainTView.Popup.MenuItem.Deselect=Deselect Points -ZipResourceDialog.Checkbox.PreviewThumbnail=Preview -ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: -ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename -ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. -ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed -PrefsDialog.Button.SetCache=Set Cache - -# Additions by Doug Brown 2013-12-17 -Tracker.StartLog=Start Log -Tracker.StartLog.NotFound=Start log file not found -Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced -Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory -Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to -Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... -TrackPlottingPanel.Popup.MenuItem.ShowZero=Show -TableTrackView.Menu.TextColumn.Text=Text Columns -TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns -TableTrackView.Action.CreateTextColumn.Text=Create... -TableTrackView.Action.DeleteTextColumn.Text=Delete -TableTrackView.Action.RenameTextColumn.Text=Rename -TableTrackView.Dialog.NameColumn.Message=Please enter a column name. -TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. -TableTrackView.Dialog.NameColumn.Title=Text Column +# This is the Slovak beta version of tracker.properties +# Translated by M.Han\u010dov\u00e1, J.Han\u010d + +Calibration.Name=Kalibra\u010dn\u00e9 body +Calibration.New.Name=kalibra\u010dn\u00e9 body +CenterOfMass.Name=\u0165a\u017eisko +CenterOfMass.New.Name=\u0165a\u017eisko +CenterOfMass.MenuItem.Inspector=Vyberte hmotnosti ... +CenterOfMassInspector.Title=\u0165a\u017eisko +CenterOfMassInspector.Border. title=Vyberte hmotnosti +ConfigInspector.Border.Title=po\u017eadovan\u00e9 vlastnosti +ConfigInspector.Title=Predvo\u013eby +ConfigInspector.Button.SaveAsDefault=Ulo\u017ei\u0165 ako predvolen\u00e9 +CoordAxes.Name=osi +CoordAxes.New.Name=osi +Dialog.Button.Cancel=Zru\u0161i\u0165 +Dialog.Button.OK=OK +Dialog.Button.Close=Zavrie\u0165 +Dialog.Button.All=V\u0161etky +Dialog.Button.None=\u017diadne +Dialog.Button.Copy=Kop\u00edrova\u0165 +Dialog.Button.Update=Aktualizova\u0165 +Dialog.Button.SelectAll=Vybra\u0165 v\u0161etko +Footprint.Diamond=koso\u0161tvorec +Footprint.BoldDiamond=zv\u00fdraznen\u00fd koso\u0161tvorec +Footprint.SolidDiamond=pln\u00fd koso\u0161tvorec +Footprint.Triangle=trojuholn\u00edk +Footprint.BoldTriangle=zv\u00fdraznen\u00fd trojuholn\u00edk +Footprint.SolidTriangle=pln\u00fd trojuholn\u00edk +Footprint.Circle=kruh +Footprint.BoldCircle=zv\u00fdraznen\u00fd kruh +Footprint.SolidCircle=pln\u00fd kruh +Footprint.VerticalLine=zvisl\u00e1 \u010diara +Footprint.BoldVerticalLine=zv\u00fdraznen\u00e1 zvisl\u00e1 \u010diara +Footprint.HorizontalLine=horizont\u00e1lna \u010diara +Footprint.BoldHorizontalLine=zv\u00fdraznen\u00e1 horizont\u00e1lna \u010diara +Footprint.Crosshair=ter\u010d\u00edk +Footprint.BoldCrosshair=zv\u00fdraznen\u00fd ter\u010d\u00edk +Footprint.SimpleAxes=jednoduch\u00e9 osi +Footprint.BoldSimpleAxes=zv\u00fdraznen\u00e9 jednoduch\u00e9 osi +Footprint.Spot=bod +Footprint.Line=\u010diara +Footprint.BoldLine=zv\u00fdraznen\u00e1 \u010diara +Footprint.Outline=obrys +Footprint.BoldOutline=zv\u00fdrazenen\u00fd obrys +Footprint.Arrow=\u0161\u00edpka +Footprint.BoldArrow=zv\u00fdraznen\u00e1 \u0161\u00edpka +Footprint.DoubleArrow=dvojit\u00e1 \u0161\u00edpka +Footprint.BoldDoubleArrow=zv\u00fdraznen\u00e1 dvojit\u00e1 \u0161\u00edpka +Footprint.2xArrow=2x \u0161\u00edpka +Footprint.Bold2xArrow=zv\u00fdraznen\u00e1 2x \u0161\u00edpka +Footprint.4xArrow=4x \u0161\u00edpka +Footprint.Bold4xArrow=zv\u00fdraznen\u00e1 4x \u0161\u00edpka +Footprint.DashArrow=\u010diarkovan\u00e1 \u0161\u00edpka +Footprint.BoldDashArrow=zv\u00fdraznen\u00e1 \u010diarkovan\u00e1 \u0161\u00edpka +Footprint.BigArrow=ve\u013ek\u00e1 \u0161\u00edpka +Footprint.BigDashArrow=ve\u013ek\u00e1 \u010diarkovan\u00e1 \u0161\u00edpka +LineProfile.Name=\u010ciarov\u00fd profil +LineProfile.New.Name=profil +LineProfile.Data.Brightness=jas +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=\u010derven\u00e1 +LineProfile.Data.Green=zelen\u00e1 +LineProfile.Data.Blue=modr\u00e1 +LineProfile.Data.Weighting=po\u010det +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Lupa +MainTView.Popup.MenuItem.ToFit=Prisp\u00f4sobi\u0165 +OffsetOrigin.Name=po\u010diatok mimo okna +OffsetOrigin.New.Name=po\u010diatok mimo okna +PlotTrackView.Button.PlotCount=graf +PlotTrackView.Button.PlotCount.ToolTip=Nastavi\u0165 po\u010det grafov +PointMass.Name=hmotn\u00fd bod +PointMass.New.Name=hmotnos\u0165 +PointMass.MenuItem.VectorsToPosition=poloha +PointMass.MenuItem.Velocity=r\u00fdchlos\u0165 +PointMass.MenuItem.Acceleration=zr\u00fdchlenie +Star.Name=hviezdi\u010dka +Star.New.Name=hviezdi\u010dka +TableTrackView.Action.CopyData=kop\u00edrova\u0165 d\u00e1ta +TableTrackView.Button.SelectTableData=Tabu\u013eka +TableTrackView.Button.SelectTableData.ToolTip=Vyberte st\u013apce tabu\u013eky +TableTrackView.Popup.MenuItem.Analyze=Analyzova\u0165 ... +TableTrackView.Dialog.Border.Title=Vidite\u013en\u00fd: +TActions.Action.Description=Pozn\u00e1mky +TActions.Action.ClearTracks=Vymaza\u0165 +TActions.Action.NewTab=Nov\u00e1 z\u00e1lo\u017eka +TActions.Action.Copy=Kop\u00edrova\u0165 +TActions.Action.Paste=Vlo\u017ei\u0165 +TActions.Action. Otvori\u0165=Otvori\u0165 ... +TActions.Action.Close=Zavrie\u0165 z\u00e1lo\u017eku +TActions.Action.Import=Importova\u0165 ... +TActions.Action.Save=Ulo\u017ei\u0165 z\u00e1lo\u017eku +TActions.Action.SaveAs=Ulo\u017ei\u0165 z\u00e1lo\u017eku ako ... +TActions.Action.Export=Exportova\u0165 ... +TActions.Action.CaptureVideo=Nahra\u0165 Video ... +TActions.Action.Delete=Zmaza\u0165 +TActions.Action.Config=Nastavenia ... +TActions.Action.AxesVisible=vidite\u013en\u00fd +TActions.Action.TapeVisible=vidite\u013en\u00fd +TActions.Action.Print=Tla\u010d ... +TActions.Action.ClearFilters=Vymaza\u0165 +TActions.Action.ImportVideo=Importova\u0165 ... +TActions.Action.CloseVideo=Zatvori\u0165 +TActions.Action.CloseAll=Zatvori\u0165 v\u0161etko +TActions.Action.Exit=Koniec +TActions.Dialog.PrintError.Message=Vyskytla sa chyba tla\u010de +TActions.Dialog.PrintError.Title=Chyba tla\u010de +TActions.Dialog.Description.Title=Pozn\u00e1mky +TActions.Dialog.DeleteLockedTracks.Message=Niektor\u00e9 stopy s\u00fa zamknut\u00e9. Odstr\u00e1ni\u0165 aj tak? +TActions.Dialog.DeleteLockedTracks.Title=Odstr\u00e1ni\u0165 zamknut\u00e9 stopy? +TActions.Dialog.NewPointMass.Title=Nov\u00fd hmotn\u00fd bod +TapeMeasure.Name=posuvn\u00e9 meradlo +TapeMeasure.New.Name=meradlo +TapeMeasure.MenuItem.Fixed=pevn\u00e1 poloha +TFrame.View.Plot=graf +TFrame.View.Table=tabu\u013eka +TFrame.View.World=re\u00e1lny poh\u013ead +TFrame.View.Video=video +TFrame.Dialog.Help.Title=Tracker N\u00e1pove\u010f +TMenuBar.Menu.File=S\u00fabor +TMenuBar.Menu.Edit=Upravi\u0165 +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Stopy +TMenuBar.Menu.Coords=s\u00faradnicov\u00fd syst\u00e9m +TMenuBar.Menu.Window=Okno +TMenuBar.Menu.Help=Pomocn\u00edk +TMenuBar.MenuItem.EditProperties=Vlastnosti ... +TMenuBar.MenuItem.VideoVisible=Vidite\u013en\u00e9 +TMenuBar.MenuItem.VideoFilters=Filtre +TMenuBar.MenuItem.NewVideoFilter=Nov\u00fd +TMenuBar.MenuItem.NewTrack=Nov\u00fd +TMenuBar.MenuItem.CoordsLocked=Zamknut\u00fd +TMenuBar.MenuItem.CoordsFixedOrigin=Pevn\u00fd po\u010diatok +TMenuBar.MenuItem.CoordsFixedAngle=Pevn\u00fd uhol +TMenuBar.MenuItem.CoordsFixedScale=pevn\u00e1 mierka +TMenuBar.MenuItem.CoordsRefFrame=Vz\u0165a\u017en\u00e1 s\u00fastava +TMenuBar.MenuItem.CoordsDefault=Predvolen\u00e9 +TMenuBar.MenuItem.WindowRight=Poh\u013ead zboku +TMenuBar.MenuItem.WindowBottom=Poh\u013ead zdola +TMenuBar.MenuItem.PlayAllSteps=Prehra\u0165 v\u0161etky kroky +TMenuBar.MenuItem.Record=Nahra\u0165 +TMenuBar.MenuItem.MatSize=Mat Ve\u013ekos\u0165 +TMenuBar.MenuItem.Language=Jazyk +TMenuBar.MenuItem.DeleteTrack=Zmaza\u0165 +TMenuBar.MenuItem.TrackerHelp=Tracker N\u00e1pove\u010f ... +TMenuBar.MenuItem.MessageLog=Spr\u00e1va Prihl\u00e1senie ... +TrackControl.Name=Kontrola stopy +TrackControl.Button.NewTrack=Vytvori\u0165 +TrackControl.Button.NewTrack.ToolTip=Vytvori\u0165 nov\u00fa stopu +TrackControl.Button.Trails.ToolTip=Nastavi\u0165 d\u013a\u017eku cesty +TrackControl.Button.Labels.ToolTip=Zobrazi\u0165 alebo skry\u0165 \u010d\u00edslovanie +TrackControl.Button.StretchVectors.ToolTip=Natiahnu\u0165 vektory +TrackControl.Button.Accelerations.ToolTip=Zobrazi\u0165 alebo skry\u0165 vektory zr\u00fdchleniaTrackControl.Button.Xmass.ToolTip=Vyn\u00e1sobte vektory hmotnos\u0165ou +TrackControl.Button.Vectors.ToolTip=Vektory +TrackControl.Button.Velocities.ToolTip=Zobrazi\u0165 alebo skry\u0165 vektory r\u00fdchlosti +TrackControl.Button.Properties.ToolTip=Kliknut\u00edm vyberte +TrackControl.Button.Positions.ToolTip=Zobrazi\u0165 alebo skry\u0165 polohu +Tracker.Popup.MenuItem.Snapshot=Sn\u00edmka ... +Tracker.Popup.MenuItem.Help=Pomocn\u00edk .. . +Tracker.Cursor.Crosshair.Description=ter\u010d\u00edkov\u00fd kurzor +Tracker.Action.AboutTracker=O Trackeri ... +Tracker.Dialog.AboutTracker.Title=O Trackeri +Tracker.Action.AboutJava=O Jave ... +Tracker.Dialog.AboutJava.Title=O Jave +Tracker.Dialog.AboutJava.UnknownVersion=nezn\u00e1my +Tracker.Dialog.AboutJava.Message=Java verzia +Tracker.Action.AboutQT=O QuickTime ... +Tracker.Dialog.AboutQT.Title=O QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime verzia +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava verzia +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava cesta: +Tracker.Dialog.NoQT.Title=QTJava.zip nebol n\u00e1jden\u00fd +Tracker.Dialog.NoQT.Message1=QuickTime for Java zrejme nie je nain\u0161talovan\u00fd +Tracker.Dialog.NoQT.Message2=Ak chcete analyzova\u0165 QuickTime filmy, pros\u00edm prein\u0161talujte QuickTime. +Tracker.Dialog.NoQT.Message3=POZN\u00c1MKA: QuickTime for Java mus\u00ed by\u0165 pri in\u0161tal\u00e1cii QuickTime ozna\u010den\u00fd. +Tracker.Dialog.UpdateQT.Title=Aktualiz\u00e1cia QTJava.zip +Tracker.Dialog.UpdateQT.Message1=nov\u0161ia verzia QTJava.zip bola n\u00e1jden\u00e1 na +Tracker.Dialog.UpdateQT.Message2=Prajete si aktualizova\u0165 existuj\u00faci s\u00fabor? +Tracker.Dialog.CopyQT.Title=Kop\u00edrova\u0165 QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime je nain\u0161talovan\u00fd, ale k\u00fdm ho Tracker m\u00f4\u017ee pou\u017ei\u0165: +Tracker.Dialog.CopyQT.Message2=1. QTJava.zip mus\u00ed by\u0165 skop\u00edrovan\u00fd z +Tracker.Dialog.CopyQT.Message3=k +Tracker.Dialog.CopyQT.Message4=2. Tracker je potrebn\u00e9 re\u0161tartova\u0165. +Tracker.Dialog.CopyQT.Message5=Prajete si skop\u00edrova\u0165 QTJava.zip teraz? +Tracker.Dialog.CopyFailed.Title=Kop\u00edrovanie sa nepodarilo +Tracker.Dialog.CopyFailed.Message=QTJava.zip sa ned\u00e1 skop\u00edrova\u0165. +Tracker.Dialog.CopiedTo.Title=Kop\u00edrovanie \u00faspe\u0161n\u00e9 +Tracker.Dialog.CopiedTo.Message1=QTJava.zip bola \u00faspe\u0161ne skop\u00edrovan\u00e1 do +Tracker.Dialog.CopiedTo.Message2=Tracker mus\u00ed by\u0165 re\u0161tartovan\u00fd a bude teraz ukon\u010den\u00fd. +Tracker.Splash.Loading=Na\u010d\u00edtanie +TrackerIO.Dialog.Import.Title=Importova\u0165 s\u00fabor Tracker +TrackerIO.Dialog.Import.Message=Vyberte polo\u017eky na import +TrackerIO.Dialog.ImportVideo.Title=Import videa +TrackerIO.Dialog.Export.Title=Export +TrackerIO.Dialog.Export.Message=Vyberte polo\u017eky pre export +TrackerIO.Dialog.ReplaceFile.Title=Nahradi\u0165 existuj\u00faci s\u00fabor? +TrackerIO.Dialog.ReplaceFile.Message=u\u017e existuje. Chcete ho nahradi\u0165 +TrackerIO.Dialog.NotTrackerXML.Title=nezodpovedaj\u00face XML +TrackerIO.Dialog.NotTrackerXML.Message=obsahuje xml d\u00e1ta pre in\u00fa aplik\u00e1ciu. +TrackerIO.Dialog.BadVideo.Message=S\u00fabor nie je rozpoznate\u013en\u00e9 video +TrackerIO.Dialog.BadVideo.Title=Nerozpoznan\u00fd video s\u00fabor +UntitledTrackerPanel.NewTab.Name=Nepomenovan\u00fd +TrackerPanel.DragToMark.Hint= Shift-\u0165ahom ozna\u010di\u0165 +TrackerPanel.ClickToMark.Hint=Shift-ozna\u010di\u0165 kliknut\u00edm +TrackerPanel.Dialog.LoadFailed.Title=Neplatn\u00fd s\u00fabor Tracker +TrackerPanel.Dialog.LoadFailed.Message=S\u00fabor nie je platn\u00fd Tracker s\u00fabor: +TrackerPanel.Dialog.SaveChanges.Title=Ulo\u017ei\u0165 zmeny +TrackerPanel.Dialog.SaveChanges.Message=Ulo\u017ei\u0165 zmeny +TrackPlottingPanel.Popup.MenuItem.Lines=\u010ciary +TrackPlottingPanel.Popup.MenuItem.Points=Body +TrackPlottingPanel.Popup.MenuItem.Scale=Mierka... +TrackPlottingPanel.Popup.MenuItem.Print=Tla\u010d ... +TrackPlottingPanel.Popup.MenuItem.Measure=Prisp\u00f4sobi\u0165 +TrackPlottingPanel.Popup.MenuItem.Analyze=Analyzova\u0165. .. +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Pribl\u00ed\u017ei\u0165 +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Oddiali\u0165 +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=autoscale +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zv\u00e4\u010d\u0161i\u0165 v obd\u013a\u017eniku +TrackPlottingPanelInspector.Title=mierka +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Nastavenie stopy +TToolBar.Dropdown.SelectedTrack.Tooltip=Vyberte stopu +TToolBar.Dropdown.SelectedTrack.None=\u017eiadny +TTrack.MenuItem.Delete=Zmaza\u0165 +TTrack.MenuItem.Color=Farba ... +TTrack.Dialog.Color.Title=Vyberte farbu stopy +TTrack.MenuItem.Name=N\u00e1zov ... +TTrack.MenuItem.Footprint=stopa +TTrack.MenuItem.Description=Pozn\u00e1mky ... +TTrack.MenuItem.Visible=Vidite\u013en\u00fd +TTrack.MenuItem.TrailVisible=Stopa vidite\u013en\u00e1 +TTrack.MenuItem.Autostep=automatick\u00fd krok +TTrack.MenuItem.MarkByDefault=Ozna\u010di\u0165 v predvolenom nastaven\u00ed +TTrack.MenuItem.Locked=Zamknut\u00e1 +TTrack.MenuItem.Delete=Odstr\u00e1ni\u0165 +TTrack.Name.None=bez n\u00e1zvu +TTrack.Dialog.Description.Title=Pozn\u00e1mky: +TTrack.Dialog.Name.Title=Nastavi\u0165 n\u00e1zov +TTrack.Dialog.Name.Label=N\u00e1zov: +TViewChooser.Button.Choose.Tooltip=Vyberte poh\u013ead +Vector.Name=Vector +Vector.New.Name=vektor +Vector.MenuItem.ToOrigin=do po\u010diatku +Vector.MenuItem.Label=ozna\u010denie vidite\u013en\u00e9 +VectorSum.Name=vektorov\u00fd s\u00fa\u010det +VectorSum.New.Name=s\u00fa\u010det +VectorSum.MenuItem.Inspector=Vyberte Vektory ... +VectorSumInspector.Title=vektorov\u00fd s\u00fa\u010det +VectorSumInspector.Border.Title=Vybra\u0165 Vektory +WorldTView.Popup.MenuItem.Projectile=N\u00e1bojov\u00fd model + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Analytick\u00fd \u010dasticov\u00fd Model +AnalyticParticle.Inspector.Title=Analytick\u00fd \u010dasticov\u00fd model +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=polomer 4 +CircleFootprint.Circle_6=polomer 6 +CircleFootprint.Circle_8=polomer 8 +DynamicParticle.Name=dynamick\u00fd \u010dasticov\u00fd model (Kartezi\u00e1nsky) +DynamicParticle.Inspector.Title=Dynamick\u00fd \u010dasticov\u00fd model +DynamicParticle.Property.ForceX=sila x +DynamicParticle.Property.ForceY=sila y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX= vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=pevn\u00e1 poloha +ParticleModel.New.Name=model +ParticleModel.MenuItem.InspectModel=Model Builder ... +ParticleModel.Inspector.Button.Undo=Sp\u00e4\u0165 +ParticleModel.Inspector.Button.Redo=Znovu +ParticleModel.Inspector.Button.Close=Zavrie\u0165 +ParticleModel.Inspector.Button.Help=Pomocn\u00edk + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=iba X +Calibration.Axes.YOnly=iba Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Vyberte kalibr\u00e1ciu os\u00ed +Calibration.Label.Axes=osi +Calibration.Dialog.InvalidCoordinates.Title=Neplatn\u00e9 s\u00faradnice +Calibration.Dialog.InvalidCoordinates.Message=body nem\u00f4\u017eu ma\u0165 rovnak\u00e9 re\u00e1lne s\u00faradnice. +Calibration.Dialog.InvalidXCoordinates.Message=Body nem\u00f4\u017eu ma\u0165 rovnak\u00e9re\u00e1lne x-ov\u00e9 s\u00faradnice. +Calibration.Dialog.InvalidYCoordinates.Message=Body nem\u00f4\u017eu ma\u0165 rovnak\u00e9 re\u00e1lne y-ov\u00e9 s\u00faradnice. +SpectralLineFilter.Title=plyn Spectra +SpectralLineFilter.H=vod\u00edk +SpectralLineFilter.He=h\u00e9lium +SpectralLineFilter.Ne= Ne\u00f3n +SpectralLineFilter.Hg=Ortu\u0165 +TFrame.View.Unknown=Zobrazi\u0165 +TMenuBar.MenuItem. Sp\u00e4\u0165=Sp\u00e4\u0165 +TMenuBar.MenuItem.Redo=Znovu +TMenuBar.MenuItem.Replace=Nahradi\u0165 ... +TMenuBar.Menu.AddImage=Import obr\u00e1zkov +TMenuBar.MenuItem.AddBefore=Pred t\u00fato sn\u00edmku... +TMenuBar.MenuItem.AddAfter=Po tejto sn\u00edmke. .. +TMenuBar.MenuItem.RemoveImage=Odstr\u00e1ni\u0165 t\u00fato sn\u00edmku +TMenuBar.Menu.Tools=N\u00e1stroje +TMenuBar.MenuItem.DataFunctionTool=Data Builder +TMenuBar.MenuItem.DatasetTool=D\u00e1ta n\u00e1stroj +TMenuBar.Menu.CopyImage=Kop\u00edrova\u0165 obr\u00e1zok +TMenuBar.MenuItem.CopyMainView=Hlavn\u00fd n\u00e1h\u013ead +TMenuBar.MenuItem.CopyFrame=sn\u00edmka +TMenuBar.MenuItem.PrintFrame=Tla\u010d ... +TrackerIO.Dialog.AddImage.Title=Import obr\u00e1zkov (vyberte jeden alebo viac) +TTrack.Dialog.Name.BadName=U\u017e sa pou\u017e\u00edva. Pros\u00edm, vyberte in\u00fd n\u00e1zov. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=\u010dist\u00e1 sila +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Graf pozorovan\u00fdch d\u00e1t sa objav\u00ed tu. +TableTView.Label.NoData=Tabu\u013eka pozorovan\u00fdch d\u00e1t sa objav\u00ed tu. +TrackerPanel.Message.NoData0=Hlavn\u00fd n\u00e1h\u013ead na video a stopy sa objav\u00ed tu +TrackerPanel.Message.NoData1=Na za\u010diatku Vyberte S\u00fabor|Otvori\u0165 alebo Stopy|Nov\u00e1 +WorldTView.Label.NoData=Re\u00e1lny n\u00e1h\u013ead na video a stopy sa objav\u00ed tu. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Rie\u0161ite\u013e: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=adapt\u00edvny viackrokov\u00fd +DynamicParticle.Table.Force.Border.Title=Funkcie sily (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Funkcie polohy(t) +ParticleModel.Table.Initial.Border.Title=po\u010diato\u010dn\u00e9 hodnoty +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Vlo\u017ei\u0165 obr\u00e1zok +TMenuBar.MenuItem.PasteAfter=Po tejto sn\u00edmke +TMenuBar.MenuItem.PasteBefore=Pred touto sn\u00edmkou +TMenuBar.MenuItem.PasteReplace=Nahradi\u0165 Video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Za\u010d\u00edname ... +Tracker.Splash.HelpMessage=Nov\u00fd u\u017e\u00edvate\u013e? Pozri + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=uhol od vodorovnej +LineProfile.Checkbox.Rotates=ot\u00e1\u010da +LineProfile.Label.Spread=roz\u0161\u00edrenie +RGBRegion.Name=RGB rozsah +RGBRegion.New.Name=rozsah +RGBRegion.MenuItem.Fixed=pevn\u00e1 poloha +RGBRegion.Label.Radius=pixel polomer +TTrack.Label.Step=krok + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=\u010d\u00edslo polohy +LineProfile.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy +LineProfile.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy +LineProfile.Data.Description.3=\u010derven\u00e1 +LineProfile.Data.Description.4=zelen\u00e1 +LineProfile.Data.Description.5=modr\u00e1 +LineProfile.Data.Description.6=vn\u00edman\u00fd jas +LineProfile.Data.Description.7=\u0161\u00edrka riadka +ParticleModel.MenuItem.TraceVisible=Stopa vidite\u013en\u00e1 +ParticleModel.MenuItem.StepsVisible=Kroky vidite\u013en\u00e9 +PointMass.Data.Description.0=\u010das +PointMass.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy +PointMass.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy +PointMass.Data.Description.3=ve\u013ekos\u0165 polohov\u00e9ho vektora +PointMass.Data.Description.4=uhol polohov\u00e9ho vektora +PointMass.Data.Description.5= x-ov\u00e1 zlo\u017eka r\u00fdchlosti +PointMass.Data.Description.6=y-ov\u00e1 zlo\u017eka r\u00fdchlosti +PointMass.Data.Description.7=ve\u013ekos\u0165 r\u00fdchlosti +PointMass.Data.Description.8=uhol r\u00fdchlosti +PointMass.Data.Description.9=x-ov\u00e1 zlo\u017eka zr\u00fdchlenia +PointMass.Data.Description.10=y-ov\u00e1 zlo\u017eka zr\u00fdchlenia +PointMass.Data.Description.11=ve\u013ekos\u0165 zr\u00fdchlenia +PointMass.Data.Description.12=uhol zr\u00fdchlenia +PointMass.Data.Description.13=uhol nato\u010denia +PointMass.Data.Description.14=uhlov\u00e1 r\u00fdchlos\u0165 +PointMass.Data.Description.15=uhlov\u00e9 zr\u00fdchlenie +PointMass.Data.Description.16=\u010d\u00edslo kroku +PointMass.Data.Description.17=\u010d\u00edslo sn\u00edmky +PointMass.Data.Description.18=x-ov\u00e1 zlo\u017eka hybnosti +PointMass.Data.Description.19=y-ov\u00e1 zlo\u017eka hybnosti +PointMass.Data.Description.20=ve\u013ekos\u0165 hybnosti +PointMass.Data.Description.21=uhol hybnosti +PointMass.Data.Description.22= kinetick\u00e1 energia +RGBRegion.Data.Description.0=\u010das +RGBRegion.Data.Description.1=x-ov\u00e1 zlo\u017eka polohy +RGBRegion.Data.Description.2=y-ov\u00e1 zlo\u017eka polohy +RGBRegion.Data.Description.3=\u010derven\u00e1 +RGBRegion.Data.Description.4=zelen\u00e1 +RGBRegion.Data.Description.5=modr\u00e1 +RGBRegion.Data.Description.6=vn\u00edman\u00fd jas +RGBRegion.Data.Description.7=po\u010det pixelov +RGBRegion.Data.Description.8=\u010d\u00edslo kroku +RGBRegion.Data.Description.9= \u010d\u00edslo sn\u00edmky +TView.Menuitem.Define=Definova\u0165 ... +Vector.Data.Description.0=\u010das +Vector.Data.Description.1=x-ov\u00e1 zlo\u017eka +Vector.Data.Description.2=y-ov\u00e1 zlo\u017eka +Vector.Data.Description.3=ve\u013ekos\u0165 +Vector.Data.Description.4=uhol +Vector.Data.Description.5=x-ov\u00e1 zlo\u017eka po\u010diatku vektora +Vector.Data.Description.6=y-ov\u00e1 zlo\u017eka po\u010diatku vektora +Vector.Data.Description.7=\u010d\u00edslo kroku +Vector.Data.Description.8=\u010d\u00edslo sn\u00edmky + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=hmotnos\u0165 tejto \u010dastice +ParticleModel.Parameter.InitialTime.Description=Po\u010diato\u010dn\u00fd \u010das +AnalyticParticle.PositionFunction.X.Description=x-ov\u00e1 zlo\u017eka polohy +AnalyticParticle.PositionFunction.Y.Description=Y-ov\u00e1 zlo\u017eka polohy +DynamicParticle.ForceFunction.X.Description=x-ov\u00e1 zlo\u017eka sily +DynamicParticle.ForceFunction.Y.Description=y-ov\u00e1 zlo\u017eka sily +DynamicParticle.Parameter.InitialX.Description=x-ov\u00e1 zlo\u017eka po\u010diato\u010dnej polohy +DynamicParticle.Parameter.InitialY.Description=y-ov\u00e1 zlo\u017eka po\u010diato\u010dnej polohy +DynamicParticle.Parameter.InitialVelocityX.Description=x-ov\u00e1 zlo\u017eka po\u010diato\u010dnej r\u00fdchlosti +DynamicParticle.Parameter.InitialVelocityY.Description=y-ov\u00e1 zlo\u017eka po\u010diato\u010dnej r\u00fdchlosti +TrackerPanel.ModelBuilder.Title=Model Builder +TrackerPanel.DataBuilder . Title=Data Builder +TrackControl.TrailMenu.NoTrail=Bez stopy +TrackControl.TrailMenu.ShortTrail=Kr\u00e1tke stopy +TrackControl.TrailMenu.LongTrail=Dlh\u00e9 stopy +TrackControl.TrailMenu.FullTrail=V\u0161etky kroky +TrackerPanel.ModelBuilder.Spinner.Tooltip=Aktu\u00e1lne vybran\u00fd model +TrackerPanel.ModelBuilder.LineButton.Text=\u0160t\u00fdl \u010diary +TrackerPanel.ModelBuilder.LineButton.Tooltip=Nastavenie \u0161t\u00fdlu \u010diary +ParticleModel.LineStyle.None=bez \u010diar +ParticleModel.LineStyle.Connect=Pripoji\u0165 kroky +ParticleModel.LineStyle.Smooth=Hladk\u00e1 krivka +ModelFunctionPanel.Label=Model +AnalyticFunctionPanel.FunctionEditor.Border.Title=Funkcie polohy +DynamicFunctionPanel.FunctionEditor.Border.Title=Funkcie sily + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Vidite\u013en\u00e9 st\u013apce tabu\u013eky +Tracker.About.ProjectOf=projekt: +Tracker.About.TranslationBy=Preklad +Tracker.About.Translator=M.Hancova, J.Hanc +TMenuBar.Menu.SaveVideoAs=Ulo\u017ei\u0165 klip ako +TActions.SaveClipAs.ProgressMonitor.Message=Ukladanie klipu ako +TActions.SaveClipAs.ProgressMonitor.Progress=Dokon\u010den\u00e9 + +# Additions Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sync +PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronizova\u0165 horizont\u00e1lne osi +RGBRegion.MenuItem.FixedRadius=Pevn\u00fd Polomer +Tracker.VideoZoom.Hint=kliknite pre zv\u00e4\u010d\u0161enie alebo zmen\u0161enie, dvojklik-pre zv\u00e4\u010d\u0161enie, prisp\u00f4sobenie +Tracker.PlotZoomIn.Hint=\u0165ahan\u00edm pribl\u00ed\u017ei\u0165, dvojklik-automatick\u00fd rozsah +Tracker.PlotZoomOut.Hint=kliknut\u00edm oddiali\u0165 +Tracker.MenuItem.Hints=Zobrazi\u0165 tipy +TapeMeasure.Label.Length=d\u013a\u017eka +TapeMeasure.Label.TapeAngle=uhol od x-ovej osi +TapeMeasure.Label.ArcAngle=uhlomer uhla +TrackerIO.Dialog.NotAnImage.Title=nespr\u00e1vny typ s\u00faboru +TrackerIO.Dialog.NotAnImage.Message1=nie je to JPG alebo GIF obr\u00e1zok. +TrackerIO.Dialog.NotAnImage.Message2=Prajete si pokra\u010dova\u0165? +TToolBar.Button.Zoom.Tooltip=n\u00e1stroj lupa (skratka: kl\u00e1vesa Z) +TrackChooserTView.DropDown.Tooltip=Vyberte stopu +TapeMeasure.Field.TapeAngle.Tooltip=uhol od pozit\u00edvnej \u010dasti x-ovej osi +TapeMeasure.Field.Magnitude.Tooltip=d\u013a\u017eka v \u0161k\u00e1lovan\u00fdch re\u00e1lnych jednotk\u00e1ch +TapeMeasure.Readout.Magnitude.Name= d\u013a\u017eka +TapeMeasure.Readout.Magnitude.Hint=re\u00e1lne jednotky +TapeMeasure.Readout.Angle.Name=uhol od\u010d\u00edtanie +TapeMeasure.Readout.Angle.Hint=uhol meran\u00fd od x-ovej osi +TapeMeasure.End.Name=koniec +TapeMeasure.End.Hint=kv\u00f4li meraniu vzdialenost\u00ed a uhlov \u0165aha\u0165 +TapeMeasure.Handle.Name=rukov\u00e4\u0165 +TapeMeasure.Handle.Hint=\u0165ahan\u00edm presun\u00fa\u0165 +Vector.Tip.Name=hrot +Vector.Tip.Hint=pre zmenu zlo\u017eiek \u0165aha\u0165 alebo zada\u0165 s\u00faradnice +Vector.Handle.Name=po\u010diatok +Vector.Handle.Hint=vektor presun\u00fa\u0165 \u0165ahan\u00edm +Vector.ShortHandle.Hint=presun\u00fa\u0165 \u0165ahan\u00edm, hrot ozna\u010di\u0165 alt-klik +PointMass.Position.Name=poloha +PointMass.Position.Hint=pre zmenu polohy \u0165aha\u0165 alebo zada\u0165 s\u00faradnice +PointMass.Velocity.Name=r\u00fdchlos\u0165 +PointMass.Acceleration.Name=zr\u00fdchlenie +PointMass.Vector.Hint=\u0165ahan\u00edm presun\u00fa\u0165 +PointMass.Position.Locked.Hint=ozna\u010di\u0165 kliknut\u00edm - ned\u00e1 sa \u0165aha\u0165 +CoordAxes.Handle.Name=+ x-ov\u00e1 os +CoordAxes.Handle.Hint=pre zmenu sklonu \u0165aha\u0165 +CoordAxes.Origin.Name=po\u010diatok +CoordAxes.Origin.Hint=pre zmenu polohy \u0165aha\u0165 +OffsetOrigin.Position.Name=poloha +OffsetOrigin.Position . Hint=pre premiestnenie po\u010diatku \u0165aha\u0165 alebo zada\u0165 s\u00faradnice +Calibration.Point.Name=bod +Calibration.Point.Hint=pre zmenu os\u00ed a mierky osi \u0165ahajte, alebo zadajte s\u00faradnice +RGBRegion.Position.Name=poloha +RGBRegion.Position.Hint=pre zmenu polohy \u0165ahajte alebo zadajte s\u00faradnice +LineProfile.End.Name=koniec +LineProfile.End.Hint=d\u013a\u017eku \u010diary nastavte \u0165ahan\u00edm +LineProfile.Handle.Name=rukov\u00e4\u0165 +LineProfile.Handle.Hint=\u0165ahan\u00edm presun\u00fa\u0165 riadok +PointMass.Hint=nastavte hmotnos\u0165 na paneli n\u00e1strojov +PointMass.Unmarked.Hint =, ozna\u010di\u0165 polohu pomocou Shift-klik +TTrack.Unselected.Hint=pre v\u00fdber a / alebo nastavenie vlastnost\u00ed kliknite +Vector.Unmarked.Hint=kreslenie vektorov pomocou shift-\u0165aha\u0165 +OffsetOrigin.Unmarked.Hint=pre ozna\u010denie offset bodu pou\u017eite shift-klik +Calibration.Unmarked.Hint=pre ozna\u010denie prv\u00e9ho bodu pou\u017eite shift-klik +Calibration.Halfmarked.Hint=pre ozna\u010denie druh\u00e9ho bodu pou\u017eite shift-klik +CenterOfMass.Empty.Hint=vyberte hmotnosti pre definovanie syst\u00e9mu +VectorSum.Empty.Hint=vyberte vektory pre definovanie s\u00fa\u010dtu +TapeMeasure.Hint=pre meranie vzdialenost\u00ed a uhlov \u0165ahajte konce +CoordAxes.Hint=pre zmenu sklonu nastavte uhol +ParticleModel.Hint=nastavte hmotnos\u0165 na paneli n\u00e1strojov, kv\u00f4li anim\u00e1cii zadajte vzorce v Model Builder +RGBRegion.Hint=pre zmenu ve\u013ekosti zadajte polomer +RGBRegion.Unmarked.Hint=na ozna\u010denie polohy pou\u017eite shift-klik +TTrack.ImportVideo.Hint=importova\u0165 video alebo obr\u00e1zok na meranie RGB +TTrack.Selected.Hint= vybran\u00fd +LineProfile.Hint=pre zmenu hr\u00fabky \u010diary zadajte \u0161\u00edrku +LineProfile.Unmarked.Hint=nakreslite \u010diaru pomocou shift-\u0165aha\u0165 +LineProfile.Menu.Orient\u00e1cia=Orient\u00e1cia +LineProfile.MenuItem.Horizontal=Horizont\u00e1lne +LineProfile.MenuItem.XAxis=pozd\u013a\u017e X-ovej osi +Footprint.PositionVector=vektor +Footprint.BoldPositionVector=zv\u00fdraznen\u00fd vektor +Tracker.Startup.Hint=tu n\u00e1jdete rady (alebo vypn\u00fa\u0165 rady v n\u00e1povede menu), kv\u00f4li n\u00e1povedi stla\u010dte kedyko\u013evek kl\u00e1ves F1 +TrackerPanel.NoVideo.Hint=otvori\u0165 alebo importova\u0165 video alebo obr\u00e1zok k anal\u00fdze +TrackerPanel.CalibrateVideo.Hint=kalibrujte video pomocou kalibra\u010dn\u00e9ho n\u00e1stroja +TrackerPanel.NoTracks.Hint=pre meranie sledovan\u00fdch vlastnost\u00ed vytvorte nov\u00fa stopu +TrackerPanel.SetClip.Hint=nastavte alebo obnovte nastavenia videoz\u00e1znamu +TrackerPanel.ShowAxes.Hint=nastavte po\u010diatok a uhol s\u00faradnicov\u00fdch os\u00ed +VideoPlayer.Step.Hint=krok vpred (skratka: PageDown) +VideoPlayer.Back.Hint=krok sp\u00e4\u0165 (skratka: PageUp) +TrackerPanel.DVVideo.Hint=pou\u017eite resize filter na n\u00e1pravu naru\u0161enia DV-form\u00e1t videa +TrackerIO.DataFileFilter.Description=Tracker S\u00fabory +Tracker.Button.PDFHelp=PDF verzia pre tla\u010d +TToolbar.Button.TapeVisible.Tooltip=Zobrazi\u0165, skry\u0165 alebo vybra\u0165 kalibra\u010dn\u00e9 n\u00e1stroje + +# Additions Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=kontrola stopy +TMenuBar.MenuItem.Description=Pozn\u00e1mky +TrackPlottingPanel.RightDrag.Hint=\u0165aha\u0165 prav\u00fdm pre vo\u013eby +TMenuBar.MenuItem.DeleteSelectedPoint=Vybran\u00fd bod +TFrame.InfoDialog.SaveChanges.Title=Ulo\u017ei\u0165 zmeny +TFrame.InfoDialog.SaveChanges.Message=Prajete si ulo\u017ei\u0165 zmeny? + +# Additions Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Kartezi\u00e1nske +DynamicParticle.Editor.Button.Polar =Pol\u00e1rne +DynamicParticle.Parameter.InitialR.Description= Po\u010diato\u010dn\u00fd polomer +DynamicParticle.Parameter.InitialTheta.Description=Po\u010diato\u010dn\u00fd uhol +DynamicParticle.Parameter.InitialVelocityR.Description=Po\u010diato\u010dn\u00e1 radi\u00e1lna r\u00fdchlos\u0165 +DynamicParticle.Parameter.InitialOmega.Description=po\u010diato\u010dn\u00e1 uhlov\u00e1 r\u00fdchlos\u0165 +DynamicParticle.ForceFunction.R.Description=radi\u00e1lna zlo\u017eka sily +DynamicParticle.ForceFunction.Theta.Description=tangenci\u00e1lna zlo\u017eka sily +DynamicParticlePolar.Name=dynamick\u00fd \u010dasticov\u00fd model (Pol\u00e1rny) +DynamicTwoBody.Editor.Button.Particle1=\u010dastica 1 +DynamicTwoBody.Editor.Button.Particle2=\u010dastica 2 +DynamicTwoBody.Name=Dynamick\u00fd dvoj-telesov\u00fd model +TMenuBar.Menu.DynamicParticle=Dynamick\u00fd \u010dasticov\u00fd model +TMenuBar.MenuItem.Cartesian=kartezi\u00e1nsky +TMenuBar.MenuItem.Polar=pol\u00e1rny + +# Additions Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=AUTOTRACK ... +Dialog.Button.Help=Pomocn\u00edk +AutoTracker.Wizard.Title=Autotracker: +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Sp\u00e4\u0165 +AutoTracker.Wizard.Button.Next=\u010eal\u0161\u00ed +AutoTracker.Wizard.Button.Accept=Akceptova\u0165 +AutoTracker.Wizard.Button.Search=H\u013eada\u0165 +AutoTracker.Wizard.Button.Pause=Pauza +AutoTracker.Wizard.Button.Skip=Presko\u010di\u0165 +AutoTracker.Label.Mask=\u0160abl\u00f3na Obr\u00e1zok +AutoTracker.Label.Target= Cie\u013eov\u00e1 Offset +AutoTracker.Label.AcceptLevel=Akceptova\u0165 sk\u00f3re nad +AutoTracker.TabbedPane.TabTitle.Mask=\u0160abl\u00f3na +AutoTracker.TabbedPane.TabTitle.Target=Cie\u013e +AutoTracker.TabbedPane.TabTitle.Settings=Akceptova\u0165 +AutoTracker.TabbedPane.TabTitle.Search=H\u013eada\u0165 +AutoTracker.Info.GetStarted=Pros\u00edm, kliknite na vlastnos\u0165 videa, ktor\u00fa chcete sledova\u0165. +AutoTracker.Info.Mask1=\u0160abl\u00f3na definuje obr\u00e1zok, ktor\u00fd bude zodpoveda\u0165 ka\u017edej video sn\u00edmke. Potiahnut\u00edm za stred resp. rukov\u00e4\u0165 premiestnite alebo zme\u0148te ve\u013ekos\u0165 \u0161abl\u00f3ny. +AutoTracker.Info.Mask2=\u0160abl\u00f3na sa m\u00f4\u017ee prisp\u00f4sobi\u0165 zmen\u00e1m tvaru a farby v priebehu \u010dasu. Vy\u0161\u0161ia r\u00fdchlos\u0165 v\u00fdvoja sleduje rap\u00eddnej\u0161ie zmeny, ale s\u00fa menej presn\u00e9 pri dlh\u0161om \u010dase. +AutoTracker.Info.MaskLocked1=\u0160abl\u00f3na sa pou\u017e\u00edva a je uzamknut\u00e1 +AutoTracker.Info.MaskLocked2=Kliknut\u00edm na tla\u010didlo Reset zma\u017ete v\u0161etky kroky a za\u010dnite znova. +AutoTracker.Info.Target1=Cie\u013e je miesto, kde bud\u00fa ozna\u010den\u00e9 kroky vo vz\u0165ahu k \u0161abl\u00f3ne. Presu\u0148te ciele potiahnut\u00edm. +AutoTracker.Info.Target2=Tip: M\u00f4\u017eete nastavi\u0165 cie\u013eov\u00fa polohu aj potom ako boli kroky ozna\u010den\u00e9. Existuj\u00face kroky sa bud\u00fa automaticky pohybova\u0165 spolu s cie\u013eom. +AutoTracker.Info.TargetLocked=Cie\u013e sa pou\u017e\u00edva a je viazan\u00fd na existuj\u00face kroky polohy. Ak premiestnite cie\u013e, premiestnia sa aj kroky. +AutoTracker.Info.Settings1=Sk\u00f3re zobrazen\u00e9 nad prijate\u013enou \u00farov\u0148ou je ozna\u010den\u00e9 automaticky. +AutoTracker.Info.Settings2=Tip: zn\u00ed\u017eenie prijate\u013enej \u00farovne zvy\u0161uje pravdepodobnos\u0165 ch\u00fdb. +AutoTracker.Info.Search1.= K uk\u00e1zan\u00e9mu obd\u013a\u017eniku bude vyh\u013eadan\u00e1 najlep\u0161ia zhoda. Potiahnut\u00edm stredu resp. rukov\u00e4te, premiestnite alebo zme\u0148te ve\u013ekos\u0165i preh\u013ead\u00e1vanej oblasti. +AutoTracker.Info.Search2=Tip: preh\u013ead\u00e1van\u00e1 oblas\u0165 nemus\u00ed by\u0165 ve\u013ek\u00e1, ak je zr\u00fdchlenie mal\u00e9 alebo kon\u0161tantn\u00e9. Vo\u013eba "h\u013eada\u0165 dopredu" automaticky presunie preh\u013ead\u00e1van\u00fa oblas\u0165 na predpokladan\u00e9 zodpovedaj\u00face polohy. +AutoTracker.Info.Frame=Sn\u00edmka +AutoTracker.Info.Match=N\u00e1jden\u00e1 zhoda bude automaticky ozna\u010den\u00e1 na cie\u013eovej polohe. +AutoTracker.Info.Possible=V preh\u013ead\u00e1vanej oblasti bola n\u00e1jden\u00e1 mo\u017en\u00e1 zhoda. Va\u0161e mo\u017enosti s\u00fa: +AutoTracker.Info.NoMatch=V preh\u013ead\u00e1vanej oblasti nebola n\u00e1jden\u00e1 \u017eiadna zhoda. Va\u0161e mo\u017enosti s\u00fa: +AutoTracker.Info.Outside=Preh\u013ead\u00e1van\u00e1 oblas\u0165 je mimo obraz. Va\u0161e mo\u017enosti s\u00fa: +AutoTracker.Info.Accepted=Zobrazen\u00e1 zhoda bola u\u017e\u00edvate\u013eom akceptovan\u00e1. +AutoTracker.Info.MarkedByUser=Krok bol ozna\u010den\u00fd u\u017e\u00edvate\u013eom manu\u00e1lne. +AutoTracker.Info.NoVideo=Autotracking vy\u017eaduje video. Pros\u00edm, importujte video alebo zatvorte Autotracker. +AutoTracker.Info.Height=v\u00fd\u0161ka +AutoTracker.Info.Width=\u0161\u00edrka +AutoTracker.Info.Accept =-- akceptova\u0165 zhodu +AutoTracker.Info.Retry =-- presu\u0148te preh\u013ead\u00e1van\u00fa oblas\u0165 a op\u00e4\u0165 za\u010dnite h\u013eadanie +AutoTracker.Info.Mark =-- pre manu\u00e1lne ozna\u010denie kroku pou\u017eite Shift-klik +AutoTracker.Info.Skip =-- presko\u010dte t\u00fato sn\u00edmku a pokra\u010dujte v sledovan\u00ed +AutoTracker.Info.Reset =-- pre zmazanie v\u0161etk\u00fdch krokov pou\u017eite reset a za\u010dnite odznova +AutoTracker.Info.MatchScore=zhoda sk\u00f3re +AutoTracker.Dialog.MaskLocked.Title=\u0160abl\u00f3na zamknut\u00e1 PointMass.Cursor.Autotrack.Description=Autotracker kurzor +VideoPlayer.StartFrame.Hint=pre nastavenie po\u010diato\u010dnej sn\u00edmky potiahnite +VideoPlayer.EndFrame.Hint=pre nastavenie koncovej sn\u00edmky potiahnite +VideoPlayer.Slider.Hint=pre skenovanie videa potiahnite +FileDropHandler.Dialog.BadFile.Message=Ned\u00e1 sa na\u010d\u00edta\u0165 +FileDropHandler.Dialog.BadFile.Title=Nerozpoznate\u013en\u00fd s\u00fabor + +# Additions Doug Brown 2009-10-27 +Dialog.Button.Apply=Pou\u017ei\u0165 +DynamicParticle.Dialog.Delete.Message=Zmazanie tejto \u010dastice sp\u00f4sob\u00ed odstr\u00e1nenie zo syst\u00e9mu. Odstr\u00e1ni\u0165 aj tak? +DynamicParticle.Dialog.Delete.Title=dynamick\u00fd syst\u00e9m +DynamicParticle.System.In=v +DynamicSystem.Empty=pr\u00e1zdny +DynamicSystem.Force.Name.Internal=vn\u00fatorn\u00fd +DynamicSystem.ForceFunction.R.Description=radi\u00e1lne zlo\u017eka vn\u00fatornej sily +DynamicSystem.ForceFunction.Theta.Description=tangenci\u00e1lna zlo\u017eka vn\u00fatornej sily +DynamicSystem.MenuItem.Inspector=Vyberte \u010castice ... +DynamicSystem.Name=Dynamick\u00fd dvoj-telesov\u00fd syst\u00e9m +DynamicSystem.New.Name=syst\u00e9m +DynamicSystem.Parameter.Of=o +DynamicSystem.Parameter.RelativeTo=vo vz\u0165ahu k +DynamicSystem.Parameter.Name.Relative=relat\u00edvne +DynamicSystem.Parameter.ParticleMass.Description=Hmotnos\u0165 +DynamicSystem.Parameter.Mass.Description=Celkov\u00e1 hmotnos\u0165 tohto syst\u00e9mu +DynamicSystemInspector.Border.Title=\u010dastica +DynamicSystemInspector.Title=dvoj-telesov\u00fd syst\u00e9m +DynamicSystemInspector.Button.Change=Zmeni\u0165 na ... +DynamicSystemInspector.ParticleName.None=(\u017eiadna) +TMenuBar.MenuItem.Clone=Klonova\u0165 +TMenuBar.MenuItem.TwoBody=dvoj-telesov\u00fd syst\u00e9m +TrackerPanel.DataBuilder.Dropdown.Tooltip=aktu\u00e1lne vybran\u00e1 stopa +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync vertik\u00e1lnej osi +TrackControl.Button.Trace.ToolTip=Zobrazi\u0165 alebo skry\u0165 cesty +TToolBar.Button.Open.Tooltip=Otvori\u0165 video alebo tracker s\u00fabor na novej z\u00e1lo\u017eke +TToolBar.Button.Save.Tooltip=Ulo\u017ei\u0165 aktu\u00e1lnu z\u00e1lo\u017eku do s\u00faboru +TToolBar.Button.SelectTrack=Vybra\u0165 +TToolBar.Button.SelectTrack.Tooltip=Vybra\u0165 existuj\u00facu stopu +TTrack.MenuItem.ClearSteps=Zmaza\u0165 kroky +PointMass.MenuItem.Position=poloha +TMenuBar.MenuItem.Empty=(Pr\u00e1zdne) +TTrackBar.Button.Memory=vyu\u017e\u00edvan\u00e1 pam\u00e4\u0165: +TTrackBar.Button.Memory.Tooltip=Monitoruj a spravuj pam\u00e4\u0165 +TTrackBar.Memory.PopupItem.Launch1=Spusti\u0165 +TTrackBar.Memory.PopupItem.Launch2=s pam\u00e4\u0165ou +TButton.Track.ToolTip=Nastavenie vlastnosti +Tracker.Dialog.OutOfMemory.Message1=Tracker m\u00e1 k vy\u010derpan\u00fa pam\u00e4\u0165. +Tracker.Dialog.OutOfMemory.Message2=Kliknite na tla\u010didlo pam\u00e4te pre \u010fal\u0161ie mo\u017enosti. +Tracker.Dialog.OutOfMemory.Title=Nedostatok pam\u00e4te + +# Additions Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Poh\u013ead dopredu +AutoTracker.Label.Original=Po\u010diato\u010dn\u00e1 +AutoTracker.Label.NoMask=\u017eiadny +AutoTracker.Label.Rate=r\u00fdchlos\u0165 v\u00fdvoja: +AutoTracker.Info.Mask3=Tip: \u0161abl\u00f3na nemus\u00ed by\u0165 ve\u013ek\u00e1, ani obsahova\u0165 cel\u00fd objekt. Funkcia, ktor\u00e1 je unik\u00e1tna a zah\u0155\u0148a vysoko-kontrastn\u00e9 hrany v\u0161eobecne funguje najlep\u0161ie. +AutoTracker.Wizard.Checkbox.XAxis=len X-ov\u00e1 os +AutoTracker.Info.SearchOnAxis1=pre x-ov\u00fa os vn\u00fatri zobrazen\u00e9ho obd\u013a\u017enika bude h\u013eadan\u00e1 najlep\u0161ia zhoda. Pre premiestnenie alebo zmenu ve\u013ekosti preh\u013ead\u00e1vanej oblasti potiahnite jej stred resp. rukov\u00e4\u0165. +AutoTracker.Info.PossibleOnAxis=V preh\u013ead\u00e1vanej oblasti pozd\u013a\u017e x-ovej osi bola n\u00e1jden\u00e1 mo\u017en\u00e1 zhoda. Va\u0161e mo\u017enosti s\u00fa: +AutoTracker.Info.NoMatchOnAxis=V preh\u013ead\u00e1vanej oblasti pozd\u013a\u017e x-ovej osi nebola n\u00e1jden\u00e1 \u017eiadna zhoda. Va\u0161e mo\u017enosti s\u00fa: +AutoTracker.Info.RetryOnAxis=--presu\u0148te preh\u013ead\u00e1van\u00fa oblas\u0165 alebo x-ov\u00fa os a h\u013eadajte znovu +AutoTracker.Wizard.Button.Delete=Zmaza\u0165 tento bod +AutoTracker.Wizard.Button.DeleteMore=Zmaza\u0165 tento a nasleduj\u00face body +Button.Define.Tooltip=Definujte funkcie alebo existuj\u00face st\u013apcov\u00e9 premenn\u00e9 +Calibration.Label.Point=body +CalibrationStick.Hint=kv\u00f4li zmene mierky nastavte d\u013a\u017eku alebo potiahnite koniec, kv\u00f4li zmene sklonu osi nastavte uhol +CalibrationStick.End.Hint=zme\u0148te \u0161k\u00e1lu potiahnut\u00edm +CalibrationStick.New.Name=kalibra\u010dn\u00e1 ty\u010d +CalibrationTapeMeasure.New.Name=kalibra\u010dn\u00e9 meradlo +CalibrationTapeMeasure.Readout.Magnitude.Hint=pre vlo\u017eenie zn\u00e1mych re\u00e1lnych jednotiek kliknite +CalibrationTapeMeasure.Hint=pre zmenu mierky nastavte d\u013a\u017eku, pre zmenu sklonu osi nastavte uhol +DynamicSystem.Data.Description.0=relat\u00edvna vzdialenos\u0165 medzi \u010dasticami +DynamicSystem.Data.Description.1=relat\u00edvny uhol +DynamicSystem.Data.Description.2=relat\u00edvna radi\u00e1lna r\u00fdchlos\u0165 +DynamicSystem.Data.Description.3=relat\u00edvna uhlov\u00e1 r\u00fdchlos\u0165 +ExportDataDialog.Subtitle.Table=Tabu\u013eka d\u00e1t +ExportDataDialog.Subtitle.Content=Bunky +ExportDataDialog.Subtitle.Format=Form\u00e1t \u010d\u00edsel +ExportDataDialog.Subtitle.Delimiter=Odde\u013eova\u010d +ExportDataDialog.Title=Exportova\u0165 d\u00e1ta +ExportDataDialog.Delimiter.Add=Prida\u0165... +ExportDataDialog.Delimiter.Remove=Odstr\u00e1ni\u0165... +ExportDataDialog.Content.AllCells=V\u0161etky bunky +ExportDataDialog.Content.SelectedCells=Vybran\u00e9 bunky +ExportDataDialog.MenuItem.RemoveDelimiter=Odstr\u00e1ni\u0165 u\u017e\u00edvate\u013esk\u00fd odde\u013eova\u010d +ExportDataDialog.Chooser.SaveData.Title=Ulo\u017ei\u0165 d\u00e1ta ako +ExportVideoDialog.Button.SaveAs=Ulo\u017ei\u0165 ako... +ExportVideoDialog.Button.FullSize=Skuto\u010dn\u00e1 ve\u013ekos\u0165 +ExportVideoDialog.Button.DrawnSize=Ako je nakreslen\u00e9 +ExportVideoDialog.Content.VideoOnly=Len video ExportVideoDialog.Content.VideoAndGraphics=Video a grafika +ExportVideoDialog.Content.GraphicsOnly=Iba grafika +ExportVideoDialog.Title=Exportova\u0165 Video klip +ExportVideoDialog.Label.ClipSettings=Nastavenia klipu +ExportVideoDialog.Subtitle.Size=Ve\u013ekos\u0165 +ExportVideoDialog.Subtitle.Content=Obsah +ExportVideoDialog.Subtitle.View=N\u00e1h\u013ead +ExportVideoDialog.Subtitle.Format=Form\u00e1t +ExportVideoDialog.Complete.Message1=Video bolo ulo\u017een\u00e9 ako +ExportVideoDialog.Complete.Message2=Prajete si otvori\u0165 to v Trackeri teraz? +ExportVideoDialog.Complete.Title=Export ukon\u010den\u00fd +ExportVideoDialog.VideoSize=ve\u013ekos\u0165 videa +ExportVideoDialog.MatSize=ve\u013ekos\u0165 r\u00e1mu +ExportVideo.Dialog.HiddenPlots.Message=Pri exportovan\u00ed musia by\u0165 grafy plne vidite\u013en\u00e9 +ExportVideo.Dialog.HiddenPlots.Title=Ne\u00fapln\u00fd n\u00e1h\u013ead +Footprint.DoubleTarget=dvojit\u00fd ter\u010d\u00edk +Footprint.BoldDoubleTarget=zv\u00fdraznen\u00fd dvojit\u00fd ter\u010d\u00edk +OffsetOrigin.MenuItem.Fixed=pevn\u00e9 re\u00e1lne s\u00faradnice +ParticleModel.Dialog.Offscreen.Message1=Niektor\u00e9 kroky modelu s\u00fa pr\u00e1zdne, lebo s\u00fa pr\u00edli\u0161 vzdielen\u00e9 z obrazovky +ParticleModel.Dialog.Offscreen.Message2=Pre n\u00e1pravu zme\u0148te model alebo pre\u0161k\u00e1lujte video. +ParticleModel.Dialog.Offscreen.Title=Mimo hran\u00edc +PrefsDialog.Tab.Configuration.Title=Konfigur\u00e1cia +PrefsDialog.Memory.BorderTitle=Ve\u013ekos\u0165 pam\u00e4te +PrefsDialog.Tab.General.Title=\u010eal\u0161\u00ed +PrefsDialog.RecentFiles.BorderTitle=Otvori\u0165 s\u00fa\u010dasn\u00e9 menu +PrefsDialog.Label.RecentSize=Po\u010det s\u00faborov +PrefsDialog.Hints.BorderTitle=N\u00e1povede +PrefsDialog.Button.Relaunch=Znovu na\u010d\u00edta\u0165 +PrefsDialog.Button.ClearRecent=Vymaza\u0165 +PrefsDialog.Checkbox.DefaultSize=Pou\u017ei\u0165 prednastaven\u00e9 +PrefsDialog.Checkbox.HintsOn=Zobrazi\u0165 prednastaven\u00e9 n\u00e1povede +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video Engine +PrefsDialog.Button.Xuggle=Xuggle (recommended) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Spr\u00e1va pa\u00e4te je nepr\u00edstupn\u00e1 pri pou\u017e\u00edvan\u00ed Web \u0161tartu +PrefsDialog.Dialog.WebStart.Title=Web \u0161tart m\u00f3d +PrefsDialog.LookFeel.BorderTitle=Look And Feel +PrefsDialog.Language.BorderTitle=Jazyk +PrefsDialog.Upgrades.BorderTitle=H\u013eadaj vy\u0161\u0161iu verziu +PrefsDialog.Tab.Runtime.Title=\u010das programu +PrefsDialog.Tab.Display.Title=Display +PrefsDialog.Language.Default=Predvolen\u00e9 +PrefsDialog.Upgrades.Always=V\u017edy +PrefsDialog.Upgrades.Weekly=t\u00fd\u017edenne +PrefsDialog.Upgrades.Monthly=mesa\u010dne +PrefsDialog.Upgrades.Never=nikdy +PrefsDialog.Button.CheckForUpgrade=H\u013eadaj teraz +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback +PrefsDialog.Xuggle.Slow=Hladko (m\u00f4\u017ee by\u0165 pomal\u00e9) +PrefsDialog.Xuggle.Fast=r\u00fdchlo (m\u00f4\u017ee by\u0165 trhan\u00e9) +PrefsDialog.CalibrationTool.BorderTitle=Predvolen\u00fd kalibra\u010dn\u00fd n\u00e1stroj +Protractor.Name=Uhlomer +Protractor.New.Name=Uhlomer +Protractor.Hint=pre meranie uhla potiahnite ramen\u00e1 +Protractor.Label.Angle=uhol +Protractor.Field.Angle.Tooltip=uhol medzi ramenami uhlomera +Protractor.Vertex.Name=vrchol +Protractor.Vertex.Hint=pre premiestnenie uhla potiahnite +Protractor.End.Name=koniec ramena +Protractor.End.Hint=pre oto\u010denie ramena potiahnite +Protractor.Handle.Name=rukov\u00e4\u0165 +Protractor.Handle.Hint=pre premiestnenie uhlomera potiahnite +Protractor.Rotator.Name=rot\u00e1tor +Protractor.Rotator.Hint=pre oto\u010denie uhlomera potiahnite +Protractor.Readout.Name=v\u00fdstup +Protractor.Readout.Hint=uhol medzi ramenami uhlomera +ProtractorFootprint.Circle3=mal\u00fd kr\u00fa\u017eok +ProtractorFootprint.Circle5=ve\u013ek\u00fd kr\u00fa\u017eok +ProtractorFootprint.Circle3Bold=zv\u00fdraznen\u00fd mal\u00fd kr\u00fa\u017eok +ProtractorFootprint.Circle5Bold=zv\u00fdraznen\u00fd ve\u013ek\u00fd kr\u00fa\u017eok +Stick.Name=kalibra\u010dn\u00e1 ty\u010d +Stick.New.Name=kalibra\u010dn\u00e1 ty\u010d +TableTrackView.MenuItem.Unformatted=Pln\u00e1 presnos\u0165 +TableTrackView.MenuItem.Formatted=Ako je formatovan\u00e9 +TableTrackView.Menu.SetDelimiter=Nastavi\u0165 odde\u013eova\u010d +TableTrackView.MenuItem.AddDelimiter=Prida\u0165... +TableTrackView.MenuItem.RemoveDelimiter=Odstr\u00e1ni\u0165... +TableTrackView.Dialog.CustomDelimiter.Message=Vlo\u017ete nov\u00fd re\u0165azec odde\u013eova\u010da: +TableTrackView.Dialog.CustomDelimiter.Title=Prida\u0165 odde\u013eova\u010d +TableTrackView.Header.Tooltip=Pre usporiadanie kliknite, pre ozna\u010denie kliknite dvakr\u00e1t. +TableTrackView.MenuItem.CopySelectedData=Kop\u00edrova\u0165 vybran\u00e9 d\u00e1ta +TableTrackView.Dialog.RemoveDelimiter.Message=Vybra\u0165 odde\u013eova\u010d pre odstr\u00e1nenie: +TableTrackView.Dialog.RemoveDelimiter.Title=Odstr\u00e1ni\u0165 odde\u013eova\u010d +TableTrackView.Radians.Tooltip=v radi\u00e1noch +TableTrackView.Degrees.Tooltip=v stup\u0148och +TableTrackView.RadiansPerSecond.Tooltip=v radi\u00e1noch za sekundu +TableTrackView.DegreesPerSecond.Tooltip=v stup\u0148och za sekundu +TableTrackView.RadiansPerSecondSquared.Tooltip=v radi\u00e1noch/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=v stup\u0148och/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Zmaz\u0165 funkciu d\u00e1t +TActions.Action.SaveFrame=Ulo\u017ei\u0165 Tabset ako... +TActions.AboutVideo=Vlastnosti... +TActions.Dialog.AboutVideo.Title=Vlastnosti videa +TActions.Dialog.AboutVideo.Type=Typ +TActions.Dialog.AboutVideo.Size=Rozmery +TActions.Dialog.AboutVideo.Length=D\u013a\u017eka +TActions.Dialog.AboutVideo.Frames=Sn\u00edmky +TActions.Dialog.AboutVideo.Seconds=Sekundy +TActions.Dialog.AboutVideo.FrameRate=R\u00fdchlos\u017e sn\u00edmok +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Cesta +TActions.Action.ImportTRK=Tracker s\u00fabor... +TActions.Action.ProtractorVisible=Vidite\u013en\u00fd +TapeMeasure.MenuItem.FixedLength=Fixn\u00e1 d\u013a\u017eka +TextTView.Label.NoTab=Kliknite na "Str\u00e1nka" pre pridanie textu alebo HTML str\u00e1nky +TextTView.NewTab.Text1=Pre zmenu textu alebo n\u00e1zvu urobte dvojklik. Kliknite prav\u00fdm tla\u010didlom pre viac mo\u017enost\u00ed. +TextTView.NewTab.Text2=Pre zobrazenie HTML str\u00e1nky vlo\u017ete url alebo kliknite prav\u00fdm tla\u010didlom a otvorte s\u00fabor +TextTView.NewTab.Title=Nepomenovan\u00fd +TextTView.Dialog.TabTitle.Title=Nastavi\u0165 nadpis +TextTView.MenuItem.OpenHTML=Otvori\u0165 HTML... +TextTView.MenuItem.SetTitle=Nastavi\u0165 nadpis... +TextTView.Button.NewTab=Nov\u00fd +TextTView.TextEdit.Description=Text +TFrame.Dialog.FileNotFound.Message=S\u00fabor nemo\u017emo n\u00e1js\u0165: +TFrame.Dialog.FileNotFound.Title=S\u00fabor nen\u00e1jden\u00fd +TFrame.View.Text=N\u00e1h\u013ead na str\u00e1nku +TFrame.View.Main=Hlavn\u00fd n\u00e1h\u013ead +TMenuBar.Menu.OpenRecent=Otvori\u0165 s\u00fa\u010dasn\u00fd +TMenuBar.Menu.Import=Importova\u0165 +TMenuBar.Menu.Export=Exportova\u0165 +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=D\u00e1tov\u00fd s\u00fabor... +TMenuBar.Menu.CopyObject=Kop\u00edrova\u0165 objekt +TMenuBar.MenuItem.Coords=Koordinova\u0165 syst\u00e9m +TMenuBar.MenuItem.VideoClip=Video klip +TMenuBar.Menu.MeasuringTools=Meracie n\u00e1stroje +TMenuBar.Menu.AngleUnits=Jednotky uhla +TMenuBar.MenuItem.Degrees=Stupne +TMenuBar.MenuItem.Radians=Radi\u00e1ny +Tracker.Dialog.NoXuggle.Title=Xuggle nen\u00e1jden\u00fd +Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplatformov\u00fd n\u00e1stroj na spracovanie video) nie je nain\u0161talovan\u00fd +Tracker.Dialog.NoXuggle.Message2=Stiahnu\u0165 Xuggle z http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=O programe Xuggle... +Tracker.Dialog.AboutXuggle.Title=O programe Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle verzia +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoVideoEngine.Message1=Nebol n\u00e1jden\u00fd \u017eiaden program pre spracovanie Videa! Bez neho,Tracker m\u00f4\u017ee +Tracker.Dialog.NoVideoEngine.Message2=otvori\u0165 len obr\u00e1zky, sekvencie obr\u00e1zkov a animovan\u00e9 gif s\u00fabory +Tracker.Dialog.NoVideoEngine.Message3=V pr\u00edpade in\u0161tal\u00e1cie Xuggle, Trackerom preferovan\u00fd program pre spracovanie Videa +Tracker.Dialog.NoVideoEngine.Message4=v r\u00e1mci v\u0161etk\u00fdch platforiem, stiahnite pre Tracker posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z +Tracker.Dialog.NoVideoEngine.Title=Ch\u00fdbaj\u00faci program pre spracovanie Videa +Tracker.Dialog.NoXuggle.Message1=Xuggle, program pre spracovanie Videa preferovan\u00fd Trackerom, nebol dosia\u013e nain\u0161talovn\u00fd. +Tracker.Dialog.NoXuggle.Message2=Pre in\u0161tal\u00e1ciu Xuggle, stiahnite posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z +Tracker.Dialog.NoXuggle.Title=Ch\u00fdbaj\u00faci program Xuggle pre spracovanie videa +Tracker.About.DefaultLocale=Prednastaven\u00e9 umiestnenie +Tracker.About.CurrentLanguage=jazyk +Tracker.Dialog.InsufficientMemory.Title=Nedostatok pam\u00e4te +Tracker.Dialog.InsufficientMemory.Message=Po\u017eadovan\u00e1 pam\u00e4\u0165 je pr\u00edli\u0161 ve\u013ek\u00e1. +TrackerIO.Dialog.TabMustBeSaved.Message1=Pre otvorenie z\u00e1lo\u017eka v ponuke z\u00e1lo\u017eiek +TrackerIO.Dialog.TabMustBeSaved.Message2=mus\u00edte ulo\u017ei\u0165 z\u00e1loi\u017eku ako Trackerovsk\u00fd s\u00fabor. +TrackerIO.Dialog.TabMustBeSaved.Message3=Chcete to ulo\u017ei\u0165? +TrackerIO.Dialog.TabMustBeSaved.Title=Neulo\u017een\u00e1 z\u00e1lo\u017eka +TrackerIO.Dialog.NoTabs.Message=Niet \u017eiadnych z\u00e1lo\u017eiek, ktor\u00e9 by neboli ulo\u017een\u00e9! +TrackerIO.Dialog.NoTabs.Title=Pr\u00e1zdna ponuka z\u00e1lo\u017eiek +TrackerIO.Dialog.SaveTabset.Title=Ulo\u017ei\u0165 ponuku z\u00e1lo\u017eiek +TrackerIO.Dialog.SaveTab.Title=Ulo\u017ei\u0165 z\u00e1lo\u017eku +TrackerIO.Delimiter.Tab=Z\u00e1lo\u017eka +TrackerIO.Delimiter.Space=medzera +TrackerIO.Delimiter.Comma=\u010diarka +TrackerIO.Delimiter.Semicolon=bodko\u010diarka +TrackerIO.VideoAndDataFileFilter.Description=Video a trackerovsk\u00e9 s\u00fabory +TrackerPanel.Dialog.Version.Message1=Chcete otvori\u0165 s\u00fabor vytvoren\u00fd Trackerom +TrackerPanel.Dialog.Version.Message2=ktor\u00fd m\u00f4\u017ee obsahova\u0165 +TrackerPanel.Dialog.Version.Message3=vlastnosti ch\u00fdbaj\u00face v pr\u00e1ve be\u017eiacej verzii Trackera. +TrackerPanel.Dialog.Version.Message4=Posledn\u00e1 verzia je dostupn\u00e1 na +TrackerPanel.Dialog.Version.Title=Nes\u00falad medzi programom a verziou Trackera +TrackerPanel.Label.ModelStart=Spusti\u0165 +TrackerPanel.Label.ModelEnd=Ukon\u010di\u0165 +TrackerPanel.Spinner.ModelStart.Tooltip=Nastavi\u0165 \u0161tartovaciu sn\u00edmku pre tento model +TrackerPanel.Spinner.ModelEnd.Tooltip=Nastavi\u0165 koncov\u00fa sn\u00edmku pre tento model +TToolbar.Button.ProtractorVisible.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 uhlomer +TToolbar.Button.AxesVisible.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 s\u00faradnicov\u00e9 osi +TToolBar.Button.TrackControl.Tooltip=Uk\u00e1za\u0165 alebo skry\u0165 ovl\u00e1danie stopy +TTrack.Dialog.StepSizeWarning.Message1=Upozornnenie: niektor\u00e9 stopy boli ozna\u010den\u00e9 s v\u00e4\u010d\u0161\u00edm krokom ne\u017e jedna a to bez ozna\u010denia vynechan\u00fdch sn\u00edmok. +TTrack.Dialog.StepSizeWarning.Message2=Zmena kroku je poravdepodobne v\u00fdsledkom niektor\u00fdch ch\u00fdbaj\u00facich d\u00e1t. +TTrack.Dialog.StepSizeWarning.Message3=V\u0161etky r\u00fdchlosti a zr\u00fdchlenia nie je mo\u017en\u00e9 vypo\u010d\u00edta\u0165 pokia\u013e neozna\u010d\u00edte v\u0161etky kroky. +TTrack.Dialog.StepSizeWarning.Title=Upozornenie +TTrack.Dialog.SkippedStepWarning.Message1=Upozornenie: presko\u010denie krokov pri ozna\u010dovan\u00ed pol\u00f4h zanech\u00e1va ch\u00fdbaj\u00face d\u00e1ta. +TTrack.Dialog.SkippedStepWarning.Title=Upozornenie +TTrack.Dialog.SkippedStepWarning.Checkbox=Neukazova\u0165 pri nasled\u00facom spusten\u00ed +TTrack.Locked.Hint=zamknut\u00e9 +TTrack.AngleField.Radians.Tooltip=Uhol v radi\u00e1noch +TTrack.AngleField.Degrees.Tooltip=Uhol v stup\u0148och +TTrack.AngleField.Popup.Radians=Prepn\u00fa\u0165 na radi\u00e1ny +TTrack.AngleField.Popup.Degrees=Prepn\u00fa\u0165 na stupne +TTrackBar.Memory.Menu.SetSize=Set memory size... +TTrackBar.Button.Version=Moment\u00e1lne dostupn\u00e1:verzia +TTrackBar.Popup.MenuItem.Upgrade=Aktualizova\u0165 teraz... +TTrackBar.Popup.MenuItem.Ignore=Ignorova\u0165 +XuggleVideo.MenuItem.SmoothPlay=Plynul\u00e9 prehr\u00e1vanie (m\u00f4\u017ee by\u0165 pomal\u00e9) + +# Additions by Doug Brown +CircleFootprint.Circle=kr\u00fa\u017eok +CircleFootprint.FilledCircle=pln\u00fd kr\u00fa\u017eok +CircleFootprint.Dialog.Title=Stopa v tvare kr\u00fa\u017eku +CircleFootprint.Dialog.Label.Radius=Polomer +CircleFootprint.Dialog.Checkbox.Bold=Zv\u00fdrazni\u0165 +CircleFootprint.Dialog.Checkbox.CenterSpot=Vycentrovan\u00e1 bodka +TrackControl.StretchVectors.None=Bez natiahnutia +TViewChooser.Maximize.Tooltip=Maximalizova\u0165 n\u00e1h\u013ead +TViewChooser.Restore.Tooltip=Obnovi\u0165 n\u00e1h\u013ead +PageTView.Button.Page=Str\u00e1nka +PageTView.MenuItem.ClosePage=Zatvori\u0165 str\u00e1nku +PointMass.Hint.Marking=Pre ozna\u010denie nov\u00e9ho bodu kliknite my\u0161ou. Stla\u010dte Enter pre opakovanie predch\u00e1dzaj\u00faceho kroku +Vector.Hint.Marking=Pre ozna\u010denie nov\u00e9ho vektora potiahnite my\u0161ou. Stla\u010dte Enter pre opakovanie predch\u00e1dzaj\u00faceho kroku +LineProfile.Hint.Marking=Pre ozna\u010denie nov\u00e9ho \u010diarov\u00e9ho profilu potiahnite my\u0161ou. +RGBRegion.Hint.Marking=Pre ozna\u010denie stredu oblasti kliknite my\u0161ou. +PrefsDialog.Dialog.NewVersion.Title=Aktualiz\u00e1cie +PrefsDialog.Dialog.NewVersion.Message1=Nov\u00e1 Verzia +PrefsDialog.Dialog.NewVersion.Message2=je pr\u00edstupn\u00e1 na +PrefsDialog.Dialog.NewVersion.None.Message=Moment\u00e1lne nie je pr\u00edstupn\u00e1 \u017eiadna nov\u00e1 verzia. +TMenuBar.MenuItem.Restore=Obnovi\u0165 n\u00e1h\u013ead +CalibrationTapeMeasure.Name=Kalibra\u010dn\u00e9 meradlo +WorldTView.Button.World=Re\u00e1lny poh\u013ead + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Warnings +PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PropertiesDialog.Title=Properties +PropertiesDialog.Label.Author=Author +PropertiesDialog.Label.Contact=Contact +TActions.Action.Properties=Properties... +TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.ClickToCancel=(click to cancel) +TFrame.Dialog.StalledVideo.Title=Error Loading Video +TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. +TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. +TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: +TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. +TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. +TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stop +TFrame.Dialog.StalledVideo.Button.Wait=Wait +Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again +TrackerIO.ZipFileFilter.Description=ZIP files +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found +TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinematic Particle +DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) +DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) +DynamicSystem.Builder.Title=Dynamic System (Internal) +PropertiesDialog.Button.CopyFilePath=Copy File Path +PropertiesDialog.Button.CopyVideoPath=Copy Video Path +PropertiesDialog.Tab.TrackerFile=Tracker File +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Property +PropertiesDialog.Header.Value=Value +TActions.Action.OpenURL=Open URL... +TActions.Dialog.OpenURL.Title=Open URL +TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file +TActions.Dialog.AboutVideo.Name=Name + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cached Web Files +PrefsDialog.Button.ClearCache=Clear + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-click to re-mark highlighted position +PointMass.Remarking.Hint=click mouse to re-mark position +PointMass.PositionSelected.Hint=drag or enter position on toolbar +PointMass.VectorSelected.Hint=drag to move +Vector.Remark.Hint=shift-click to re-mark highlighted tip +Vector.TipSelected.Hint=drag or enter components on toolbar +Vector.HandleSelected.Hint=drag to move +Vector.Remarking.Hint=click mouse to re-mark tip +AutoTracker.Label.Search=Search +AutoTracker.Label.Target=Target +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Point +AutoTracker.Label.Template=Template +AutoTracker.Label.Track=Track +AutoTracker.Label.Match=Match +AutoTracker.Label.NoTemplate=No Template +AutoTracker.Label.EvolutionRate=Evolution Rate +AutoTracker.Label.Automark=Automark +AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. +AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. +AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. +AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. +AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. +AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. +AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. +AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. +AutoTracker.Info.Search=The search area is scanned for the best match. +AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. +AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. +AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. +AutoTracker.Info.Target=The target is where the targeted track point is marked. +AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. +AutoTracker.Info.Title.Settings=Settings +AutoTracker.Info.Title.Tip=Tip +AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. +AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: +AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame +AutoTracker.Info.Replace=--accept the match and replace the existing point +AutoTracker.Info.Keep=--keep the existing point +AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Wizard.Button.Replace=Replace +AutoTracker.Wizard.Button.Keep=Keep +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.SearchThis=Search This +AutoTracker.Wizard.Button.SearchNext=Search Next +AutoTracker.Wizard.Button.Delete=Delete +AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Wizard.Menuitem.DeleteThis=This Point +AutoTracker.Wizard.Menuitem.DeleteLater=Later Points +AutoTracker.Wizard.Menuitem.DeleteAll=All Points +TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker +MainTView.Popup.MenuItem.ZoomIn=Zoom In +MainTView.Popup.MenuItem.ZoomOut=Zoom Out +MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit +TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration +TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than +TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from +TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. +TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: +TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=No resource could be loaded for node + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift-click to mark +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Directories +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Clear on exit +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=Save +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=Algorithms... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: +AlgorithmDialog.Title=Algorithms +AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. +AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i]=(x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i]=(2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. +AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=The file cannot be read. +TrackPlottingPanel.Popup.Menu.CompareWith=Compare With +TrackerPanel.DataBuilder.TrackType.Unknown=unknown +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=Load Data Functions +TrackerPanel.DataBuilder.Load.Message=Select functions to load: +TrackerPanel.DataBuilder.Save.Title=Save Data Functions +TrackerPanel.DataBuilder.Save.Message=Select functions to save: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into +TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection +TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type +TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. +TToolbar.Button.Refresh=Refresh data and views + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as +ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportTRKDialog.Complete.Title=Export Complete +ExportTRKDialog.Title=Export ZIP Resource +ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. +ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. +TMenuBar.MenuItem.TabClip=ZIP Resource +TMenuBar.Menu.CalibrationTools=Calibration Tools +TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=end +TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Attach Ends +AttachmentInspector.Label.End=End +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Name +AttachmentInspector.Header.AttachedTo=Attach To +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Attach Ends... +PerspectiveTrack.Corner=corner +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=time +Protractor.Data.Description.1=protractor angle +Protractor.Data.Description.2=length of arm 1 +Protractor.Data.Description.3=length of arm 2 +Protractor.Data.Description.4=step number +Protractor.Data.Description.5=frame number +TapeMeasure.Data.Description.0=time +TapeMeasure.Data.Description.1=length +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=step number +TapeMeasure.Data.Description.4=frame number + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export ZIP Resource +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export ZIP Resource +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource +ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Load All Images +TMenuBar.Dialog.RequiresMemory.Message1=All images will be loaded into memory for faster response and editing. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage data function autoloading +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties index 299cc8a2..4be7e922 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties @@ -1,1191 +1,1191 @@ -# This is the Slovenian tracker.properties file -# Translation by Sasa Divjak 2011 - -Calibration.Name=Kalibracijske to\u010Dke -Calibration.New.Name=kalibracijske to\u010Dke -CenterOfMass.Name=Te\u017Ei\u0161\u010De -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Izberi mase... -CenterOfMassInspector.Title=Te\u017Ei\u0161\u010De -CenterOfMassInspector.Border.Title=Izberi mase -ConfigInspector.Border.Title=\u017Delene lastnosti -ConfigInspector.Title=Preference -ConfigInspector.Button.SaveAsDefault=Shrani kot privzeto -CoordAxes.Name=Osi -CoordAxes.New.Name=Osi -Dialog.Button.Cancel=Preklic -Dialog.Button.OK=V redu -Dialog.Button.Close=Zapri -Dialog.Button.All=Vse -Dialog.Button.None=Ni\u010D -Dialog.Button.Copy=Kopiraj -Dialog.Button.Update=Osve\u017Ei -Dialog.Button.SelectAll=Izberi vse -Footprint.Diamond=romb -Footprint.BoldDiamond=poudarjen romb -Footprint.SolidDiamond=poln romb -Footprint.Triangle=trikotnik -Footprint.BoldTriangle=poudarjen trikotnik -Footprint.SolidTriangle=poln trikotnik -Footprint.Circle=krog -Footprint.BoldCircle=poudarjen krog -Footprint.SolidCircle=poln krog -Footprint.VerticalLine=navpi\u010Dna \u010Drta -Footprint.BoldVerticalLine=poudarjena navpi\u010Dna \u010Drta -Footprint.HorizontalLine=vodoravna \u010Drta -Footprint.BoldHorizontalLine=poudarjena vodoravna \u010Drta -Footprint.Crosshair=kri\u017Eec -Footprint.BoldCrosshair=poudarjen kri\u017Eec -Footprint.SimpleAxes=preproste osi -Footprint.BoldSimpleAxes=poudarjene preproste osi -Footprint.Spot=spot -Footprint.Line=\u010Drta -Footprint.BoldLine=debela \u010Drta -Footprint.Outline=obris -Footprint.BoldOutline=debel obris -Footprint.Arrow=pu\u0161\u010Dica -Footprint.BoldArrow=debela pu\u0161\u010Dica -Footprint.DoubleArrow=dvojna pu\u0161\u010Dica -Footprint.BoldDoubleArrow=debela dvojna pu\u0161\u010Dica -Footprint.2xArrow=2x pu\u0161\u010Dica -Footprint.Bold2xArrow=debela 2x pu\u0161\u010Dica -Footprint.4xArrow=4x pu\u0161\u010Dica -Footprint.Bold4xArrow=debela 4x pu\u0161\u010Dica -Footprint.DashArrow=\u010Drtkana pu\u0161\u010Dica -Footprint.BoldDashArrow=debela \u010Drtkana pu\u0161\u010Dica -Footprint.BigArrow=velika pu\u0161\u010Dica -Footprint.BigDashArrow=velika \u010Drtkana pu\u0161\u010Dica -LineProfile.Name=Profil \u010Drte -LineProfile.New.Name=profil -LineProfile.Data.Brightness=svetlost -LineProfile.Data.Pixel=piksel -LineProfile.Data.Red=rde\u010Da -LineProfile.Data.Green=zelena -LineProfile.Data.Blue=modra -LineProfile.Data.Weighting=\u0161tevilo -MainTView.Popup.MenuItem.QTPlayer=QuickTime predvajalnik -MainTView.Popup.MenuItem.Zoom=Pove\u010Dava -MainTView.Popup.MenuItem.ToFit=Prileganje -OffsetOrigin.Name=Odmik izhodi\u0161\u010Da -OffsetOrigin.New.Name=odmik izhodi\u0161\u010Da -PlotTrackView.Button.PlotCount=Grafi -PlotTrackView.Button.PlotCount.ToolTip=Nastavi \u0161tevilo grafov -PointMass.Name=Masna to\u010Dka -PointMass.New.Name=masa -PointMass.MenuItem.VectorsToPosition=Na pozicijo -PointMass.MenuItem.Velocity=Hitrost -PointMass.MenuItem.Acceleration=Pospe\u0161ek -Star.Name=Zvezda -Star.New.Name=zvezda -TableTrackView.Action.CopyData=Kopiranje podatkov -TableTrackView.Button.SelectTableData=Table -TableTrackView.Button.SelectTableData.ToolTip=Choose table columns -TableTrackView.Popup.MenuItem.Analyze=Analizaj... -TableTrackView.Dialog.Border.Title=Vidno: -TActions.Action.Description=Opombe -TActions.Action.ClearTracks=Po\u010Disti -TActions.Action.NewTab=Nov zavihek -TActions.Action.Copy=Kopiraj -TActions.Action.Paste=Prilepi -TActions.Action.Open=Odpri... -TActions.Action.Close=Zapri zavihek -TActions.Action.Import=Uvozi... -TActions.Action.Save=Shrani zavihek -TActions.Action.SaveAs=Shrani zavihek kot... -TActions.Action.Export=Izvozi... -TActions.Action.CaptureVideo=Zajemi Video... -TActions.Action.Delete=Brisanje -TActions.Action.Config=Preference... -TActions.Action.AxesVisible=Vidno -TActions.Action.TapeVisible=Vidno -TActions.Action.Print=Natisni... -TActions.Action.ClearFilters=Bri\u0161i -TActions.Action.ImportVideo=Uvozi... -TActions.Action.CloseVideo=Zapri -TActions.Action.CloseAll=Zapri vse -TActions.Action.Exit=Izhod -TActions.Dialog.PrintError.Message=Napaka pri tiskanju. -TActions.Dialog.PrintError.Title=Napaka tiskanja -TActions.Dialog.Description.Title=Opombe: -TActions.Dialog.DeleteLockedTracks.Message=Nekatere sledi so zaklenjene. Vseeno zbri\u0161em? -TActions.Dialog.DeleteLockedTracks.Title=Bri\u0161em zaklenjene sledi? -TActions.Dialog.NewPointMass.Title=Nova masna to\u010Dka -TapeMeasure.Name=Merilni trak -TapeMeasure.New.Name=trak -TapeMeasure.MenuItem.Fixed=Fiksen polo\u017Eaj -TFrame.View.Plot=Grafi\u010Dni prikaz -TFrame.View.Table=Tabelari\u010Dni prikaz -TFrame.View.World=Pogled sveta -TFrame.View.Video=Video pogled -TFrame.Dialog.Help.Title=Tracker-pomo\u010D -TMenuBar.Menu.File=Datoteka -TMenuBar.Menu.Edit=Urejanje -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Sledi -TMenuBar.Menu.Coords=Koordinatni sistem -TMenuBar.Menu.Window=Okno -TMenuBar.Menu.Help=Pomo\u010D -TMenuBar.MenuItem.EditProperties=Lastnosti... -TMenuBar.MenuItem.VideoVisible=Viden -TMenuBar.MenuItem.VideoFilters=Filtri -TMenuBar.MenuItem.NewVideoFilter=Nov -TMenuBar.MenuItem.NewTrack=Nova -TMenuBar.MenuItem.CoordsLocked=Zaklenjeno -TMenuBar.MenuItem.CoordsFixedOrigin=Fiksno izhodi\u0161\u010De -TMenuBar.MenuItem.CoordsFixedAngle=Fiksen kot -TMenuBar.MenuItem.CoordsFixedScale=Fiksno merilo -TMenuBar.MenuItem.CoordsRefFrame=Referen\u010Dni okvir -TMenuBar.MenuItem.CoordsDefault=Privzeto -TMenuBar.MenuItem.WindowRight=Pogled desno -TMenuBar.MenuItem.WindowBottom=Pogled spodaj -TMenuBar.MenuItem.PlayAllSteps=Predvajaj vse korake -TMenuBar.MenuItem.Record=Zapis -TMenuBar.MenuItem.MatSize=Velikost matrike -TMenuBar.MenuItem.Language=Jezik -TMenuBar.MenuItem.DeleteTrack=Brisanje -TMenuBar.MenuItem.TrackerHelp=Tracker-pomo\u010D... -TMenuBar.MenuItem.MessageLog=Zapis obvestil... -TrackControl.Name=Kontrola sledi -TrackControl.Button.NewTrack=Tvori -TrackControl.Button.NewTrack.ToolTip=Tvori novo sled -TrackControl.Button.Trails.ToolTip=Nastavi dol\u017Eino sledi -TrackControl.Button.Labels.ToolTip=Prika\u017Ei ali skrij o\u0161tevil\u010Denje -TrackControl.Button.StretchVectors.ToolTip=Raztegni vektorje -TrackControl.Button.Accelerations.ToolTip=prika\u017Ei ali skrij vektorje pospe\u0161ka -TrackControl.Button.Xmass.ToolTip=Pomno\u017Ei vektorje z maso -TrackControl.Button.Vectors.ToolTip=Vektorji -TrackControl.Button.Velocities.ToolTip=Prika\u017Ei ali skrij vektorje hitrosti -TrackControl.Button.Properties.ToolTip=Izberi s klikom -TrackControl.Button.Positions.ToolTip=Prika\u017Ei ali skrij polo\u017Eaje -Tracker.Popup.MenuItem.Snapshot=Posnetek... -Tracker.Popup.MenuItem.Help=Pomo\u010D... -Tracker.Cursor.Crosshair.Description=Kurzor kot kri\u017Eec -Tracker.Action.AboutTracker=O programu Tracker... -Tracker.Dialog.AboutTracker.Title=O programu Tracker -Tracker.Action.AboutJava=O javi... -Tracker.Dialog.AboutJava.Title=O javi -Tracker.Dialog.AboutJava.UnknownVersion=neznano -Tracker.Dialog.AboutJava.Message=Verzija jave -Tracker.Action.AboutQT=o QuickTime... -Tracker.Dialog.AboutQT.Title=Nekaj o QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=Verzija QuickTime -Tracker.Dialog.AboutQT.Message.QTJavaVersion=Verzija QTJava -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava pOT: -Tracker.Dialog.NoQT.Title=Ne najdem QTJava.zip -Tracker.Dialog.NoQT.Message1=Izgleda, da ni name\u0161\u010Den QuickTime za javo. -Tracker.Dialog.NoQT.Message2=\u010Ce \u017Eeli\u0161 analizirati QuickTime video, ponovno namesti QuickTime. -Tracker.Dialog.NoQT.Message3=Opomba: Pri namestitvi QuickTime MORA BITI IZBRAN QuickTime za Javo. -Tracker.Dialog.UpdateQT.Title=Osve\u017Ei QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Nova verzija QTJava.zip je najdena na -Tracker.Dialog.UpdateQT.Message2=Ali \u017Eeli\u0161 posodobiti obstoje\u010Do datoteko? -Tracker.Dialog.CopyQT.Title=Kopiraj QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime je name\u0161\u010Den, preden ga Tracker lahko uporabi: -Tracker.Dialog.CopyQT.Message2= 1. mora biti QTJava.zip kopiran od -Tracker.Dialog.CopyQT.Message3= na -Tracker.Dialog.CopyQT.Message4= 2. Tracker moramo ponovno pognati. -Tracker.Dialog.CopyQT.Message5=\u017Deli\u0161, da sedaj kopiram QTJava.zip? -Tracker.Dialog.CopyFailed.Title=Kopiranje neuspe\u0161no -Tracker.Dialog.CopyFailed.Message=QTJava.zip ne morem kopirati. -Tracker.Dialog.CopiedTo.Title=Kopiranje uspe\u0161no -Tracker.Dialog.CopiedTo.Message1=QTJava.zip je bil uspe\u0161no kopiran na -Tracker.Dialog.CopiedTo.Message2=Tracker bo sedaj prekinjen ig ga moramo na novo pognati. -Tracker.Splash.Loading=Nalaganje -TrackerIO.Dialog.Import.Title=Uvoz Tracker datoteke -TrackerIO.Dialog.Import.Message=Izberi postavke za uvoz -TrackerIO.Dialog.ImportVideo.Title=Izvoz videa -TrackerIO.Dialog.Export.Title=Izvoz -TrackerIO.Dialog.Export.Message=Izberi postavke za izvoz -TrackerIO.Dialog.ReplaceFile.Title=Zamenjam obstoje\u010Do datoteko? -TrackerIO.Dialog.ReplaceFile.Message=\u017Ee obstaja. Ali naj jo zamenjam? -TrackerIO.Dialog.NotTrackerXML.Title=Neskladnost XML -TrackerIO.Dialog.NotTrackerXML.Message=vsebuje xml podatke za drugo aplikacijo. -TrackerIO.Dialog.BadVideo.Message=Datoteke ne spoznam kot video tip: -TrackerIO.Dialog.BadVideo.Title=Nerazpoznana video datoteka -TrackerPanel.NewTab.Name=Brez naslova -TrackerPanel.DragToMark.Hint=Ozna\u010Dimo s Shift-vle\u010Denjem -TrackerPanel.ClickToMark.Hint=Ozbna\u010Dimo s Shift-klik -TrackerPanel.Dialog.LoadFailed.Title=neveljavna Tracker datoteka -TrackerPanel.Dialog.LoadFailed.Message=Datoteka ni veljavna Tracker datoteka: -TrackerPanel.Dialog.SaveChanges.Title=Shrani spremembe -TrackerPanel.Dialog.SaveChanges.Message=Shrani spremembe v -TrackPlottingPanel.Popup.MenuItem.Lines=\u010Crte -TrackPlottingPanel.Popup.MenuItem.Points=To\u010Dke -TrackPlottingPanel.Popup.MenuItem.Scale=Pove\u010Daj... -TrackPlottingPanel.Popup.MenuItem.Print=Natisni... -TrackPlottingPanel.Popup.MenuItem.Measure=Pove\u010Daj do prilagoditve -TrackPlottingPanel.Popup.MenuItem.Analyze=Analiziraj... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Pove\u010Dava -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Pomanj\u0161ava -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Automatska pove\u010Dava -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box -TrackPlottingPanelInspector.Title=Pove\u010Dava -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Maks -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Nastavi izgled -TToolBar.Dropdown.SelectedTrack.Tooltip=Izberi sled -TToolBar.Dropdown.SelectedTrack.None=Noben -TTrack.MenuItem.Delete=Brisanje -TTrack.MenuItem.Color=Barva... -TTrack.Dialog.Color.Title=Izberi barvo sledi -TTrack.MenuItem.Name=Ime... -TTrack.MenuItem.Footprint=Izgled -TTrack.MenuItem.Description=Opombe... -TTrack.MenuItem.Visible=Vidno -TTrack.MenuItem.TrailVisible=Vidna sled -TTrack.MenuItem.Autostep=Automatsko korakanje -TTrack.MenuItem.MarkByDefault=Ozna\u010Di privzeto -TTrack.MenuItem.Locked=Zaklenjeno -TTrack.MenuItem.Delete=Brisanje -TTrack.Name.None=brez imena -TTrack.Dialog.Description.Title=Opombe: -TTrack.Dialog.Name.Title=Imenuj -TTrack.Dialog.Name.Label=Ime: -TViewChooser.Button.Choose.Tooltip=Izberi pogled -Vector.Name=Vektor -Vector.New.Name=vektor -Vector.MenuItem.ToOrigin=Na izhodi\u0161\u010De -Vector.MenuItem.Label=Oznaka vidna -VectorSum.Name=Vsota vektorjev -VectorSum.New.Name=vsota -VectorSum.MenuItem.Inspector=Izberi vektorje... -VectorSumInspector.Title=Vsota vektorjev -VectorSumInspector.Border.Title=Izberi vektorje -WorldTView.Popup.MenuItem.Projectile=Model izstrelka - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Analiti\u010Dni model delca -AnalyticParticle.Inspector.Title=Analiti\u010Dni model delca -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=polmer 4 -CircleFootprint.Circle_6=polmer 6 -CircleFootprint.Circle_8=polmer 8 -DynamicParticle.Name=Dinami\u010Dni model delca(Kartezi\u010Dni) -DynamicParticle.Inspector.Title=Dinami\u010Dni model delca -DynamicParticle.Property.ForceX=sila x -DynamicParticle.Property.ForceY=sila y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Fiksen polo\u017Eaj -ParticleModel.New.Name=model -ParticleModel.MenuItem.InspectModel=Graditelj modela... -ParticleModel.Inspector.Button.Undo=razveljavi -ParticleModel.Inspector.Button.Redo=ponovno uveljavi -ParticleModel.Inspector.Button.Close=Zapri -ParticleModel.Inspector.Button.Help=Pomo\u010D - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=Le X -Calibration.Axes.YOnly=Le Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Izberi osi kalibracije -Calibration.Label.Axes=osi -Calibration.Dialog.InvalidCoordinates.Title=Neveljavne koordinate -Calibration.Dialog.InvalidCoordinates.Message=To\u010Dke ne morejo imeti istih koordinat sveta. -Calibration.Dialog.InvalidXCoordinates.Message=To\u010Dke ne morejo imeti enakih x-koordinat sveta. -Calibration.Dialog.InvalidYCoordinates.Message=To\u010Dke ne morejo imeti enakih y-koordinat sveta. -SpectralLineFilter.Title=Spekter plinov -SpectralLineFilter.H=Vodik -SpectralLineFilter.He=Helij -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=\u017Divo srebro -TFrame.View.Unknown=Pogled -TMenuBar.MenuItem.Undo=Razveljavi -TMenuBar.MenuItem.Redo=Obnovi -TMenuBar.MenuItem.Replace=Zamenjaj... -TMenuBar.Menu.AddImage=Uvoz slik -TMenuBar.MenuItem.AddBefore=Pred to sli\u010Dico... -TMenuBar.MenuItem.AddAfter=Za to sli\u010Dico... -TMenuBar.MenuItem.RemoveImage=Odstrani to sli\u010Dico -TMenuBar.Menu.Tools=Orodja -TMenuBar.MenuItem.DataFunctionTool=Graditelj podatkov -TMenuBar.MenuItem.DatasetTool=Podatkovno orodje -TMenuBar.Menu.CopyImage=Kopiranje slike -TMenuBar.MenuItem.CopyMainView=Glavni pogled -TMenuBar.MenuItem.CopyFrame=Sli\u010Dica -TMenuBar.MenuItem.PrintFrame=Tiskanje... -TrackerIO.Dialog.AddImage.Title=Uvoz slik (izberi eno ali ve\u010D) -TTrack.Dialog.Name.BadName=je v uporabi. Izberi drugo ime. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=skupna sila -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Tu bodo grafi\u010Dno prikazani podatki o sledeh. -TableTView.Label.NoData=Tu bodo tabelari\u010Dno prikazani podatki o sledeh. -TrackerPanel.Message.NoData0=Tu bo glavni prikaz videa in sledi. -TrackerPanel.Message.NoData1=Izberi datoteko|Odpri ali Sledi|Novo za za\u010Detek. -WorldTView.Label.NoData=Tu bo prikazan pogled sveta na video in sledi. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Metoda integracije: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptivna ve\u010Dkora\u010Dna -DynamicParticle.Table.Force.Border.Title=Funkcije sile (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Funkcije polo\u017Eaja (t) -ParticleModel.Table.Initial.Border.Title=Za\u010Detne vrednosti -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Prilepi sliko -TMenuBar.MenuItem.PasteAfter=Po tej sli\u010Dici -TMenuBar.MenuItem.PasteBefore=Pred to sli\u010Dico -TMenuBar.MenuItem.PasteReplace=Zamenjaj video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Pa za\u010Dnimo... -Tracker.Splash.HelpMessage=Nov uporabnik? Poglej - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=kot od vodoravnice -LineProfile.Checkbox.Rotates=rotates -LineProfile.Label.Spread=razpon -RGBRegion.Name=RGB podro\u010Dje -RGBRegion.New.Name=podro\u010Dje -RGBRegion.MenuItem.Fixed=Fiksen polo\u017Eaj -RGBRegion.Label.Radius=pixel radius -TTrack.Label.Step=korak - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=\u0161tev.polo\u017Eaja -LineProfile.Data.Description.1=x-komponenta polo\u017Eaja -LineProfile.Data.Description.2=y-komponenta polo\u017Eaja -LineProfile.Data.Description.3=rde\u010Da -LineProfile.Data.Description.4=zelena -LineProfile.Data.Description.5=modra -LineProfile.Data.Description.6=zaznana svetlost -LineProfile.Data.Description.7=debelina \u010Drte -ParticleModel.MenuItem.TraceVisible=Sled vidna -ParticleModel.MenuItem.StepsVisible=Koraki vidni -PointMass.Data.Description.0=\u010Das -PointMass.Data.Description.1=x komponenta polo\u017Eaja -PointMass.Data.Description.2=y komponenta polo\u017Eaja -PointMass.Data.Description.3=magnituda polo\u017Eaja -PointMass.Data.Description.4=naklon polo\u017Eaja -PointMass.Data.Description.5=x komponenta hitrosti -PointMass.Data.Description.6=y komponenta hitrosti -PointMass.Data.Description.7=magnituda hitrosti -PointMass.Data.Description.8=naklon hitrosti -PointMass.Data.Description.9=x komponenta pospe\u0161ka -PointMass.Data.Description.10=y komponenta pospe\u0161ka -PointMass.Data.Description.11=magnituda pospe\u0161ka -PointMass.Data.Description.12=naklon pospe\u0161ka -PointMass.Data.Description.13=kot rotacije -PointMass.Data.Description.14=kotna hitrost -PointMass.Data.Description.15=kotni pospe\u0161ek -PointMass.Data.Description.16=\u0161tev. koraka -PointMass.Data.Description.17=\u0161tev.sli\u010Dice -PointMass.Data.Description.18=x komponenta gibalne.koli\u010Dine -PointMass.Data.Description.19=y komponenta gibalne koli\u010Dine -PointMass.Data.Description.20=magnituda gibalne koli\u010Dine -PointMass.Data.Description.21=naklon gibalne koli\u010Dine -PointMass.Data.Description.22=kineti\u010Dna energija -RGBRegion.Data.Description.0=\u010Das -RGBRegion.Data.Description.1=x komponenta polo\u017Eaja -RGBRegion.Data.Description.2=y komponenta polo\u017Eaja -RGBRegion.Data.Description.3=rde\u010Da -RGBRegion.Data.Description.4=zelena -RGBRegion.Data.Description.5=modra -RGBRegion.Data.Description.6=zaznana svetlost -RGBRegion.Data.Description.7=\u0161tev. pikslov -RGBRegion.Data.Description.8=\u0161tev.koraka -RGBRegion.Data.Description.9=\u0161tev.sli\u010Dice -TView.Menuitem.Define=Definiraj... -Vector.Data.Description.0=\u010Das -Vector.Data.Description.1=x-komponenta -Vector.Data.Description.2=y-komponenta -Vector.Data.Description.3=magnituda -Vector.Data.Description.4=kot -Vector.Data.Description.5=x komponenta polo\u017Eaja repa -Vector.Data.Description.6=y komponenta polo\u017Eaja repa -Vector.Data.Description.7=\u0161tev. koraka -Vector.Data.Description.8=\u0161tev. sli\u010Dice - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Masa tega delca -ParticleModel.Parameter.InitialTime.Description=Za\u010Detni \u010Das -AnalyticParticle.PositionFunction.X.Description=x komponenta polo\u017Eaja -AnalyticParticle.PositionFunction.Y.Description=y komponenta polo\u017Eaja -DynamicParticle.ForceFunction.X.Description=x komponenta sile -DynamicParticle.ForceFunction.Y.Description=y komponenta sile -DynamicParticle.Parameter.InitialX.Description=x komponenta za\u010Detnega polo\u017Eaja -DynamicParticle.Parameter.InitialY.Description=y komponenta za\u010Detnega polo\u017Eaja -DynamicParticle.Parameter.InitialVelocityX.Description=x komponenta za\u010Detne hitrosti -DynamicParticle.Parameter.InitialVelocityY.Description=y komponenta za\u010Detne hitrosti -TrackerPanel.ModelBuilder.Title=Graditelj modela -TrackerPanel.DataBuilder.Title=Graditelj podatkov -TrackControl.TrailMenu.NoTrail=Ni sledi -TrackControl.TrailMenu.ShortTrail=Kratke sledi -TrackControl.TrailMenu.LongTrail=Dolge sledi -TrackControl.TrailMenu.FullTrail=Vsi koraki -TrackerPanel.ModelBuilder.Spinner.Tooltip=Trenutno izbrani model -TrackerPanel.ModelBuilder.LineButton.Text=Stil \u010Drte -TrackerPanel.ModelBuilder.LineButton.Tooltip=Izberi stil \u010Drte -ParticleModel.LineStyle.None=Ni \u010Drte -ParticleModel.LineStyle.Connect=Pove\u017Ei korake -ParticleModel.LineStyle.Smooth=Mehka \u010Drta -ModelFunctionPanel.Label=Model -AnalyticFunctionPanel.FunctionEditor.Border.Title=Funkcije polo\u017Eaja -DynamicFunctionPanel.FunctionEditor.Border.Title=Funkcije sile - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Visible Table Columns -Tracker.About.ProjectOf=Avtor projekta: -Tracker.About.TranslationBy=Prevedel -# following entry (Tracker.About.Translator) purposely left blank -Tracker.About.Translator=Sa\u0161a Divjak -TMenuBar.Menu.SaveVideoAs=Shrani izrezek kot -TActions.SaveClipAs.ProgressMonitor.Message=Shranjujem izrezek kot -TActions.SaveClipAs.ProgressMonitor.Progress=Kon\u010Dano - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sinhro. -PlotTrackView.Checkbox.Synchronize.Tooltip=Sinhroniziraj vodoravne osi -RGBRegion.MenuItem.FixedRadius=Fiksen polmer -Tracker.VideoZoom.Hint=klikni za pribli\u017Eanje ali oddaljevanje, dvoklik za prileganje -Tracker.PlotZoomIn.Hint=z vle\u010Denjem pribli\u017Eamo, dvoklik za avtomatsko prileganje merila -Tracker.PlotZoomOut.Hint=S klikom se odmakne\u0161 (pomanj\u0161a\u0161) -Tracker.MenuItem.Hints=Prika\u017Ei namige -TapeMeasure.Label.Length=dol\u017Eina -TapeMeasure.Label.TapeAngle=kot od osi x -TapeMeasure.Label.ArcAngle=kot kotomera -TrackerIO.Dialog.NotAnImage.Title=Napa\u010Den tip datoteke -TrackerIO.Dialog.NotAnImage.Message1=ni slika JPG ali GIF. -TrackerIO.Dialog.NotAnImage.Message2=Ali \u017Eeli\u0161 nadaljevati? -TToolBar.Button.Zoom.Tooltip=Pove\u010Dava (bli\u017Enjica: tipka Z) -TrackChooserTView.DropDown.Tooltip=Izberi sled -TapeMeasure.Field.TapeAngle.Tooltip=Kot od pozitivne osi x do traku -TapeMeasure.Field.Magnitude.Tooltip=Dol\u017Eina v umerjenih enotah sveta -TapeMeasure.Readout.Magnitude.Name=dol\u017Eina -TapeMeasure.Readout.Magnitude.Hint=enote sveta -TapeMeasure.Readout.Angle.Name=od\u010Ditek naklona -TapeMeasure.Readout.Angle.Hint=kot, merjen od osi +x -TapeMeasure.End.Name=konec -TapeMeasure.End.Hint=Z vle\u010Denjem meri\u0161 razdalje in kote -TapeMeasure.Handle.Name=ro\u010Dica -TapeMeasure.Handle.Hint=premakni z vle\u010Denjem -Vector.Tip.Name=Konica -Vector.Tip.Hint=komponente spremenimo z vle\u010Denjem ali vnosom koordinat -Vector.Handle.Name=ro\u010Dica -Vector.Handle.Hint=vektor premika\u0161 z vle\u010Denjem -Vector.ShortHandle.Hint=z vle\u010Denjem pomikamo, konico izberemo z ALT-klik -PointMass.Position.Name=polo\u017Eaj -PointMass.Position.Hint=za spremembo polo\u017Eaja povleci ali vnesi koordinate -PointMass.Velocity.Name=hitrost -PointMass.Acceleration.Name=pospe\u0161ek -PointMass.Vector.Hint=Za premik povleci -PointMass.Position.Locked.Hint=s klikom izbere\u0161 -- ne more\u0161 vle\u010Di -CoordAxes.Handle.Name=+x-os -CoordAxes.Handle.Hint=naklon spremeni\u0161 z vle\u010Denjem -CoordAxes.Origin.Name=izhodi\u0161\u010Den -CoordAxes.Origin.Hint=polo\u017Eaj spremeni\u0161 z vle\u010Denjem -OffsetOrigin.Position.Name=polo\u017Eaj -OffsetOrigin.Position.Hint=za premik izhodi\u0161\u010Da povleci ali vnesi koordinate -Calibration.Point.Name=to\u010Dka -Calibration.Point.Hint=Osi in merilo spremeni\u0161 z vle\u010Denjem ali z vnosom koordinat -RGBRegion.Position.Name=polo\u017Eaj -RGBRegion.Position.Hint=polo\u017Eaj spremeni\u0161 z vle\u010Denjem ali z vnosom koordinat -LineProfile.End.Name=konec -LineProfile.End.Hint=z vle\u010Denjem naravna\u0161 dol\u017Eino \u010Drte -LineProfile.Handle.Name=ro\u010Dica -LineProfile.Handle.Hint=\u010Drto premakne\u0161 z vle\u010Denjem -PointMass.Hint=maso nastavi\u0161 v orodni vrstici -PointMass.Unmarked.Hint=, polo\u017Eaje ozna\u010Di\u0161 s shift-klik -TTrack.Unselected.Hint=klikni za izbiro oziroma nastavitev lastnosti -Vector.Unmarked.Hint=vektorje ri\u0161e\u0161 s shift-vle\u010Denjem -OffsetOrigin.Unmarked.Hint=to\u010Dko odmika ozna\u010Di\u0161 s shift-klik -Calibration.Unmarked.Hint=prvo to\u010Dko ozna\u010Di\u0161 s shift-klik -Calibration.Halfmarked.Hint=drugo to\u010Dko ozna\u010Di\u0161 s shift-klik -CenterOfMass.Empty.Hint=Izberi mase za definiranje sistema -VectorSum.Empty.Hint=izberi vektorje za definiranje vsote -TapeMeasure.Hint=razdalje in kote meri\u0161 z vle\u010Denjem koncev -CoordAxes.Hint=za spremembo naklona nastavi kot -ParticleModel.Hint=nastavi maso v orodni vrstici, v Graditelj modela vnesi izraze za animacijo -RGBRegion.Hint=velikost spremeni\u0161 z vnosom polmera -RGBRegion.Unmarked.Hint=polo\u017Eaje ozna\u010Di\u0161 s shift-klik -TTrack.ImportVideo.Hint=uvoz videa ali slike za merjenje RGB -TTrack.Selected.Hint=izbrano -LineProfile.Hint=za spremembo debeline \u010Drte vnesi razpo -LineProfile.Unmarked.Hint=\u010Drto nari\u0161e\u0161 s shift-vle\u010Denjem -LineProfile.Menu.Orientation=Usmeritev -LineProfile.MenuItem.Horizontal=Vodoravna -LineProfile.MenuItem.XAxis=Vzdol\u017E osi X -Footprint.PositionVector=vektor -Footprint.BoldPositionVector=poudarjen vektor -Tracker.Startup.Hint=Tu poglej za namige (ali v menuju Pomo\u010D izklopi namige). Za pomo\u010D kadarkoli klikni na F1 -TrackerPanel.NoVideo.Hint=odpri ali uvozi video ali sliko za analizo -TrackerPanel.CalibrateVideo.Hint=Kalibriraj video s pomo\u010Djo orodja za kalibracijo -TrackerPanel.NoTracks.Hint=tvori novo sled za merjenje zanimivih lastnosti -TrackerPanel.SetClip.Hint=nastavi ali preglej nastavitve video izrezov -TrackerPanel.ShowAxes.Hint=nastavi izhodi\u0161\u010De in kot koordinatnih osi -VideoPlayer.Step.Hint=korak naprej (bli\u017Enjica: tipka PageDown) -VideoPlayer.Back.Hint=korak nazaj (bli\u017Enjica: tipka PageUp) -TrackerPanel.DVVideo.Hint=za popravek popa\u010Denja v videih formata DV uporabi filter za pove\u010Davo -TrackerIO.DataFileFilter.Description=Datoteke Tracker -Tracker.Button.PDFHelp=Verzija PDF za tisk -TToolbar.Button.TapeVisible.Tooltip=Prika\u017Ei, skrij ali izberi kalibracijska orodja - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Kontrola sledi -TMenuBar.MenuItem.Description=Opombe -TrackPlottingPanel.RightDrag.Hint=za opcije vle\u010Di z desnim gumbom -TMenuBar.MenuItem.DeleteSelectedPoint=Izbrana to\u010Dka -TFrame.InfoDialog.SaveChanges.Title=Shrani spremembe -TFrame.InfoDialog.SaveChanges.Message=Ali naj shranim spremembe? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Kartezi\u010Dni -DynamicParticle.Editor.Button.Polar=Polarni -DynamicParticle.Parameter.InitialR.Description=Za\u010Detni polmer -DynamicParticle.Parameter.InitialTheta.Description=Za\u010Detni kot -DynamicParticle.Parameter.InitialVelocityR.Description=Za\u010Detna obodna hitrost -DynamicParticle.Parameter.InitialOmega.Description=Za\u010Detna kotna hitrost -DynamicParticle.ForceFunction.R.Description=Radialna komponenta sile -DynamicParticle.ForceFunction.Theta.Description=Tangencialna komponenta sile -DynamicParticlePolar.Name=Dinami\u010Dni model delca(Polarni) -DynamicTwoBody.Editor.Button.Particle1=Delec 1 -DynamicTwoBody.Editor.Button.Particle2=Delec 2 -DynamicTwoBody.Name=Dinami\u010Dni model dveh teles -TMenuBar.Menu.DynamicParticle=Dinami\u010Dni model z delci -TMenuBar.MenuItem.Cartesian=Cartezi\u010Dni -TMenuBar.MenuItem.Polar=Polarni - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Avtom.sledenje... -Dialog.Button.Help=Pomo\u010D -AutoTracker.Wizard.Title=Avtom.sledilec: -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Nazaj -AutoTracker.Wizard.Button.Next=Naprej -AutoTracker.Wizard.Button.Accept=Sprejmi -AutoTracker.Wizard.Button.Search=Iskanje -AutoTracker.Wizard.Button.Pause=Pavza -AutoTracker.Wizard.Button.Skip=Presko\u010Di -AutoTracker.Label.Mask=Vzorec slike -AutoTracker.Label.Target=Odmik tar\u010De -AutoTracker.Label.AcceptLevel=Sprejmi zgornje ocene -AutoTracker.TabbedPane.TabTitle.Mask=Vzorec -AutoTracker.TabbedPane.TabTitle.Target=Tar\u010Da -AutoTracker.TabbedPane.TabTitle.Settings=Sprejemljivost -AutoTracker.TabbedPane.TabTitle.Search=Iskanje -AutoTracker.Info.GetStarted=Klikni na video zna\u010Dilnost, ki ji \u017Eeli\u0161 avtomatsko slediti. -AutoTracker.Info.Mask1=Vzorec definira sliko, ki naj bi se ujemala v vsaki video sli\u010Dici. Z vle\u010Denjem centra vzorca ali ro\u010Dice ga premika\u0161 ali pove\u010Da\u0161. -AutoTracker.Info.Mask2=Vzorec se lahko po obliki in barvi s \u010Dasom spreminja. Vi\u0161je hitrosti razvoja omogo\u010Dajo sledenje hitrej\u0161im spremembam, vendar so dolgoro\u010Dno manj natan\u010Dne. -AutoTracker.Info.MaskLocked1=Vzorec je v uporabi in zaklenjen. -AutoTracker.Info.MaskLocked2=S klikom na gumb Reset zbri\u0161e\u0161 vse korake in za\u010Dne\u0161 znova. -AutoTracker.Info.Target1=Tar\u010Da je tam, kjer bodo koraki ozna\u010Deni relativno glede na vzorec. Tar\u010Do premikamo z vle\u010Denjem. -AutoTracker.Info.Target2=Namig: Polo\u017Eaj tar\u010De lahko naravnamo tudi po ozna\u010Devanju korakov. Obstoje\u010Di koraki se vodo avtomati\u010Dno premikali glede na tar\u010Do. -AutoTracker.Info.TargetLocked=Tar\u010Da je v uporabi in vezana na obstoje\u010De polo\u017Eaje v korakih. Premik tar\u010De pomeni tudi premik korakov. -AutoTracker.Info.Settings1=Ocene ujemanja nad prikazanim pragom sprejemljivosti so avtomatsko ozna\u010Dene. -AutoTracker.Info.Settings2=Namig: zmanj\u0161anje praga sprejemljivosti pove\u010Da mo\u017Enost napak. -AutoTracker.Info.Search1=Prikazan pravokotnik bo pregledan za najbolj\u0161e ujemanje. Podro\u010Dje iskanja premikamo oziroma pove\u010Damo z vle\u010Denjem njegovega centra oziroma ro\u010Dice. -AutoTracker.Info.Search2=Namig: Iskano podro\u010Dje ni nujno veliko, \u010De je pospe\u0161ek majhen ali konstanten. Opcija "gledaj naprej" avtomatsko pomika iskalno podro\u010Dje na napovedane polo\u017Eaje ujemanja. -AutoTracker.Info.Frame=Sli\u010Dica -AutoTracker.Info.Match=Prikazano ujemanje je bilo avtomati\u010Dno ozna\u010Deno na polo\u017Eaju tar\u010De. -AutoTracker.Info.Possible=Pa prikazanem iskalnem podro\u010Dju je bilo najdeno mo\u017Eno ujemanje. Tvoje mo\u017Enosti so: -AutoTracker.Info.NoMatch=V prikazanem iskalnem podro\u010Dju ni bilo najdeno nobeno ujemanje. Tvoje mo\u017Enosti so: -AutoTracker.Info.Outside=Iskalno podro\u010Dje je izven slike. Tvoje mo\u017Enosti so: -AutoTracker.Info.Accepted=Prikazano ujemanje je uporabnik sprejel. -AutoTracker.Info.MarkedByUser=Korak je uporabnik ro\u010Dno ozna\u010Dil. -AutoTracker.Info.NoVideo=Avtomati\u010Dno sledenje zahteva video. Uvozi nek video ali zapri avtomatski sledilec. -AutoTracker.Info.Height=vi\u0161ina -AutoTracker.Info.Width=\u0161irinah -AutoTracker.Info.Accept=--sprejmi ujemanje -AutoTracker.Info.Retry=--premakni iskalno podro\u010Dje in ponovi iskanje -AutoTracker.Info.Mark=--ro\u010Dno ozna\u010Di korak s shift-klik -AutoTracker.Info.Skip=--presko\u010Di to sli\u010Dico in nadaljuj sledenje -AutoTracker.Info.Reset=--reset za brisanje vseh korakov in nov za\u010Detek -AutoTracker.Info.MatchScore=ocena ujemanja -AutoTracker.Dialog.MaskLocked.Title=Vzorec je zaklenjen -PointMass.Cursor.Autotrack.Description=Kurzor avtomatskega sledilca -VideoPlayer.StartFrame.Hint=Za\u010Detno sli\u010Dico nastavi z vle\u010Denjem -VideoPlayer.EndFrame.Hint=kon\u010Dno sli\u010Dico nastavi z vle\u010Denjem -VideoPlayer.Slider.Hint=z vle\u010Denjem pregleduje\u0161 video -FileDropHandler.Dialog.BadFile.Message=ne morem nalo\u017Eiti. -FileDropHandler.Dialog.BadFile.Title=Nerazpoznana datoteka - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Uporabi -DynamicParticle.Dialog.Delete.Message=Z brisanjem tega delca ga bomo odstranili iz sistema. Ali naj ga res zbri\u0161em? -DynamicParticle.Dialog.Delete.Title=Dinami\u010Dni sistem -DynamicParticle.System.In=v -DynamicSystem.Empty=prazno -DynamicSystem.Force.Name.Internal=interno -DynamicSystem.ForceFunction.R.Description=Radialna komponenta notranje sile -DynamicSystem.ForceFunction.Theta.Description=Tangencialna komponenta notranje sile -DynamicSystem.MenuItem.Inspector=Izberi delce... -DynamicSystem.Name=Dinami\u010Dni sistem dveh teles -DynamicSystem.New.Name=sistem -DynamicSystem.Parameter.Of=od -DynamicSystem.Parameter.RelativeTo=relativno glede na -DynamicSystem.Parameter.Name.Relative=relativno -DynamicSystem.Parameter.ParticleMass.Description=Masa od -DynamicSystem.Parameter.Mass.Description=Celotna masa sistema -DynamicSystemInspector.Border.Title=Delec -DynamicSystemInspector.Title=Sistem dveh teles -DynamicSystemInspector.Button.Change=Spremeni v... -DynamicSystemInspector.ParticleName.None=(noben) -TMenuBar.MenuItem.Clone=Kloniraj -TMenuBar.MenuItem.TwoBody=Sistem dveh teles -TrackerPanel.DataBuilder.Dropdown.Tooltip=Trenutno izbrana sled -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sinhr. vertikalnih osi -TrackControl.Button.Trace.ToolTip=prika\u017Ei ali skrij poti -TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab -TToolBar.Button.Save.Tooltip=Shrani teko\u010Di zavihek v datoteko -TToolBar.Button.SelectTrack=Izberi -TToolBar.Button.SelectTrack.Tooltip=Izberi obstoje\u010Do sled -TTrack.MenuItem.ClearSteps=Po\u010Disti korake -PointMass.MenuItem.Position=Polo\u017Eaj -TMenuBar.MenuItem.Empty=(prazno) -TTrackBar.Button.Memory=Uporaba pomnilnika: -TTrackBar.Button.Memory.Tooltip=Nadzor in upravljanje pomnilnika -TTrackBar.Memory.PopupItem.Launch1=Po\u017Eeni -TTrackBar.Memory.PopupItem.Launch2=s pomnilnikom -TButton.Track.ToolTip=Nastavi lastnosti -Tracker.Dialog.OutOfMemory.Message1=Trackerju zmanjkuje pomnilnika. -Tracker.Dialog.OutOfMemory.Message2=Za opcije klikni na gumb pomnilnik. -Tracker.Dialog.OutOfMemory.Title=Premajhen pomnilnik - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Glej naprej -AutoTracker.Label.Original=Za\u010Detna -AutoTracker.Label.NoMask=nobena -AutoTracker.Label.Rate=Hitrost razvoja: -AutoTracker.Info.Mask3=Namig: vzorec ni nujno velik in ne vklju\u010Duje nujno cel objekt. Najbolj u\u010Dinkovita je uporaba unikatnih zna\u010Dilnosti z robovi z visokim kontrastom. -AutoTracker.Wizard.Checkbox.XAxis=Le os X -AutoTracker.Info.SearchOnAxis1=Na osi x znotraj prikazanega pravokotnika bom iskal najbolj\u0161e ujemanje. Iskalno podro\u010Dje lahko premakne\u0161 oziroma pove\u010Da\u0161 z vle\u010Denjem njegovega centra oziroma ro\u010Dice. -AutoTracker.Info.PossibleOnAxis=Vzdol\u017E osi x v prikazanem iskalnem podro\u010Dju je najdeno mo\u017Eno ujemanje. Ima\u0161 mo\u017Enosti: -AutoTracker.Info.NoMatchOnAxis=Vzdol\u017E osi x v prikazanem iskalnem podro\u010Dju ne najdem ujemanja. Ima\u0161 mo\u017Enosti: -AutoTracker.Info.RetryOnAxis=--premakni iskalno podro\u010Dje ali os x in ponovi iskanje -AutoTracker.Wizard.Button.Delete=Bri\u0161i to to\u010Dko -AutoTracker.Wizard.Button.DeleteMore=Bri\u0161i to in naslednje to\u010Dke -Button.Define.Tooltip=Definiraj funkcije obstoje\u010Dih spremenljivk v stolpcih -Calibration.Label.Point=to\u010Dka -CalibrationStick.Hint=nastavi dol\u017Eino ali vleci konec za spremembo velikosti, naklon osi spremeni\u0161 s spremembo kota. -CalibrationStick.End.Hint=z vle\u010Denjem spremeni\u0161 velikost -CalibrationStick.New.Name=merilna palica: -CalibrationTapeMeasure.New.Name=merilni trak -CalibrationTapeMeasure.Readout.Magnitude.Hint=klikni za vnos znane dol\u017Eine v enotah sveta -CalibrationTapeMeasure.Hint=za spremembo merila nastavi dol\u017Eino, za spremembo nagiba osi nastavi kot -DynamicSystem.Data.Description.0=relative distance between particles -DynamicSystem.Data.Description.1=relativni kot -DynamicSystem.Data.Description.2=relativna obodna hitrost -DynamicSystem.Data.Description.3=relativena kotna hitrost -ExportDataDialog.Subtitle.Table=Podatkovna tabela -ExportDataDialog.Subtitle.Content=Cells -ExportDataDialog.Subtitle.Format=\u0160tevil\u010Dni format -ExportDataDialog.Subtitle.Delimiter=Lo\u010Dilo -ExportDataDialog.Title=Izvoz podatkov -ExportDataDialog.Delimiter.Add=Dodaj... -ExportDataDialog.Delimiter.Remove=Odstrani... -ExportDataDialog.Content.AllCells=Dodaj celice -ExportDataDialog.Content.SelectedCells=Izbrane celice -ExportDataDialog.MenuItem.RemoveDelimiter=Odstrani lastno lo\u010Dilo -ExportDataDialog.Chooser.SaveData.Title=Shrani podatke kot -ExportVideoDialog.Button.SaveAs=Shrani kot... -ExportVideoDialog.Button.FullSize=Polna velikost -ExportVideoDialog.Button.DrawnSize=Tako kot nasisano -ExportVideoDialog.Content.VideoOnly=Samo video -ExportVideoDialog.Content.VideoAndGraphics=Video in grafika -ExportVideoDialog.Content.GraphicsOnly=Samo grafika -ExportVideoDialog.Title=Izvoz video izreza -ExportVideoDialog.Label.ClipSettings=Nastavitve posnetka -ExportVideoDialog.Subtitle.Size=Velikost -ExportVideoDialog.Subtitle.Content=Vsebina -ExportVideoDialog.Subtitle.View=Pogled -ExportVideoDialog.Subtitle.Format=Format -ExportVideoDialog.Complete.Message1=Video je bil shranjen kot -ExportVideoDialog.Complete.Message2=Ali naj ga sedaj odprem v programu Tracker? -ExportVideoDialog.Complete.Title=Izvoz kon\u010Dan -ExportVideoDialog.VideoSize=velikost videa -ExportVideoDialog.MatSize=velikost matrike -ExportVideo.Dialog.HiddenPlots.Message=Za izvoz morajo biti izrisi povsem vidni. -ExportVideo.Dialog.HiddenPlots.Title=Nepopoln pogled -Footprint.DoubleTarget=dvojni kri\u017Eec -Footprint.BoldDoubleTarget=poudarjen dvojni kri\u017Eec -OffsetOrigin.MenuItem.Fixed=Fiksne koordinate sveta -ParticleModel.Dialog.Offscreen.Message1=Nekateri koraki modela so prazni, ker so predale\u010D iz zaslona. -ParticleModel.Dialog.Offscreen.Message2=To odpravimo s spremembo modela ali s spremembo velikosti videa. -ParticleModel.Dialog.Offscreen.Title=Izven meja -PrefsDialog.Tab.Configuration.Title=Konfiguracija -PrefsDialog.Memory.BorderTitle=Velikost pomnilnika -PrefsDialog.Tab.General.Title=Drugo -PrefsDialog.RecentFiles.BorderTitle=Odpri nedavni menu -PrefsDialog.Label.RecentSize=\u0160tevilo datotek -PrefsDialog.Hints.BorderTitle=Namigi -PrefsDialog.Button.Relaunch=Ponovno po\u017Eeni -PrefsDialog.Button.ClearRecent=Bri\u0161i -PrefsDialog.Checkbox.DefaultSize=Uporabi privzeto -PrefsDialog.Checkbox.HintsOn=Privzeto prika\u017Ei namige -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video pogon -PrefsDialog.Button.Xuggle=Xuggle (priporo\u010Deno) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=\u010Ce uporablja\u0161 Web Start, upravljanje pomnilnika ni na voljo. -PrefsDialog.Dialog.WebStart.Title=Na\u010Din Web Start -PrefsDialog.LookFeel.BorderTitle=Izgled -PrefsDialog.Language.BorderTitle=Jezik -PrefsDialog.Upgrades.BorderTitle=Preveri posodobitve -PrefsDialog.Tab.Runtime.Title=\u010Cas izvajanja -PrefsDialog.Tab.Display.Title=Prikaz -PrefsDialog.Language.Default=privzeto -PrefsDialog.Upgrades.Always=Vedno -PrefsDialog.Upgrades.Weekly=Tedensko -PrefsDialog.Upgrades.Monthly=Mese\u010Dno -PrefsDialog.Upgrades.Never=Nikoli -PrefsDialog.Button.CheckForUpgrade=Preveri sedaj -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Gladko (lahko je po\u010Dasno) -PrefsDialog.Xuggle.Fast=Hitro (lahko bo sunkovito) -PrefsDialog.CalibrationTool.BorderTitle=Privzeto orodje za kalibracijo -Protractor.Name=Kotomer -Protractor.New.Name=kotomer -Protractor.Hint=Kote merimo z vle\u010Denjem rok -Protractor.Label.Angle=kot -Protractor.Field.Angle.Tooltip=Kot med rokami kotomera -Protractor.Vertex.Name=verteks -Protractor.Vertex.Hint=verteks premakne\u0161 z vle\u010Denjem -Protractor.End.Name=konec roke -Protractor.End.Hint=roko vrti\u0161 z vle\u010Denjem -Protractor.Handle.Name=ro\u010Dica -Protractor.Handle.Hint=Kotomer premika\u0161 z vle\u010Denjem -Protractor.Rotator.Name=rotator -Protractor.Rotator.Hint=kotomer vrti\u0161 z vle\u010Denjem -Protractor.Readout.Name=readout -Protractor.Readout.Hint=Kot med rokami kotomera -ProtractorFootprint.Circle3=majhen krog -ProtractorFootprint.Circle5=velik krog -ProtractorFootprint.Circle3Bold=majhen poudarjen krog -ProtractorFootprint.Circle5Bold=velik poudarjen krog -Stick.Name=Merilna palica -Stick.New.Name=merilna palica -TableTrackView.MenuItem.Unformatted=Polna natan\u010Dnost -TableTrackView.MenuItem.Formatted=Kot formatirano -TableTrackView.Menu.SetDelimiter=Postavi lo\u010Dilo -TableTrackView.MenuItem.AddDelimiter=Dodaj... -TableTrackView.MenuItem.RemoveDelimiter=Odstrani... -TableTrackView.Dialog.CustomDelimiter.Message=Vnesi niz z lo\u010Dili: -TableTrackView.Dialog.CustomDelimiter.Title=Dodaj lo\u010Dilo -TableTrackView.Header.Tooltip=Klikni za sortiranje, z dvoklikom izbere\u0161 stolpec -TableTrackView.MenuItem.CopySelectedData=Kopiraj izbrane podatke -TableTrackView.Dialog.RemoveDelimiter.Message=Izberi lo\u010Dilo za odstranitev: -TableTrackView.Dialog.RemoveDelimiter.Title=Odstrani lo\u010Dilo -TableTrackView.Radians.Tooltip=v radianih -TableTrackView.Degrees.Tooltip=v stopinjah -TableTrackView.RadiansPerSecond.Tooltip=v radianih/s -TableTrackView.DegreesPerSecond.Tooltip=v stopinjah/s -TableTrackView.RadiansPerSecondSquared.Tooltip=v radianih/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=v stopinjah/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Zbri\u0161i podatkovno funkcijo -TActions.Action.SaveFrame=Shrani skupino zavihkov kot... -TActions.AboutVideo=Lastnosti... -TActions.Dialog.AboutVideo.Title=Lastnosti videa -TActions.Dialog.AboutVideo.Type=Tip -TActions.Dialog.AboutVideo.Size=Dimenzije -TActions.Dialog.AboutVideo.Length=Dol\u017Eina -TActions.Dialog.AboutVideo.Frames=Sli\u010Dic -TActions.Dialog.AboutVideo.Seconds=sekund -TActions.Dialog.AboutVideo.FrameRate=Sli\u010Dic/sek -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Pot -TActions.Action.ImportTRK=Tracker datoteka... -TActions.Action.ProtractorVisible=Viden -TapeMeasure.MenuItem.FixedLength=Fiksna dol\u017Eina -TextTView.Label.NoTab=Za dodajanje streni s tekstom ali HTML klikni na "Stran". -TextTView.NewTab.Text1=Besedilo ali naslov ureja\u0161 po dvokliku. Desni klik ponudi ve\u010D opcij. -TextTView.NewTab.Text2=Za prikaz HTML strani vnesi URL ali z desnim klikom odpri neko datoteko. -TextTView.NewTab.Title=Neimenovana -TextTView.Dialog.TabTitle.Title=Postavi naslov -TextTView.MenuItem.OpenHTML=Odpri HTML... -TextTView.MenuItem.SetTitle=Postavi naslov... -TextTView.Button.NewTab=Nova -TextTView.TextEdit.Description=Tekst -TFrame.Dialog.FileNotFound.Message=Datoteke ne najdem: -TFrame.Dialog.FileNotFound.Title=Datoteke ne najdem -TFrame.View.Text=Pogled na stran -TFrame.View.Main=Glavni pogled -TMenuBar.Menu.OpenRecent=Odpri nedavne -TMenuBar.Menu.Import=Uvoz -TMenuBar.Menu.Export=Izvoz -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=Datoteka... -TMenuBar.Menu.CopyObject=Kopiranje objekta -TMenuBar.MenuItem.Coords=Koordinatni sistem -TMenuBar.MenuItem.VideoClip=Video izrez -TMenuBar.Menu.MeasuringTools=Merilna orodja -TMenuBar.Menu.AngleUnits=Enote za kot -TMenuBar.MenuItem.Degrees=Stopinje -TMenuBar.MenuItem.Radians=Radiani -Tracker.Dialog.NoXuggle.Title=Ne najdem Xuggle -Tracker.Dialog.NoXuggle.Message1=Xuggle (platformno neodvisen video pogon) ni name\u0161\u010Den. -Tracker.Dialog.NoXuggle.Message2=Nalo\u017Ei Xuggle iz http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Nekaj o Xuggle... -Tracker.Dialog.AboutXuggle.Title=Nekaj o Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Verzija Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle dom: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle pot: -Tracker.Dialog.NoVideoEngine.Message1=ne najdem video pogona! Brez tega lahko Tracker -Tracker.Dialog.NoVideoEngine.Message2=odpre le slike, zaporedja slik in animirane gif. -Tracker.Dialog.NoVideoEngine.Message3=Za namestitev Xuggle, ki je najbolj priporo\u010Dljiv video pogon za -Tracker.Dialog.NoVideoEngine.Message4=vse platforme, nalo\u017Ei zadnji Tracker installer iz -Tracker.Dialog.NoVideoEngine.Title=Manjka video pogon -Tracker.Dialog.NoXuggle.Message1=Xuggle, Trackerjev priporo\u010Dljiv video pogon, ni name\u0161\u010Den. -Tracker.Dialog.NoXuggle.Message2=Za namestitev Xuggle, nalo\u017Ei zadnji Tracker installer iz -Tracker.Dialog.NoXuggle.Title=Manjka Xuggle -Tracker.About.DefaultLocale=Privzeti locale -Tracker.About.CurrentLanguage=Jezik -Tracker.Dialog.InsufficientMemory.Title=Premajhen pomnilnik -Tracker.Dialog.InsufficientMemory.Message=Zahtevana velikost pomnilnika je prevelika. -TrackerIO.Dialog.TabMustBeSaved.Message1=Zavihek -TrackerIO.Dialog.TabMustBeSaved.Message2=mora biti shranjen kot tracker datoteka, \u010De naj bo vklju\u010Dena v skupino zavihkov. -TrackerIO.Dialog.TabMustBeSaved.Message3=Ali naj ga shranim? -TrackerIO.Dialog.TabMustBeSaved.Title=Neshranjen zavihek -TrackerIO.Dialog.NoTabs.Message=Ni zavihkov, ki bi jih lahko shranili! -TrackerIO.Dialog.NoTabs.Title=Prazna skupina zavihkov -TrackerIO.Dialog.SaveTabset.Title=Shrani skupino zavihkov -TrackerIO.Dialog.SaveTab.Title=Shrani zavihek -TrackerIO.Delimiter.Tab=Zavihek -TrackerIO.Delimiter.Space=Presledek -TrackerIO.Delimiter.Comma=Vejica -TrackerIO.Delimiter.Semicolon=Podpi\u010Dje -TrackerIO.VideoAndDataFileFilter.Description=Datoteke video in Tracker -TrackerPanel.Dialog.Version.Message1=Odpira\u0161 datoteko, tvorjeno s Trackerjem -TrackerPanel.Dialog.Version.Message2=kar se lahko nana\u0161a na -TrackerPanel.Dialog.Version.Message3=zna\u010Dilnosti, ki manjkajo v verziji, ki jo izvaja\u0161 -TrackerPanel.Dialog.Version.Message4=Zadnja verzija je na voljo na -TrackerPanel.Dialog.Version.Title=Verzija se ne ujema -TrackerPanel.Label.ModelStart=Za\u010Detek -TrackerPanel.Label.ModelEnd=Konec -TrackerPanel.Spinner.ModelStart.Tooltip=Izberi za\u010Detno sli\u010Dico za ta model -TrackerPanel.Spinner.ModelEnd.Tooltip=Izberi kon\u010Dno sli\u010Dico za ta model -TToolbar.Button.ProtractorVisible.Tooltip=Prika\u017Ei ali skrij kotomer -TToolbar.Button.AxesVisible.Tooltip=Prika\u017Ei ali skrij koordinatne osi -TToolBar.Button.TrackControl.Tooltip=Prika\u017Ei ali skrij kontrolo sledi -TTrack.Dialog.StepSizeWarning.Message1=Pozor: nekatere sledi so bile ozna\u010Dene pri koraku, ve\u010Djem od 1, presko\u010Dene sli\u010Dice ne bodo ozna\u010Dene. -TTrack.Dialog.StepSizeWarning.Message2=Sprememba velikosti koraka lahko zato pu\u0161\u010Da luknje v podatkovni mno\u017Eici. -TTrack.Dialog.StepSizeWarning.Message3=Hitrosti in pospe\u0161kov okrog lukenj ne moremo dolo\u010Diti, dokler ne ozna\u010Dimo vseh korakov. -TTrack.Dialog.StepSizeWarning.Title=Pozor -TTrack.Dialog.SkippedStepWarning.Message1=Pozor: preskakovanje korakov pri ozna\u010Devanju polo\u017Eajev pu\u0161\u010Da luknje v podatkovni mno\u017Eici. -TTrack.Dialog.SkippedStepWarning.Title=Pozor -TTrack.Dialog.SkippedStepWarning.Checkbox=Tega ne prika\u017Ei ve\u010D -TTrack.Locked.Hint=zaklenjeno -TTrack.AngleField.Radians.Tooltip=Kot v radianih -TTrack.AngleField.Degrees.Tooltip=Kot v stopinjah -TTrack.AngleField.Popup.Radians=Preklop na radiane -TTrack.AngleField.Popup.Degrees=Preklop na stopinje -TTrackBar.Memory.Menu.SetSize=Nastavi velikost pomnilnika... -TTrackBar.Button.Version=Sedaj na voljo: verzija -TTrackBar.Popup.MenuItem.Upgrade=Posodobi sedaj... -TTrackBar.Popup.MenuItem.Ignore=Ignoriraj -XuggleVideo.MenuItem.SmoothPlay=mehko predvajanje (je lahko po\u010Dasno) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Merilni trak -CircleFootprint.Circle=krog -CircleFootprint.FilledCircle=zapolnjen krog -CircleFootprint.Dialog.Title=Izgled kroga -CircleFootprint.Dialog.Label.Radius=Polmer -CircleFootprint.Dialog.Checkbox.Bold=Poudarjeno -CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot -LineProfile.Hint.Marking=Profil \u010Drte ozna\u010Di\u0161 z vle\u010Denjem mi\u0161ke -PageTView.Button.Page=Stran -PageTView.MenuItem.ClosePage=Zapri stran -PointMass.Hint.Marking=novo to\u010Dko ozna\u010Di\u0161 s klikom mi\u0161ke, s tipko Enter podvoji\u0161 prej\u0161nji korak -PrefsDialog.Dialog.NewVersion.Title=Nadgradnje -PrefsDialog.Dialog.NewVersion.Message1=Verzija -PrefsDialog.Dialog.NewVersion.Message2=je na voljo na -PrefsDialog.Dialog.NewVersion.None.Message=Trenutno ni na voljo nove verzije. -RGBRegion.Hint.Marking=S klikom na pi\u0161ko ozna\u010Di\u0161 sredi\u0161\u010De podro\u010Dja -TMenuBar.MenuItem.Restore=Restavriraj poglede -TrackControl.StretchVectors.None=Ne raztegni -TViewChooser.Maximize.Tooltip=Maksimiraj ta pogled -TViewChooser.Restore.Tooltip=Restavriraj poglede -Vector.Hint.Marking=nov vektor ozna\u010Di\u0161 z vle\u010Denjem, s tipko Enter podvoji\u0161 predhodni korak -WorldTView.Button.World=Svet - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Opozorila -PrefsDialog.Checkbox.WarnIfNoEngine=Ni video pogona -PrefsDialog.Checkbox.WarnIfXuggleError=Ne usodne napake Xuggle -PropertiesDialog.Title=Lastnosti -PropertiesDialog.Label.Author=Avtor -PropertiesDialog.Label.Contact=Kontakt -TActions.Action.Properties=Lastnosti... -TActions.Action.OpenBrowser=Odpri brkljalnik knji\u017Enice... -TFrame.Progress.Xuggle=Xuggle loading frame -TFrame.Progress.ClickToCancel=(Klikni za brisanje) -TFrame.Dialog.StalledVideo.Title=Napaka pri nalaganju videa -TFrame.Dialog.StalledVideo.Message0=Nalaganje videa se je zaustavilo. Morda je to za\u010Dasno. -TFrame.Dialog.StalledVideo.Message1=Nalaganje lahko zaustavi\u0161 ali nadaljuje\u0161 s \u010Dakanjem. -TFrame.Dialog.StalledVideo.Message2=Druge opcije za odpiranje tega videa vklju\u010Dujejo: -TFrame.Dialog.StalledVideo.Message3=1. Uporabi programe za konverzijo videa v drug format. -TFrame.Dialog.StalledVideo.Message4=2. V izbiralniku datotek ali v preferencah izberi QuickTime. -TFrame.Dialog.StalledVideo.MessageMac=2. Odpri Tracker v 32-bitnem Java VM in ga odpri s QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stop -TFrame.Dialog.StalledVideo.Button.Wait=\u010Cakaj -Tracker.Dialog.NoVideoEngine.Checkbox=Tega ne prika\u017Ei ve\u010D -TrackerIO.ZipFileFilter.Description=Datoteke ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle je naletel na naslednje napake pri odpiranju tega videa: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Vse napake niso usodne. Za polna obvestila o napakah izberi Pomo\u010D|Zapis obvestil. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u010Ce Xuggle izpade, morda lahko odpre\u0161 video s QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Opomba: Na Mac OSX mora te\u010Di Tracker na 32-bitnem Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Napaka Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Za ve\u010D podrobnosti vklju\u010Di opozorila Xuggle v pogovornem oknu s preferencami (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Odpri brkljalnik digitalne knji\u017Enice OSP - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=Datoteke ne najdem -TFrame.Dialog.NoTRKInComPADRE.Message=Za vozel ne najdem datoteke Tracker -TFrame.Dialog.OSPUnavailable.Title=Ne morem povezati -TFrame.Dialog.OSPUnavailable.Message=OSP stre\u017Enik ni na voljo.\nPreveri povezavo z omre\u017Ejem. - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Analiti\u010Dni delec -DynamicParticle.Builder.Title=Dinami\u010Dni delec (Kartezi\u010Dni) -DynamicParticlePolar.Builder.Title=Dinami\u010Dni delec (Polarni) -DynamicSystem.Builder.Title=Dinami\u010Dni sistem (Interni) -PropertiesDialog.Button.CopyFilePath=Kopiraj pot do datoteke -PropertiesDialog.Button.CopyVideoPath=Kopiraj pot do videa -PropertiesDialog.Tab.TrackerFile=Datoteka Tracker -PropertiesDialog.Tab.Metadata=Metapodatki -PropertiesDialog.Header.Property=Lastnost -PropertiesDialog.Header.Value=Vrednost -TActions.Action.OpenURL=Odpri URL... -TActions.Dialog.OpenURL.Title=Odpri URL -TActions.Dialog.OpenURL.Message=Vnesi URL za spletni video ali datoteko Tracker -TActions.Dialog.AboutVideo.Name=Ime - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Medpomnjene spletne strani -PrefsDialog.Button.ClearCache=Brisanje - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-klik za ponovno ozna\u010Ditev poudarjenega polo\u017Eaja -PointMass.Remarking.Hint=klik z mi\u0161ko za ponovno ozna\u010Ditev polo\u017Eaja -PointMass.PositionSelected.Hint=Vle\u010Di ali vnesi polo\u017Eaj na orodni vrstici -PointMass.VectorSelected.Hint=premik z vle\u010Denjem -Vector.Remark.Hint=shift-klik za ponovno ozna\u010Ditev poudarjene konice -Vector.TipSelected.Hint=Vle\u010Di ali vnesi komponente v orodni vrstici -Vector.HandleSelected.Hint=premik z vle\u010Denjem -Vector.Remarking.Hint=klik z mi\u0161ko za ponovno ozna\u010Ditev konice -AutoTracker.Label.Search=Iskanje -AutoTracker.Label.Target=Cilj -AutoTracker.Label.Frame=Sli\u010Dica -AutoTracker.Label.Point=To\u010Dka -AutoTracker.Label.Template=\u0160ablona -AutoTracker.Label.Track=Sled -AutoTracker.Label.Match=Ujemanje -AutoTracker.Label.NoTemplate=Ni \u0161ablone -AutoTracker.Label.EvolutionRate=Hitrost razvoja -AutoTracker.Label.Automark=Automatsko ozna\u010Devanje -AutoTracker.Info.Instructions=Klikni na gumb za iskanje ujemanja v prikazanem iskalnem podro\u010Dju. -AutoTracker.Info.KeyFrame.Instructions1=Ta klju\u010Dna sli\u010Dica definira \u0161ablono in prikazan cilj. Klikni na gumb za iskanjeujemanja v \u0161abloni. -AutoTracker.Info.KeyFrame.Instructions2=Cilj, \u0161ablono ali iskalno podro\u010Dje lahko vle\u010Demo in tako premaknemo ali spremenimo velikost. -AutoTracker.Info.MouseOver.Instructions=Ve\u010D o nastavitvah lahko izvemo z mi\u0161ko nad posamezno kontrolo. -AutoTracker.Info.Mask1=\u0160ablona je slika, ki naj bi se ujemala. Zacne v klju\u010Dni sli\u010Dici in se razvija v ujemanje s preminjanjem oblike in barve. -AutoTracker.Info.Mask2=Nivo avtomatskega ozna\u010Devanja je minimalna ocena ujemanja, ki jo terja avtomatsko ozna\u010Devanje. -AutoTracker.Info.Mask.Instructions=\u0160ablono premaknemo ali spremenimo njeno velikost z vle\u010Denjem njenega roba ali ogli\u0161\u010Da (le v klju\u010Dnih sli\u010Dicah). Naravnaj hitrost razvoja in nivoje avtomatskega ozna\u010Devanja. -AutoTracker.Info.Mask.Tip=Nizki novoji avtomatskega ozna\u010Devanjalahko povzro\u010Dijo napa\u010Dno ujemanje--raje poskusi s pove\u010Danjem hitrosti razvoja. -AutoTracker.Info.Search=I\u0161\u010De se najbolj\u0161e ujemanje v iskalnem podro\u010Dju. -AutoTracker.Info.SearchOnAxis=I\u0161\u010De se najbolj\u0161e ujemanje na osi x v iskalnem podro\u010Dju. -AutoTracker.Info.Search.Instructions=Iskalno podro\u010Dje premaknemo ali spremenimo velikost z vle\u010Denjem ro\u010Dic na robovih ali ogli\u0161\u010Dih. Z odkljukanjem izberemo os x in opcije gledanja naprej. -AutoTracker.Info.Search.Tip=V veliko primerih ni potrebno, da je iskalno podro\u010Dje veliko. Opcija gledanja naprej avtomatsko premika iskalno podro\u010Dje na napovedane polo\u017Eaje. -AutoTracker.Info.Target=Cilj je, kjer je ozna\u010Dena ciljna to\u010Dka sledi. -AutoTracker.Info.Target.Instructions=Cilj premikamo z vle\u010Denjem (le v klju\u010Dnih sli\u010Dicah). Iz spustnih seznamov izberemo ciljno sled in to\u010Dko. -AutoTracker.Info.Title.Settings=Nastavitve -AutoTracker.Info.Title.Tip=Namig -AutoTracker.Info.SelectTrack=Izberi ali tvori sled in to\u010Dko, ki bi rad avtomatsko sledil. -AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: -AutoTracker.Info.NewKeyFrame=--korak nazaj in zamenjaj hitrost razvoja ali klikni skupaj s SHIFT in CTRL za definiranje nove klju\u010Dne sli\u010Dice -AutoTracker.Info.Replace=--sprejmi ujemanje in nadomesti obstoje\u010Do to\u010Dko -AutoTracker.Info.Keep=--obdr\u017Ei obstoje\u010Do to\u010Dko -AutoTracker.Info.PossibleReplace=Ni najdeno mo\u017Eno ujemanje za nadome\u0161\u010Danje obstoje\u010De to\u010Dke. Ima\u0161 mo\u017Enosti : -AutoTracker.Wizard.Button.Accept=Sprejmi -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=presko\u010Di -AutoTracker.Wizard.Button.Replace=Nadomesti -AutoTracker.Wizard.Button.Keep=Obdr\u017Ei -AutoTracker.Wizard.Button.Search=Iskanje -AutoTracker.Wizard.Button.SearchThis=I\u0161\u010Di to -AutoTracker.Wizard.Button.SearchNext=SI\u0161\u010Di naslednje -AutoTracker.Wizard.Button.Delete=Bri\u0161i -AutoTracker.Wizard.Button.ShowKeyFrame=Prikaz klju\u010Dne sli\u010Dice -AutoTracker.Wizard.Button.DeleteKeyFrame=Brisanje klju\u010Dne sli\u010Dice -AutoTracker.Wizard.Checkbox.LookAhead=Glej naprej -AutoTracker.Wizard.Checkbox.XAxis=Le os X -AutoTracker.Wizard.Menuitem.DeleteThis=Ta to\u010Dka -AutoTracker.Wizard.Menuitem.DeleteLater=Kasnej\u0161e to\u010Dke -AutoTracker.Wizard.Menuitem.DeleteAll=vse to\u010Dke -TToolBar.Button.AutoTracker.Tooltip=prika\u017Ei ali skrij avtomatski sledilec -MainTView.Popup.MenuItem.ZoomIn=Pribli\u017Eaj -MainTView.Popup.MenuItem.ZoomOut=oddalji -MainTView.Popup.MenuItem.ZoomToFit=Zoom do ujemanja -TrackerIO.Dialog.DurationVaries.Title=Spremenljiva dol\u017Eina trajanja sli\u010Dic -TrackerIO.Dialog.DurationVaries.Message1=Ta video vklju\u010Duje sli\u010Dice s trajanjem, ki se razlikuje od srednjega za ve\u010D kot -TrackerIO.Dialog.DurationVaries.Message2=za to\u010Dno dolo\u010Danje hitrosti in pospe\u0161kov moramo take sli\u010Dice izlo\u010Diti iz -TrackerIO.Dialog.DurationVaries.Message3=ra\u010Dunanj z nastavitvijo za\u010Detne in kon\u010Dne sli\u010Dice video izrezka. -TrackerIO.Dialog.DurationVaries.Message4=Sli\u010Dice, ki morajo biti izlo\u010Dene: -TrackerIO.Dialog.DurationVaries.Message5=Srednje trajanje in frekvenca sli\u010Dic, \u010De izlo\u010Dimo: -TFrame.Dialog.LibraryError.Title=Napaka -TFrame.Dialog.LibraryError.Message=Za vozel ne morem nalo\u017Eiti nobenega vira - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=Ozna\u010Dimo s shift-klik -PrefsDialog.Label.Path=Pot -PrefsDialog.Checkbox.ClearCacheOnExit=pri izstopu po\u010Disti -PrefsDialog.FileChooser.Title.Cache=Nastavi medpomnenje -PrefsDialog.FileFilter.Directories=Direktoriji -Tracker.Action.AboutThreads=O nitih... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Nastavi Java VM -PrefsDialog.FileFilter.JRE=Direktoriji in Java VM -PrefsDialog.Version.BorderTitle=Verzija Tracker -PrefsDialog.Version.Default=privzeto -PrefsDialog.Tab.ClearCacheOnExit=Brisanje ob izstopu -PrefsDialog.Run.BorderTitle=Programi, pognani ob zagonu -PrefsDialog.FileChooser.Title.Run=Izberi izvajalno datoteko -PrefsDialog.Button.Save=Shrani -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=Datoteke README ne najdem -Popup.MenuItem.Algorithm=Algoritmi... -AlgorithmDialog.Button.FiniteDifference=Koncne diference -AlgorithmDialog.Button.BounceDetect=Odkrivanje trkov -AlgorithmDialog.TitledBorder.Choose=Izberi algoritem za ra\u010Dunanje hitrosti in pospe\u0161ka: -AlgorithmDialog.Title=Algoritmi -AlgorithmDialog.FiniteDifference.Message1=To je privzeti algoritem. -AlgorithmDialog.FiniteDifference.Message2=Hitrost: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Pospe\u0161ek: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Ta algoritem meh\u010Da hitrosti in pospe\u0161ke, vendar hkrati odkriva nagle spremembe hitrosti. -AlgorithmDialog.BounceDetect.Message2=Previdno: lahko povzro\u010Da napake. Ve\u010D o tem poglej: -TMenuBar.Menu.Diagnostics=Diagnostika - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Neveljaven XML -Tracker.Dialog.Invalid.Message=Datoteke ne morem brati. -TrackPlottingPanel.Popup.Menu.CompareWith=Primerjava z -TrackerPanel.DataBuilder.TrackType.Unknown=neznano -TrackerPanel.DataBuilder.Button.Load.Tooltip=Nalo\u017Ei podatkovne funkcije iz datoteke XML -TrackerPanel.DataBuilder.Button.Save.Tooltip=Shrani podatkovne funkcije v datoteko XML -TrackerPanel.DataBuilder.Load.Title=Nalo\u017Ei podatkovne funkcije -TrackerPanel.DataBuilder.Load.Message=Izberi funkcije za nalaganje: -TrackerPanel.DataBuilder.Save.Title=Shrani podatkovne funkcije -TrackerPanel.DataBuilder.Save.Message=Izberi funkcije za shranjevanje: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Nalo\u017Ei v vse -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Nalo\u017Ei le v -TrackerPanel.DataBuilder.Dialog.Load.Title=Izbira sledi -TrackerPanel.DataBuilder.Dialog.Load.Message=\u017Deli\u0161 nalo\u017Eiti funkcije v vse sledi tega tipa -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Napa\u010Den tip sledi -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Datoteka ne definira podatkovnih funkcij za tip sledi -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Ne morejo biti nalo\u017Eene v tip -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Napa\u010Den tip -TrackerPanel.DataBuilder.Dialog.WrongType.Message=Datoteka ne definira podatkovnih funkcij. -TToolbar.Button.Refresh=Osve\u017Ei podatke in poglede - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=ZIP vir je bil shranjen kot -ExportTRKDialog.Complete.Message2=Ali \u017Eeli\u0161, da ga odpremo sedaj v Tracker? -ExportTRKDialog.Complete.Title=Izvoz zaklju\u010Den -ExportTRKDialog.Title=Izvoz vir ZIP -ExportTRKDialog.Message1=To (1) izvozi video izrezek, (2) konvertira podatke iz zavihka, da se ujemajo z izvo\u017Eenim videom, (3) shrani konvertirani zavihek kot novo Tracker datoteko. -ExportTRKDialog.Message2=Datoteke Tracker in video pomnimo v istem direktoriju pod istim imenom, a z razlicnimi podalj\u0161ki. -TMenuBar.MenuItem.TabClip=Vir ZIP -TMenuBar.Menu.CalibrationTools=Kalibracijska orodja -TrackerIO.Dialog.DurationVaries.Button.SetClip=Nastavi priporo\u010Dljiv izrezek -TrackerIO.Dialog.DurationVaries.Start=za\u010Detek -TrackerIO.Dialog.DurationVaries.End=konec -TrackerIO.Dialog.DurationVaries.Recommended=Priporo\u010Dljiv izrezek - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Prilepi konce -AttachmentInspector.Label.End=Konec -AttachmentInspector.Label.Vertex=Verteks -AttachmentInspector.Header.PointName=Ime -AttachmentInspector.Header.AttachedTo=Prilepi k -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Prilepi konce... -PerspectiveTrack.Corner=vogal -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=\u010Das -Protractor.Data.Description.1= kot kotomera -Protractor.Data.Description.2=dol\u017Eina ro\u010Dice 1 -Protractor.Data.Description.3=dol\u017Eina ro\u010Dice 2 -Protractor.Data.Description.4=\u0161tevilka koraka -Protractor.Data.Description.5=\u0161tevilka sli\u010Dice -TapeMeasure.Data.Description.0=\u010Das -TapeMeasure.Data.Description.1=dol\u017Eina -TapeMeasure.Data.Description.2=kot, merjen od osi +x -TapeMeasure.Data.Description.3=\u0161tevilka koraka -TapeMeasure.Data.Description.4=\u0161tevilka slicice - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=neiskano -AutoTracker.Info.KeyFrame=Klju\u010Dna sli\u010Dica -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Ta klju\u010Dna sli\u010Dica -AutoTracker.Wizard.Menuitem.DeleteThisMatch=To ujemanje -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Kasnej\u0161a ujemanja -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Dodaj -Dialog.Button.Remove=Odstrani -PrefsDialog.Button.ClearHost=Po\u010Disti ra\u010Dunalnik -PrefsDialog.Button.ClearHost.Tooltip=brisanje vseh datotekiz medpomnilnika OSP, povezanih z izbranim spletnim ra\u010Dunalnikom -PrefsDialog.Button.ClearCache.Tooltip=brisanje vseh datotek iz medpomnilnika OSP -TActions.Action.SaveZip=Izvoz vira ZIP -ThumbnailDialog.Title=Izvoz slikovne ikone -ThumbnailDialog.Settings.Title=Opcije slikovne ikone -ThumbnailDialog.Label.CurrentImage=teko\u010Da slika -ThumbnailDialog.Label.FrameNumber=sli\u010Dica -ThumbnailDialog.Label.StepNumber=korak -ThumbnailDialog.View.VideoOnly=Le video -ThumbnailDialog.View.MainView=Glavni pogled -ThumbnailDialog.View.WholeFrame=Celotna sli\u010Dica -ThumbnailDialog.Format.PNG=PNG slika -ThumbnailDialog.Format.JPG=JPEG slika -ThumbnailDialog.Chooser.SaveThumbnail.Title=Shrani slikovno ikono -ThumbnailDialog.Subtitle.Image=Slika -TMenuBar.MenuItem.Thumbnail=Slikovna ikona -TToolBar.Button.SaveZip.Tooltip=Izvoz vira ZIP za OSP brkljalnik digitalnih knji\u017Enic -TTrack.MenuItem.DeletePoint=Bri\u0161i izbrani korak -ZipResourceDialog.Title=Izvozi vir ZIP -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Ime -ZipResourceDialog.Label.Description=Opis -ZipResourceDialog.Label.Keywords=Klju\u010Dne besede -ZipResourceDialog.Label.Link=Zunanji Link -ZipResourceDialog.Label.HTML=HTML vir -ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Uspe\u0161no -ZipResourceDialog.Border.Title.Documentation=HTML Dokumentacija -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Slikovna ikona -ZipResourceDialog.FileChooser.SaveZip.Title=Izvoz vira ZIP -ZipResourceDialog.FileChooser.AddFile.Title=Dodaj datoteko viru ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title=Odpri datoteko HTML -ZipResourceDialog.Button.AddFiles=Dodaj datoteke -ZipResourceDialog.Button.ThumbnailSettings=Opcije za slikovne ikone -ZipResourceDialog.Checkbox.TrimVideo=Obre\u017Ei -ZipResourceDialog.AddHTMLInfo.Title=Dodaj inform. datoteko HTML -ZipResourceDialog.AddHTMLInfo.Message1=\u017Deli\u0161 dodati informacijsko datoteko HTML -ZipResourceDialog.AddHTMLInfo.Message2=viru ZIP? -ZipResourceDialog.HTMLField.DefaultText=\u010De ni ni\u010D dolo\u010Denega, bo datoteka tvorjena od za\u010Detka -ZipResourceDialog.Dialog.AddFiles.Title=Dodajanje datotek HTML in PDF -ZipResourceDialog.Tooltip.HTML=Pot do izvorne datoteke HTML(\u010De ni nobene, bo datoteka tvorjena od za\u010Detka) -ZipResourceDialog.Tooltip.Author=Avtorji tega vira -ZipResourceDialog.Tooltip.Title=Prikaz imena tega vira(ne imena datoteke) -ZipResourceDialog.Tooltip.Description=Koristen opis tega vira -ZipResourceDialog.Tooltip.Keywords=Seznam klju\u010Dnih besed za iskanje v brkljalniku digitalne knji\u017Enice -ZipResourceDialog.Tooltip.Contact=Kontktni podatki o avtorju (ustanova, e-mail, spletna stran, itd.) -ZipResourceDialog.Tooltip.Link=URL zunanje HTML datoteke z ve\u010D podatki o tem viru -ZipResourceDialog.Tooltip.ThumbnailSettings=Spremeni pogled na slikovno ikono, velikost ali tip datoteke -ZipResourceDialog.Tooltip.AddFiles=Dodajanje HTML in PDF datotek viru ZIP -ZipResourceDialog.Tooltip.TrimVideo=Odkljukaj za izvoz video izrezka, razkljukaj za uporabo originalnega videa -ZipResourceDialog.Tooltip.LoadHTML=Za nalaganje informacijske HTML datoteke uporabi izbiralnik datotek +# This is the Slovenian tracker.properties file +# Translation by Sasa Divjak 2011 + +Calibration.Name=Kalibracijske to\u010Dke +Calibration.New.Name=kalibracijske to\u010Dke +CenterOfMass.Name=Te\u017Ei\u0161\u010De +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Izberi mase... +CenterOfMassInspector.Title=Te\u017Ei\u0161\u010De +CenterOfMassInspector.Border.Title=Izberi mase +ConfigInspector.Border.Title=\u017Delene lastnosti +ConfigInspector.Title=Preference +ConfigInspector.Button.SaveAsDefault=Shrani kot privzeto +CoordAxes.Name=Osi +CoordAxes.New.Name=Osi +Dialog.Button.Cancel=Preklic +Dialog.Button.OK=V redu +Dialog.Button.Close=Zapri +Dialog.Button.All=Vse +Dialog.Button.None=Ni\u010D +Dialog.Button.Copy=Kopiraj +Dialog.Button.Update=Osve\u017Ei +Dialog.Button.SelectAll=Izberi vse +Footprint.Diamond=romb +Footprint.BoldDiamond=poudarjen romb +Footprint.SolidDiamond=poln romb +Footprint.Triangle=trikotnik +Footprint.BoldTriangle=poudarjen trikotnik +Footprint.SolidTriangle=poln trikotnik +Footprint.Circle=krog +Footprint.BoldCircle=poudarjen krog +Footprint.SolidCircle=poln krog +Footprint.VerticalLine=navpi\u010Dna \u010Drta +Footprint.BoldVerticalLine=poudarjena navpi\u010Dna \u010Drta +Footprint.HorizontalLine=vodoravna \u010Drta +Footprint.BoldHorizontalLine=poudarjena vodoravna \u010Drta +Footprint.Crosshair=kri\u017Eec +Footprint.BoldCrosshair=poudarjen kri\u017Eec +Footprint.SimpleAxes=preproste osi +Footprint.BoldSimpleAxes=poudarjene preproste osi +Footprint.Spot=spot +Footprint.Line=\u010Drta +Footprint.BoldLine=debela \u010Drta +Footprint.Outline=obris +Footprint.BoldOutline=debel obris +Footprint.Arrow=pu\u0161\u010Dica +Footprint.BoldArrow=debela pu\u0161\u010Dica +Footprint.DoubleArrow=dvojna pu\u0161\u010Dica +Footprint.BoldDoubleArrow=debela dvojna pu\u0161\u010Dica +Footprint.2xArrow=2x pu\u0161\u010Dica +Footprint.Bold2xArrow=debela 2x pu\u0161\u010Dica +Footprint.4xArrow=4x pu\u0161\u010Dica +Footprint.Bold4xArrow=debela 4x pu\u0161\u010Dica +Footprint.DashArrow=\u010Drtkana pu\u0161\u010Dica +Footprint.BoldDashArrow=debela \u010Drtkana pu\u0161\u010Dica +Footprint.BigArrow=velika pu\u0161\u010Dica +Footprint.BigDashArrow=velika \u010Drtkana pu\u0161\u010Dica +LineProfile.Name=Profil \u010Drte +LineProfile.New.Name=profil +LineProfile.Data.Brightness=svetlost +LineProfile.Data.Pixel=piksel +LineProfile.Data.Red=rde\u010Da +LineProfile.Data.Green=zelena +LineProfile.Data.Blue=modra +LineProfile.Data.Weighting=\u0161tevilo +MainTView.Popup.MenuItem.QTPlayer=QuickTime predvajalnik +MainTView.Popup.MenuItem.Zoom=Pove\u010Dava +MainTView.Popup.MenuItem.ToFit=Prileganje +OffsetOrigin.Name=Odmik izhodi\u0161\u010Da +OffsetOrigin.New.Name=odmik izhodi\u0161\u010Da +PlotTrackView.Button.PlotCount=Grafi +PlotTrackView.Button.PlotCount.ToolTip=Nastavi \u0161tevilo grafov +PointMass.Name=Masna to\u010Dka +PointMass.New.Name=masa +PointMass.MenuItem.VectorsToPosition=Na pozicijo +PointMass.MenuItem.Velocity=Hitrost +PointMass.MenuItem.Acceleration=Pospe\u0161ek +Star.Name=Zvezda +Star.New.Name=zvezda +TableTrackView.Action.CopyData=Kopiranje podatkov +TableTrackView.Button.SelectTableData=Table +TableTrackView.Button.SelectTableData.ToolTip=Choose table columns +TableTrackView.Popup.MenuItem.Analyze=Analizaj... +TableTrackView.Dialog.Border.Title=Vidno: +TActions.Action.Description=Opombe +TActions.Action.ClearTracks=Po\u010Disti +TActions.Action.NewTab=Nov zavihek +TActions.Action.Copy=Kopiraj +TActions.Action.Paste=Prilepi +TActions.Action.Open=Odpri... +TActions.Action.Close=Zapri zavihek +TActions.Action.Import=Uvozi... +TActions.Action.Save=Shrani zavihek +TActions.Action.SaveAs=Shrani zavihek kot... +TActions.Action.Export=Izvozi... +TActions.Action.CaptureVideo=Zajemi Video... +TActions.Action.Delete=Brisanje +TActions.Action.Config=Preference... +TActions.Action.AxesVisible=Vidno +TActions.Action.TapeVisible=Vidno +TActions.Action.Print=Natisni... +TActions.Action.ClearFilters=Bri\u0161i +TActions.Action.ImportVideo=Uvozi... +TActions.Action.CloseVideo=Zapri +TActions.Action.CloseAll=Zapri vse +TActions.Action.Exit=Izhod +TActions.Dialog.PrintError.Message=Napaka pri tiskanju. +TActions.Dialog.PrintError.Title=Napaka tiskanja +TActions.Dialog.Description.Title=Opombe: +TActions.Dialog.DeleteLockedTracks.Message=Nekatere sledi so zaklenjene. Vseeno zbri\u0161em? +TActions.Dialog.DeleteLockedTracks.Title=Bri\u0161em zaklenjene sledi? +TActions.Dialog.NewPointMass.Title=Nova masna to\u010Dka +TapeMeasure.Name=Merilni trak +TapeMeasure.New.Name=trak +TapeMeasure.MenuItem.Fixed=Fiksen polo\u017Eaj +TFrame.View.Plot=Grafi\u010Dni prikaz +TFrame.View.Table=Tabelari\u010Dni prikaz +TFrame.View.World=Pogled sveta +TFrame.View.Video=Video pogled +TFrame.Dialog.Help.Title=Tracker-pomo\u010D +TMenuBar.Menu.File=Datoteka +TMenuBar.Menu.Edit=Urejanje +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Sledi +TMenuBar.Menu.Coords=Koordinatni sistem +TMenuBar.Menu.Window=Okno +TMenuBar.Menu.Help=Pomo\u010D +TMenuBar.MenuItem.EditProperties=Lastnosti... +TMenuBar.MenuItem.VideoVisible=Viden +TMenuBar.MenuItem.VideoFilters=Filtri +TMenuBar.MenuItem.NewVideoFilter=Nov +TMenuBar.MenuItem.NewTrack=Nova +TMenuBar.MenuItem.CoordsLocked=Zaklenjeno +TMenuBar.MenuItem.CoordsFixedOrigin=Fiksno izhodi\u0161\u010De +TMenuBar.MenuItem.CoordsFixedAngle=Fiksen kot +TMenuBar.MenuItem.CoordsFixedScale=Fiksno merilo +TMenuBar.MenuItem.CoordsRefFrame=Referen\u010Dni okvir +TMenuBar.MenuItem.CoordsDefault=Privzeto +TMenuBar.MenuItem.WindowRight=Pogled desno +TMenuBar.MenuItem.WindowBottom=Pogled spodaj +TMenuBar.MenuItem.PlayAllSteps=Predvajaj vse korake +TMenuBar.MenuItem.Record=Zapis +TMenuBar.MenuItem.MatSize=Velikost matrike +TMenuBar.MenuItem.Language=Jezik +TMenuBar.MenuItem.DeleteTrack=Brisanje +TMenuBar.MenuItem.TrackerHelp=Tracker-pomo\u010D... +TMenuBar.MenuItem.MessageLog=Zapis obvestil... +TrackControl.Name=Kontrola sledi +TrackControl.Button.NewTrack=Tvori +TrackControl.Button.NewTrack.ToolTip=Tvori novo sled +TrackControl.Button.Trails.ToolTip=Nastavi dol\u017Eino sledi +TrackControl.Button.Labels.ToolTip=Prika\u017Ei ali skrij o\u0161tevil\u010Denje +TrackControl.Button.StretchVectors.ToolTip=Raztegni vektorje +TrackControl.Button.Accelerations.ToolTip=prika\u017Ei ali skrij vektorje pospe\u0161ka +TrackControl.Button.Xmass.ToolTip=Pomno\u017Ei vektorje z maso +TrackControl.Button.Vectors.ToolTip=Vektorji +TrackControl.Button.Velocities.ToolTip=Prika\u017Ei ali skrij vektorje hitrosti +TrackControl.Button.Properties.ToolTip=Izberi s klikom +TrackControl.Button.Positions.ToolTip=Prika\u017Ei ali skrij polo\u017Eaje +Tracker.Popup.MenuItem.Snapshot=Posnetek... +Tracker.Popup.MenuItem.Help=Pomo\u010D... +Tracker.Cursor.Crosshair.Description=Kurzor kot kri\u017Eec +Tracker.Action.AboutTracker=O programu Tracker... +Tracker.Dialog.AboutTracker.Title=O programu Tracker +Tracker.Action.AboutJava=O javi... +Tracker.Dialog.AboutJava.Title=O javi +Tracker.Dialog.AboutJava.UnknownVersion=neznano +Tracker.Dialog.AboutJava.Message=Verzija jave +Tracker.Action.AboutQT=o QuickTime... +Tracker.Dialog.AboutQT.Title=Nekaj o QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=Verzija QuickTime +Tracker.Dialog.AboutQT.Message.QTJavaVersion=Verzija QTJava +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava pOT: +Tracker.Dialog.NoQT.Title=Ne najdem QTJava.zip +Tracker.Dialog.NoQT.Message1=Izgleda, da ni name\u0161\u010Den QuickTime za javo. +Tracker.Dialog.NoQT.Message2=\u010Ce \u017Eeli\u0161 analizirati QuickTime video, ponovno namesti QuickTime. +Tracker.Dialog.NoQT.Message3=Opomba: Pri namestitvi QuickTime MORA BITI IZBRAN QuickTime za Javo. +Tracker.Dialog.UpdateQT.Title=Osve\u017Ei QTJava.zip +Tracker.Dialog.UpdateQT.Message1=Nova verzija QTJava.zip je najdena na +Tracker.Dialog.UpdateQT.Message2=Ali \u017Eeli\u0161 posodobiti obstoje\u010Do datoteko? +Tracker.Dialog.CopyQT.Title=Kopiraj QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime je name\u0161\u010Den, preden ga Tracker lahko uporabi: +Tracker.Dialog.CopyQT.Message2= 1. mora biti QTJava.zip kopiran od +Tracker.Dialog.CopyQT.Message3= na +Tracker.Dialog.CopyQT.Message4= 2. Tracker moramo ponovno pognati. +Tracker.Dialog.CopyQT.Message5=\u017Deli\u0161, da sedaj kopiram QTJava.zip? +Tracker.Dialog.CopyFailed.Title=Kopiranje neuspe\u0161no +Tracker.Dialog.CopyFailed.Message=QTJava.zip ne morem kopirati. +Tracker.Dialog.CopiedTo.Title=Kopiranje uspe\u0161no +Tracker.Dialog.CopiedTo.Message1=QTJava.zip je bil uspe\u0161no kopiran na +Tracker.Dialog.CopiedTo.Message2=Tracker bo sedaj prekinjen ig ga moramo na novo pognati. +Tracker.Splash.Loading=Nalaganje +TrackerIO.Dialog.Import.Title=Uvoz Tracker datoteke +TrackerIO.Dialog.Import.Message=Izberi postavke za uvoz +TrackerIO.Dialog.ImportVideo.Title=Izvoz videa +TrackerIO.Dialog.Export.Title=Izvoz +TrackerIO.Dialog.Export.Message=Izberi postavke za izvoz +TrackerIO.Dialog.ReplaceFile.Title=Zamenjam obstoje\u010Do datoteko? +TrackerIO.Dialog.ReplaceFile.Message=\u017Ee obstaja. Ali naj jo zamenjam? +TrackerIO.Dialog.NotTrackerXML.Title=Neskladnost XML +TrackerIO.Dialog.NotTrackerXML.Message=vsebuje xml podatke za drugo aplikacijo. +TrackerIO.Dialog.BadVideo.Message=Datoteke ne spoznam kot video tip: +TrackerIO.Dialog.BadVideo.Title=Nerazpoznana video datoteka +TrackerPanel.NewTab.Name=Brez naslova +TrackerPanel.DragToMark.Hint=Ozna\u010Dimo s Shift-vle\u010Denjem +TrackerPanel.ClickToMark.Hint=Ozbna\u010Dimo s Shift-klik +TrackerPanel.Dialog.LoadFailed.Title=neveljavna Tracker datoteka +TrackerPanel.Dialog.LoadFailed.Message=Datoteka ni veljavna Tracker datoteka: +TrackerPanel.Dialog.SaveChanges.Title=Shrani spremembe +TrackerPanel.Dialog.SaveChanges.Message=Shrani spremembe v +TrackPlottingPanel.Popup.MenuItem.Lines=\u010Crte +TrackPlottingPanel.Popup.MenuItem.Points=To\u010Dke +TrackPlottingPanel.Popup.MenuItem.Scale=Pove\u010Daj... +TrackPlottingPanel.Popup.MenuItem.Print=Natisni... +TrackPlottingPanel.Popup.MenuItem.Measure=Pove\u010Daj do prilagoditve +TrackPlottingPanel.Popup.MenuItem.Analyze=Analiziraj... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Pove\u010Dava +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Pomanj\u0161ava +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Automatska pove\u010Dava +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box +TrackPlottingPanelInspector.Title=Pove\u010Dava +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Maks +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Nastavi izgled +TToolBar.Dropdown.SelectedTrack.Tooltip=Izberi sled +TToolBar.Dropdown.SelectedTrack.None=Noben +TTrack.MenuItem.Delete=Brisanje +TTrack.MenuItem.Color=Barva... +TTrack.Dialog.Color.Title=Izberi barvo sledi +TTrack.MenuItem.Name=Ime... +TTrack.MenuItem.Footprint=Izgled +TTrack.MenuItem.Description=Opombe... +TTrack.MenuItem.Visible=Vidno +TTrack.MenuItem.TrailVisible=Vidna sled +TTrack.MenuItem.Autostep=Automatsko korakanje +TTrack.MenuItem.MarkByDefault=Ozna\u010Di privzeto +TTrack.MenuItem.Locked=Zaklenjeno +TTrack.MenuItem.Delete=Brisanje +TTrack.Name.None=brez imena +TTrack.Dialog.Description.Title=Opombe: +TTrack.Dialog.Name.Title=Imenuj +TTrack.Dialog.Name.Label=Ime: +TViewChooser.Button.Choose.Tooltip=Izberi pogled +Vector.Name=Vektor +Vector.New.Name=vektor +Vector.MenuItem.ToOrigin=Na izhodi\u0161\u010De +Vector.MenuItem.Label=Oznaka vidna +VectorSum.Name=Vsota vektorjev +VectorSum.New.Name=vsota +VectorSum.MenuItem.Inspector=Izberi vektorje... +VectorSumInspector.Title=Vsota vektorjev +VectorSumInspector.Border.Title=Izberi vektorje +WorldTView.Popup.MenuItem.Projectile=Model izstrelka + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Analiti\u010Dni model delca +AnalyticParticle.Inspector.Title=Analiti\u010Dni model delca +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=polmer 4 +CircleFootprint.Circle_6=polmer 6 +CircleFootprint.Circle_8=polmer 8 +DynamicParticle.Name=Dinami\u010Dni model delca(Kartezi\u010Dni) +DynamicParticle.Inspector.Title=Dinami\u010Dni model delca +DynamicParticle.Property.ForceX=sila x +DynamicParticle.Property.ForceY=sila y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Fiksen polo\u017Eaj +ParticleModel.New.Name=model +ParticleModel.MenuItem.InspectModel=Graditelj modela... +ParticleModel.Inspector.Button.Undo=razveljavi +ParticleModel.Inspector.Button.Redo=ponovno uveljavi +ParticleModel.Inspector.Button.Close=Zapri +ParticleModel.Inspector.Button.Help=Pomo\u010D + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=Le X +Calibration.Axes.YOnly=Le Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Izberi osi kalibracije +Calibration.Label.Axes=osi +Calibration.Dialog.InvalidCoordinates.Title=Neveljavne koordinate +Calibration.Dialog.InvalidCoordinates.Message=To\u010Dke ne morejo imeti istih koordinat sveta. +Calibration.Dialog.InvalidXCoordinates.Message=To\u010Dke ne morejo imeti enakih x-koordinat sveta. +Calibration.Dialog.InvalidYCoordinates.Message=To\u010Dke ne morejo imeti enakih y-koordinat sveta. +SpectralLineFilter.Title=Spekter plinov +SpectralLineFilter.H=Vodik +SpectralLineFilter.He=Helij +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=\u017Divo srebro +TFrame.View.Unknown=Pogled +TMenuBar.MenuItem.Undo=Razveljavi +TMenuBar.MenuItem.Redo=Obnovi +TMenuBar.MenuItem.Replace=Zamenjaj... +TMenuBar.Menu.AddImage=Uvoz slik +TMenuBar.MenuItem.AddBefore=Pred to sli\u010Dico... +TMenuBar.MenuItem.AddAfter=Za to sli\u010Dico... +TMenuBar.MenuItem.RemoveImage=Odstrani to sli\u010Dico +TMenuBar.Menu.Tools=Orodja +TMenuBar.MenuItem.DataFunctionTool=Graditelj podatkov +TMenuBar.MenuItem.DatasetTool=Podatkovno orodje +TMenuBar.Menu.CopyImage=Kopiranje slike +TMenuBar.MenuItem.CopyMainView=Glavni pogled +TMenuBar.MenuItem.CopyFrame=Sli\u010Dica +TMenuBar.MenuItem.PrintFrame=Tiskanje... +TrackerIO.Dialog.AddImage.Title=Uvoz slik (izberi eno ali ve\u010D) +TTrack.Dialog.Name.BadName=je v uporabi. Izberi drugo ime. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=skupna sila +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Tu bodo grafi\u010Dno prikazani podatki o sledeh. +TableTView.Label.NoData=Tu bodo tabelari\u010Dno prikazani podatki o sledeh. +TrackerPanel.Message.NoData0=Tu bo glavni prikaz videa in sledi. +TrackerPanel.Message.NoData1=Izberi datoteko|Odpri ali Sledi|Novo za za\u010Detek. +WorldTView.Label.NoData=Tu bo prikazan pogled sveta na video in sledi. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Metoda integracije: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptivna ve\u010Dkora\u010Dna +DynamicParticle.Table.Force.Border.Title=Funkcije sile (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Funkcije polo\u017Eaja (t) +ParticleModel.Table.Initial.Border.Title=Za\u010Detne vrednosti +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Prilepi sliko +TMenuBar.MenuItem.PasteAfter=Po tej sli\u010Dici +TMenuBar.MenuItem.PasteBefore=Pred to sli\u010Dico +TMenuBar.MenuItem.PasteReplace=Zamenjaj video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Pa za\u010Dnimo... +Tracker.Splash.HelpMessage=Nov uporabnik? Poglej + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=kot od vodoravnice +LineProfile.Checkbox.Rotates=rotates +LineProfile.Label.Spread=razpon +RGBRegion.Name=RGB podro\u010Dje +RGBRegion.New.Name=podro\u010Dje +RGBRegion.MenuItem.Fixed=Fiksen polo\u017Eaj +RGBRegion.Label.Radius=pixel radius +TTrack.Label.Step=korak + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=\u0161tev.polo\u017Eaja +LineProfile.Data.Description.1=x-komponenta polo\u017Eaja +LineProfile.Data.Description.2=y-komponenta polo\u017Eaja +LineProfile.Data.Description.3=rde\u010Da +LineProfile.Data.Description.4=zelena +LineProfile.Data.Description.5=modra +LineProfile.Data.Description.6=zaznana svetlost +LineProfile.Data.Description.7=debelina \u010Drte +ParticleModel.MenuItem.TraceVisible=Sled vidna +ParticleModel.MenuItem.StepsVisible=Koraki vidni +PointMass.Data.Description.0=\u010Das +PointMass.Data.Description.1=x komponenta polo\u017Eaja +PointMass.Data.Description.2=y komponenta polo\u017Eaja +PointMass.Data.Description.3=magnituda polo\u017Eaja +PointMass.Data.Description.4=naklon polo\u017Eaja +PointMass.Data.Description.5=x komponenta hitrosti +PointMass.Data.Description.6=y komponenta hitrosti +PointMass.Data.Description.7=magnituda hitrosti +PointMass.Data.Description.8=naklon hitrosti +PointMass.Data.Description.9=x komponenta pospe\u0161ka +PointMass.Data.Description.10=y komponenta pospe\u0161ka +PointMass.Data.Description.11=magnituda pospe\u0161ka +PointMass.Data.Description.12=naklon pospe\u0161ka +PointMass.Data.Description.13=kot rotacije +PointMass.Data.Description.14=kotna hitrost +PointMass.Data.Description.15=kotni pospe\u0161ek +PointMass.Data.Description.16=\u0161tev. koraka +PointMass.Data.Description.17=\u0161tev.sli\u010Dice +PointMass.Data.Description.18=x komponenta gibalne.koli\u010Dine +PointMass.Data.Description.19=y komponenta gibalne koli\u010Dine +PointMass.Data.Description.20=magnituda gibalne koli\u010Dine +PointMass.Data.Description.21=naklon gibalne koli\u010Dine +PointMass.Data.Description.22=kineti\u010Dna energija +RGBRegion.Data.Description.0=\u010Das +RGBRegion.Data.Description.1=x komponenta polo\u017Eaja +RGBRegion.Data.Description.2=y komponenta polo\u017Eaja +RGBRegion.Data.Description.3=rde\u010Da +RGBRegion.Data.Description.4=zelena +RGBRegion.Data.Description.5=modra +RGBRegion.Data.Description.6=zaznana svetlost +RGBRegion.Data.Description.7=\u0161tev. pikslov +RGBRegion.Data.Description.8=\u0161tev.koraka +RGBRegion.Data.Description.9=\u0161tev.sli\u010Dice +TView.Menuitem.Define=Definiraj... +Vector.Data.Description.0=\u010Das +Vector.Data.Description.1=x-komponenta +Vector.Data.Description.2=y-komponenta +Vector.Data.Description.3=magnituda +Vector.Data.Description.4=kot +Vector.Data.Description.5=x komponenta polo\u017Eaja repa +Vector.Data.Description.6=y komponenta polo\u017Eaja repa +Vector.Data.Description.7=\u0161tev. koraka +Vector.Data.Description.8=\u0161tev. sli\u010Dice + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Masa tega delca +ParticleModel.Parameter.InitialTime.Description=Za\u010Detni \u010Das +AnalyticParticle.PositionFunction.X.Description=x komponenta polo\u017Eaja +AnalyticParticle.PositionFunction.Y.Description=y komponenta polo\u017Eaja +DynamicParticle.ForceFunction.X.Description=x komponenta sile +DynamicParticle.ForceFunction.Y.Description=y komponenta sile +DynamicParticle.Parameter.InitialX.Description=x komponenta za\u010Detnega polo\u017Eaja +DynamicParticle.Parameter.InitialY.Description=y komponenta za\u010Detnega polo\u017Eaja +DynamicParticle.Parameter.InitialVelocityX.Description=x komponenta za\u010Detne hitrosti +DynamicParticle.Parameter.InitialVelocityY.Description=y komponenta za\u010Detne hitrosti +TrackerPanel.ModelBuilder.Title=Graditelj modela +TrackerPanel.DataBuilder.Title=Graditelj podatkov +TrackControl.TrailMenu.NoTrail=Ni sledi +TrackControl.TrailMenu.ShortTrail=Kratke sledi +TrackControl.TrailMenu.LongTrail=Dolge sledi +TrackControl.TrailMenu.FullTrail=Vsi koraki +TrackerPanel.ModelBuilder.Spinner.Tooltip=Trenutno izbrani model +TrackerPanel.ModelBuilder.LineButton.Text=Stil \u010Drte +TrackerPanel.ModelBuilder.LineButton.Tooltip=Izberi stil \u010Drte +ParticleModel.LineStyle.None=Ni \u010Drte +ParticleModel.LineStyle.Connect=Pove\u017Ei korake +ParticleModel.LineStyle.Smooth=Mehka \u010Drta +ModelFunctionPanel.Label=Model +AnalyticFunctionPanel.FunctionEditor.Border.Title=Funkcije polo\u017Eaja +DynamicFunctionPanel.FunctionEditor.Border.Title=Funkcije sile + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Visible Table Columns +Tracker.About.ProjectOf=Avtor projekta: +Tracker.About.TranslationBy=Prevedel +# following entry (Tracker.About.Translator) purposely left blank +Tracker.About.Translator=Sa\u0161a Divjak +TMenuBar.Menu.SaveVideoAs=Shrani izrezek kot +TActions.SaveClipAs.ProgressMonitor.Message=Shranjujem izrezek kot +TActions.SaveClipAs.ProgressMonitor.Progress=Kon\u010Dano + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sinhro. +PlotTrackView.Checkbox.Synchronize.Tooltip=Sinhroniziraj vodoravne osi +RGBRegion.MenuItem.FixedRadius=Fiksen polmer +Tracker.VideoZoom.Hint=klikni za pribli\u017Eanje ali oddaljevanje, dvoklik za prileganje +Tracker.PlotZoomIn.Hint=z vle\u010Denjem pribli\u017Eamo, dvoklik za avtomatsko prileganje merila +Tracker.PlotZoomOut.Hint=S klikom se odmakne\u0161 (pomanj\u0161a\u0161) +Tracker.MenuItem.Hints=Prika\u017Ei namige +TapeMeasure.Label.Length=dol\u017Eina +TapeMeasure.Label.TapeAngle=kot od osi x +TapeMeasure.Label.ArcAngle=kot kotomera +TrackerIO.Dialog.NotAnImage.Title=Napa\u010Den tip datoteke +TrackerIO.Dialog.NotAnImage.Message1=ni slika JPG ali GIF. +TrackerIO.Dialog.NotAnImage.Message2=Ali \u017Eeli\u0161 nadaljevati? +TToolBar.Button.Zoom.Tooltip=Pove\u010Dava (bli\u017Enjica: tipka Z) +TrackChooserTView.DropDown.Tooltip=Izberi sled +TapeMeasure.Field.TapeAngle.Tooltip=Kot od pozitivne osi x do traku +TapeMeasure.Field.Magnitude.Tooltip=Dol\u017Eina v umerjenih enotah sveta +TapeMeasure.Readout.Magnitude.Name=dol\u017Eina +TapeMeasure.Readout.Magnitude.Hint=enote sveta +TapeMeasure.Readout.Angle.Name=od\u010Ditek naklona +TapeMeasure.Readout.Angle.Hint=kot, merjen od osi +x +TapeMeasure.End.Name=konec +TapeMeasure.End.Hint=Z vle\u010Denjem meri\u0161 razdalje in kote +TapeMeasure.Handle.Name=ro\u010Dica +TapeMeasure.Handle.Hint=premakni z vle\u010Denjem +Vector.Tip.Name=Konica +Vector.Tip.Hint=komponente spremenimo z vle\u010Denjem ali vnosom koordinat +Vector.Handle.Name=ro\u010Dica +Vector.Handle.Hint=vektor premika\u0161 z vle\u010Denjem +Vector.ShortHandle.Hint=z vle\u010Denjem pomikamo, konico izberemo z ALT-klik +PointMass.Position.Name=polo\u017Eaj +PointMass.Position.Hint=za spremembo polo\u017Eaja povleci ali vnesi koordinate +PointMass.Velocity.Name=hitrost +PointMass.Acceleration.Name=pospe\u0161ek +PointMass.Vector.Hint=Za premik povleci +PointMass.Position.Locked.Hint=s klikom izbere\u0161 -- ne more\u0161 vle\u010Di +CoordAxes.Handle.Name=+x-os +CoordAxes.Handle.Hint=naklon spremeni\u0161 z vle\u010Denjem +CoordAxes.Origin.Name=izhodi\u0161\u010Den +CoordAxes.Origin.Hint=polo\u017Eaj spremeni\u0161 z vle\u010Denjem +OffsetOrigin.Position.Name=polo\u017Eaj +OffsetOrigin.Position.Hint=za premik izhodi\u0161\u010Da povleci ali vnesi koordinate +Calibration.Point.Name=to\u010Dka +Calibration.Point.Hint=Osi in merilo spremeni\u0161 z vle\u010Denjem ali z vnosom koordinat +RGBRegion.Position.Name=polo\u017Eaj +RGBRegion.Position.Hint=polo\u017Eaj spremeni\u0161 z vle\u010Denjem ali z vnosom koordinat +LineProfile.End.Name=konec +LineProfile.End.Hint=z vle\u010Denjem naravna\u0161 dol\u017Eino \u010Drte +LineProfile.Handle.Name=ro\u010Dica +LineProfile.Handle.Hint=\u010Drto premakne\u0161 z vle\u010Denjem +PointMass.Hint=maso nastavi\u0161 v orodni vrstici +PointMass.Unmarked.Hint=, polo\u017Eaje ozna\u010Di\u0161 s shift-klik +TTrack.Unselected.Hint=klikni za izbiro oziroma nastavitev lastnosti +Vector.Unmarked.Hint=vektorje ri\u0161e\u0161 s shift-vle\u010Denjem +OffsetOrigin.Unmarked.Hint=to\u010Dko odmika ozna\u010Di\u0161 s shift-klik +Calibration.Unmarked.Hint=prvo to\u010Dko ozna\u010Di\u0161 s shift-klik +Calibration.Halfmarked.Hint=drugo to\u010Dko ozna\u010Di\u0161 s shift-klik +CenterOfMass.Empty.Hint=Izberi mase za definiranje sistema +VectorSum.Empty.Hint=izberi vektorje za definiranje vsote +TapeMeasure.Hint=razdalje in kote meri\u0161 z vle\u010Denjem koncev +CoordAxes.Hint=za spremembo naklona nastavi kot +ParticleModel.Hint=nastavi maso v orodni vrstici, v Graditelj modela vnesi izraze za animacijo +RGBRegion.Hint=velikost spremeni\u0161 z vnosom polmera +RGBRegion.Unmarked.Hint=polo\u017Eaje ozna\u010Di\u0161 s shift-klik +TTrack.ImportVideo.Hint=uvoz videa ali slike za merjenje RGB +TTrack.Selected.Hint=izbrano +LineProfile.Hint=za spremembo debeline \u010Drte vnesi razpo +LineProfile.Unmarked.Hint=\u010Drto nari\u0161e\u0161 s shift-vle\u010Denjem +LineProfile.Menu.Orientation=Usmeritev +LineProfile.MenuItem.Horizontal=Vodoravna +LineProfile.MenuItem.XAxis=Vzdol\u017E osi X +Footprint.PositionVector=vektor +Footprint.BoldPositionVector=poudarjen vektor +Tracker.Startup.Hint=Tu poglej za namige (ali v menuju Pomo\u010D izklopi namige). Za pomo\u010D kadarkoli klikni na F1 +TrackerPanel.NoVideo.Hint=odpri ali uvozi video ali sliko za analizo +TrackerPanel.CalibrateVideo.Hint=Kalibriraj video s pomo\u010Djo orodja za kalibracijo +TrackerPanel.NoTracks.Hint=tvori novo sled za merjenje zanimivih lastnosti +TrackerPanel.SetClip.Hint=nastavi ali preglej nastavitve video izrezov +TrackerPanel.ShowAxes.Hint=nastavi izhodi\u0161\u010De in kot koordinatnih osi +VideoPlayer.Step.Hint=korak naprej (bli\u017Enjica: tipka PageDown) +VideoPlayer.Back.Hint=korak nazaj (bli\u017Enjica: tipka PageUp) +TrackerPanel.DVVideo.Hint=za popravek popa\u010Denja v videih formata DV uporabi filter za pove\u010Davo +TrackerIO.DataFileFilter.Description=Datoteke Tracker +Tracker.Button.PDFHelp=Verzija PDF za tisk +TToolbar.Button.TapeVisible.Tooltip=Prika\u017Ei, skrij ali izberi kalibracijska orodja + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Kontrola sledi +TMenuBar.MenuItem.Description=Opombe +TrackPlottingPanel.RightDrag.Hint=za opcije vle\u010Di z desnim gumbom +TMenuBar.MenuItem.DeleteSelectedPoint=Izbrana to\u010Dka +TFrame.InfoDialog.SaveChanges.Title=Shrani spremembe +TFrame.InfoDialog.SaveChanges.Message=Ali naj shranim spremembe? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Kartezi\u010Dni +DynamicParticle.Editor.Button.Polar=Polarni +DynamicParticle.Parameter.InitialR.Description=Za\u010Detni polmer +DynamicParticle.Parameter.InitialTheta.Description=Za\u010Detni kot +DynamicParticle.Parameter.InitialVelocityR.Description=Za\u010Detna obodna hitrost +DynamicParticle.Parameter.InitialOmega.Description=Za\u010Detna kotna hitrost +DynamicParticle.ForceFunction.R.Description=Radialna komponenta sile +DynamicParticle.ForceFunction.Theta.Description=Tangencialna komponenta sile +DynamicParticlePolar.Name=Dinami\u010Dni model delca(Polarni) +DynamicTwoBody.Editor.Button.Particle1=Delec 1 +DynamicTwoBody.Editor.Button.Particle2=Delec 2 +DynamicTwoBody.Name=Dinami\u010Dni model dveh teles +TMenuBar.Menu.DynamicParticle=Dinami\u010Dni model z delci +TMenuBar.MenuItem.Cartesian=Cartezi\u010Dni +TMenuBar.MenuItem.Polar=Polarni + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Avtom.sledenje... +Dialog.Button.Help=Pomo\u010D +AutoTracker.Wizard.Title=Avtom.sledilec: +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Nazaj +AutoTracker.Wizard.Button.Next=Naprej +AutoTracker.Wizard.Button.Accept=Sprejmi +AutoTracker.Wizard.Button.Search=Iskanje +AutoTracker.Wizard.Button.Pause=Pavza +AutoTracker.Wizard.Button.Skip=Presko\u010Di +AutoTracker.Label.Mask=Vzorec slike +AutoTracker.Label.Target=Odmik tar\u010De +AutoTracker.Label.AcceptLevel=Sprejmi zgornje ocene +AutoTracker.TabbedPane.TabTitle.Mask=Vzorec +AutoTracker.TabbedPane.TabTitle.Target=Tar\u010Da +AutoTracker.TabbedPane.TabTitle.Settings=Sprejemljivost +AutoTracker.TabbedPane.TabTitle.Search=Iskanje +AutoTracker.Info.GetStarted=Klikni na video zna\u010Dilnost, ki ji \u017Eeli\u0161 avtomatsko slediti. +AutoTracker.Info.Mask1=Vzorec definira sliko, ki naj bi se ujemala v vsaki video sli\u010Dici. Z vle\u010Denjem centra vzorca ali ro\u010Dice ga premika\u0161 ali pove\u010Da\u0161. +AutoTracker.Info.Mask2=Vzorec se lahko po obliki in barvi s \u010Dasom spreminja. Vi\u0161je hitrosti razvoja omogo\u010Dajo sledenje hitrej\u0161im spremembam, vendar so dolgoro\u010Dno manj natan\u010Dne. +AutoTracker.Info.MaskLocked1=Vzorec je v uporabi in zaklenjen. +AutoTracker.Info.MaskLocked2=S klikom na gumb Reset zbri\u0161e\u0161 vse korake in za\u010Dne\u0161 znova. +AutoTracker.Info.Target1=Tar\u010Da je tam, kjer bodo koraki ozna\u010Deni relativno glede na vzorec. Tar\u010Do premikamo z vle\u010Denjem. +AutoTracker.Info.Target2=Namig: Polo\u017Eaj tar\u010De lahko naravnamo tudi po ozna\u010Devanju korakov. Obstoje\u010Di koraki se vodo avtomati\u010Dno premikali glede na tar\u010Do. +AutoTracker.Info.TargetLocked=Tar\u010Da je v uporabi in vezana na obstoje\u010De polo\u017Eaje v korakih. Premik tar\u010De pomeni tudi premik korakov. +AutoTracker.Info.Settings1=Ocene ujemanja nad prikazanim pragom sprejemljivosti so avtomatsko ozna\u010Dene. +AutoTracker.Info.Settings2=Namig: zmanj\u0161anje praga sprejemljivosti pove\u010Da mo\u017Enost napak. +AutoTracker.Info.Search1=Prikazan pravokotnik bo pregledan za najbolj\u0161e ujemanje. Podro\u010Dje iskanja premikamo oziroma pove\u010Damo z vle\u010Denjem njegovega centra oziroma ro\u010Dice. +AutoTracker.Info.Search2=Namig: Iskano podro\u010Dje ni nujno veliko, \u010De je pospe\u0161ek majhen ali konstanten. Opcija "gledaj naprej" avtomatsko pomika iskalno podro\u010Dje na napovedane polo\u017Eaje ujemanja. +AutoTracker.Info.Frame=Sli\u010Dica +AutoTracker.Info.Match=Prikazano ujemanje je bilo avtomati\u010Dno ozna\u010Deno na polo\u017Eaju tar\u010De. +AutoTracker.Info.Possible=Pa prikazanem iskalnem podro\u010Dju je bilo najdeno mo\u017Eno ujemanje. Tvoje mo\u017Enosti so: +AutoTracker.Info.NoMatch=V prikazanem iskalnem podro\u010Dju ni bilo najdeno nobeno ujemanje. Tvoje mo\u017Enosti so: +AutoTracker.Info.Outside=Iskalno podro\u010Dje je izven slike. Tvoje mo\u017Enosti so: +AutoTracker.Info.Accepted=Prikazano ujemanje je uporabnik sprejel. +AutoTracker.Info.MarkedByUser=Korak je uporabnik ro\u010Dno ozna\u010Dil. +AutoTracker.Info.NoVideo=Avtomati\u010Dno sledenje zahteva video. Uvozi nek video ali zapri avtomatski sledilec. +AutoTracker.Info.Height=vi\u0161ina +AutoTracker.Info.Width=\u0161irinah +AutoTracker.Info.Accept=--sprejmi ujemanje +AutoTracker.Info.Retry=--premakni iskalno podro\u010Dje in ponovi iskanje +AutoTracker.Info.Mark=--ro\u010Dno ozna\u010Di korak s shift-klik +AutoTracker.Info.Skip=--presko\u010Di to sli\u010Dico in nadaljuj sledenje +AutoTracker.Info.Reset=--reset za brisanje vseh korakov in nov za\u010Detek +AutoTracker.Info.MatchScore=ocena ujemanja +AutoTracker.Dialog.MaskLocked.Title=Vzorec je zaklenjen +PointMass.Cursor.Autotrack.Description=Kurzor avtomatskega sledilca +VideoPlayer.StartFrame.Hint=Za\u010Detno sli\u010Dico nastavi z vle\u010Denjem +VideoPlayer.EndFrame.Hint=kon\u010Dno sli\u010Dico nastavi z vle\u010Denjem +VideoPlayer.Slider.Hint=z vle\u010Denjem pregleduje\u0161 video +FileDropHandler.Dialog.BadFile.Message=ne morem nalo\u017Eiti. +FileDropHandler.Dialog.BadFile.Title=Nerazpoznana datoteka + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Uporabi +DynamicParticle.Dialog.Delete.Message=Z brisanjem tega delca ga bomo odstranili iz sistema. Ali naj ga res zbri\u0161em? +DynamicParticle.Dialog.Delete.Title=Dinami\u010Dni sistem +DynamicParticle.System.In=v +DynamicSystem.Empty=prazno +DynamicSystem.Force.Name.Internal=interno +DynamicSystem.ForceFunction.R.Description=Radialna komponenta notranje sile +DynamicSystem.ForceFunction.Theta.Description=Tangencialna komponenta notranje sile +DynamicSystem.MenuItem.Inspector=Izberi delce... +DynamicSystem.Name=Dinami\u010Dni sistem dveh teles +DynamicSystem.New.Name=sistem +DynamicSystem.Parameter.Of=od +DynamicSystem.Parameter.RelativeTo=relativno glede na +DynamicSystem.Parameter.Name.Relative=relativno +DynamicSystem.Parameter.ParticleMass.Description=Masa od +DynamicSystem.Parameter.Mass.Description=Celotna masa sistema +DynamicSystemInspector.Border.Title=Delec +DynamicSystemInspector.Title=Sistem dveh teles +DynamicSystemInspector.Button.Change=Spremeni v... +DynamicSystemInspector.ParticleName.None=(noben) +TMenuBar.MenuItem.Clone=Kloniraj +TMenuBar.MenuItem.TwoBody=Sistem dveh teles +TrackerPanel.DataBuilder.Dropdown.Tooltip=Trenutno izbrana sled +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sinhr. vertikalnih osi +TrackControl.Button.Trace.ToolTip=prika\u017Ei ali skrij poti +TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab +TToolBar.Button.Save.Tooltip=Shrani teko\u010Di zavihek v datoteko +TToolBar.Button.SelectTrack=Izberi +TToolBar.Button.SelectTrack.Tooltip=Izberi obstoje\u010Do sled +TTrack.MenuItem.ClearSteps=Po\u010Disti korake +PointMass.MenuItem.Position=Polo\u017Eaj +TMenuBar.MenuItem.Empty=(prazno) +TTrackBar.Button.Memory=Uporaba pomnilnika: +TTrackBar.Button.Memory.Tooltip=Nadzor in upravljanje pomnilnika +TTrackBar.Memory.PopupItem.Launch1=Po\u017Eeni +TTrackBar.Memory.PopupItem.Launch2=s pomnilnikom +TButton.Track.ToolTip=Nastavi lastnosti +Tracker.Dialog.OutOfMemory.Message1=Trackerju zmanjkuje pomnilnika. +Tracker.Dialog.OutOfMemory.Message2=Za opcije klikni na gumb pomnilnik. +Tracker.Dialog.OutOfMemory.Title=Premajhen pomnilnik + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Glej naprej +AutoTracker.Label.Original=Za\u010Detna +AutoTracker.Label.NoMask=nobena +AutoTracker.Label.Rate=Hitrost razvoja: +AutoTracker.Info.Mask3=Namig: vzorec ni nujno velik in ne vklju\u010Duje nujno cel objekt. Najbolj u\u010Dinkovita je uporaba unikatnih zna\u010Dilnosti z robovi z visokim kontrastom. +AutoTracker.Wizard.Checkbox.XAxis=Le os X +AutoTracker.Info.SearchOnAxis1=Na osi x znotraj prikazanega pravokotnika bom iskal najbolj\u0161e ujemanje. Iskalno podro\u010Dje lahko premakne\u0161 oziroma pove\u010Da\u0161 z vle\u010Denjem njegovega centra oziroma ro\u010Dice. +AutoTracker.Info.PossibleOnAxis=Vzdol\u017E osi x v prikazanem iskalnem podro\u010Dju je najdeno mo\u017Eno ujemanje. Ima\u0161 mo\u017Enosti: +AutoTracker.Info.NoMatchOnAxis=Vzdol\u017E osi x v prikazanem iskalnem podro\u010Dju ne najdem ujemanja. Ima\u0161 mo\u017Enosti: +AutoTracker.Info.RetryOnAxis=--premakni iskalno podro\u010Dje ali os x in ponovi iskanje +AutoTracker.Wizard.Button.Delete=Bri\u0161i to to\u010Dko +AutoTracker.Wizard.Button.DeleteMore=Bri\u0161i to in naslednje to\u010Dke +Button.Define.Tooltip=Definiraj funkcije obstoje\u010Dih spremenljivk v stolpcih +Calibration.Label.Point=to\u010Dka +CalibrationStick.Hint=nastavi dol\u017Eino ali vleci konec za spremembo velikosti, naklon osi spremeni\u0161 s spremembo kota. +CalibrationStick.End.Hint=z vle\u010Denjem spremeni\u0161 velikost +CalibrationStick.New.Name=merilna palica: +CalibrationTapeMeasure.New.Name=merilni trak +CalibrationTapeMeasure.Readout.Magnitude.Hint=klikni za vnos znane dol\u017Eine v enotah sveta +CalibrationTapeMeasure.Hint=za spremembo merila nastavi dol\u017Eino, za spremembo nagiba osi nastavi kot +DynamicSystem.Data.Description.0=relative distance between particles +DynamicSystem.Data.Description.1=relativni kot +DynamicSystem.Data.Description.2=relativna obodna hitrost +DynamicSystem.Data.Description.3=relativena kotna hitrost +ExportDataDialog.Subtitle.Table=Podatkovna tabela +ExportDataDialog.Subtitle.Content=Cells +ExportDataDialog.Subtitle.Format=\u0160tevil\u010Dni format +ExportDataDialog.Subtitle.Delimiter=Lo\u010Dilo +ExportDataDialog.Title=Izvoz podatkov +ExportDataDialog.Delimiter.Add=Dodaj... +ExportDataDialog.Delimiter.Remove=Odstrani... +ExportDataDialog.Content.AllCells=Dodaj celice +ExportDataDialog.Content.SelectedCells=Izbrane celice +ExportDataDialog.MenuItem.RemoveDelimiter=Odstrani lastno lo\u010Dilo +ExportDataDialog.Chooser.SaveData.Title=Shrani podatke kot +ExportVideoDialog.Button.SaveAs=Shrani kot... +ExportVideoDialog.Button.FullSize=Polna velikost +ExportVideoDialog.Button.DrawnSize=Tako kot nasisano +ExportVideoDialog.Content.VideoOnly=Samo video +ExportVideoDialog.Content.VideoAndGraphics=Video in grafika +ExportVideoDialog.Content.GraphicsOnly=Samo grafika +ExportVideoDialog.Title=Izvoz video izreza +ExportVideoDialog.Label.ClipSettings=Nastavitve posnetka +ExportVideoDialog.Subtitle.Size=Velikost +ExportVideoDialog.Subtitle.Content=Vsebina +ExportVideoDialog.Subtitle.View=Pogled +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=Video je bil shranjen kot +ExportVideoDialog.Complete.Message2=Ali naj ga sedaj odprem v programu Tracker? +ExportVideoDialog.Complete.Title=Izvoz kon\u010Dan +ExportVideoDialog.VideoSize=velikost videa +ExportVideoDialog.MatSize=velikost matrike +ExportVideo.Dialog.HiddenPlots.Message=Za izvoz morajo biti izrisi povsem vidni. +ExportVideo.Dialog.HiddenPlots.Title=Nepopoln pogled +Footprint.DoubleTarget=dvojni kri\u017Eec +Footprint.BoldDoubleTarget=poudarjen dvojni kri\u017Eec +OffsetOrigin.MenuItem.Fixed=Fiksne koordinate sveta +ParticleModel.Dialog.Offscreen.Message1=Nekateri koraki modela so prazni, ker so predale\u010D iz zaslona. +ParticleModel.Dialog.Offscreen.Message2=To odpravimo s spremembo modela ali s spremembo velikosti videa. +ParticleModel.Dialog.Offscreen.Title=Izven meja +PrefsDialog.Tab.Configuration.Title=Konfiguracija +PrefsDialog.Memory.BorderTitle=Velikost pomnilnika +PrefsDialog.Tab.General.Title=Drugo +PrefsDialog.RecentFiles.BorderTitle=Odpri nedavni menu +PrefsDialog.Label.RecentSize=\u0160tevilo datotek +PrefsDialog.Hints.BorderTitle=Namigi +PrefsDialog.Button.Relaunch=Ponovno po\u017Eeni +PrefsDialog.Button.ClearRecent=Bri\u0161i +PrefsDialog.Checkbox.DefaultSize=Uporabi privzeto +PrefsDialog.Checkbox.HintsOn=Privzeto prika\u017Ei namige +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video pogon +PrefsDialog.Button.Xuggle=Xuggle (priporo\u010Deno) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=\u010Ce uporablja\u0161 Web Start, upravljanje pomnilnika ni na voljo. +PrefsDialog.Dialog.WebStart.Title=Na\u010Din Web Start +PrefsDialog.LookFeel.BorderTitle=Izgled +PrefsDialog.Language.BorderTitle=Jezik +PrefsDialog.Upgrades.BorderTitle=Preveri posodobitve +PrefsDialog.Tab.Runtime.Title=\u010Cas izvajanja +PrefsDialog.Tab.Display.Title=Prikaz +PrefsDialog.Language.Default=privzeto +PrefsDialog.Upgrades.Always=Vedno +PrefsDialog.Upgrades.Weekly=Tedensko +PrefsDialog.Upgrades.Monthly=Mese\u010Dno +PrefsDialog.Upgrades.Never=Nikoli +PrefsDialog.Button.CheckForUpgrade=Preveri sedaj +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback +PrefsDialog.Xuggle.Slow=Gladko (lahko je po\u010Dasno) +PrefsDialog.Xuggle.Fast=Hitro (lahko bo sunkovito) +PrefsDialog.CalibrationTool.BorderTitle=Privzeto orodje za kalibracijo +Protractor.Name=Kotomer +Protractor.New.Name=kotomer +Protractor.Hint=Kote merimo z vle\u010Denjem rok +Protractor.Label.Angle=kot +Protractor.Field.Angle.Tooltip=Kot med rokami kotomera +Protractor.Vertex.Name=verteks +Protractor.Vertex.Hint=verteks premakne\u0161 z vle\u010Denjem +Protractor.End.Name=konec roke +Protractor.End.Hint=roko vrti\u0161 z vle\u010Denjem +Protractor.Handle.Name=ro\u010Dica +Protractor.Handle.Hint=Kotomer premika\u0161 z vle\u010Denjem +Protractor.Rotator.Name=rotator +Protractor.Rotator.Hint=kotomer vrti\u0161 z vle\u010Denjem +Protractor.Readout.Name=readout +Protractor.Readout.Hint=Kot med rokami kotomera +ProtractorFootprint.Circle3=majhen krog +ProtractorFootprint.Circle5=velik krog +ProtractorFootprint.Circle3Bold=majhen poudarjen krog +ProtractorFootprint.Circle5Bold=velik poudarjen krog +Stick.Name=Merilna palica +Stick.New.Name=merilna palica +TableTrackView.MenuItem.Unformatted=Polna natan\u010Dnost +TableTrackView.MenuItem.Formatted=Kot formatirano +TableTrackView.Menu.SetDelimiter=Postavi lo\u010Dilo +TableTrackView.MenuItem.AddDelimiter=Dodaj... +TableTrackView.MenuItem.RemoveDelimiter=Odstrani... +TableTrackView.Dialog.CustomDelimiter.Message=Vnesi niz z lo\u010Dili: +TableTrackView.Dialog.CustomDelimiter.Title=Dodaj lo\u010Dilo +TableTrackView.Header.Tooltip=Klikni za sortiranje, z dvoklikom izbere\u0161 stolpec +TableTrackView.MenuItem.CopySelectedData=Kopiraj izbrane podatke +TableTrackView.Dialog.RemoveDelimiter.Message=Izberi lo\u010Dilo za odstranitev: +TableTrackView.Dialog.RemoveDelimiter.Title=Odstrani lo\u010Dilo +TableTrackView.Radians.Tooltip=v radianih +TableTrackView.Degrees.Tooltip=v stopinjah +TableTrackView.RadiansPerSecond.Tooltip=v radianih/s +TableTrackView.DegreesPerSecond.Tooltip=v stopinjah/s +TableTrackView.RadiansPerSecondSquared.Tooltip=v radianih/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=v stopinjah/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Zbri\u0161i podatkovno funkcijo +TActions.Action.SaveFrame=Shrani skupino zavihkov kot... +TActions.AboutVideo=Lastnosti... +TActions.Dialog.AboutVideo.Title=Lastnosti videa +TActions.Dialog.AboutVideo.Type=Tip +TActions.Dialog.AboutVideo.Size=Dimenzije +TActions.Dialog.AboutVideo.Length=Dol\u017Eina +TActions.Dialog.AboutVideo.Frames=Sli\u010Dic +TActions.Dialog.AboutVideo.Seconds=sekund +TActions.Dialog.AboutVideo.FrameRate=Sli\u010Dic/sek +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Pot +TActions.Action.ImportTRK=Tracker datoteka... +TActions.Action.ProtractorVisible=Viden +TapeMeasure.MenuItem.FixedLength=Fiksna dol\u017Eina +TextTView.Label.NoTab=Za dodajanje streni s tekstom ali HTML klikni na "Stran". +TextTView.NewTab.Text1=Besedilo ali naslov ureja\u0161 po dvokliku. Desni klik ponudi ve\u010D opcij. +TextTView.NewTab.Text2=Za prikaz HTML strani vnesi URL ali z desnim klikom odpri neko datoteko. +TextTView.NewTab.Title=Neimenovana +TextTView.Dialog.TabTitle.Title=Postavi naslov +TextTView.MenuItem.OpenHTML=Odpri HTML... +TextTView.MenuItem.SetTitle=Postavi naslov... +TextTView.Button.NewTab=Nova +TextTView.TextEdit.Description=Tekst +TFrame.Dialog.FileNotFound.Message=Datoteke ne najdem: +TFrame.Dialog.FileNotFound.Title=Datoteke ne najdem +TFrame.View.Text=Pogled na stran +TFrame.View.Main=Glavni pogled +TMenuBar.Menu.OpenRecent=Odpri nedavne +TMenuBar.Menu.Import=Uvoz +TMenuBar.Menu.Export=Izvoz +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=Datoteka... +TMenuBar.Menu.CopyObject=Kopiranje objekta +TMenuBar.MenuItem.Coords=Koordinatni sistem +TMenuBar.MenuItem.VideoClip=Video izrez +TMenuBar.Menu.MeasuringTools=Merilna orodja +TMenuBar.Menu.AngleUnits=Enote za kot +TMenuBar.MenuItem.Degrees=Stopinje +TMenuBar.MenuItem.Radians=Radiani +Tracker.Dialog.NoXuggle.Title=Ne najdem Xuggle +Tracker.Dialog.NoXuggle.Message1=Xuggle (platformno neodvisen video pogon) ni name\u0161\u010Den. +Tracker.Dialog.NoXuggle.Message2=Nalo\u017Ei Xuggle iz http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=Nekaj o Xuggle... +Tracker.Dialog.AboutXuggle.Title=Nekaj o Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Verzija Xuggle +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle dom: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle pot: +Tracker.Dialog.NoVideoEngine.Message1=ne najdem video pogona! Brez tega lahko Tracker +Tracker.Dialog.NoVideoEngine.Message2=odpre le slike, zaporedja slik in animirane gif. +Tracker.Dialog.NoVideoEngine.Message3=Za namestitev Xuggle, ki je najbolj priporo\u010Dljiv video pogon za +Tracker.Dialog.NoVideoEngine.Message4=vse platforme, nalo\u017Ei zadnji Tracker installer iz +Tracker.Dialog.NoVideoEngine.Title=Manjka video pogon +Tracker.Dialog.NoXuggle.Message1=Xuggle, Trackerjev priporo\u010Dljiv video pogon, ni name\u0161\u010Den. +Tracker.Dialog.NoXuggle.Message2=Za namestitev Xuggle, nalo\u017Ei zadnji Tracker installer iz +Tracker.Dialog.NoXuggle.Title=Manjka Xuggle +Tracker.About.DefaultLocale=Privzeti locale +Tracker.About.CurrentLanguage=Jezik +Tracker.Dialog.InsufficientMemory.Title=Premajhen pomnilnik +Tracker.Dialog.InsufficientMemory.Message=Zahtevana velikost pomnilnika je prevelika. +TrackerIO.Dialog.TabMustBeSaved.Message1=Zavihek +TrackerIO.Dialog.TabMustBeSaved.Message2=mora biti shranjen kot tracker datoteka, \u010De naj bo vklju\u010Dena v skupino zavihkov. +TrackerIO.Dialog.TabMustBeSaved.Message3=Ali naj ga shranim? +TrackerIO.Dialog.TabMustBeSaved.Title=Neshranjen zavihek +TrackerIO.Dialog.NoTabs.Message=Ni zavihkov, ki bi jih lahko shranili! +TrackerIO.Dialog.NoTabs.Title=Prazna skupina zavihkov +TrackerIO.Dialog.SaveTabset.Title=Shrani skupino zavihkov +TrackerIO.Dialog.SaveTab.Title=Shrani zavihek +TrackerIO.Delimiter.Tab=Zavihek +TrackerIO.Delimiter.Space=Presledek +TrackerIO.Delimiter.Comma=Vejica +TrackerIO.Delimiter.Semicolon=Podpi\u010Dje +TrackerIO.VideoAndDataFileFilter.Description=Datoteke video in Tracker +TrackerPanel.Dialog.Version.Message1=Odpira\u0161 datoteko, tvorjeno s Trackerjem +TrackerPanel.Dialog.Version.Message2=kar se lahko nana\u0161a na +TrackerPanel.Dialog.Version.Message3=zna\u010Dilnosti, ki manjkajo v verziji, ki jo izvaja\u0161 +TrackerPanel.Dialog.Version.Message4=Zadnja verzija je na voljo na +TrackerPanel.Dialog.Version.Title=Verzija se ne ujema +TrackerPanel.Label.ModelStart=Za\u010Detek +TrackerPanel.Label.ModelEnd=Konec +TrackerPanel.Spinner.ModelStart.Tooltip=Izberi za\u010Detno sli\u010Dico za ta model +TrackerPanel.Spinner.ModelEnd.Tooltip=Izberi kon\u010Dno sli\u010Dico za ta model +TToolbar.Button.ProtractorVisible.Tooltip=Prika\u017Ei ali skrij kotomer +TToolbar.Button.AxesVisible.Tooltip=Prika\u017Ei ali skrij koordinatne osi +TToolBar.Button.TrackControl.Tooltip=Prika\u017Ei ali skrij kontrolo sledi +TTrack.Dialog.StepSizeWarning.Message1=Pozor: nekatere sledi so bile ozna\u010Dene pri koraku, ve\u010Djem od 1, presko\u010Dene sli\u010Dice ne bodo ozna\u010Dene. +TTrack.Dialog.StepSizeWarning.Message2=Sprememba velikosti koraka lahko zato pu\u0161\u010Da luknje v podatkovni mno\u017Eici. +TTrack.Dialog.StepSizeWarning.Message3=Hitrosti in pospe\u0161kov okrog lukenj ne moremo dolo\u010Diti, dokler ne ozna\u010Dimo vseh korakov. +TTrack.Dialog.StepSizeWarning.Title=Pozor +TTrack.Dialog.SkippedStepWarning.Message1=Pozor: preskakovanje korakov pri ozna\u010Devanju polo\u017Eajev pu\u0161\u010Da luknje v podatkovni mno\u017Eici. +TTrack.Dialog.SkippedStepWarning.Title=Pozor +TTrack.Dialog.SkippedStepWarning.Checkbox=Tega ne prika\u017Ei ve\u010D +TTrack.Locked.Hint=zaklenjeno +TTrack.AngleField.Radians.Tooltip=Kot v radianih +TTrack.AngleField.Degrees.Tooltip=Kot v stopinjah +TTrack.AngleField.Popup.Radians=Preklop na radiane +TTrack.AngleField.Popup.Degrees=Preklop na stopinje +TTrackBar.Memory.Menu.SetSize=Nastavi velikost pomnilnika... +TTrackBar.Button.Version=Sedaj na voljo: verzija +TTrackBar.Popup.MenuItem.Upgrade=Posodobi sedaj... +TTrackBar.Popup.MenuItem.Ignore=Ignoriraj +XuggleVideo.MenuItem.SmoothPlay=mehko predvajanje (je lahko po\u010Dasno) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Merilni trak +CircleFootprint.Circle=krog +CircleFootprint.FilledCircle=zapolnjen krog +CircleFootprint.Dialog.Title=Izgled kroga +CircleFootprint.Dialog.Label.Radius=Polmer +CircleFootprint.Dialog.Checkbox.Bold=Poudarjeno +CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot +LineProfile.Hint.Marking=Profil \u010Drte ozna\u010Di\u0161 z vle\u010Denjem mi\u0161ke +PageTView.Button.Page=Stran +PageTView.MenuItem.ClosePage=Zapri stran +PointMass.Hint.Marking=novo to\u010Dko ozna\u010Di\u0161 s klikom mi\u0161ke, s tipko Enter podvoji\u0161 prej\u0161nji korak +PrefsDialog.Dialog.NewVersion.Title=Nadgradnje +PrefsDialog.Dialog.NewVersion.Message1=Verzija +PrefsDialog.Dialog.NewVersion.Message2=je na voljo na +PrefsDialog.Dialog.NewVersion.None.Message=Trenutno ni na voljo nove verzije. +RGBRegion.Hint.Marking=S klikom na pi\u0161ko ozna\u010Di\u0161 sredi\u0161\u010De podro\u010Dja +TMenuBar.MenuItem.Restore=Restavriraj poglede +TrackControl.StretchVectors.None=Ne raztegni +TViewChooser.Maximize.Tooltip=Maksimiraj ta pogled +TViewChooser.Restore.Tooltip=Restavriraj poglede +Vector.Hint.Marking=nov vektor ozna\u010Di\u0161 z vle\u010Denjem, s tipko Enter podvoji\u0161 predhodni korak +WorldTView.Button.World=Svet + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Opozorila +PrefsDialog.Checkbox.WarnIfNoEngine=Ni video pogona +PrefsDialog.Checkbox.WarnIfXuggleError=Ne usodne napake Xuggle +PropertiesDialog.Title=Lastnosti +PropertiesDialog.Label.Author=Avtor +PropertiesDialog.Label.Contact=Kontakt +TActions.Action.Properties=Lastnosti... +TActions.Action.OpenBrowser=Odpri brkljalnik knji\u017Enice... +TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.ClickToCancel=(Klikni za brisanje) +TFrame.Dialog.StalledVideo.Title=Napaka pri nalaganju videa +TFrame.Dialog.StalledVideo.Message0=Nalaganje videa se je zaustavilo. Morda je to za\u010Dasno. +TFrame.Dialog.StalledVideo.Message1=Nalaganje lahko zaustavi\u0161 ali nadaljuje\u0161 s \u010Dakanjem. +TFrame.Dialog.StalledVideo.Message2=Druge opcije za odpiranje tega videa vklju\u010Dujejo: +TFrame.Dialog.StalledVideo.Message3=1. Uporabi programe za konverzijo videa v drug format. +TFrame.Dialog.StalledVideo.Message4=2. V izbiralniku datotek ali v preferencah izberi QuickTime. +TFrame.Dialog.StalledVideo.MessageMac=2. Odpri Tracker v 32-bitnem Java VM in ga odpri s QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stop +TFrame.Dialog.StalledVideo.Button.Wait=\u010Cakaj +Tracker.Dialog.NoVideoEngine.Checkbox=Tega ne prika\u017Ei ve\u010D +TrackerIO.ZipFileFilter.Description=Datoteke ZIP +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle je naletel na naslednje napake pri odpiranju tega videa: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Vse napake niso usodne. Za polna obvestila o napakah izberi Pomo\u010D|Zapis obvestil. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u010Ce Xuggle izpade, morda lahko odpre\u0161 video s QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Opomba: Na Mac OSX mora te\u010Di Tracker na 32-bitnem Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Napaka Xuggle +TrackerIO.ErrorFFMPEG.LogMessage=Za ve\u010D podrobnosti vklju\u010Di opozorila Xuggle v pogovornem oknu s preferencami (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Odpri brkljalnik digitalne knji\u017Enice OSP + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=Datoteke ne najdem +TFrame.Dialog.NoTRKInComPADRE.Message=Za vozel ne najdem datoteke Tracker +TFrame.Dialog.OSPUnavailable.Title=Ne morem povezati +TFrame.Dialog.OSPUnavailable.Message=OSP stre\u017Enik ni na voljo.\nPreveri povezavo z omre\u017Ejem. + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Analiti\u010Dni delec +DynamicParticle.Builder.Title=Dinami\u010Dni delec (Kartezi\u010Dni) +DynamicParticlePolar.Builder.Title=Dinami\u010Dni delec (Polarni) +DynamicSystem.Builder.Title=Dinami\u010Dni sistem (Interni) +PropertiesDialog.Button.CopyFilePath=Kopiraj pot do datoteke +PropertiesDialog.Button.CopyVideoPath=Kopiraj pot do videa +PropertiesDialog.Tab.TrackerFile=Datoteka Tracker +PropertiesDialog.Tab.Metadata=Metapodatki +PropertiesDialog.Header.Property=Lastnost +PropertiesDialog.Header.Value=Vrednost +TActions.Action.OpenURL=Odpri URL... +TActions.Dialog.OpenURL.Title=Odpri URL +TActions.Dialog.OpenURL.Message=Vnesi URL za spletni video ali datoteko Tracker +TActions.Dialog.AboutVideo.Name=Ime + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Medpomnjene spletne strani +PrefsDialog.Button.ClearCache=Brisanje + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-klik za ponovno ozna\u010Ditev poudarjenega polo\u017Eaja +PointMass.Remarking.Hint=klik z mi\u0161ko za ponovno ozna\u010Ditev polo\u017Eaja +PointMass.PositionSelected.Hint=Vle\u010Di ali vnesi polo\u017Eaj na orodni vrstici +PointMass.VectorSelected.Hint=premik z vle\u010Denjem +Vector.Remark.Hint=shift-klik za ponovno ozna\u010Ditev poudarjene konice +Vector.TipSelected.Hint=Vle\u010Di ali vnesi komponente v orodni vrstici +Vector.HandleSelected.Hint=premik z vle\u010Denjem +Vector.Remarking.Hint=klik z mi\u0161ko za ponovno ozna\u010Ditev konice +AutoTracker.Label.Search=Iskanje +AutoTracker.Label.Target=Cilj +AutoTracker.Label.Frame=Sli\u010Dica +AutoTracker.Label.Point=To\u010Dka +AutoTracker.Label.Template=\u0160ablona +AutoTracker.Label.Track=Sled +AutoTracker.Label.Match=Ujemanje +AutoTracker.Label.NoTemplate=Ni \u0161ablone +AutoTracker.Label.EvolutionRate=Hitrost razvoja +AutoTracker.Label.Automark=Automatsko ozna\u010Devanje +AutoTracker.Info.Instructions=Klikni na gumb za iskanje ujemanja v prikazanem iskalnem podro\u010Dju. +AutoTracker.Info.KeyFrame.Instructions1=Ta klju\u010Dna sli\u010Dica definira \u0161ablono in prikazan cilj. Klikni na gumb za iskanjeujemanja v \u0161abloni. +AutoTracker.Info.KeyFrame.Instructions2=Cilj, \u0161ablono ali iskalno podro\u010Dje lahko vle\u010Demo in tako premaknemo ali spremenimo velikost. +AutoTracker.Info.MouseOver.Instructions=Ve\u010D o nastavitvah lahko izvemo z mi\u0161ko nad posamezno kontrolo. +AutoTracker.Info.Mask1=\u0160ablona je slika, ki naj bi se ujemala. Zacne v klju\u010Dni sli\u010Dici in se razvija v ujemanje s preminjanjem oblike in barve. +AutoTracker.Info.Mask2=Nivo avtomatskega ozna\u010Devanja je minimalna ocena ujemanja, ki jo terja avtomatsko ozna\u010Devanje. +AutoTracker.Info.Mask.Instructions=\u0160ablono premaknemo ali spremenimo njeno velikost z vle\u010Denjem njenega roba ali ogli\u0161\u010Da (le v klju\u010Dnih sli\u010Dicah). Naravnaj hitrost razvoja in nivoje avtomatskega ozna\u010Devanja. +AutoTracker.Info.Mask.Tip=Nizki novoji avtomatskega ozna\u010Devanjalahko povzro\u010Dijo napa\u010Dno ujemanje--raje poskusi s pove\u010Danjem hitrosti razvoja. +AutoTracker.Info.Search=I\u0161\u010De se najbolj\u0161e ujemanje v iskalnem podro\u010Dju. +AutoTracker.Info.SearchOnAxis=I\u0161\u010De se najbolj\u0161e ujemanje na osi x v iskalnem podro\u010Dju. +AutoTracker.Info.Search.Instructions=Iskalno podro\u010Dje premaknemo ali spremenimo velikost z vle\u010Denjem ro\u010Dic na robovih ali ogli\u0161\u010Dih. Z odkljukanjem izberemo os x in opcije gledanja naprej. +AutoTracker.Info.Search.Tip=V veliko primerih ni potrebno, da je iskalno podro\u010Dje veliko. Opcija gledanja naprej avtomatsko premika iskalno podro\u010Dje na napovedane polo\u017Eaje. +AutoTracker.Info.Target=Cilj je, kjer je ozna\u010Dena ciljna to\u010Dka sledi. +AutoTracker.Info.Target.Instructions=Cilj premikamo z vle\u010Denjem (le v klju\u010Dnih sli\u010Dicah). Iz spustnih seznamov izberemo ciljno sled in to\u010Dko. +AutoTracker.Info.Title.Settings=Nastavitve +AutoTracker.Info.Title.Tip=Namig +AutoTracker.Info.SelectTrack=Izberi ali tvori sled in to\u010Dko, ki bi rad avtomatsko sledil. +AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: +AutoTracker.Info.NewKeyFrame=--korak nazaj in zamenjaj hitrost razvoja ali klikni skupaj s SHIFT in CTRL za definiranje nove klju\u010Dne sli\u010Dice +AutoTracker.Info.Replace=--sprejmi ujemanje in nadomesti obstoje\u010Do to\u010Dko +AutoTracker.Info.Keep=--obdr\u017Ei obstoje\u010Do to\u010Dko +AutoTracker.Info.PossibleReplace=Ni najdeno mo\u017Eno ujemanje za nadome\u0161\u010Danje obstoje\u010De to\u010Dke. Ima\u0161 mo\u017Enosti : +AutoTracker.Wizard.Button.Accept=Sprejmi +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=presko\u010Di +AutoTracker.Wizard.Button.Replace=Nadomesti +AutoTracker.Wizard.Button.Keep=Obdr\u017Ei +AutoTracker.Wizard.Button.Search=Iskanje +AutoTracker.Wizard.Button.SearchThis=I\u0161\u010Di to +AutoTracker.Wizard.Button.SearchNext=SI\u0161\u010Di naslednje +AutoTracker.Wizard.Button.Delete=Bri\u0161i +AutoTracker.Wizard.Button.ShowKeyFrame=Prikaz klju\u010Dne sli\u010Dice +AutoTracker.Wizard.Button.DeleteKeyFrame=Brisanje klju\u010Dne sli\u010Dice +AutoTracker.Wizard.Checkbox.LookAhead=Glej naprej +AutoTracker.Wizard.Checkbox.XAxis=Le os X +AutoTracker.Wizard.Menuitem.DeleteThis=Ta to\u010Dka +AutoTracker.Wizard.Menuitem.DeleteLater=Kasnej\u0161e to\u010Dke +AutoTracker.Wizard.Menuitem.DeleteAll=vse to\u010Dke +TToolBar.Button.AutoTracker.Tooltip=prika\u017Ei ali skrij avtomatski sledilec +MainTView.Popup.MenuItem.ZoomIn=Pribli\u017Eaj +MainTView.Popup.MenuItem.ZoomOut=oddalji +MainTView.Popup.MenuItem.ZoomToFit=Zoom do ujemanja +TrackerIO.Dialog.DurationVaries.Title=Spremenljiva dol\u017Eina trajanja sli\u010Dic +TrackerIO.Dialog.DurationVaries.Message1=Ta video vklju\u010Duje sli\u010Dice s trajanjem, ki se razlikuje od srednjega za ve\u010D kot +TrackerIO.Dialog.DurationVaries.Message2=za to\u010Dno dolo\u010Danje hitrosti in pospe\u0161kov moramo take sli\u010Dice izlo\u010Diti iz +TrackerIO.Dialog.DurationVaries.Message3=ra\u010Dunanj z nastavitvijo za\u010Detne in kon\u010Dne sli\u010Dice video izrezka. +TrackerIO.Dialog.DurationVaries.Message4=Sli\u010Dice, ki morajo biti izlo\u010Dene: +TrackerIO.Dialog.DurationVaries.Message5=Srednje trajanje in frekvenca sli\u010Dic, \u010De izlo\u010Dimo: +TFrame.Dialog.LibraryError.Title=Napaka +TFrame.Dialog.LibraryError.Message=Za vozel ne morem nalo\u017Eiti nobenega vira + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=Ozna\u010Dimo s shift-klik +PrefsDialog.Label.Path=Pot +PrefsDialog.Checkbox.ClearCacheOnExit=pri izstopu po\u010Disti +PrefsDialog.FileChooser.Title.Cache=Nastavi medpomnenje +PrefsDialog.FileFilter.Directories=Direktoriji +Tracker.Action.AboutThreads=O nitih... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Nastavi Java VM +PrefsDialog.FileFilter.JRE=Direktoriji in Java VM +PrefsDialog.Version.BorderTitle=Verzija Tracker +PrefsDialog.Version.Default=privzeto +PrefsDialog.Tab.ClearCacheOnExit=Brisanje ob izstopu +PrefsDialog.Run.BorderTitle=Programi, pognani ob zagonu +PrefsDialog.FileChooser.Title.Run=Izberi izvajalno datoteko +PrefsDialog.Button.Save=Shrani +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=Datoteke README ne najdem +Popup.MenuItem.Algorithm=Algoritmi... +AlgorithmDialog.Button.FiniteDifference=Koncne diference +AlgorithmDialog.Button.BounceDetect=Odkrivanje trkov +AlgorithmDialog.TitledBorder.Choose=Izberi algoritem za ra\u010Dunanje hitrosti in pospe\u0161ka: +AlgorithmDialog.Title=Algoritmi +AlgorithmDialog.FiniteDifference.Message1=To je privzeti algoritem. +AlgorithmDialog.FiniteDifference.Message2=Hitrost: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Pospe\u0161ek: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Ta algoritem meh\u010Da hitrosti in pospe\u0161ke, vendar hkrati odkriva nagle spremembe hitrosti. +AlgorithmDialog.BounceDetect.Message2=Previdno: lahko povzro\u010Da napake. Ve\u010D o tem poglej: +TMenuBar.Menu.Diagnostics=Diagnostika + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Neveljaven XML +Tracker.Dialog.Invalid.Message=Datoteke ne morem brati. +TrackPlottingPanel.Popup.Menu.CompareWith=Primerjava z +TrackerPanel.DataBuilder.TrackType.Unknown=neznano +TrackerPanel.DataBuilder.Button.Load.Tooltip=Nalo\u017Ei podatkovne funkcije iz datoteke XML +TrackerPanel.DataBuilder.Button.Save.Tooltip=Shrani podatkovne funkcije v datoteko XML +TrackerPanel.DataBuilder.Load.Title=Nalo\u017Ei podatkovne funkcije +TrackerPanel.DataBuilder.Load.Message=Izberi funkcije za nalaganje: +TrackerPanel.DataBuilder.Save.Title=Shrani podatkovne funkcije +TrackerPanel.DataBuilder.Save.Message=Izberi funkcije za shranjevanje: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Nalo\u017Ei v vse +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Nalo\u017Ei le v +TrackerPanel.DataBuilder.Dialog.Load.Title=Izbira sledi +TrackerPanel.DataBuilder.Dialog.Load.Message=\u017Deli\u0161 nalo\u017Eiti funkcije v vse sledi tega tipa +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Napa\u010Den tip sledi +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Datoteka ne definira podatkovnih funkcij za tip sledi +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Ne morejo biti nalo\u017Eene v tip +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Napa\u010Den tip +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Datoteka ne definira podatkovnih funkcij. +TToolbar.Button.Refresh=Osve\u017Ei podatke in poglede + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=ZIP vir je bil shranjen kot +ExportTRKDialog.Complete.Message2=Ali \u017Eeli\u0161, da ga odpremo sedaj v Tracker? +ExportTRKDialog.Complete.Title=Izvoz zaklju\u010Den +ExportTRKDialog.Title=Izvoz vir ZIP +ExportTRKDialog.Message1=To (1) izvozi video izrezek, (2) konvertira podatke iz zavihka, da se ujemajo z izvo\u017Eenim videom, (3) shrani konvertirani zavihek kot novo Tracker datoteko. +ExportTRKDialog.Message2=Datoteke Tracker in video pomnimo v istem direktoriju pod istim imenom, a z razlicnimi podalj\u0161ki. +TMenuBar.MenuItem.TabClip=Vir ZIP +TMenuBar.Menu.CalibrationTools=Kalibracijska orodja +TrackerIO.Dialog.DurationVaries.Button.SetClip=Nastavi priporo\u010Dljiv izrezek +TrackerIO.Dialog.DurationVaries.Start=za\u010Detek +TrackerIO.Dialog.DurationVaries.End=konec +TrackerIO.Dialog.DurationVaries.Recommended=Priporo\u010Dljiv izrezek + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Prilepi konce +AttachmentInspector.Label.End=Konec +AttachmentInspector.Label.Vertex=Verteks +AttachmentInspector.Header.PointName=Ime +AttachmentInspector.Header.AttachedTo=Prilepi k +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Prilepi konce... +PerspectiveTrack.Corner=vogal +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=\u010Das +Protractor.Data.Description.1= kot kotomera +Protractor.Data.Description.2=dol\u017Eina ro\u010Dice 1 +Protractor.Data.Description.3=dol\u017Eina ro\u010Dice 2 +Protractor.Data.Description.4=\u0161tevilka koraka +Protractor.Data.Description.5=\u0161tevilka sli\u010Dice +TapeMeasure.Data.Description.0=\u010Das +TapeMeasure.Data.Description.1=dol\u017Eina +TapeMeasure.Data.Description.2=kot, merjen od osi +x +TapeMeasure.Data.Description.3=\u0161tevilka koraka +TapeMeasure.Data.Description.4=\u0161tevilka slicice + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=neiskano +AutoTracker.Info.KeyFrame=Klju\u010Dna sli\u010Dica +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Ta klju\u010Dna sli\u010Dica +AutoTracker.Wizard.Menuitem.DeleteThisMatch=To ujemanje +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Kasnej\u0161a ujemanja +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Dodaj +Dialog.Button.Remove=Odstrani +PrefsDialog.Button.ClearHost=Po\u010Disti ra\u010Dunalnik +PrefsDialog.Button.ClearHost.Tooltip=brisanje vseh datotekiz medpomnilnika OSP, povezanih z izbranim spletnim ra\u010Dunalnikom +PrefsDialog.Button.ClearCache.Tooltip=brisanje vseh datotek iz medpomnilnika OSP +TActions.Action.SaveZip=Izvoz vira ZIP +ThumbnailDialog.Title=Izvoz slikovne ikone +ThumbnailDialog.Settings.Title=Opcije slikovne ikone +ThumbnailDialog.Label.CurrentImage=teko\u010Da slika +ThumbnailDialog.Label.FrameNumber=sli\u010Dica +ThumbnailDialog.Label.StepNumber=korak +ThumbnailDialog.View.VideoOnly=Le video +ThumbnailDialog.View.MainView=Glavni pogled +ThumbnailDialog.View.WholeFrame=Celotna sli\u010Dica +ThumbnailDialog.Format.PNG=PNG slika +ThumbnailDialog.Format.JPG=JPEG slika +ThumbnailDialog.Chooser.SaveThumbnail.Title=Shrani slikovno ikono +ThumbnailDialog.Subtitle.Image=Slika +TMenuBar.MenuItem.Thumbnail=Slikovna ikona +TToolBar.Button.SaveZip.Tooltip=Izvoz vira ZIP za OSP brkljalnik digitalnih knji\u017Enic +TTrack.MenuItem.DeletePoint=Bri\u0161i izbrani korak +ZipResourceDialog.Title=Izvozi vir ZIP +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Ime +ZipResourceDialog.Label.Description=Opis +ZipResourceDialog.Label.Keywords=Klju\u010Dne besede +ZipResourceDialog.Label.Link=Zunanji Link +ZipResourceDialog.Label.HTML=HTML vir +ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Uspe\u0161no +ZipResourceDialog.Border.Title.Documentation=HTML Dokumentacija +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Slikovna ikona +ZipResourceDialog.FileChooser.SaveZip.Title=Izvoz vira ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Dodaj datoteko viru ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Odpri datoteko HTML +ZipResourceDialog.Button.AddFiles=Dodaj datoteke +ZipResourceDialog.Button.ThumbnailSettings=Opcije za slikovne ikone +ZipResourceDialog.Checkbox.TrimVideo=Obre\u017Ei +ZipResourceDialog.AddHTMLInfo.Title=Dodaj inform. datoteko HTML +ZipResourceDialog.AddHTMLInfo.Message1=\u017Deli\u0161 dodati informacijsko datoteko HTML +ZipResourceDialog.AddHTMLInfo.Message2=viru ZIP? +ZipResourceDialog.HTMLField.DefaultText=\u010De ni ni\u010D dolo\u010Denega, bo datoteka tvorjena od za\u010Detka +ZipResourceDialog.Dialog.AddFiles.Title=Dodajanje datotek HTML in PDF +ZipResourceDialog.Tooltip.HTML=Pot do izvorne datoteke HTML(\u010De ni nobene, bo datoteka tvorjena od za\u010Detka) +ZipResourceDialog.Tooltip.Author=Avtorji tega vira +ZipResourceDialog.Tooltip.Title=Prikaz imena tega vira(ne imena datoteke) +ZipResourceDialog.Tooltip.Description=Koristen opis tega vira +ZipResourceDialog.Tooltip.Keywords=Seznam klju\u010Dnih besed za iskanje v brkljalniku digitalne knji\u017Enice +ZipResourceDialog.Tooltip.Contact=Kontktni podatki o avtorju (ustanova, e-mail, spletna stran, itd.) +ZipResourceDialog.Tooltip.Link=URL zunanje HTML datoteke z ve\u010D podatki o tem viru +ZipResourceDialog.Tooltip.ThumbnailSettings=Spremeni pogled na slikovno ikono, velikost ali tip datoteke +ZipResourceDialog.Tooltip.AddFiles=Dodajanje HTML in PDF datotek viru ZIP +ZipResourceDialog.Tooltip.TrimVideo=Odkljukaj za izvoz video izrezka, razkljukaj za uporabo originalnega videa +ZipResourceDialog.Tooltip.LoadHTML=Za nalaganje informacijske HTML datoteke uporabi izbiralnik datotek diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties index 2f13012d..165de2a2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties @@ -1,1196 +1,1196 @@ -# This is the swedish tracker.properties file -# translated by Jonas Persson, Sep 2011 - -Calibration.Name=Kalibreringspunkter -Calibration.New.Name=kalibreringspunkter -CenterOfMass.Name=Masscentrum -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Välj massor... -CenterOfMassInspector.Title=Masscentrum -CenterOfMassInspector.Border.Title=Välj massor -ConfigInspector.Border.Title=Önskade egenskaper -ConfigInspector.Title=Preferenser -ConfigInspector.Button.SaveAsDefault=Spara som standard -CoordAxes.Name=Axlar -CoordAxes.New.Name=axlar -Dialog.Button.Cancel=Avbryt -Dialog.Button.OK=OK -Dialog.Button.Close=Stäng -Dialog.Button.All=Alla -Dialog.Button.None=Inga -Dialog.Button.Copy=Kopiera -Dialog.Button.Update=Updatera -Dialog.Button.SelectAll=Välj alla -Footprint.Diamond=diamant -Footprint.BoldDiamond=kraftig diamant -Footprint.SolidDiamond=fylld diamant -Footprint.Triangle=triangel -Footprint.BoldTriangle=kraftig triangel -Footprint.SolidTriangle=fylld triangel -Footprint.Circle=cirkel -Footprint.BoldCircle=kraftig cirkel -Footprint.SolidCircle=fylld cirkel -Footprint.VerticalLine=vertikal linje -Footprint.BoldVerticalLine=kraftig vertikal linje -Footprint.HorizontalLine=horisontell linje -Footprint.BoldHorizontalLine=kraftig horisontell linje -Footprint.Crosshair=hårkors -Footprint.BoldCrosshair=kraftig hårkors -Footprint.SimpleAxes=enkel axel -Footprint.BoldSimpleAxes=kraftig enkel axel -Footprint.Spot=punkt -Footprint.Line=linje -Footprint.BoldLine=kraftig linje -Footprint.Outline=kontur -Footprint.BoldOutline=kraftig kontur -Footprint.Arrow=pil -Footprint.BoldArrow=kraftig pil -Footprint.DoubleArrow=dubbel pil -Footprint.BoldDoubleArrow=kraftig dubbel pil -Footprint.2xArrow=2x pil -Footprint.Bold2xArrow=kraftig 2x pil -Footprint.4xArrow=4x pil -Footprint.Bold4xArrow=kraftig 4x pil -Footprint.DashArrow=streckad pil -Footprint.BoldDashArrow=kraftig streckad pil -Footprint.BigArrow=stor pil -Footprint.BigDashArrow=stor streckad pil -LineProfile.Name=Linje Profil -LineProfile.New.Name=profil -LineProfile.Data.Brightness=ljusstryka -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=röd -LineProfile.Data.Green=grön -LineProfile.Data.Blue=blå -LineProfile.Data.Weighting=antal -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=Zooma -MainTView.Popup.MenuItem.ToFit=Anpassa -OffsetOrigin.Name=Offset Origo -OffsetOrigin.New.Name=offset origo - -PlotTrackView.Button.PlotCount=Diagram -PlotTrackView.Button.PlotCount.ToolTip=Sätt diagram räknare - -PointMass.Name=Punkt massa -PointMass.New.Name=massa -PointMass.MenuItem.VectorsToPosition=Till position -PointMass.MenuItem.Velocity=Hastighet -PointMass.MenuItem.Acceleration=Acceleration -Star.Name=Stjärna -Star.New.Name=stjärna -TableTrackView.Action.CopyData=Kopiera data -TableTrackView.Button.SelectTableData=Tabell -TableTrackView.Button.SelectTableData.ToolTip=välj tabell-kolumner -TableTrackView.Popup.MenuItem.Analyze=Analysera... -TableTrackView.Dialog.Border.Title=Synlig: -TActions.Action.Description=Anteckningar -TActions.Action.ClearTracks=Radera -TActions.Action.NewTab=Nytt fönster -TActions.Action.Copy=kopiera -TActions.Action.Paste=Limma in -TActions.Action.Open=Öppna... -TActions.Action.Close=Stäng Tab -TActions.Action.Import=Importera... -TActions.Action.Save=Spara Tab -TActions.Action.SaveAs=Spara Tab som... -TActions.Action.Export=Exportera... -TActions.Action.CaptureVideo=Spela in Video... -TActions.Action.Delete=Radera -TActions.Action.Config=Preferenser... -TActions.Action.AxesVisible=Synlig -TActions.Action.TapeVisible=Synlig -TActions.Action.Print=Skriv ut... -TActions.Action.ClearFilters=Radera -TActions.Action.ImportVideo=Importera... -TActions.Action.CloseVideo=Stäng -TActions.Action.CloseAll=Stäng alla -TActions.Action.Exit=Avsluta -TActions.Dialog.PrintError.Message=Ett skrivarfel uppstod. -TActions.Dialog.PrintError.Title=Skrivarfel -TActions.Dialog.Description.Title=Anteckningar: -TActions.Dialog.DeleteLockedTracks.Message=Vissa spår är låsta. Radera ändå? -TActions.Dialog.DeleteLockedTracks.Title=Radera låsta spår? -TActions.Dialog.NewPointMass.Title=Ny punkt-massa -TapeMeasure.Name=Måttband -TapeMeasure.New.Name=måttband -TapeMeasure.MenuItem.Fixed=Fixerad position -TFrame.View.Plot=Plot fönster -TFrame.View.Table=Tabell fönster -TFrame.View.World=World fönster -TFrame.View.Video=Video fönster -TFrame.Dialog.Help.Title=Tracker Hjälp -TMenuBar.Menu.File=Fil -TMenuBar.Menu.Edit=Editera -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Spår -TMenuBar.Menu.Coords=Koordinat system -TMenuBar.Menu.Window=Fönster -TMenuBar.Menu.Help=Hjälp - -TMenuBar.MenuItem.EditProperties=Egenskaper... -TMenuBar.MenuItem.VideoVisible=Synligt -TMenuBar.MenuItem.VideoFilters=Filter -TMenuBar.MenuItem.NewVideoFilter=Ny -TMenuBar.MenuItem.NewTrack=Ny -TMenuBar.MenuItem.CoordsLocked=Låst -TMenuBar.MenuItem.CoordsFixedOrigin=Fixerad Origo -TMenuBar.MenuItem.CoordsFixedAngle=Fixerad Vinkel -TMenuBar.MenuItem.CoordsFixedScale=Fixerad Skala -TMenuBar.MenuItem.CoordsRefFrame=Referens-system - -TMenuBar.MenuItem.CoordsDefault=Default -TMenuBar.MenuItem.WindowRight=Fönster till höger -TMenuBar.MenuItem.WindowBottom=Fönster nederst -TMenuBar.MenuItem.PlayAllSteps=Visa alla steg -TMenuBar.MenuItem.Record=Spela in -TMenuBar.MenuItem.MatSize=Mat Size -TMenuBar.MenuItem.Language=Språk -TMenuBar.MenuItem.DeleteTrack=Radera -TMenuBar.MenuItem.TrackerHelp=Tracker Hjälp... -TMenuBar.MenuItem.MessageLog=Meddelande Logg... -TrackControl.Name=Spår Kontroll -TrackControl.Button.NewTrack=Skapa -TrackControl.Button.NewTrack.ToolTip=Skapa nytt spår -TrackControl.Button.Trails.ToolTip=Sätt spår längd -TrackControl.Button.Labels.ToolTip=Visa eller dölj numrering -TrackControl.Button.StretchVectors.ToolTip=Vektorer -TrackControl.Button.Accelerations.ToolTip=Visa eller dölj accelerations vektorer -TrackControl.Button.Xmass.ToolTip=Multiplicera vektorer med massan -TrackControl.Button.Vectors.ToolTip=Vektorer -TrackControl.Button.Velocities.ToolTip=Visa eller dölj hastighetsvektorer -TrackControl.Button.Properties.ToolTip=Klicka för att välja -TrackControl.Button.Positions.ToolTip=Visa eller dölj positioner -Tracker.Popup.MenuItem.Snapshot=Snapshot... -Tracker.Popup.MenuItem.Help=Hjälp... -Tracker.Cursor.Crosshair.Description=Hårkors markör -Tracker.Action.AboutTracker=Om Tracker... -Tracker.Dialog.AboutTracker.Title=Om Tracker -Tracker.Action.AboutJava=Om Java... -Tracker.Dialog.AboutJava.Title=Om Java -Tracker.Dialog.AboutJava.UnknownVersion=Okänd -Tracker.Dialog.AboutJava.Message=Java version -Tracker.Action.AboutQT=Om QuickTime... -Tracker.Dialog.AboutQT.Title=Om QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: -Tracker.Dialog.NoQT.Title=QTJava.zip kan ej hittas -Tracker.Dialog.NoQT.Message1=QuickTime for Java verkar inte vara installerad. -Tracker.Dialog.NoQT.Message2=om du önskar analysera QuickTime filmer, installera om QuickTime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MÅSTE VÄLJAS när QuickTime installeras. -Tracker.Dialog.UpdateQT.Title=Uppdatera QTJava.zip -Tracker.Dialog.UpdateQT.Message1=En nyare version av QTJava.zip har hittats -Tracker.Dialog.UpdateQT.Message2=Vill du uppdatera den existerande filen? -Tracker.Dialog.CopyQT.Title=Kopiera QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime har installerats, men innan Tracker kan använda den måste: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip kopieras från -Tracker.Dialog.CopyQT.Message3= till -Tracker.Dialog.CopyQT.Message4= 2. Tracker måste startas om. -Tracker.Dialog.CopyQT.Message5=Vill du kopiera QTJava.zip nu? -Tracker.Dialog.CopyFailed.Title=Kopiering misslyckades -Tracker.Dialog.CopyFailed.Message=QTJava.zip kunde inte kopieras. -Tracker.Dialog.CopiedTo.Title=Kopieringen lyckades -Tracker.Dialog.CopiedTo.Message1=QTJava.zip har kopierats till -Tracker.Dialog.CopiedTo.Message2=Tracker måste startas om och avslutas nu. -Tracker.Splash.Loading=Läser in -TrackerIO.Dialog.Import.Title=Importerar Tracker Fil -TrackerIO.Dialog.Import.Message=Välj objekt att importera -TrackerIO.Dialog.ImportVideo.Title=Importera Video -TrackerIO.Dialog.Export.Title=Exportera -TrackerIO.Dialog.Export.Message=Välj objekt att exportera -TrackerIO.Dialog.ReplaceFile.Title=Ersätt existerande fil? -TrackerIO.Dialog.ReplaceFile.Message=existerar redan. Vill du ersätta den? -TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML -TrackerIO.Dialog.NotTrackerXML.Message=innehåller xml data för en annan applikation. -TrackerIO.Dialog.BadVideo.Message=Filen är av en okänd video typ: -TrackerIO.Dialog.BadVideo.Title=Okänd Video Fil -TrackerPanel.NewTab.Name=namnlös -TrackerPanel.DragToMark.Hint=Skift-dra för att markera -TrackerPanel.ClickToMark.Hint=Skift-klicka för att markera -TrackerPanel.Dialog.LoadFailed.Title=Ogiltig Tracker Fil -TrackerPanel.Dialog.LoadFailed.Message=Filen är inte en giltig Tracker fil: -TrackerPanel.Dialog.SaveChanges.Title=Spara ändringar -TrackerPanel.Dialog.SaveChanges.Message=Spara ändringar som -TrackPlottingPanel.Popup.MenuItem.Lines=Linjer -TrackPlottingPanel.Popup.MenuItem.Points=Punkter -TrackPlottingPanel.Popup.MenuItem.Scale=Skalera... -TrackPlottingPanel.Popup.MenuItem.Print=Skriv... -TrackPlottingPanel.Popup.MenuItem.Measure=Skalera till fönster -TrackPlottingPanel.Popup.MenuItem.Analyze=Analysera... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zooma in -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zooma ut -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoskalera -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zooma till box -TrackPlottingPanelInspector.Title=Skala -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Sätt fotspår -TToolBar.Dropdown.SelectedTrack.Tooltip=Välj ett spår -TToolBar.Dropdown.SelectedTrack.None=Inget -TTrack.MenuItem.Delete=Radera -TTrack.MenuItem.Color=Färg... -TTrack.Dialog.Color.Title=Välj spår färg -TTrack.MenuItem.Name=Namn... -TTrack.MenuItem.Footprint=Fotspår -TTrack.MenuItem.Description=Notat... -TTrack.MenuItem.Visible=Synlig -TTrack.MenuItem.TrailVisible=Spår synligt -TTrack.MenuItem.Autostep=Autosteg -TTrack.MenuItem.MarkByDefault=Förinställd markering -TTrack.MenuItem.Locked=Låst -TTrack.MenuItem.Delete=Radera -TTrack.Name.None=Inget namn -TTrack.Dialog.Description.Title=Notat: -TTrack.Dialog.Name.Title=Sätt Namn -TTrack.Dialog.Name.Label=Namn: -TViewChooser.Button.Choose.Tooltip=Välj en vy -Vector.Name=Vektor -Vector.New.Name=vektor -Vector.MenuItem.ToOrigin=Till origo -Vector.MenuItem.Label=Synlig etikett -VectorSum.Name=Vektor summa -VectorSum.New.Name=summa -VectorSum.MenuItem.Inspector=Välj Vektorer... -VectorSumInspector.Title=Vektor Summa -VectorSumInspector.Border.Title=Välj vektorer -WorldTView.Popup.MenuItem.Projectile=Projektil modell - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Analytisk Partikel Modell -AnalyticParticle.Inspector.Title=Analytisk Partikel Modell -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=radie 4 -CircleFootprint.Circle_6=radie 6 -CircleFootprint.Circle_8=radie 8 -DynamicParticle.Name=Dynamisk Partikel Modell (Cartesisk) -DynamicParticle.Inspector.Title=Dynamisk Partikel Modell -DynamicParticle.Property.ForceX=kraft x -DynamicParticle.Property.ForceY=kraft y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Fixerad Position -ParticleModel.New.Name=modell -ParticleModel.MenuItem.InspectModel=Modell-editor... -ParticleModel.Inspector.Button.Undo=Ã…ngra -ParticleModel.Inspector.Button.Redo=Gör om -ParticleModel.Inspector.Button.Close=Stäng -ParticleModel.Inspector.Button.Help=Hjälp - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=X endast -Calibration.Axes.YOnly=Y endast -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Välj kalibrerings axel -Calibration.Label.Axes=axlar -Calibration.Dialog.InvalidCoordinates.Title=Ogiltiga koordinater -Calibration.Dialog.InvalidCoordinates.Message=Punkterna kan inte ha samma rum-koordinater. -Calibration.Dialog.InvalidXCoordinates.Message=Punkterna kan inte ha samma x-koordinater. -Calibration.Dialog.InvalidYCoordinates.Message=Punkterna kan inte ha samma y-koordinater. -SpectralLineFilter.Title=Gas Spektra -SpectralLineFilter.H=Väte -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Kvicksilver -TFrame.View.Unknown=View -TMenuBar.MenuItem.Undo=Ã…ngra -TMenuBar.MenuItem.Redo=Gör om -TMenuBar.MenuItem.Replace=Ersätt... -TMenuBar.Menu.AddImage=Importera Bilder -TMenuBar.MenuItem.AddBefore=Före denna bildruta... -TMenuBar.MenuItem.AddAfter=Efter denna bildruta... -TMenuBar.MenuItem.RemoveImage=Ta bort denna bildruta -TMenuBar.Menu.Tools=Verktyg -TMenuBar.MenuItem.DataFunctionTool=Data Builder -TMenuBar.MenuItem.DatasetTool=Data Tool -TMenuBar.Menu.CopyImage=Kopiera bild -TMenuBar.MenuItem.CopyMainView=Huvud vy -TMenuBar.MenuItem.CopyFrame=Bildruta -TMenuBar.MenuItem.PrintFrame=Skriv ut... -TrackerIO.Dialog.AddImage.Title=Importera bilder (välj en eller flera) -TTrack.Dialog.Name.BadName=används redan. Välj ett annat namn. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=totala kraften -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Plot vy av spår data kommer att visas här. -TableTView.Label.NoData=Tabell vy av spår data kommer att visas här. -TrackerPanel.Message.NoData0=Huvud vy av video och spår kommer att visas här. -TrackerPanel.Message.NoData1=Välj Fil|Öppna or Tracks|Ny för att starta. -WorldTView.Label.NoData=World vy av video och spår kommer att visas här. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Solver: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptiv Multistep -DynamicParticle.Table.Force.Border.Title=Kraft funktioner (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Position funktioner (t) -ParticleModel.Table.Initial.Border.Title=Startvärden -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Limma in bildruta -TMenuBar.MenuItem.PasteAfter=Efter denna bildruta -TMenuBar.MenuItem.PasteBefore=Före denna bildruta -TMenuBar.MenuItem.PasteReplace=Ersätt Video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Startar upp... -Tracker.Splash.HelpMessage=Ny användare? Se - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=vinkel mot horisontalen -LineProfile.Checkbox.Rotates=roteras -LineProfile.Label.Spread=spridning -RGBRegion.Name=RGB Region -RGBRegion.New.Name=region -RGBRegion.MenuItem.Fixed=Fixerad position -RGBRegion.Label.Radius=pixel radie -TTrack.Label.Step=steg - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=position nummer -LineProfile.Data.Description.1=position x-komponent -LineProfile.Data.Description.2=position y-komponent -LineProfile.Data.Description.3=röd -LineProfile.Data.Description.4=grön -LineProfile.Data.Description.5=blå -LineProfile.Data.Description.6=uppfattad ljusstyrka -LineProfile.Data.Description.7=linjebredd -ParticleModel.MenuItem.TraceVisible=Synligt spår -ParticleModel.MenuItem.StepsVisible=Synliga steg -PointMass.Data.Description.0=tid -PointMass.Data.Description.1=position x-komponent -PointMass.Data.Description.2=position y-komponent -PointMass.Data.Description.3=position storlek -PointMass.Data.Description.4=position vinkel -PointMass.Data.Description.5=hastighet x-komponent -PointMass.Data.Description.6=hastighet y-komponent -PointMass.Data.Description.7=hastighet storlek -PointMass.Data.Description.8=hastighet vinkel -PointMass.Data.Description.9=acceleration x-komponent -PointMass.Data.Description.10=acceleration y-komponent -PointMass.Data.Description.11=acceleration storlek -PointMass.Data.Description.12=acceleration vinkel -PointMass.Data.Description.13=rotationsvinkel -PointMass.Data.Description.14=vinkelhastighet -PointMass.Data.Description.15=vinkelacceleration -PointMass.Data.Description.16=steg nummer -PointMass.Data.Description.17=bildruta nummer -PointMass.Data.Description.18=rörelsemängd x-komponent -PointMass.Data.Description.19=rörelsemängd y-komponent -PointMass.Data.Description.20=rörelsemängd storlek -PointMass.Data.Description.21=rörelsemängd vinkel -PointMass.Data.Description.22=kinetisk energi -RGBRegion.Data.Description.0=tid -RGBRegion.Data.Description.1=position x-komponent -RGBRegion.Data.Description.2=position y-komponent -RGBRegion.Data.Description.3=röd -RGBRegion.Data.Description.4=grön -RGBRegion.Data.Description.5=blå -RGBRegion.Data.Description.6=uppfattad ljusstyrka -RGBRegion.Data.Description.7=pixel count -RGBRegion.Data.Description.8=steg nummer -RGBRegion.Data.Description.9=bildruta nummer -TView.Menuitem.Define=Definiera... -Vector.Data.Description.0=tid -Vector.Data.Description.1=x-komponent -Vector.Data.Description.2=y-komponent -Vector.Data.Description.3=storlek -Vector.Data.Description.4=vinkel -Vector.Data.Description.5=svans position x-komponent -Vector.Data.Description.6=svans position y-komponent -Vector.Data.Description.7=steg nummer -Vector.Data.Description.8=bildruta nummer - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Partikelns massa -ParticleModel.Parameter.InitialTime.Description=Start tid -AnalyticParticle.PositionFunction.X.Description=Position x-komponent -AnalyticParticle.PositionFunction.Y.Description=Position y-komponent -DynamicParticle.ForceFunction.X.Description=Kraft x-komponent -DynamicParticle.ForceFunction.Y.Description=Kraft y-komponent -DynamicParticle.Parameter.InitialX.Description=Startposition x-komponent -DynamicParticle.Parameter.InitialY.Description=Startposition y-komponent -DynamicParticle.Parameter.InitialVelocityX.Description=starthastighet x-komponent -DynamicParticle.Parameter.InitialVelocityY.Description=starthastighet y-komponent -TrackerPanel.ModelBuilder.Title=Model Builder -TrackerPanel.DataBuilder.Title=Data Builder - -TrackControl.TrailMenu.NoTrail=Inga fotspår -TrackControl.TrailMenu.ShortTrail=Korta fotspår -TrackControl.TrailMenu.LongTrail=Långa fotspår -TrackControl.TrailMenu.FullTrail=Alla steg -TrackerPanel.ModelBuilder.Spinner.Tooltip=Gällande modell -TrackerPanel.ModelBuilder.LineButton.Text=Linje stip -TrackerPanel.ModelBuilder.LineButton.Tooltip=Sätt linje stil -ParticleModel.LineStyle.None=Ingen linje -ParticleModel.LineStyle.Connect=Förena steg -ParticleModel.LineStyle.Smooth=Mjuk linje -ModelFunctionPanel.Label=Modell -AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functioner -DynamicFunctionPanel.FunctionEditor.Border.Title=Kraft Functioner - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Synliga tabell kolumner -Tracker.About.ProjectOf=Ett projekt av: -Tracker.About.TranslationBy=Översättning av -Tracker.About.Translator=Jonas Persson -TMenuBar.Menu.SaveVideoAs=Spara klipp som -TActions.SaveClipAs.ProgressMonitor.Message=Sparar klipp som -TActions.SaveClipAs.ProgressMonitor.Progress=Avslutat - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sync -PlotTrackView.Checkbox.Synchronize.Tooltip=Synkronisera horisontella axeln -RGBRegion.MenuItem.FixedRadius=Fixerad radie -Tracker.VideoZoom.Hint=klicka för att zooma in eller ut, dubbelklicka för att anpassa till fönster -Tracker.PlotZoomIn.Hint=drag för att zooma in, dubbelklicka för att autoskalera -Tracker.PlotZoomOut.Hint=klicka för att zooma ut -Tracker.MenuItem.Hints=Visa tips -TapeMeasure.Label.Length=längd -TapeMeasure.Label.TapeAngle=vinkel från x-axel -TapeMeasure.Label.ArcAngle=Gradskiva vinkel -TrackerIO.Dialog.NotAnImage.Title=Ogiltig fil typ -TrackerIO.Dialog.NotAnImage.Message1=är inte en JPG eller GIF fil. -TrackerIO.Dialog.NotAnImage.Message2=Vill du fortsätta? -TToolBar.Button.Zoom.Tooltip=Zoom verktyg (genväg: Z tangent) -TrackChooserTView.DropDown.Tooltip=Välj ett spår -TapeMeasure.Field.TapeAngle.Tooltip=Vinkel från positiv x-axel till måttband -TapeMeasure.Field.Magnitude.Tooltip=Längd i skalerade världs enheter -TapeMeasure.Readout.Magnitude.Name=längd -TapeMeasure.Readout.Magnitude.Hint=världs enheter -TapeMeasure.Readout.Angle.Name=Vinkel mätning -TapeMeasure.Readout.Angle.Hint=vinkel mot x-axeln -TapeMeasure.End.Name=slut -TapeMeasure.End.Hint=drag för att mäta avstånd och vinkel -TapeMeasure.Handle.Name=handtag -TapeMeasure.Handle.Hint=drag för att flytta -Vector.Tip.Name=spets -Vector.Tip.Hint=drag eller skriv in koordinater för att ändra komponenter -Vector.Handle.Name=handtag -Vector.Handle.Hint=drag för att flytta vektor -Vector.ShortHandle.Hint=drag för att flytta, alt-klick för att välja spets -PointMass.Position.Name=position -PointMass.Position.Hint=drag eller skriv in koordinater för att ändra position -PointMass.Velocity.Name=hastighet -PointMass.Acceleration.Name=acceleration -PointMass.Vector.Hint=drag för att flytta -PointMass.Position.Locked.Hint=klick för att välja--kan inte dras -CoordAxes.Handle.Name=+x-axel -CoordAxes.Handle.Hint=drag för att ändra lutning -CoordAxes.Origin.Name=origo -CoordAxes.Origin.Hint=drag för att ändra position -OffsetOrigin.Position.Name=position -OffsetOrigin.Position.Hint=drag eller skriv in koordinater för att flytta origo -Calibration.Point.Name=punkt -Calibration.Point.Hint=drag eller skriv in koordinater för att ändra axlar och skala -RGBRegion.Position.Name=position -RGBRegion.Position.Hint=drag eller skriv in koordinater för att ändra position -LineProfile.End.Name=slut -LineProfile.End.Hint=drag för att ändra linjens längd -LineProfile.Handle.Name=handtag -LineProfile.Handle.Hint=drag för att flytta linje -PointMass.Hint=Skriv in massan i verktygsfältet -PointMass.Unmarked.Hint=, shift-klick för att markera positionen -TTrack.Unselected.Hint=klick för att välja och/eller ändra egenskaper -Vector.Unmarked.Hint=skift-drag för att rita vektorer -OffsetOrigin.Unmarked.Hint=skift-klick för att markera offset punkt -Calibration.Unmarked.Hint=skift-klick för att markera fösta punkten -Calibration.Halfmarked.Hint=skift-klick för att markera andra punkten -CenterOfMass.Empty.Hint=välj massor för att definiera systemet -VectorSum.Empty.Hint=välj vektorer för att definiera summan -TapeMeasure.Hint=drag slutpunkter för att mäta avstånd och vinklar -CoordAxes.Hint=skriv in vinkel för att ändra lutning -ParticleModel.Hint=skriv in massan i verktysfältet, skriv in uttrycken i Model Builder för att skapa animation -RGBRegion.Hint=skriv in radie för att ändra storlek -RGBRegion.Unmarked.Hint=skift-klick för att markera positioner -TTrack.ImportVideo.Hint=importera video eller bild för att mäta RGB -TTrack.Selected.Hint=vald -LineProfile.Hint=skriv in spridning för att ändra linje bredd -LineProfile.Unmarked.Hint=skift-drag för att rita linje -LineProfile.Menu.Orientation=Orientering -LineProfile.MenuItem.Horizontal=Horisontal -LineProfile.MenuItem.XAxis=Längs X-Axeln -Footprint.PositionVector=vektor -Footprint.BoldPositionVector=kraftig vektor -Tracker.Startup.Hint=se här för tips (eller stäng av tips i Hjälp menyn), Tryck F1 för hjälp -TrackerPanel.NoVideo.Hint=öppna eller importera en video eller bild att analysera -TrackerPanel.CalibrateVideo.Hint=kalibrera videon genom att använda klibreringsverktyget -TrackerPanel.NoTracks.Hint=skapa ett nytt spår för att mäta objekt av intresse -TrackerPanel.SetClip.Hint=sätt eller se video klipp inställningar -TrackerPanel.ShowAxes.Hint=sätt origo och vinkeln på koordinataxlarna -VideoPlayer.Step.Hint=stega fram (genväg: PageDown ) -VideoPlayer.Back.Hint=stega tillbaka (genväg: PageUp ) -TrackerPanel.DVVideo.Hint=använd resize filtret för att korrigera distortioner i DV-format video -TrackerIO.DataFileFilter.Description=Tracker Filer -Tracker.Button.PDFHelp=Printable PDF Version -TToolbar.Button.TapeVisible.Tooltip=Visa, göm eller välj kalibreringsverktyg - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Spår kontroll -TMenuBar.MenuItem.Description=Noter -TrackPlottingPanel.RightDrag.Hint=höger-drag för alternativ -TMenuBar.MenuItem.DeleteSelectedPoint=Utvald punkt -TFrame.InfoDialog.SaveChanges.Title=Spara ändringar -TFrame.InfoDialog.SaveChanges.Message=Vill du spara ändringarna? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesisk -DynamicParticle.Editor.Button.Polar=Polär -DynamicParticle.Parameter.InitialR.Description=Begynnelsevärde för radien -DynamicParticle.Parameter.InitialTheta.Description=Begynnelsevärde för vinkeln -DynamicParticle.Parameter.InitialVelocityR.Description=Begynnelsevärde för radialhastigheten -DynamicParticle.Parameter.InitialOmega.Description=Begynnelsevärde för vinkelhastigheten -DynamicParticle.ForceFunction.R.Description=Kraftens radial komponent -DynamicParticle.ForceFunction.Theta.Description=Kraftens tangeniella komponent -DynamicParticlePolar.Name=Dynamisk Partikel Modell (Polär) -DynamicTwoBody.Editor.Button.Particle1=Partikel 1 -DynamicTwoBody.Editor.Button.Particle2=Partikel 2 -DynamicTwoBody.Name=Dynamisk två-kropps modell -TMenuBar.Menu.DynamicParticle=Dynamisk Partikel Modell -TMenuBar.MenuItem.Cartesian=Cartesisk -TMenuBar.MenuItem.Polar=Polär - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotrack... -Dialog.Button.Help=Hjälp -AutoTracker.Wizard.Title=Autotracker: -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Tillbaka -AutoTracker.Wizard.Button.Next=Nesta -AutoTracker.Wizard.Button.Accept=Acceptera -AutoTracker.Wizard.Button.Search=Sök -AutoTracker.Wizard.Button.Pause=Paus -AutoTracker.Wizard.Button.Skip=Hålla över -AutoTracker.Label.Mask=Bildmall -AutoTracker.Label.Target=Mål Offset -AutoTracker.Label.AcceptLevel=Acceptera Scores över -AutoTracker.TabbedPane.TabTitle.Mask=1. Mall -AutoTracker.TabbedPane.TabTitle.Target=2. Mål -AutoTracker.TabbedPane.TabTitle.Settings=3. Acceptera -AutoTracker.TabbedPane.TabTitle.Search=4. Sök -AutoTracker.Info.GetStarted=Markera objektet du önskar att autospåra. -AutoTracker.Info.Mask1=Mallen definierar den bild som skall matchas i varje bildruta. Flytta eller ändra storleken på mallen genom att dra i centrum eller handtaget. -AutoTracker.Info.Mask2=Mallen kan ändras till form och färg med tiden. Högre evolution fungerar på snabba förändringar, men blir mer osäker över långa tider. -AutoTracker.Info.MaskLocked1=Mallen används och är låst. -AutoTracker.Info.MaskLocked2=Klicka på Reset för att ta bort alla markeringar och starta på nytt. -AutoTracker.Info.Target1=Målet är där stegen markeras relativt mallen. Flytta målet genom att dra det. -AutoTracker.Info.Target2=Tips: Du kan justera mål-positionen även efter att stegen har markerats. Redan markerade steg kommer automatiskt att följa målet. -AutoTracker.Info.TargetLocked=Målet används och är fixerad till existerande steg positioner. Flyttar du målet följer stegen med. -AutoTracker.Info.Settings1=Match scores över acceptansnivån markeras automatiskt. -AutoTracker.Info.Settings2=Tips: minskar du acceptansnivån ökar risken för fel. -AutoTracker.Info.Search1=Rektangeln som visas visar var var sökningen efter en match görs. Flytta eller ändra storlek genom att dra i dess centrum eller handtag. -AutoTracker.Info.Search2=Tips: Sökområdet behöver inte vara stort om accelerationen är liten eller konstant. "Se-framåt" funktionen flyttar sökområdet automatiskt. -AutoTracker.Info.Frame=Bildruta -AutoTracker.Info.Match=Matchen som visas markerades automatiskt vid målpositionen. -AutoTracker.Info.Possible=En möjlig match hittades i sökområdet. Dina alternativ är: -AutoTracker.Info.NoMatch=Ingen match hittades inom sökområdet. Dina alternativ är: -AutoTracker.Info.Outside=Sökområdet är utanför bilden. Dina alternativ är: -AutoTracker.Info.Accepted=Matchen accepterades av användaren. -AutoTracker.Info.MarkedByUser=Detta steg markerades manuellt av användaren. -AutoTracker.Info.NoVideo=Autotracking kräver en video. Importera en video eller stäng Autotracker. -AutoTracker.Info.Height=höjd -AutoTracker.Info.Width=bredd -AutoTracker.Info.Accept=--acceptera matchen -AutoTracker.Info.Retry=--flytta sökområ+det och sök igen -AutoTracker.Info.Mark=--skift-klick för att markera detta steg manuellt -AutoTracker.Info.Skip=--hoppa över denna bildruta och fortsätt -AutoTracker.Info.Reset=--reset för att ta bort alla steg och starta på nytt -AutoTracker.Info.MatchScore=match score -AutoTracker.Dialog.MaskLocked.Title=Mallen låst -PointMass.Cursor.Autotrack.Description=Autotracker markör -VideoPlayer.StartFrame.Hint=drag för att markera start-bildrutan -VideoPlayer.EndFrame.Hint=drag för att markera slut-bildrutan -VideoPlayer.Slider.Hint=drag för att skanna genom videon -FileDropHandler.Dialog.BadFile.Message=Kan inte laddas in. -FileDropHandler.Dialog.BadFile.Title=okänt filformat - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Använd -DynamicParticle.Dialog.Delete.Message=Radera denna partikeln tar bort den från systemet. Radera? -DynamicParticle.Dialog.Delete.Title=Dynamiskt System -DynamicParticle.System.In=in -DynamicSystem.Empty=tom -DynamicSystem.Force.Name.Internal=intern -DynamicSystem.ForceFunction.R.Description=Intern radial kraft komponent -DynamicSystem.ForceFunction.Theta.Description=Intern tangentiell kraft komponent -DynamicSystem.MenuItem.Inspector=Välj partiklar... -DynamicSystem.Name=Dynamiskt två-kropps system -DynamicSystem.New.Name=system -DynamicSystem.Parameter.Of=av -DynamicSystem.Parameter.RelativeTo=relativt till -DynamicSystem.Parameter.Name.Relative=relativt -DynamicSystem.Parameter.ParticleMass.Description=Massa för -DynamicSystem.Parameter.Mass.Description=Total massa i systemet -DynamicSystemInspector.Border.Title=Partikel -DynamicSystemInspector.Title=Två-kropps system -DynamicSystemInspector.Button.Change=andra till... -DynamicSystemInspector.ParticleName.None=(none) -TMenuBar.MenuItem.Clone=Klona -TMenuBar.MenuItem.TwoBody=Två-kropps system -TrackerPanel.DataBuilder.Dropdown.Tooltip=Aktuellt valt spår -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertikal axel -TrackControl.Button.Trace.ToolTip=Visa eller göm spår -TToolBar.Button.Open.Tooltip=Öppna en video eller tracker fil i en ny tab -TToolBar.Button.Save.Tooltip=Spara aktuell tab i en fil -TToolBar.Button.SelectTrack=Välj -TToolBar.Button.SelectTrack.Tooltip=Välj ett existerande spår -TTrack.MenuItem.ClearSteps=Ta bort steg -PointMass.MenuItem.Position=Position -TMenuBar.MenuItem.Empty=(tom) -TTrackBar.Button.Memory=använt minne: -TTrackBar.Button.Memory.Tooltip=Visa och hantera minne -TTrackBar.Memory.PopupItem.Launch1=Starta -TTrackBar.Memory.PopupItem.Launch2=med minne -TButton.Track.ToolTip=Sätt egenskaperna till -Tracker.Dialog.OutOfMemory.Message1=Tracker har slut på tillgängligt minne. -Tracker.Dialog.OutOfMemory.Message2=Klicka minne knappen för alternativ. -Tracker.Dialog.OutOfMemory.Title=Slut på minne - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Se framåt -AutoTracker.Label.Original=Initial -AutoTracker.Label.NoMask=ingen -AutoTracker.Label.Rate=Evolution Rate: - -AutoTracker.Info.Mask3=Tips: Mallen behöver inte vara stor eller omfatta hela objektet. Ett drag som är unikt och innehåller en hog-kontrast kant fungerar generellt bäst. -AutoTracker.Wizard.Checkbox.XAxis=Enbart X-axeln -AutoTracker.Info.SearchOnAxis1=X-axeln inom den visade rektangeln kommer att sökas av för bästa match. Flytta eller ändra storlek genom att dra dess center eller handtag. -AutoTracker.Info.PossibleOnAxis=En möjlig match har hittats längs x-axeln i sökområdet. Dina alternativ är: -AutoTracker.Info.NoMatchOnAxis=Ingen match hittades längs x-axeln i sökområdet Dina alternativ är: -AutoTracker.Info.RetryOnAxis=--flytta sökområdet eller x-axeln och sök igen -AutoTracker.Wizard.Button.Delete=Ta bort denna punkten -AutoTracker.Wizard.Button.DeleteMore=Ta bord denna och alla punkter efter den -Button.Define.Tooltip=Definiera funktioner för existerande kolumn variabler -Calibration.Label.Point=punkt -CalibrationStick.Hint=Sätt längd eller drag spetsen för att ändra skala, sätt vinkel för att ändra lutning -CalibrationStick.End.Hint=drag för att ändra skala -CalibrationStick.New.Name=kalibreringsstav -CalibrationTapeMeasure.New.Name=kalibrerings måttband -CalibrationTapeMeasure.Readout.Magnitude.Hint=Klicka för att mata in en känd längd i världsenheter -CalibrationTapeMeasure.Hint=sätt längd för att ändra skalan, sätt vinkel för att ändra axlarnas lutning -DynamicSystem.Data.Description.0=relativt avstånd mellan partiklar -DynamicSystem.Data.Description.1=relativ vinkel -DynamicSystem.Data.Description.2=relativ radialhastighet -DynamicSystem.Data.Description.3=relativ vinkelhastighet -ExportDataDialog.Subtitle.Table=Data Tabell -ExportDataDialog.Subtitle.Content=Celler -ExportDataDialog.Subtitle.Format=Numeriskt Format -ExportDataDialog.Subtitle.Delimiter=avgränsare -ExportDataDialog.Title=Exportera Data -ExportDataDialog.Delimiter.Add=Addera... -ExportDataDialog.Delimiter.Remove=Ta bort... -ExportDataDialog.Content.AllCells=Alla Celler -ExportDataDialog.Content.SelectedCells=Valda Celler -ExportDataDialog.MenuItem.RemoveDelimiter=Ta bort egna avgränsare -ExportDataDialog.Chooser.SaveData.Title=Spara Data som -ExportVideoDialog.Button.SaveAs=Spara som... -ExportVideoDialog.Button.FullSize=Full storlek -ExportVideoDialog.Button.DrawnSize=Som visas -ExportVideoDialog.Content.VideoOnly=enbart Video -ExportVideoDialog.Content.VideoAndGraphics=Video och grafik -ExportVideoDialog.Content.GraphicsOnly=Enbart grafik -ExportVideoDialog.Title=Exportera Video klipp -ExportVideoDialog.Label.ClipSettings=Klipp inställningar -ExportVideoDialog.Subtitle.Size=Storlek -ExportVideoDialog.Subtitle.Content=Innehåll -ExportVideoDialog.Subtitle.View=Vy -ExportVideoDialog.Subtitle.Format=Format -ExportVideoDialog.Complete.Message1=Videon har sparats som -ExportVideoDialog.Complete.Message2=Vill du öppna den i Tracker nu? -ExportVideoDialog.Complete.Title=Export klar -ExportVideoDialog.VideoSize=video storlek -ExportVideoDialog.MatSize=mat storlek -ExportVideo.Dialog.HiddenPlots.Message=Plots måste vara fullt synliga för att kunna exporteras. -ExportVideo.Dialog.HiddenPlots.Title=Ofullständig vy -Footprint.DoubleTarget=dubbelt hårkors -Footprint.BoldDoubleTarget=kraftigt dubbelt hårkors -OffsetOrigin.MenuItem.Fixed=Fixerade världs koordinater -ParticleModel.Dialog.Offscreen.Message1=Några modell steg är tomma då de befinner sig långt borta från skärmen. -ParticleModel.Dialog.Offscreen.Message2=för att åtgärda detta, ändra modellen eller skala om videon. -ParticleModel.Dialog.Offscreen.Title=Utanför giltigt område -PrefsDialog.Tab.Configuration.Title=Konfiguration -PrefsDialog.Memory.BorderTitle=Minnesstorlek -PrefsDialog.Tab.General.Title=Annat -PrefsDialog.RecentFiles.BorderTitle=Öppna senaste menyn -PrefsDialog.Label.RecentSize=Fil count -PrefsDialog.Hints.BorderTitle=Tips -PrefsDialog.Button.Relaunch=Ladda in på nytt nu -PrefsDialog.Button.ClearRecent=Rensa -PrefsDialog.Checkbox.DefaultSize=Använd default -PrefsDialog.Checkbox.HintsOn=Visa tips genom default -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video spelare -PrefsDialog.Button.Xuggle=Xuggle (rekommenderas) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Minnes hanteringen är inte tillgänglig när Web Start används. -PrefsDialog.Dialog.WebStart.Title=Web Start Mode -PrefsDialog.LookFeel.BorderTitle=Se och testa -PrefsDialog.Language.BorderTitle=Språk -PrefsDialog.Upgrades.BorderTitle=Sök efter nya versioner -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=Display -PrefsDialog.Language.Default=default -PrefsDialog.Upgrades.Always=Varje gång -PrefsDialog.Upgrades.Weekly=Varje vecka -PrefsDialog.Upgrades.Monthly=Varje månad -PrefsDialog.Upgrades.Never=Aldrig -PrefsDialog.Button.CheckForUpgrade=Sök nu -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (kan vara långsam) -PrefsDialog.Xuggle.Fast=Fast (kan verka hoppande) -PrefsDialog.CalibrationTool.BorderTitle=Default Kalibreringsverktyg -Protractor.Name=Gradskiva -Protractor.New.Name=gradskiva -Protractor.Hint=drag armar för att mäta vinkel -Protractor.Label.Angle=vinkel -Protractor.Field.Angle.Tooltip=Vinkel mellan gradskivarmarna -Protractor.Vertex.Name=vertex -Protractor.Vertex.Hint=drag för att flytta vertex -Protractor.End.Name=arm ände -Protractor.End.Hint=drag för att rotera armen -Protractor.Handle.Name=handtag -Protractor.Handle.Hint=drag för att flytta gradskivan -Protractor.Rotator.Name=roterare -Protractor.Rotator.Hint=drag för att rotera gradskivan -Protractor.Readout.Name=avläsning -Protractor.Readout.Hint=Vinkel mellan gradskivarmarna -ProtractorFootprint.Circle3=liten cirkal -ProtractorFootprint.Circle5=stor cirkel -ProtractorFootprint.Circle3Bold=kraftig liten cirkel -ProtractorFootprint.Circle5Bold=kraftig stor cirkel -Stick.Name=Kalibreringsstav -Stick.New.Name=kalibereringsstav - -TableTrackView.MenuItem.Unformatted=Full Precision -TableTrackView.MenuItem.Formatted=Som formatterad -TableTrackView.Menu.SetDelimiter=sätt avgränsare -TableTrackView.MenuItem.AddDelimiter=Lägg till... -TableTrackView.MenuItem.RemoveDelimiter=Ta bort... -TableTrackView.Dialog.CustomDelimiter.Message=Mata in en ny avgränsare: -TableTrackView.Dialog.CustomDelimiter.Title=Lägg till avgränsare -TableTrackView.Header.Tooltip=Klika för att sortera eller dubbel-klicka för att välja kolumn -TableTrackView.MenuItem.CopySelectedData=Kopiera valda data -TableTrackView.Dialog.RemoveDelimiter.Message=Välj avgränsare att ta bort: -TableTrackView.Dialog.RemoveDelimiter.Title=Ta bort avgränsare -TableTrackView.Radians.Tooltip=i radianer -TableTrackView.Degrees.Tooltip=i grader -TableTrackView.RadiansPerSecond.Tooltip=i radianer/s -TableTrackView.DegreesPerSecond.Tooltip=i grader/s -TableTrackView.RadiansPerSecondSquared.Tooltip=i radianer/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=i grader/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Ta bort Data funktion -TActions.Action.SaveFrame=Spara Tabset som... -TActions.AboutVideo=Egenskaper... -TActions.Dialog.AboutVideo.Title=Video egenskaper -TActions.Dialog.AboutVideo.Type=Typ -TActions.Dialog.AboutVideo.Size=Dimensioner -TActions.Dialog.AboutVideo.Length=Längd -TActions.Dialog.AboutVideo.Frames=bildrutor -TActions.Dialog.AboutVideo.Seconds=sekunder -TActions.Dialog.AboutVideo.FrameRate=bildhastighet (Frame Rate) -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Väg -TActions.Action.ImportTRK=Tracker Fil... -TActions.Action.ProtractorVisible=Synlig -TapeMeasure.MenuItem.FixedLength=Fixerad längd -TextTView.Label.NoTab=Klicka på "Page" för att lägga till text och HTML sidor här. -TextTView.NewTab.Text1=Dubbel-klicka föpr att editera text eller titel. Höger-klicka för fler alternativ. -TextTView.NewTab.Text2=För att visa en HTML sida, skriv in url eller höger-klicka för att öppna en fil. -TextTView.NewTab.Title=Namnlös -TextTView.Dialog.TabTitle.Title=Skriv Titel -TextTView.MenuItem.OpenHTML=Öppna HTML... -TextTView.MenuItem.SetTitle=Skriv Titel... -TextTView.Button.NewTab=Ny -TextTView.TextEdit.Description=Text -TFrame.Dialog.FileNotFound.Message=Filen kunde inte hittas: -TFrame.Dialog.FileNotFound.Title=Filen kunde inte hittas -TFrame.View.Text=Sid vy -TFrame.View.Main=Huvud vy -TMenuBar.Menu.OpenRecent=Öppna senaste -TMenuBar.Menu.Import=Importera -TMenuBar.Menu.Export=Exportera -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=Data Fil... -TMenuBar.Menu.CopyObject=Kopiera objekt -TMenuBar.MenuItem.Coords=Koordinat system -TMenuBar.MenuItem.VideoClip=Video klipp -TMenuBar.Menu.MeasuringTools=Mätverktyg -TMenuBar.Menu.AngleUnits=Vinkel enheter -TMenuBar.MenuItem.Degrees=Grader -TMenuBar.MenuItem.Radians=Radianer -Tracker.Dialog.NoXuggle.Title=Xuggle kunde inte hittas -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) är inte installerad. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle från http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Om Xuggle... -Tracker.Dialog.AboutXuggle.Title=Om Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: -Tracker.Dialog.NoVideoEngine.Message1=Ingen video spelare kunde hittas. Utan dessa kan Trakck bara -Tracker.Dialog.NoVideoEngine.Message2=öppna bilder, blidsekvenser och animmated gifs. -Tracker.Dialog.NoVideoEngine.Message3=För att installera Xuggle, Trackers rekommenderade videospelare på -Tracker.Dialog.NoVideoEngine.Message4=alla platformar, download den senaste Tracker installer från -Tracker.Dialog.NoVideoEngine.Title=Videospelare saknas -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's rekommenderade videospelare, har inte installerats än. -Tracker.Dialog.NoXuggle.Message2=För att installera Xuggle, download den senaste Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle saknas -Tracker.About.DefaultLocale=Default placering -Tracker.About.CurrentLanguage=Språk -Tracker.Dialog.InsufficientMemory.Title=För lite minne -Tracker.Dialog.InsufficientMemory.Message=Minnet som behövs är för stort. -TrackerIO.Dialog.TabMustBeSaved.Message1=Tab -TrackerIO.Dialog.TabMustBeSaved.Message2=måste sparas som en tracker fil för att inkluderas i ett tabset. -TrackerIO.Dialog.TabMustBeSaved.Message3=Vill du spara den? -TrackerIO.Dialog.TabMustBeSaved.Title=Tab som inte sparats -TrackerIO.Dialog.NoTabs.Message=Det finns inga tabs att spara! -TrackerIO.Dialog.NoTabs.Title=Tomt Tabset -TrackerIO.Dialog.SaveTabset.Title=Spara Tabset -TrackerIO.Dialog.SaveTab.Title=Spara Tab -TrackerIO.Delimiter.Tab=Tab -TrackerIO.Delimiter.Space=mellanrum -TrackerIO.Delimiter.Comma=komma -TrackerIO.Delimiter.Semicolon=semikolon -TrackerIO.VideoAndDataFileFilter.Description=Video och Tracker Filer -TrackerPanel.Dialog.Version.Message1=Du öppnar en fil som skapats med Tracker -TrackerPanel.Dialog.Version.Message2=som kan referera till -TrackerPanel.Dialog.Version.Message3=funktioner som saknas i den version du använder -TrackerPanel.Dialog.Version.Message4=Den senaste versionen är tillgänglig hos -TrackerPanel.Dialog.Version.Title=Version Mismatch -TrackerPanel.Label.ModelStart=Start -TrackerPanel.Label.ModelEnd=Slut -TrackerPanel.Spinner.ModelStart.Tooltip=Sätt start-bildruta för denna modellen -TrackerPanel.Spinner.ModelEnd.Tooltip=Sätt slut-bildruta för denna modellen -TToolbar.Button.ProtractorVisible.Tooltip=Visa eller dölj gradskiva -TToolbar.Button.AxesVisible.Tooltip=Visa eller dölj koordinataxlar -TToolBar.Button.TrackControl.Tooltip=Visa eller dölj spår-kontrollen -TTrack.Dialog.StepSizeWarning.Message1=Varning: vissa spår har markerats med en steg-längd större än ett, vilket gör att vissa bildrutor inte markerats. -TTrack.Dialog.StepSizeWarning.Message2=Ändring av steg-längden ger upphov till gap i data-mängden. -TTrack.Dialog.StepSizeWarning.Message3=Hastigheten och accelerationen runt dessa gap kan inte bestämmas innan alla steg markerats. -TTrack.Dialog.StepSizeWarning.Title=Varning -TTrack.Dialog.SkippedStepWarning.Message1=Varning: hoppa över steg när man markerar ger upphov till gap i data-mängden. -TTrack.Dialog.SkippedStepWarning.Title=Varning -TTrack.Dialog.SkippedStepWarning.Checkbox=Visa inte detta igen -TTrack.Locked.Hint=Låst -TTrack.AngleField.Radians.Tooltip=Vinkel i radianer -TTrack.AngleField.Degrees.Tooltip=Vinkel i grader -TTrack.AngleField.Popup.Radians=Ändra till radianer -TTrack.AngleField.Popup.Degrees=Ändra till grader -TTrackBar.Memory.Menu.SetSize=SÄtt minnesstorlek... -TTrackBar.Button.Version=Now available: version -TTrackBar.Popup.MenuItem.Upgrade=Uppdatera nu... -TTrackBar.Popup.MenuItem.Ignore=Ignorera -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (kan vara långsam) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Kalibrerings måttband -CircleFootprint.Circle=cirkel -CircleFootprint.FilledCircle=fylld cirkel -CircleFootprint.Dialog.Title=Cirkel Spår -CircleFootprint.Dialog.Label.Radius=Radie -CircleFootprint.Dialog.Checkbox.Bold=Kraftig -CircleFootprint.Dialog.Checkbox.CenterSpot=Center Markering -LineProfile.Hint.Marking=drag musen för att markera linjeprofil -PageTView.Button.Page=Sida -PageTView.MenuItem.ClosePage=Stäng sida -PointMass.Hint.Marking=klicka med musen för att markera en ny punkt, tryck enter för att klona det förra steget -PrefsDialog.Dialog.NewVersion.Title=Upgradering -PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=är nu tillgänglig hos -PrefsDialog.Dialog.NewVersion.None.Message=Ingen ny version är tillgänglig för tillfället. -RGBRegion.Hint.Marking=klicka med musen för att markera centrum i området -TMenuBar.MenuItem.Restore=Återställ vy -TrackControl.StretchVectors.None=No stretch -TViewChooser.Maximize.Tooltip=Maximera denna vy -TViewChooser.Restore.Tooltip=Återställ vy -Vector.Hint.Marking=drag musen för att markera en ny vektor, tryck enter för att klona det förra steget -WorldTView.Button.World=World - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Varningar -PrefsDialog.Checkbox.WarnIfNoEngine=Ingen video-spelare -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle fel -PropertiesDialog.Title=Egenskaper -PropertiesDialog.Label.Author=Författare -PropertiesDialog.Label.Contact=Kontakt -TActions.Action.Properties=Egenskaper... -TActions.Action.OpenBrowser=Öppna bliblioteks webläsaren... -TFrame.Progress.Xuggle=Xuggle lastar in bildrutor -TFrame.Progress.ClickToCancel=(klicka för att stoppa) -TFrame.Dialog.StalledVideo.Title=Fel inträffade under inläsning av video -TFrame.Dialog.StalledVideo.Message0=Inlastning av video har stannat upp. Detta kan vara ett tillfälligt fel. -TFrame.Dialog.StalledVideo.Message1=Du kan välja på att stoppa inlastningen eller vänta. -TFrame.Dialog.StalledVideo.Message2=Andra alternativ för att öppna videon är: -TFrame.Dialog.StalledVideo.Message3=1. Använd konverteringsprogram för att spara i annat format. -TFrame.Dialog.StalledVideo.Message4=2. Välj QuickTime för att lasta in videon. -TFrame.Dialog.StalledVideo.MessageMac=2. Öppna Tracker i 32-bit Java VM och öppna med QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stopp -TFrame.Dialog.StalledVideo.Button.Wait=Vänta -Tracker.Dialog.NoVideoEngine.Checkbox=Visa inte igen -TrackerIO.ZipFileFilter.Description=ZIP filer -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle träffat på följande fel medan videon öppnades: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Inte alla fel är fatala. För fullständigt felmeddelande öppna Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Om Xuggle misslyckas, kan det gå att öppna videon med QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: I Mac OSX kräver detta att Tracker körs med 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Fel -TrackerIO.ErrorFFMPEG.LogMessage=För mer detajer, sätt på Xuggle varningar i inställningsdialogen (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Öppna OSP Digital Library Browser - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=Filen kan inte hittas -TFrame.Dialog.NoTRKInComPADRE.Message=Ingen Tracker fil hittades i denna noden - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinematisk Partikel -DynamicParticle.Builder.Title=Dynamisk Partikel (Cartesisk) -DynamicParticlePolar.Builder.Title=Dynamisk Partikel (Polär) -DynamicSystem.Builder.Title=Dynamiskt System (Intern) -PropertiesDialog.Button.CopyFilePath=Kopiera Fil Path -PropertiesDialog.Button.CopyVideoPath=Kopiera Video Path -PropertiesDialog.Tab.TrackerFile=Tracker Fil -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=Egenskaper -PropertiesDialog.Header.Value=Värde -TActions.Action.OpenURL=Öppna URL... -TActions.Dialog.OpenURL.Title=Öppna URL -TActions.Dialog.OpenURL.Message=Skriv in URL för web-baserad video, Tracker fil eller Tracker zip fil -TActions.Dialog.AboutVideo.Name=Namn - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cachade Web Filer -PrefsDialog.Button.ClearCache=Clear - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, skift-klick för att ommarkera markerad position -PointMass.Remarking.Hint=klicka musen för att ommarkera positionen -PointMass.PositionSelected.Hint=drag eller skriv in positionen i verktygsraden -PointMass.VectorSelected.Hint=drag för att flytta -Vector.Remark.Hint=skift-klick för att ommarkera markerad spets -Vector.TipSelected.Hint=drag eller skriv in komponenter i verktygsraden -Vector.HandleSelected.Hint=dra för att flytta -Vector.Remarking.Hint=klicka musen för att ommarkera spetsen -AutoTracker.Label.Search=Sök -AutoTracker.Label.Target=Mål -AutoTracker.Label.Frame=Bildruta -AutoTracker.Label.Point=Punkt -AutoTracker.Label.Template=Mall -AutoTracker.Label.Track=Spår -AutoTracker.Label.Match=Match -AutoTracker.Label.NoTemplate=Ingen Mall -AutoTracker.Label.EvolutionRate=Evolutions grad -AutoTracker.Label.Automark=Automarkera -AutoTracker.Info.Instructions=Klicka på Search knappen før att hitta en match i sökområdet som visas. -AutoTracker.Info.KeyFrame.Instructions1=Key frame definierar mallen och målet. Klicka på Sök knappen för att hitta matchingar till mallen. -AutoTracker.Info.KeyFrame.Instructions2=Du kan dra på målet, mallen eller sökområdet för att flytta eller ändra storleken. -AutoTracker.Info.MouseOver.Instructions=Placera musen över kontrollerna för att få mer information om inställningar och justeringar. -AutoTracker.Info.Mask1=Mallen är bilden som man skall hitta en match till. Den startar med key frame och anpassar sig till förändringar i form och färg. -AutoTracker.Info.Mask2=Automark nivån är den minsta match poängen som behövs för att få en automatisk markering. -AutoTracker.Info.Mask.Instructions=Flytta eller ändra storlek på mallen genom att dra i kanterna eller hörnen (endast key frame). Justera evolutions graden och automark nivån med menyerna. -AutoTracker.Info.Mask.Tip=För låg automark nivå kan ge falska matcher--öka evolution graden istället. -AutoTracker.Info.Search=Sökområdet skannas för bäste match. -AutoTracker.Info.SearchOnAxis=X-axeln i sökområdet skannas för bäste match. -AutoTracker.Info.Search.Instructions=Flytta eller ändra storlek på sökområdet genom att dra i kanterna eller hörnen. Aktivera x-axel och se-frammåt funktionerna genom att markera dessa. -AutoTracker.Info.Search.Tip=Sökområdet behöver inte vara stort i många fall. Se framåt funktionen flyttar automatiskt sökområdet till match positionen. -AutoTracker.Info.Target=Målet är där den önskade spår punkten är markerad. -AutoTracker.Info.Target.Instructions=Flytta målet genom att dra det (endast key frame). Välj det önskade spåret från gardin menyerna. -AutoTracker.Info.Title.Settings=Inställningar -AutoTracker.Info.Title.Tip=Topp -AutoTracker.Info.SelectTrack=Välj eller skapa ett spår och den punkt du vill använda autotrack på. -AutoTracker.Info.OutsideXAxis=X-axis passerar inte genom sökområdet. Dina möjligheter är: -AutoTracker.Info.NewKeyFrame=--gå tillbaka och ändra evolutionsgraden ellan använd skift-control-klick för att definiera en ny key frame -AutoTracker.Info.Replace=--acceptera matchen och ersätt den existerande punkten -AutoTracker.Info.Keep=--behåll den existerande punkten -AutoTracker.Info.PossibleReplace=En möjlig match hittades för att ersätta den existerande punkten. Dina möjligheter är: -AutoTracker.Wizard.Button.Accept=Acceptera -AutoTracker.Wizard.Button.Stop=Stopp -AutoTracker.Wizard.Button.Skip=Hoppa över -AutoTracker.Wizard.Button.Replace=Ersätt -AutoTracker.Wizard.Button.Keep=Behåll -AutoTracker.Wizard.Button.Search=Sök -AutoTracker.Wizard.Button.SearchThis=Sök denna -AutoTracker.Wizard.Button.SearchNext=Sök nästa -AutoTracker.Wizard.Button.Delete=Ta bort -AutoTracker.Wizard.Button.ShowKeyFrame=Visa Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=Ta bort Key Frame -AutoTracker.Wizard.Checkbox.LookAhead=Se frammåt -AutoTracker.Wizard.Checkbox.XAxis=Enbart x-axel -AutoTracker.Wizard.Menuitem.DeleteThis=Denna punkten -AutoTracker.Wizard.Menuitem.DeleteLater=Punkter efter denna -AutoTracker.Wizard.Menuitem.DeleteAll=Alla punkter -TToolBar.Button.AutoTracker.Tooltip=Visa eller dölj autotracker -MainTView.Popup.MenuItem.ZoomIn=Zooma in -MainTView.Popup.MenuItem.ZoomOut=Zooma ut -MainTView.Popup.MenuItem.ZoomToFit=Zooma till fönster -TrackerIO.Dialog.DurationVaries.Title=Variabelt tid mellan bildrutor -TrackerIO.Dialog.DurationVaries.Message1=Denna video innehåller bildrutor med tidsskillnader som avviker från medel med mer än -TrackerIO.Dialog.DurationVaries.Message2=För noggranna hastigheter och accelerationer, bör du utesluta dessa bildrutor från -TrackerIO.Dialog.DurationVaries.Message3=beräkningarna genom att ändra start och slut bildrutorna i videoklippet. -TrackerIO.Dialog.DurationVaries.Message4=Bildrutor att utesluta: -TrackerIO.Dialog.DurationVaries.Message5=Medel tidsskillnad och uppspelningshastighet om uteslutna: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=Ingen resurs kan hämtas från denna noden - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=skift-klick för att markera -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Rensa när programmet stängs -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Bibliotek -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Bibliotek och Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Rensa när programmet stängs -PrefsDialog.Run.BorderTitle=Program som körs vid uppstart -PrefsDialog.FileChooser.Title.Run=Välj körbar fil -PrefsDialog.Button.Save=Spara -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README fil kan inte hittas -Popup.MenuItem.Algorithm=Algoritmer... -AlgorithmDialog.Button.FiniteDifference=Finite skillnad -AlgorithmDialog.Button.BounceDetect=Studsdetektion -AlgorithmDialog.TitledBorder.Choose=Välj algoritm för att beräkna hastighet och acceleration: -AlgorithmDialog.Title=Algoritmer -AlgorithmDialog.FiniteDifference.Message1=Detta är standard algoritmen. -AlgorithmDialog.FiniteDifference.Message2=Hastighet: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=Denna algoritmen jämnar ut hastigheten och accelerationen samt detekterar plötsliga ändringar i hastigheten. -AlgorithmDialog.BounceDetect.Message2=Varning: kan skapa artefakter. För mer information, se: -TMenuBar.Menu.Diagnostics=Diagnostik - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Ogiltig XML -Tracker.Dialog.Invalid.Message=Filen kan inte läsas. -TrackPlottingPanel.Popup.Menu.CompareWith=Jämför med -TrackerPanel.DataBuilder.TrackType.Unknown=okänd -TrackerPanel.DataBuilder.Button.Load.Tooltip=Läs in datafunktioner från en XML fil -TrackerPanel.DataBuilder.Button.Save.Tooltip=Spara datafunktioner i en XML fil -TrackerPanel.DataBuilder.Load.Title=Läs in datafunktioner -TrackerPanel.DataBuilder.Load.Message=Välj funktioner att läsa in: -TrackerPanel.DataBuilder.Save.Title=Spara datafunktioner -TrackerPanel.DataBuilder.Save.Message=Välj funktioner attspara: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Läs in till alla -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Läs indast in i -TrackerPanel.DataBuilder.Dialog.Load.Title=Spår Val -TrackerPanel.DataBuilder.Dialog.Load.Message=Vill du läsa in funktioner till alla spår av typen -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Ogiltig spårtyp -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Filen definierar datafunktioner för spårtyp -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Dom kan inte läsas till typ -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Felaktig typ -TrackerPanel.DataBuilder.Dialog.WrongType.Message=Filen definierar inga datafunktioner. -TToolbar.Button.Refresh=Refresh data och vyer - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=ZIP resursen har sparats som -ExportTRKDialog.Complete.Message2=Vill du öppna den i Tracker nu? -ExportTRKDialog.Complete.Title=Export fullförd -ExportTRKDialog.Title=Exportera ZIP resurs -ExportTRKDialog.Message1=Denna (1) exporterar videoklipp, (2) konverterar tab data för att matcha den exporterade videon, och (3) sparar tab data som en ny Tracker fil. -ExportTRKDialog.Message2=Tracker filen och videon sparas i samma bibliotek med samma namn men med olik filtyp. -TMenuBar.MenuItem.TabClip=ZIP Resurs -TMenuBar.Menu.CalibrationTools=Kalibrerings verktyg -TrackerIO.Dialog.DurationVaries.Button.SetClip=Sätt Rekommenderat klipp -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=slut -TrackerIO.Dialog.DurationVaries.Recommended=Rekommenderat klipp - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Sätt samman ändar -AttachmentInspector.Label.End=Slut -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Namn -AttachmentInspector.Header.AttachedTo=Bifoga till -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Sätt samman ändar... -PerspectiveTrack.Corner=hörn -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=tid -Protractor.Data.Description.1=gradskiva, vinkel -Protractor.Data.Description.2=längd arm 1 -Protractor.Data.Description.3=längd arm 2 -Protractor.Data.Description.4=steg nummer -Protractor.Data.Description.5=bildruta nummer -TapeMeasure.Data.Description.0=tid -TapeMeasure.Data.Description.1=längd -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=steg nummer -TapeMeasure.Data.Description.4=bildruta nummer - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Denna Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=Denna Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Senare Matcher -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Lägg till -Dialog.Button.Remove=Radera -PrefsDialog.Button.ClearHost=Clear webplats -PrefsDialog.Button.ClearHost.Tooltip=ta bort alla filer associerade med den valda webplatsen från OSP cache -PrefsDialog.Button.ClearCache.Tooltip=ta bort alla filer från OSP cache -TActions.Action.SaveZip=Exportera ZIP Resurs -ThumbnailDialog.Title=Exportera Thumbnail bild -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Nuvarande bild -ThumbnailDialog.Label.FrameNumber=bildruta -ThumbnailDialog.Label.StepNumber=steg -ThumbnailDialog.View.VideoOnly=Enbart Video -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG bild -ThumbnailDialog.Format.JPG=JPEG bild -ThumbnailDialog.Chooser.SaveThumbnail.Title=Spara Thumbnail -ThumbnailDialog.Subtitle.Image=bild -TMenuBar.MenuItem.Thumbnail=Thumbnail bild - -TToolBar.Button.SaveZip.Tooltip=Exportera en ZIP resurs för OSP Digital Library Browser -TTrack.MenuItem.DeletePoint=Radera valt steg -ZipResourceDialog.Title=Exportera ZIP resurs -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Namn -ZipResourceDialog.Label.Description=Beskrivning -ZipResourceDialog.Label.Keywords=Nyckelord -ZipResourceDialog.Label.Link=Extern Länk -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=ZIP resursen har sparats som -ZipResourceDialog.Complete.Message2=Vill du öppna den i Tracker nu? -ZipResourceDialog.Complete.Title=Framgång -ZipResourceDialog.Border.Title.Documentation=HTML Dokumentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Exportera ZIP resurs -ZipResourceDialog.FileChooser.AddFile.Title=Lägg till fil i ZIP Resurs -ZipResourceDialog.FileChooser.OpenHTML.Title=Öppna HTML Fil -ZipResourceDialog.Button.AddFiles=Lägg till filer -ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Lägg till HTML informations fil -ZipResourceDialog.AddHTMLInfo.Message1=Vill du lägga till en HTML informations fil -ZipResourceDialog.AddHTMLInfo.Message2=till ZIP resursen? -ZipResourceDialog.HTMLField.DefaultText=Om ingen specificerad kommer en tom fil att skapas -ZipResourceDialog.Dialog.AddFiles.Title=Lägg till HTML och PDF Filer -ZipResourceDialog.Tooltip.HTML=Path till HTML filee (finns ingen kommer en tom fil att skapas) -ZipResourceDialog.Tooltip.Author=Författare till denna resurs -ZipResourceDialog.Tooltip.Title=Visa namnet på resursen (inte filnamnet) -ZipResourceDialog.Tooltip.Description=En användbar beskrivning av resurtsen -ZipResourceDialog.Tooltip.Keywords=En lista med nyckelord att söka i DL browsern -ZipResourceDialog.Tooltip.Contact=Kontakt information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL till en extern HTML fil med mer information om denna resursen -ZipResourceDialog.Tooltip.ThumbnailSettings=Ändra thumbnail vy, storlek eller filtyp -ZipResourceDialog.Tooltip.AddFiles=Lägg till HTML och PDF filer till ZIP resursen -ZipResourceDialog.Tooltip.TrimVideo=Markera för att exportera video klippet, avmarkera för att använda original videon -ZipResourceDialog.Tooltip.LoadHTML=Använd en filväljare för att lasta in en HTML info fil +# This is the swedish tracker.properties file +# translated by Jonas Persson, Sep 2011 + +Calibration.Name=Kalibreringspunkter +Calibration.New.Name=kalibreringspunkter +CenterOfMass.Name=Masscentrum +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Välj massor... +CenterOfMassInspector.Title=Masscentrum +CenterOfMassInspector.Border.Title=Välj massor +ConfigInspector.Border.Title=Önskade egenskaper +ConfigInspector.Title=Preferenser +ConfigInspector.Button.SaveAsDefault=Spara som standard +CoordAxes.Name=Axlar +CoordAxes.New.Name=axlar +Dialog.Button.Cancel=Avbryt +Dialog.Button.OK=OK +Dialog.Button.Close=Stäng +Dialog.Button.All=Alla +Dialog.Button.None=Inga +Dialog.Button.Copy=Kopiera +Dialog.Button.Update=Updatera +Dialog.Button.SelectAll=Välj alla +Footprint.Diamond=diamant +Footprint.BoldDiamond=kraftig diamant +Footprint.SolidDiamond=fylld diamant +Footprint.Triangle=triangel +Footprint.BoldTriangle=kraftig triangel +Footprint.SolidTriangle=fylld triangel +Footprint.Circle=cirkel +Footprint.BoldCircle=kraftig cirkel +Footprint.SolidCircle=fylld cirkel +Footprint.VerticalLine=vertikal linje +Footprint.BoldVerticalLine=kraftig vertikal linje +Footprint.HorizontalLine=horisontell linje +Footprint.BoldHorizontalLine=kraftig horisontell linje +Footprint.Crosshair=hårkors +Footprint.BoldCrosshair=kraftig hårkors +Footprint.SimpleAxes=enkel axel +Footprint.BoldSimpleAxes=kraftig enkel axel +Footprint.Spot=punkt +Footprint.Line=linje +Footprint.BoldLine=kraftig linje +Footprint.Outline=kontur +Footprint.BoldOutline=kraftig kontur +Footprint.Arrow=pil +Footprint.BoldArrow=kraftig pil +Footprint.DoubleArrow=dubbel pil +Footprint.BoldDoubleArrow=kraftig dubbel pil +Footprint.2xArrow=2x pil +Footprint.Bold2xArrow=kraftig 2x pil +Footprint.4xArrow=4x pil +Footprint.Bold4xArrow=kraftig 4x pil +Footprint.DashArrow=streckad pil +Footprint.BoldDashArrow=kraftig streckad pil +Footprint.BigArrow=stor pil +Footprint.BigDashArrow=stor streckad pil +LineProfile.Name=Linje Profil +LineProfile.New.Name=profil +LineProfile.Data.Brightness=ljusstryka +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=röd +LineProfile.Data.Green=grön +LineProfile.Data.Blue=blå +LineProfile.Data.Weighting=antal +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Zooma +MainTView.Popup.MenuItem.ToFit=Anpassa +OffsetOrigin.Name=Offset Origo +OffsetOrigin.New.Name=offset origo + +PlotTrackView.Button.PlotCount=Diagram +PlotTrackView.Button.PlotCount.ToolTip=Sätt diagram räknare + +PointMass.Name=Punkt massa +PointMass.New.Name=massa +PointMass.MenuItem.VectorsToPosition=Till position +PointMass.MenuItem.Velocity=Hastighet +PointMass.MenuItem.Acceleration=Acceleration +Star.Name=Stjärna +Star.New.Name=stjärna +TableTrackView.Action.CopyData=Kopiera data +TableTrackView.Button.SelectTableData=Tabell +TableTrackView.Button.SelectTableData.ToolTip=välj tabell-kolumner +TableTrackView.Popup.MenuItem.Analyze=Analysera... +TableTrackView.Dialog.Border.Title=Synlig: +TActions.Action.Description=Anteckningar +TActions.Action.ClearTracks=Radera +TActions.Action.NewTab=Nytt fönster +TActions.Action.Copy=kopiera +TActions.Action.Paste=Limma in +TActions.Action.Open=Öppna... +TActions.Action.Close=Stäng Tab +TActions.Action.Import=Importera... +TActions.Action.Save=Spara Tab +TActions.Action.SaveAs=Spara Tab som... +TActions.Action.Export=Exportera... +TActions.Action.CaptureVideo=Spela in Video... +TActions.Action.Delete=Radera +TActions.Action.Config=Preferenser... +TActions.Action.AxesVisible=Synlig +TActions.Action.TapeVisible=Synlig +TActions.Action.Print=Skriv ut... +TActions.Action.ClearFilters=Radera +TActions.Action.ImportVideo=Importera... +TActions.Action.CloseVideo=Stäng +TActions.Action.CloseAll=Stäng alla +TActions.Action.Exit=Avsluta +TActions.Dialog.PrintError.Message=Ett skrivarfel uppstod. +TActions.Dialog.PrintError.Title=Skrivarfel +TActions.Dialog.Description.Title=Anteckningar: +TActions.Dialog.DeleteLockedTracks.Message=Vissa spår är låsta. Radera ändå? +TActions.Dialog.DeleteLockedTracks.Title=Radera låsta spår? +TActions.Dialog.NewPointMass.Title=Ny punkt-massa +TapeMeasure.Name=Måttband +TapeMeasure.New.Name=måttband +TapeMeasure.MenuItem.Fixed=Fixerad position +TFrame.View.Plot=Plot fönster +TFrame.View.Table=Tabell fönster +TFrame.View.World=World fönster +TFrame.View.Video=Video fönster +TFrame.Dialog.Help.Title=Tracker Hjälp +TMenuBar.Menu.File=Fil +TMenuBar.Menu.Edit=Editera +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Spår +TMenuBar.Menu.Coords=Koordinat system +TMenuBar.Menu.Window=Fönster +TMenuBar.Menu.Help=Hjälp + +TMenuBar.MenuItem.EditProperties=Egenskaper... +TMenuBar.MenuItem.VideoVisible=Synligt +TMenuBar.MenuItem.VideoFilters=Filter +TMenuBar.MenuItem.NewVideoFilter=Ny +TMenuBar.MenuItem.NewTrack=Ny +TMenuBar.MenuItem.CoordsLocked=Låst +TMenuBar.MenuItem.CoordsFixedOrigin=Fixerad Origo +TMenuBar.MenuItem.CoordsFixedAngle=Fixerad Vinkel +TMenuBar.MenuItem.CoordsFixedScale=Fixerad Skala +TMenuBar.MenuItem.CoordsRefFrame=Referens-system + +TMenuBar.MenuItem.CoordsDefault=Default +TMenuBar.MenuItem.WindowRight=Fönster till höger +TMenuBar.MenuItem.WindowBottom=Fönster nederst +TMenuBar.MenuItem.PlayAllSteps=Visa alla steg +TMenuBar.MenuItem.Record=Spela in +TMenuBar.MenuItem.MatSize=Mat Size +TMenuBar.MenuItem.Language=Språk +TMenuBar.MenuItem.DeleteTrack=Radera +TMenuBar.MenuItem.TrackerHelp=Tracker Hjälp... +TMenuBar.MenuItem.MessageLog=Meddelande Logg... +TrackControl.Name=Spår Kontroll +TrackControl.Button.NewTrack=Skapa +TrackControl.Button.NewTrack.ToolTip=Skapa nytt spår +TrackControl.Button.Trails.ToolTip=Sätt spår längd +TrackControl.Button.Labels.ToolTip=Visa eller dölj numrering +TrackControl.Button.StretchVectors.ToolTip=Vektorer +TrackControl.Button.Accelerations.ToolTip=Visa eller dölj accelerations vektorer +TrackControl.Button.Xmass.ToolTip=Multiplicera vektorer med massan +TrackControl.Button.Vectors.ToolTip=Vektorer +TrackControl.Button.Velocities.ToolTip=Visa eller dölj hastighetsvektorer +TrackControl.Button.Properties.ToolTip=Klicka för att välja +TrackControl.Button.Positions.ToolTip=Visa eller dölj positioner +Tracker.Popup.MenuItem.Snapshot=Snapshot... +Tracker.Popup.MenuItem.Help=Hjälp... +Tracker.Cursor.Crosshair.Description=Hårkors markör +Tracker.Action.AboutTracker=Om Tracker... +Tracker.Dialog.AboutTracker.Title=Om Tracker +Tracker.Action.AboutJava=Om Java... +Tracker.Dialog.AboutJava.Title=Om Java +Tracker.Dialog.AboutJava.UnknownVersion=Okänd +Tracker.Dialog.AboutJava.Message=Java version +Tracker.Action.AboutQT=Om QuickTime... +Tracker.Dialog.AboutQT.Title=Om QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: +Tracker.Dialog.NoQT.Title=QTJava.zip kan ej hittas +Tracker.Dialog.NoQT.Message1=QuickTime for Java verkar inte vara installerad. +Tracker.Dialog.NoQT.Message2=om du önskar analysera QuickTime filmer, installera om QuickTime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MÅSTE VÄLJAS när QuickTime installeras. +Tracker.Dialog.UpdateQT.Title=Uppdatera QTJava.zip +Tracker.Dialog.UpdateQT.Message1=En nyare version av QTJava.zip har hittats +Tracker.Dialog.UpdateQT.Message2=Vill du uppdatera den existerande filen? +Tracker.Dialog.CopyQT.Title=Kopiera QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime har installerats, men innan Tracker kan använda den måste: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip kopieras från +Tracker.Dialog.CopyQT.Message3= till +Tracker.Dialog.CopyQT.Message4= 2. Tracker måste startas om. +Tracker.Dialog.CopyQT.Message5=Vill du kopiera QTJava.zip nu? +Tracker.Dialog.CopyFailed.Title=Kopiering misslyckades +Tracker.Dialog.CopyFailed.Message=QTJava.zip kunde inte kopieras. +Tracker.Dialog.CopiedTo.Title=Kopieringen lyckades +Tracker.Dialog.CopiedTo.Message1=QTJava.zip har kopierats till +Tracker.Dialog.CopiedTo.Message2=Tracker måste startas om och avslutas nu. +Tracker.Splash.Loading=Läser in +TrackerIO.Dialog.Import.Title=Importerar Tracker Fil +TrackerIO.Dialog.Import.Message=Välj objekt att importera +TrackerIO.Dialog.ImportVideo.Title=Importera Video +TrackerIO.Dialog.Export.Title=Exportera +TrackerIO.Dialog.Export.Message=Välj objekt att exportera +TrackerIO.Dialog.ReplaceFile.Title=Ersätt existerande fil? +TrackerIO.Dialog.ReplaceFile.Message=existerar redan. Vill du ersätta den? +TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML +TrackerIO.Dialog.NotTrackerXML.Message=innehåller xml data för en annan applikation. +TrackerIO.Dialog.BadVideo.Message=Filen är av en okänd video typ: +TrackerIO.Dialog.BadVideo.Title=Okänd Video Fil +TrackerPanel.NewTab.Name=namnlös +TrackerPanel.DragToMark.Hint=Skift-dra för att markera +TrackerPanel.ClickToMark.Hint=Skift-klicka för att markera +TrackerPanel.Dialog.LoadFailed.Title=Ogiltig Tracker Fil +TrackerPanel.Dialog.LoadFailed.Message=Filen är inte en giltig Tracker fil: +TrackerPanel.Dialog.SaveChanges.Title=Spara ändringar +TrackerPanel.Dialog.SaveChanges.Message=Spara ändringar som +TrackPlottingPanel.Popup.MenuItem.Lines=Linjer +TrackPlottingPanel.Popup.MenuItem.Points=Punkter +TrackPlottingPanel.Popup.MenuItem.Scale=Skalera... +TrackPlottingPanel.Popup.MenuItem.Print=Skriv... +TrackPlottingPanel.Popup.MenuItem.Measure=Skalera till fönster +TrackPlottingPanel.Popup.MenuItem.Analyze=Analysera... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zooma in +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zooma ut +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoskalera +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zooma till box +TrackPlottingPanelInspector.Title=Skala +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Sätt fotspår +TToolBar.Dropdown.SelectedTrack.Tooltip=Välj ett spår +TToolBar.Dropdown.SelectedTrack.None=Inget +TTrack.MenuItem.Delete=Radera +TTrack.MenuItem.Color=Färg... +TTrack.Dialog.Color.Title=Välj spår färg +TTrack.MenuItem.Name=Namn... +TTrack.MenuItem.Footprint=Fotspår +TTrack.MenuItem.Description=Notat... +TTrack.MenuItem.Visible=Synlig +TTrack.MenuItem.TrailVisible=Spår synligt +TTrack.MenuItem.Autostep=Autosteg +TTrack.MenuItem.MarkByDefault=Förinställd markering +TTrack.MenuItem.Locked=Låst +TTrack.MenuItem.Delete=Radera +TTrack.Name.None=Inget namn +TTrack.Dialog.Description.Title=Notat: +TTrack.Dialog.Name.Title=Sätt Namn +TTrack.Dialog.Name.Label=Namn: +TViewChooser.Button.Choose.Tooltip=Välj en vy +Vector.Name=Vektor +Vector.New.Name=vektor +Vector.MenuItem.ToOrigin=Till origo +Vector.MenuItem.Label=Synlig etikett +VectorSum.Name=Vektor summa +VectorSum.New.Name=summa +VectorSum.MenuItem.Inspector=Välj Vektorer... +VectorSumInspector.Title=Vektor Summa +VectorSumInspector.Border.Title=Välj vektorer +WorldTView.Popup.MenuItem.Projectile=Projektil modell + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Analytisk Partikel Modell +AnalyticParticle.Inspector.Title=Analytisk Partikel Modell +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=radie 4 +CircleFootprint.Circle_6=radie 6 +CircleFootprint.Circle_8=radie 8 +DynamicParticle.Name=Dynamisk Partikel Modell (Cartesisk) +DynamicParticle.Inspector.Title=Dynamisk Partikel Modell +DynamicParticle.Property.ForceX=kraft x +DynamicParticle.Property.ForceY=kraft y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Fixerad Position +ParticleModel.New.Name=modell +ParticleModel.MenuItem.InspectModel=Modell-editor... +ParticleModel.Inspector.Button.Undo=Ã…ngra +ParticleModel.Inspector.Button.Redo=Gör om +ParticleModel.Inspector.Button.Close=Stäng +ParticleModel.Inspector.Button.Help=Hjälp + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=X endast +Calibration.Axes.YOnly=Y endast +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Välj kalibrerings axel +Calibration.Label.Axes=axlar +Calibration.Dialog.InvalidCoordinates.Title=Ogiltiga koordinater +Calibration.Dialog.InvalidCoordinates.Message=Punkterna kan inte ha samma rum-koordinater. +Calibration.Dialog.InvalidXCoordinates.Message=Punkterna kan inte ha samma x-koordinater. +Calibration.Dialog.InvalidYCoordinates.Message=Punkterna kan inte ha samma y-koordinater. +SpectralLineFilter.Title=Gas Spektra +SpectralLineFilter.H=Väte +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Kvicksilver +TFrame.View.Unknown=View +TMenuBar.MenuItem.Undo=Ã…ngra +TMenuBar.MenuItem.Redo=Gör om +TMenuBar.MenuItem.Replace=Ersätt... +TMenuBar.Menu.AddImage=Importera Bilder +TMenuBar.MenuItem.AddBefore=Före denna bildruta... +TMenuBar.MenuItem.AddAfter=Efter denna bildruta... +TMenuBar.MenuItem.RemoveImage=Ta bort denna bildruta +TMenuBar.Menu.Tools=Verktyg +TMenuBar.MenuItem.DataFunctionTool=Data Builder +TMenuBar.MenuItem.DatasetTool=Data Tool +TMenuBar.Menu.CopyImage=Kopiera bild +TMenuBar.MenuItem.CopyMainView=Huvud vy +TMenuBar.MenuItem.CopyFrame=Bildruta +TMenuBar.MenuItem.PrintFrame=Skriv ut... +TrackerIO.Dialog.AddImage.Title=Importera bilder (välj en eller flera) +TTrack.Dialog.Name.BadName=används redan. Välj ett annat namn. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=totala kraften +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Plot vy av spår data kommer att visas här. +TableTView.Label.NoData=Tabell vy av spår data kommer att visas här. +TrackerPanel.Message.NoData0=Huvud vy av video och spår kommer att visas här. +TrackerPanel.Message.NoData1=Välj Fil|Öppna or Tracks|Ny för att starta. +WorldTView.Label.NoData=World vy av video och spår kommer att visas här. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Solver: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptiv Multistep +DynamicParticle.Table.Force.Border.Title=Kraft funktioner (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Position funktioner (t) +ParticleModel.Table.Initial.Border.Title=Startvärden +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Limma in bildruta +TMenuBar.MenuItem.PasteAfter=Efter denna bildruta +TMenuBar.MenuItem.PasteBefore=Före denna bildruta +TMenuBar.MenuItem.PasteReplace=Ersätt Video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Startar upp... +Tracker.Splash.HelpMessage=Ny användare? Se + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=vinkel mot horisontalen +LineProfile.Checkbox.Rotates=roteras +LineProfile.Label.Spread=spridning +RGBRegion.Name=RGB Region +RGBRegion.New.Name=region +RGBRegion.MenuItem.Fixed=Fixerad position +RGBRegion.Label.Radius=pixel radie +TTrack.Label.Step=steg + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=position nummer +LineProfile.Data.Description.1=position x-komponent +LineProfile.Data.Description.2=position y-komponent +LineProfile.Data.Description.3=röd +LineProfile.Data.Description.4=grön +LineProfile.Data.Description.5=blå +LineProfile.Data.Description.6=uppfattad ljusstyrka +LineProfile.Data.Description.7=linjebredd +ParticleModel.MenuItem.TraceVisible=Synligt spår +ParticleModel.MenuItem.StepsVisible=Synliga steg +PointMass.Data.Description.0=tid +PointMass.Data.Description.1=position x-komponent +PointMass.Data.Description.2=position y-komponent +PointMass.Data.Description.3=position storlek +PointMass.Data.Description.4=position vinkel +PointMass.Data.Description.5=hastighet x-komponent +PointMass.Data.Description.6=hastighet y-komponent +PointMass.Data.Description.7=hastighet storlek +PointMass.Data.Description.8=hastighet vinkel +PointMass.Data.Description.9=acceleration x-komponent +PointMass.Data.Description.10=acceleration y-komponent +PointMass.Data.Description.11=acceleration storlek +PointMass.Data.Description.12=acceleration vinkel +PointMass.Data.Description.13=rotationsvinkel +PointMass.Data.Description.14=vinkelhastighet +PointMass.Data.Description.15=vinkelacceleration +PointMass.Data.Description.16=steg nummer +PointMass.Data.Description.17=bildruta nummer +PointMass.Data.Description.18=rörelsemängd x-komponent +PointMass.Data.Description.19=rörelsemängd y-komponent +PointMass.Data.Description.20=rörelsemängd storlek +PointMass.Data.Description.21=rörelsemängd vinkel +PointMass.Data.Description.22=kinetisk energi +RGBRegion.Data.Description.0=tid +RGBRegion.Data.Description.1=position x-komponent +RGBRegion.Data.Description.2=position y-komponent +RGBRegion.Data.Description.3=röd +RGBRegion.Data.Description.4=grön +RGBRegion.Data.Description.5=blå +RGBRegion.Data.Description.6=uppfattad ljusstyrka +RGBRegion.Data.Description.7=pixel count +RGBRegion.Data.Description.8=steg nummer +RGBRegion.Data.Description.9=bildruta nummer +TView.Menuitem.Define=Definiera... +Vector.Data.Description.0=tid +Vector.Data.Description.1=x-komponent +Vector.Data.Description.2=y-komponent +Vector.Data.Description.3=storlek +Vector.Data.Description.4=vinkel +Vector.Data.Description.5=svans position x-komponent +Vector.Data.Description.6=svans position y-komponent +Vector.Data.Description.7=steg nummer +Vector.Data.Description.8=bildruta nummer + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Partikelns massa +ParticleModel.Parameter.InitialTime.Description=Start tid +AnalyticParticle.PositionFunction.X.Description=Position x-komponent +AnalyticParticle.PositionFunction.Y.Description=Position y-komponent +DynamicParticle.ForceFunction.X.Description=Kraft x-komponent +DynamicParticle.ForceFunction.Y.Description=Kraft y-komponent +DynamicParticle.Parameter.InitialX.Description=Startposition x-komponent +DynamicParticle.Parameter.InitialY.Description=Startposition y-komponent +DynamicParticle.Parameter.InitialVelocityX.Description=starthastighet x-komponent +DynamicParticle.Parameter.InitialVelocityY.Description=starthastighet y-komponent +TrackerPanel.ModelBuilder.Title=Model Builder +TrackerPanel.DataBuilder.Title=Data Builder + +TrackControl.TrailMenu.NoTrail=Inga fotspår +TrackControl.TrailMenu.ShortTrail=Korta fotspår +TrackControl.TrailMenu.LongTrail=Långa fotspår +TrackControl.TrailMenu.FullTrail=Alla steg +TrackerPanel.ModelBuilder.Spinner.Tooltip=Gällande modell +TrackerPanel.ModelBuilder.LineButton.Text=Linje stip +TrackerPanel.ModelBuilder.LineButton.Tooltip=Sätt linje stil +ParticleModel.LineStyle.None=Ingen linje +ParticleModel.LineStyle.Connect=Förena steg +ParticleModel.LineStyle.Smooth=Mjuk linje +ModelFunctionPanel.Label=Modell +AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functioner +DynamicFunctionPanel.FunctionEditor.Border.Title=Kraft Functioner + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Synliga tabell kolumner +Tracker.About.ProjectOf=Ett projekt av: +Tracker.About.TranslationBy=Översättning av +Tracker.About.Translator=Jonas Persson +TMenuBar.Menu.SaveVideoAs=Spara klipp som +TActions.SaveClipAs.ProgressMonitor.Message=Sparar klipp som +TActions.SaveClipAs.ProgressMonitor.Progress=Avslutat + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sync +PlotTrackView.Checkbox.Synchronize.Tooltip=Synkronisera horisontella axeln +RGBRegion.MenuItem.FixedRadius=Fixerad radie +Tracker.VideoZoom.Hint=klicka för att zooma in eller ut, dubbelklicka för att anpassa till fönster +Tracker.PlotZoomIn.Hint=drag för att zooma in, dubbelklicka för att autoskalera +Tracker.PlotZoomOut.Hint=klicka för att zooma ut +Tracker.MenuItem.Hints=Visa tips +TapeMeasure.Label.Length=längd +TapeMeasure.Label.TapeAngle=vinkel från x-axel +TapeMeasure.Label.ArcAngle=Gradskiva vinkel +TrackerIO.Dialog.NotAnImage.Title=Ogiltig fil typ +TrackerIO.Dialog.NotAnImage.Message1=är inte en JPG eller GIF fil. +TrackerIO.Dialog.NotAnImage.Message2=Vill du fortsätta? +TToolBar.Button.Zoom.Tooltip=Zoom verktyg (genväg: Z tangent) +TrackChooserTView.DropDown.Tooltip=Välj ett spår +TapeMeasure.Field.TapeAngle.Tooltip=Vinkel från positiv x-axel till måttband +TapeMeasure.Field.Magnitude.Tooltip=Längd i skalerade världs enheter +TapeMeasure.Readout.Magnitude.Name=längd +TapeMeasure.Readout.Magnitude.Hint=världs enheter +TapeMeasure.Readout.Angle.Name=Vinkel mätning +TapeMeasure.Readout.Angle.Hint=vinkel mot x-axeln +TapeMeasure.End.Name=slut +TapeMeasure.End.Hint=drag för att mäta avstånd och vinkel +TapeMeasure.Handle.Name=handtag +TapeMeasure.Handle.Hint=drag för att flytta +Vector.Tip.Name=spets +Vector.Tip.Hint=drag eller skriv in koordinater för att ändra komponenter +Vector.Handle.Name=handtag +Vector.Handle.Hint=drag för att flytta vektor +Vector.ShortHandle.Hint=drag för att flytta, alt-klick för att välja spets +PointMass.Position.Name=position +PointMass.Position.Hint=drag eller skriv in koordinater för att ändra position +PointMass.Velocity.Name=hastighet +PointMass.Acceleration.Name=acceleration +PointMass.Vector.Hint=drag för att flytta +PointMass.Position.Locked.Hint=klick för att välja--kan inte dras +CoordAxes.Handle.Name=+x-axel +CoordAxes.Handle.Hint=drag för att ändra lutning +CoordAxes.Origin.Name=origo +CoordAxes.Origin.Hint=drag för att ändra position +OffsetOrigin.Position.Name=position +OffsetOrigin.Position.Hint=drag eller skriv in koordinater för att flytta origo +Calibration.Point.Name=punkt +Calibration.Point.Hint=drag eller skriv in koordinater för att ändra axlar och skala +RGBRegion.Position.Name=position +RGBRegion.Position.Hint=drag eller skriv in koordinater för att ändra position +LineProfile.End.Name=slut +LineProfile.End.Hint=drag för att ändra linjens längd +LineProfile.Handle.Name=handtag +LineProfile.Handle.Hint=drag för att flytta linje +PointMass.Hint=Skriv in massan i verktygsfältet +PointMass.Unmarked.Hint=, shift-klick för att markera positionen +TTrack.Unselected.Hint=klick för att välja och/eller ändra egenskaper +Vector.Unmarked.Hint=skift-drag för att rita vektorer +OffsetOrigin.Unmarked.Hint=skift-klick för att markera offset punkt +Calibration.Unmarked.Hint=skift-klick för att markera fösta punkten +Calibration.Halfmarked.Hint=skift-klick för att markera andra punkten +CenterOfMass.Empty.Hint=välj massor för att definiera systemet +VectorSum.Empty.Hint=välj vektorer för att definiera summan +TapeMeasure.Hint=drag slutpunkter för att mäta avstånd och vinklar +CoordAxes.Hint=skriv in vinkel för att ändra lutning +ParticleModel.Hint=skriv in massan i verktysfältet, skriv in uttrycken i Model Builder för att skapa animation +RGBRegion.Hint=skriv in radie för att ändra storlek +RGBRegion.Unmarked.Hint=skift-klick för att markera positioner +TTrack.ImportVideo.Hint=importera video eller bild för att mäta RGB +TTrack.Selected.Hint=vald +LineProfile.Hint=skriv in spridning för att ändra linje bredd +LineProfile.Unmarked.Hint=skift-drag för att rita linje +LineProfile.Menu.Orientation=Orientering +LineProfile.MenuItem.Horizontal=Horisontal +LineProfile.MenuItem.XAxis=Längs X-Axeln +Footprint.PositionVector=vektor +Footprint.BoldPositionVector=kraftig vektor +Tracker.Startup.Hint=se här för tips (eller stäng av tips i Hjälp menyn), Tryck F1 för hjälp +TrackerPanel.NoVideo.Hint=öppna eller importera en video eller bild att analysera +TrackerPanel.CalibrateVideo.Hint=kalibrera videon genom att använda klibreringsverktyget +TrackerPanel.NoTracks.Hint=skapa ett nytt spår för att mäta objekt av intresse +TrackerPanel.SetClip.Hint=sätt eller se video klipp inställningar +TrackerPanel.ShowAxes.Hint=sätt origo och vinkeln på koordinataxlarna +VideoPlayer.Step.Hint=stega fram (genväg: PageDown ) +VideoPlayer.Back.Hint=stega tillbaka (genväg: PageUp ) +TrackerPanel.DVVideo.Hint=använd resize filtret för att korrigera distortioner i DV-format video +TrackerIO.DataFileFilter.Description=Tracker Filer +Tracker.Button.PDFHelp=Printable PDF Version +TToolbar.Button.TapeVisible.Tooltip=Visa, göm eller välj kalibreringsverktyg + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Spår kontroll +TMenuBar.MenuItem.Description=Noter +TrackPlottingPanel.RightDrag.Hint=höger-drag för alternativ +TMenuBar.MenuItem.DeleteSelectedPoint=Utvald punkt +TFrame.InfoDialog.SaveChanges.Title=Spara ändringar +TFrame.InfoDialog.SaveChanges.Message=Vill du spara ändringarna? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesisk +DynamicParticle.Editor.Button.Polar=Polär +DynamicParticle.Parameter.InitialR.Description=Begynnelsevärde för radien +DynamicParticle.Parameter.InitialTheta.Description=Begynnelsevärde för vinkeln +DynamicParticle.Parameter.InitialVelocityR.Description=Begynnelsevärde för radialhastigheten +DynamicParticle.Parameter.InitialOmega.Description=Begynnelsevärde för vinkelhastigheten +DynamicParticle.ForceFunction.R.Description=Kraftens radial komponent +DynamicParticle.ForceFunction.Theta.Description=Kraftens tangeniella komponent +DynamicParticlePolar.Name=Dynamisk Partikel Modell (Polär) +DynamicTwoBody.Editor.Button.Particle1=Partikel 1 +DynamicTwoBody.Editor.Button.Particle2=Partikel 2 +DynamicTwoBody.Name=Dynamisk två-kropps modell +TMenuBar.Menu.DynamicParticle=Dynamisk Partikel Modell +TMenuBar.MenuItem.Cartesian=Cartesisk +TMenuBar.MenuItem.Polar=Polär + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotrack... +Dialog.Button.Help=Hjälp +AutoTracker.Wizard.Title=Autotracker: +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Tillbaka +AutoTracker.Wizard.Button.Next=Nesta +AutoTracker.Wizard.Button.Accept=Acceptera +AutoTracker.Wizard.Button.Search=Sök +AutoTracker.Wizard.Button.Pause=Paus +AutoTracker.Wizard.Button.Skip=Hålla över +AutoTracker.Label.Mask=Bildmall +AutoTracker.Label.Target=Mål Offset +AutoTracker.Label.AcceptLevel=Acceptera Scores över +AutoTracker.TabbedPane.TabTitle.Mask=1. Mall +AutoTracker.TabbedPane.TabTitle.Target=2. Mål +AutoTracker.TabbedPane.TabTitle.Settings=3. Acceptera +AutoTracker.TabbedPane.TabTitle.Search=4. Sök +AutoTracker.Info.GetStarted=Markera objektet du önskar att autospåra. +AutoTracker.Info.Mask1=Mallen definierar den bild som skall matchas i varje bildruta. Flytta eller ändra storleken på mallen genom att dra i centrum eller handtaget. +AutoTracker.Info.Mask2=Mallen kan ändras till form och färg med tiden. Högre evolution fungerar på snabba förändringar, men blir mer osäker över långa tider. +AutoTracker.Info.MaskLocked1=Mallen används och är låst. +AutoTracker.Info.MaskLocked2=Klicka på Reset för att ta bort alla markeringar och starta på nytt. +AutoTracker.Info.Target1=Målet är där stegen markeras relativt mallen. Flytta målet genom att dra det. +AutoTracker.Info.Target2=Tips: Du kan justera mål-positionen även efter att stegen har markerats. Redan markerade steg kommer automatiskt att följa målet. +AutoTracker.Info.TargetLocked=Målet används och är fixerad till existerande steg positioner. Flyttar du målet följer stegen med. +AutoTracker.Info.Settings1=Match scores över acceptansnivån markeras automatiskt. +AutoTracker.Info.Settings2=Tips: minskar du acceptansnivån ökar risken för fel. +AutoTracker.Info.Search1=Rektangeln som visas visar var var sökningen efter en match görs. Flytta eller ändra storlek genom att dra i dess centrum eller handtag. +AutoTracker.Info.Search2=Tips: Sökområdet behöver inte vara stort om accelerationen är liten eller konstant. "Se-framåt" funktionen flyttar sökområdet automatiskt. +AutoTracker.Info.Frame=Bildruta +AutoTracker.Info.Match=Matchen som visas markerades automatiskt vid målpositionen. +AutoTracker.Info.Possible=En möjlig match hittades i sökområdet. Dina alternativ är: +AutoTracker.Info.NoMatch=Ingen match hittades inom sökområdet. Dina alternativ är: +AutoTracker.Info.Outside=Sökområdet är utanför bilden. Dina alternativ är: +AutoTracker.Info.Accepted=Matchen accepterades av användaren. +AutoTracker.Info.MarkedByUser=Detta steg markerades manuellt av användaren. +AutoTracker.Info.NoVideo=Autotracking kräver en video. Importera en video eller stäng Autotracker. +AutoTracker.Info.Height=höjd +AutoTracker.Info.Width=bredd +AutoTracker.Info.Accept=--acceptera matchen +AutoTracker.Info.Retry=--flytta sökområ+det och sök igen +AutoTracker.Info.Mark=--skift-klick för att markera detta steg manuellt +AutoTracker.Info.Skip=--hoppa över denna bildruta och fortsätt +AutoTracker.Info.Reset=--reset för att ta bort alla steg och starta på nytt +AutoTracker.Info.MatchScore=match score +AutoTracker.Dialog.MaskLocked.Title=Mallen låst +PointMass.Cursor.Autotrack.Description=Autotracker markör +VideoPlayer.StartFrame.Hint=drag för att markera start-bildrutan +VideoPlayer.EndFrame.Hint=drag för att markera slut-bildrutan +VideoPlayer.Slider.Hint=drag för att skanna genom videon +FileDropHandler.Dialog.BadFile.Message=Kan inte laddas in. +FileDropHandler.Dialog.BadFile.Title=okänt filformat + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Använd +DynamicParticle.Dialog.Delete.Message=Radera denna partikeln tar bort den från systemet. Radera? +DynamicParticle.Dialog.Delete.Title=Dynamiskt System +DynamicParticle.System.In=in +DynamicSystem.Empty=tom +DynamicSystem.Force.Name.Internal=intern +DynamicSystem.ForceFunction.R.Description=Intern radial kraft komponent +DynamicSystem.ForceFunction.Theta.Description=Intern tangentiell kraft komponent +DynamicSystem.MenuItem.Inspector=Välj partiklar... +DynamicSystem.Name=Dynamiskt två-kropps system +DynamicSystem.New.Name=system +DynamicSystem.Parameter.Of=av +DynamicSystem.Parameter.RelativeTo=relativt till +DynamicSystem.Parameter.Name.Relative=relativt +DynamicSystem.Parameter.ParticleMass.Description=Massa för +DynamicSystem.Parameter.Mass.Description=Total massa i systemet +DynamicSystemInspector.Border.Title=Partikel +DynamicSystemInspector.Title=Två-kropps system +DynamicSystemInspector.Button.Change=andra till... +DynamicSystemInspector.ParticleName.None=(none) +TMenuBar.MenuItem.Clone=Klona +TMenuBar.MenuItem.TwoBody=Två-kropps system +TrackerPanel.DataBuilder.Dropdown.Tooltip=Aktuellt valt spår +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertikal axel +TrackControl.Button.Trace.ToolTip=Visa eller göm spår +TToolBar.Button.Open.Tooltip=Öppna en video eller tracker fil i en ny tab +TToolBar.Button.Save.Tooltip=Spara aktuell tab i en fil +TToolBar.Button.SelectTrack=Välj +TToolBar.Button.SelectTrack.Tooltip=Välj ett existerande spår +TTrack.MenuItem.ClearSteps=Ta bort steg +PointMass.MenuItem.Position=Position +TMenuBar.MenuItem.Empty=(tom) +TTrackBar.Button.Memory=använt minne: +TTrackBar.Button.Memory.Tooltip=Visa och hantera minne +TTrackBar.Memory.PopupItem.Launch1=Starta +TTrackBar.Memory.PopupItem.Launch2=med minne +TButton.Track.ToolTip=Sätt egenskaperna till +Tracker.Dialog.OutOfMemory.Message1=Tracker har slut på tillgängligt minne. +Tracker.Dialog.OutOfMemory.Message2=Klicka minne knappen för alternativ. +Tracker.Dialog.OutOfMemory.Title=Slut på minne + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Se framåt +AutoTracker.Label.Original=Initial +AutoTracker.Label.NoMask=ingen +AutoTracker.Label.Rate=Evolution Rate: + +AutoTracker.Info.Mask3=Tips: Mallen behöver inte vara stor eller omfatta hela objektet. Ett drag som är unikt och innehåller en hog-kontrast kant fungerar generellt bäst. +AutoTracker.Wizard.Checkbox.XAxis=Enbart X-axeln +AutoTracker.Info.SearchOnAxis1=X-axeln inom den visade rektangeln kommer att sökas av för bästa match. Flytta eller ändra storlek genom att dra dess center eller handtag. +AutoTracker.Info.PossibleOnAxis=En möjlig match har hittats längs x-axeln i sökområdet. Dina alternativ är: +AutoTracker.Info.NoMatchOnAxis=Ingen match hittades längs x-axeln i sökområdet Dina alternativ är: +AutoTracker.Info.RetryOnAxis=--flytta sökområdet eller x-axeln och sök igen +AutoTracker.Wizard.Button.Delete=Ta bort denna punkten +AutoTracker.Wizard.Button.DeleteMore=Ta bord denna och alla punkter efter den +Button.Define.Tooltip=Definiera funktioner för existerande kolumn variabler +Calibration.Label.Point=punkt +CalibrationStick.Hint=Sätt längd eller drag spetsen för att ändra skala, sätt vinkel för att ändra lutning +CalibrationStick.End.Hint=drag för att ändra skala +CalibrationStick.New.Name=kalibreringsstav +CalibrationTapeMeasure.New.Name=kalibrerings måttband +CalibrationTapeMeasure.Readout.Magnitude.Hint=Klicka för att mata in en känd längd i världsenheter +CalibrationTapeMeasure.Hint=sätt längd för att ändra skalan, sätt vinkel för att ändra axlarnas lutning +DynamicSystem.Data.Description.0=relativt avstånd mellan partiklar +DynamicSystem.Data.Description.1=relativ vinkel +DynamicSystem.Data.Description.2=relativ radialhastighet +DynamicSystem.Data.Description.3=relativ vinkelhastighet +ExportDataDialog.Subtitle.Table=Data Tabell +ExportDataDialog.Subtitle.Content=Celler +ExportDataDialog.Subtitle.Format=Numeriskt Format +ExportDataDialog.Subtitle.Delimiter=avgränsare +ExportDataDialog.Title=Exportera Data +ExportDataDialog.Delimiter.Add=Addera... +ExportDataDialog.Delimiter.Remove=Ta bort... +ExportDataDialog.Content.AllCells=Alla Celler +ExportDataDialog.Content.SelectedCells=Valda Celler +ExportDataDialog.MenuItem.RemoveDelimiter=Ta bort egna avgränsare +ExportDataDialog.Chooser.SaveData.Title=Spara Data som +ExportVideoDialog.Button.SaveAs=Spara som... +ExportVideoDialog.Button.FullSize=Full storlek +ExportVideoDialog.Button.DrawnSize=Som visas +ExportVideoDialog.Content.VideoOnly=enbart Video +ExportVideoDialog.Content.VideoAndGraphics=Video och grafik +ExportVideoDialog.Content.GraphicsOnly=Enbart grafik +ExportVideoDialog.Title=Exportera Video klipp +ExportVideoDialog.Label.ClipSettings=Klipp inställningar +ExportVideoDialog.Subtitle.Size=Storlek +ExportVideoDialog.Subtitle.Content=Innehåll +ExportVideoDialog.Subtitle.View=Vy +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=Videon har sparats som +ExportVideoDialog.Complete.Message2=Vill du öppna den i Tracker nu? +ExportVideoDialog.Complete.Title=Export klar +ExportVideoDialog.VideoSize=video storlek +ExportVideoDialog.MatSize=mat storlek +ExportVideo.Dialog.HiddenPlots.Message=Plots måste vara fullt synliga för att kunna exporteras. +ExportVideo.Dialog.HiddenPlots.Title=Ofullständig vy +Footprint.DoubleTarget=dubbelt hårkors +Footprint.BoldDoubleTarget=kraftigt dubbelt hårkors +OffsetOrigin.MenuItem.Fixed=Fixerade världs koordinater +ParticleModel.Dialog.Offscreen.Message1=Några modell steg är tomma då de befinner sig långt borta från skärmen. +ParticleModel.Dialog.Offscreen.Message2=för att åtgärda detta, ändra modellen eller skala om videon. +ParticleModel.Dialog.Offscreen.Title=Utanför giltigt område +PrefsDialog.Tab.Configuration.Title=Konfiguration +PrefsDialog.Memory.BorderTitle=Minnesstorlek +PrefsDialog.Tab.General.Title=Annat +PrefsDialog.RecentFiles.BorderTitle=Öppna senaste menyn +PrefsDialog.Label.RecentSize=Fil count +PrefsDialog.Hints.BorderTitle=Tips +PrefsDialog.Button.Relaunch=Ladda in på nytt nu +PrefsDialog.Button.ClearRecent=Rensa +PrefsDialog.Checkbox.DefaultSize=Använd default +PrefsDialog.Checkbox.HintsOn=Visa tips genom default +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video spelare +PrefsDialog.Button.Xuggle=Xuggle (rekommenderas) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Minnes hanteringen är inte tillgänglig när Web Start används. +PrefsDialog.Dialog.WebStart.Title=Web Start Mode +PrefsDialog.LookFeel.BorderTitle=Se och testa +PrefsDialog.Language.BorderTitle=Språk +PrefsDialog.Upgrades.BorderTitle=Sök efter nya versioner +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=Display +PrefsDialog.Language.Default=default +PrefsDialog.Upgrades.Always=Varje gång +PrefsDialog.Upgrades.Weekly=Varje vecka +PrefsDialog.Upgrades.Monthly=Varje månad +PrefsDialog.Upgrades.Never=Aldrig +PrefsDialog.Button.CheckForUpgrade=Sök nu +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback +PrefsDialog.Xuggle.Slow=Smooth (kan vara långsam) +PrefsDialog.Xuggle.Fast=Fast (kan verka hoppande) +PrefsDialog.CalibrationTool.BorderTitle=Default Kalibreringsverktyg +Protractor.Name=Gradskiva +Protractor.New.Name=gradskiva +Protractor.Hint=drag armar för att mäta vinkel +Protractor.Label.Angle=vinkel +Protractor.Field.Angle.Tooltip=Vinkel mellan gradskivarmarna +Protractor.Vertex.Name=vertex +Protractor.Vertex.Hint=drag för att flytta vertex +Protractor.End.Name=arm ände +Protractor.End.Hint=drag för att rotera armen +Protractor.Handle.Name=handtag +Protractor.Handle.Hint=drag för att flytta gradskivan +Protractor.Rotator.Name=roterare +Protractor.Rotator.Hint=drag för att rotera gradskivan +Protractor.Readout.Name=avläsning +Protractor.Readout.Hint=Vinkel mellan gradskivarmarna +ProtractorFootprint.Circle3=liten cirkal +ProtractorFootprint.Circle5=stor cirkel +ProtractorFootprint.Circle3Bold=kraftig liten cirkel +ProtractorFootprint.Circle5Bold=kraftig stor cirkel +Stick.Name=Kalibreringsstav +Stick.New.Name=kalibereringsstav + +TableTrackView.MenuItem.Unformatted=Full Precision +TableTrackView.MenuItem.Formatted=Som formatterad +TableTrackView.Menu.SetDelimiter=sätt avgränsare +TableTrackView.MenuItem.AddDelimiter=Lägg till... +TableTrackView.MenuItem.RemoveDelimiter=Ta bort... +TableTrackView.Dialog.CustomDelimiter.Message=Mata in en ny avgränsare: +TableTrackView.Dialog.CustomDelimiter.Title=Lägg till avgränsare +TableTrackView.Header.Tooltip=Klika för att sortera eller dubbel-klicka för att välja kolumn +TableTrackView.MenuItem.CopySelectedData=Kopiera valda data +TableTrackView.Dialog.RemoveDelimiter.Message=Välj avgränsare att ta bort: +TableTrackView.Dialog.RemoveDelimiter.Title=Ta bort avgränsare +TableTrackView.Radians.Tooltip=i radianer +TableTrackView.Degrees.Tooltip=i grader +TableTrackView.RadiansPerSecond.Tooltip=i radianer/s +TableTrackView.DegreesPerSecond.Tooltip=i grader/s +TableTrackView.RadiansPerSecondSquared.Tooltip=i radianer/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=i grader/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Ta bort Data funktion +TActions.Action.SaveFrame=Spara Tabset som... +TActions.AboutVideo=Egenskaper... +TActions.Dialog.AboutVideo.Title=Video egenskaper +TActions.Dialog.AboutVideo.Type=Typ +TActions.Dialog.AboutVideo.Size=Dimensioner +TActions.Dialog.AboutVideo.Length=Längd +TActions.Dialog.AboutVideo.Frames=bildrutor +TActions.Dialog.AboutVideo.Seconds=sekunder +TActions.Dialog.AboutVideo.FrameRate=bildhastighet (Frame Rate) +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Väg +TActions.Action.ImportTRK=Tracker Fil... +TActions.Action.ProtractorVisible=Synlig +TapeMeasure.MenuItem.FixedLength=Fixerad längd +TextTView.Label.NoTab=Klicka på "Page" för att lägga till text och HTML sidor här. +TextTView.NewTab.Text1=Dubbel-klicka föpr att editera text eller titel. Höger-klicka för fler alternativ. +TextTView.NewTab.Text2=För att visa en HTML sida, skriv in url eller höger-klicka för att öppna en fil. +TextTView.NewTab.Title=Namnlös +TextTView.Dialog.TabTitle.Title=Skriv Titel +TextTView.MenuItem.OpenHTML=Öppna HTML... +TextTView.MenuItem.SetTitle=Skriv Titel... +TextTView.Button.NewTab=Ny +TextTView.TextEdit.Description=Text +TFrame.Dialog.FileNotFound.Message=Filen kunde inte hittas: +TFrame.Dialog.FileNotFound.Title=Filen kunde inte hittas +TFrame.View.Text=Sid vy +TFrame.View.Main=Huvud vy +TMenuBar.Menu.OpenRecent=Öppna senaste +TMenuBar.Menu.Import=Importera +TMenuBar.Menu.Export=Exportera +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=Data Fil... +TMenuBar.Menu.CopyObject=Kopiera objekt +TMenuBar.MenuItem.Coords=Koordinat system +TMenuBar.MenuItem.VideoClip=Video klipp +TMenuBar.Menu.MeasuringTools=Mätverktyg +TMenuBar.Menu.AngleUnits=Vinkel enheter +TMenuBar.MenuItem.Degrees=Grader +TMenuBar.MenuItem.Radians=Radianer +Tracker.Dialog.NoXuggle.Title=Xuggle kunde inte hittas +Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) är inte installerad. +Tracker.Dialog.NoXuggle.Message2=Download Xuggle från http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=Om Xuggle... +Tracker.Dialog.AboutXuggle.Title=Om Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoVideoEngine.Message1=Ingen video spelare kunde hittas. Utan dessa kan Trakck bara +Tracker.Dialog.NoVideoEngine.Message2=öppna bilder, blidsekvenser och animmated gifs. +Tracker.Dialog.NoVideoEngine.Message3=För att installera Xuggle, Trackers rekommenderade videospelare på +Tracker.Dialog.NoVideoEngine.Message4=alla platformar, download den senaste Tracker installer från +Tracker.Dialog.NoVideoEngine.Title=Videospelare saknas +Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's rekommenderade videospelare, har inte installerats än. +Tracker.Dialog.NoXuggle.Message2=För att installera Xuggle, download den senaste Tracker installer from +Tracker.Dialog.NoXuggle.Title=Xuggle saknas +Tracker.About.DefaultLocale=Default placering +Tracker.About.CurrentLanguage=Språk +Tracker.Dialog.InsufficientMemory.Title=För lite minne +Tracker.Dialog.InsufficientMemory.Message=Minnet som behövs är för stort. +TrackerIO.Dialog.TabMustBeSaved.Message1=Tab +TrackerIO.Dialog.TabMustBeSaved.Message2=måste sparas som en tracker fil för att inkluderas i ett tabset. +TrackerIO.Dialog.TabMustBeSaved.Message3=Vill du spara den? +TrackerIO.Dialog.TabMustBeSaved.Title=Tab som inte sparats +TrackerIO.Dialog.NoTabs.Message=Det finns inga tabs att spara! +TrackerIO.Dialog.NoTabs.Title=Tomt Tabset +TrackerIO.Dialog.SaveTabset.Title=Spara Tabset +TrackerIO.Dialog.SaveTab.Title=Spara Tab +TrackerIO.Delimiter.Tab=Tab +TrackerIO.Delimiter.Space=mellanrum +TrackerIO.Delimiter.Comma=komma +TrackerIO.Delimiter.Semicolon=semikolon +TrackerIO.VideoAndDataFileFilter.Description=Video och Tracker Filer +TrackerPanel.Dialog.Version.Message1=Du öppnar en fil som skapats med Tracker +TrackerPanel.Dialog.Version.Message2=som kan referera till +TrackerPanel.Dialog.Version.Message3=funktioner som saknas i den version du använder +TrackerPanel.Dialog.Version.Message4=Den senaste versionen är tillgänglig hos +TrackerPanel.Dialog.Version.Title=Version Mismatch +TrackerPanel.Label.ModelStart=Start +TrackerPanel.Label.ModelEnd=Slut +TrackerPanel.Spinner.ModelStart.Tooltip=Sätt start-bildruta för denna modellen +TrackerPanel.Spinner.ModelEnd.Tooltip=Sätt slut-bildruta för denna modellen +TToolbar.Button.ProtractorVisible.Tooltip=Visa eller dölj gradskiva +TToolbar.Button.AxesVisible.Tooltip=Visa eller dölj koordinataxlar +TToolBar.Button.TrackControl.Tooltip=Visa eller dölj spår-kontrollen +TTrack.Dialog.StepSizeWarning.Message1=Varning: vissa spår har markerats med en steg-längd större än ett, vilket gör att vissa bildrutor inte markerats. +TTrack.Dialog.StepSizeWarning.Message2=Ändring av steg-längden ger upphov till gap i data-mängden. +TTrack.Dialog.StepSizeWarning.Message3=Hastigheten och accelerationen runt dessa gap kan inte bestämmas innan alla steg markerats. +TTrack.Dialog.StepSizeWarning.Title=Varning +TTrack.Dialog.SkippedStepWarning.Message1=Varning: hoppa över steg när man markerar ger upphov till gap i data-mängden. +TTrack.Dialog.SkippedStepWarning.Title=Varning +TTrack.Dialog.SkippedStepWarning.Checkbox=Visa inte detta igen +TTrack.Locked.Hint=Låst +TTrack.AngleField.Radians.Tooltip=Vinkel i radianer +TTrack.AngleField.Degrees.Tooltip=Vinkel i grader +TTrack.AngleField.Popup.Radians=Ändra till radianer +TTrack.AngleField.Popup.Degrees=Ändra till grader +TTrackBar.Memory.Menu.SetSize=SÄtt minnesstorlek... +TTrackBar.Button.Version=Now available: version +TTrackBar.Popup.MenuItem.Upgrade=Uppdatera nu... +TTrackBar.Popup.MenuItem.Ignore=Ignorera +XuggleVideo.MenuItem.SmoothPlay=Smooth Play (kan vara långsam) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Kalibrerings måttband +CircleFootprint.Circle=cirkel +CircleFootprint.FilledCircle=fylld cirkel +CircleFootprint.Dialog.Title=Cirkel Spår +CircleFootprint.Dialog.Label.Radius=Radie +CircleFootprint.Dialog.Checkbox.Bold=Kraftig +CircleFootprint.Dialog.Checkbox.CenterSpot=Center Markering +LineProfile.Hint.Marking=drag musen för att markera linjeprofil +PageTView.Button.Page=Sida +PageTView.MenuItem.ClosePage=Stäng sida +PointMass.Hint.Marking=klicka med musen för att markera en ny punkt, tryck enter för att klona det förra steget +PrefsDialog.Dialog.NewVersion.Title=Upgradering +PrefsDialog.Dialog.NewVersion.Message1=Version +PrefsDialog.Dialog.NewVersion.Message2=är nu tillgänglig hos +PrefsDialog.Dialog.NewVersion.None.Message=Ingen ny version är tillgänglig för tillfället. +RGBRegion.Hint.Marking=klicka med musen för att markera centrum i området +TMenuBar.MenuItem.Restore=Återställ vy +TrackControl.StretchVectors.None=No stretch +TViewChooser.Maximize.Tooltip=Maximera denna vy +TViewChooser.Restore.Tooltip=Återställ vy +Vector.Hint.Marking=drag musen för att markera en ny vektor, tryck enter för att klona det förra steget +WorldTView.Button.World=World + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Varningar +PrefsDialog.Checkbox.WarnIfNoEngine=Ingen video-spelare +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle fel +PropertiesDialog.Title=Egenskaper +PropertiesDialog.Label.Author=Författare +PropertiesDialog.Label.Contact=Kontakt +TActions.Action.Properties=Egenskaper... +TActions.Action.OpenBrowser=Öppna bliblioteks webläsaren... +TFrame.Progress.Xuggle=Xuggle lastar in bildrutor +TFrame.Progress.ClickToCancel=(klicka för att stoppa) +TFrame.Dialog.StalledVideo.Title=Fel inträffade under inläsning av video +TFrame.Dialog.StalledVideo.Message0=Inlastning av video har stannat upp. Detta kan vara ett tillfälligt fel. +TFrame.Dialog.StalledVideo.Message1=Du kan välja på att stoppa inlastningen eller vänta. +TFrame.Dialog.StalledVideo.Message2=Andra alternativ för att öppna videon är: +TFrame.Dialog.StalledVideo.Message3=1. Använd konverteringsprogram för att spara i annat format. +TFrame.Dialog.StalledVideo.Message4=2. Välj QuickTime för att lasta in videon. +TFrame.Dialog.StalledVideo.MessageMac=2. Öppna Tracker i 32-bit Java VM och öppna med QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stopp +TFrame.Dialog.StalledVideo.Button.Wait=Vänta +Tracker.Dialog.NoVideoEngine.Checkbox=Visa inte igen +TrackerIO.ZipFileFilter.Description=ZIP filer +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle träffat på följande fel medan videon öppnades: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Inte alla fel är fatala. För fullständigt felmeddelande öppna Help|Message Log. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Om Xuggle misslyckas, kan det gå att öppna videon med QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: I Mac OSX kräver detta att Tracker körs med 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Fel +TrackerIO.ErrorFFMPEG.LogMessage=För mer detajer, sätt på Xuggle varningar i inställningsdialogen (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Öppna OSP Digital Library Browser + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=Filen kan inte hittas +TFrame.Dialog.NoTRKInComPADRE.Message=Ingen Tracker fil hittades i denna noden + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinematisk Partikel +DynamicParticle.Builder.Title=Dynamisk Partikel (Cartesisk) +DynamicParticlePolar.Builder.Title=Dynamisk Partikel (Polär) +DynamicSystem.Builder.Title=Dynamiskt System (Intern) +PropertiesDialog.Button.CopyFilePath=Kopiera Fil Path +PropertiesDialog.Button.CopyVideoPath=Kopiera Video Path +PropertiesDialog.Tab.TrackerFile=Tracker Fil +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Egenskaper +PropertiesDialog.Header.Value=Värde +TActions.Action.OpenURL=Öppna URL... +TActions.Dialog.OpenURL.Title=Öppna URL +TActions.Dialog.OpenURL.Message=Skriv in URL för web-baserad video, Tracker fil eller Tracker zip fil +TActions.Dialog.AboutVideo.Name=Namn + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cachade Web Filer +PrefsDialog.Button.ClearCache=Clear + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, skift-klick för att ommarkera markerad position +PointMass.Remarking.Hint=klicka musen för att ommarkera positionen +PointMass.PositionSelected.Hint=drag eller skriv in positionen i verktygsraden +PointMass.VectorSelected.Hint=drag för att flytta +Vector.Remark.Hint=skift-klick för att ommarkera markerad spets +Vector.TipSelected.Hint=drag eller skriv in komponenter i verktygsraden +Vector.HandleSelected.Hint=dra för att flytta +Vector.Remarking.Hint=klicka musen för att ommarkera spetsen +AutoTracker.Label.Search=Sök +AutoTracker.Label.Target=Mål +AutoTracker.Label.Frame=Bildruta +AutoTracker.Label.Point=Punkt +AutoTracker.Label.Template=Mall +AutoTracker.Label.Track=Spår +AutoTracker.Label.Match=Match +AutoTracker.Label.NoTemplate=Ingen Mall +AutoTracker.Label.EvolutionRate=Evolutions grad +AutoTracker.Label.Automark=Automarkera +AutoTracker.Info.Instructions=Klicka på Search knappen før att hitta en match i sökområdet som visas. +AutoTracker.Info.KeyFrame.Instructions1=Key frame definierar mallen och målet. Klicka på Sök knappen för att hitta matchingar till mallen. +AutoTracker.Info.KeyFrame.Instructions2=Du kan dra på målet, mallen eller sökområdet för att flytta eller ändra storleken. +AutoTracker.Info.MouseOver.Instructions=Placera musen över kontrollerna för att få mer information om inställningar och justeringar. +AutoTracker.Info.Mask1=Mallen är bilden som man skall hitta en match till. Den startar med key frame och anpassar sig till förändringar i form och färg. +AutoTracker.Info.Mask2=Automark nivån är den minsta match poängen som behövs för att få en automatisk markering. +AutoTracker.Info.Mask.Instructions=Flytta eller ändra storlek på mallen genom att dra i kanterna eller hörnen (endast key frame). Justera evolutions graden och automark nivån med menyerna. +AutoTracker.Info.Mask.Tip=För låg automark nivå kan ge falska matcher--öka evolution graden istället. +AutoTracker.Info.Search=Sökområdet skannas för bäste match. +AutoTracker.Info.SearchOnAxis=X-axeln i sökområdet skannas för bäste match. +AutoTracker.Info.Search.Instructions=Flytta eller ändra storlek på sökområdet genom att dra i kanterna eller hörnen. Aktivera x-axel och se-frammåt funktionerna genom att markera dessa. +AutoTracker.Info.Search.Tip=Sökområdet behöver inte vara stort i många fall. Se framåt funktionen flyttar automatiskt sökområdet till match positionen. +AutoTracker.Info.Target=Målet är där den önskade spår punkten är markerad. +AutoTracker.Info.Target.Instructions=Flytta målet genom att dra det (endast key frame). Välj det önskade spåret från gardin menyerna. +AutoTracker.Info.Title.Settings=Inställningar +AutoTracker.Info.Title.Tip=Topp +AutoTracker.Info.SelectTrack=Välj eller skapa ett spår och den punkt du vill använda autotrack på. +AutoTracker.Info.OutsideXAxis=X-axis passerar inte genom sökområdet. Dina möjligheter är: +AutoTracker.Info.NewKeyFrame=--gå tillbaka och ändra evolutionsgraden ellan använd skift-control-klick för att definiera en ny key frame +AutoTracker.Info.Replace=--acceptera matchen och ersätt den existerande punkten +AutoTracker.Info.Keep=--behåll den existerande punkten +AutoTracker.Info.PossibleReplace=En möjlig match hittades för att ersätta den existerande punkten. Dina möjligheter är: +AutoTracker.Wizard.Button.Accept=Acceptera +AutoTracker.Wizard.Button.Stop=Stopp +AutoTracker.Wizard.Button.Skip=Hoppa över +AutoTracker.Wizard.Button.Replace=Ersätt +AutoTracker.Wizard.Button.Keep=Behåll +AutoTracker.Wizard.Button.Search=Sök +AutoTracker.Wizard.Button.SearchThis=Sök denna +AutoTracker.Wizard.Button.SearchNext=Sök nästa +AutoTracker.Wizard.Button.Delete=Ta bort +AutoTracker.Wizard.Button.ShowKeyFrame=Visa Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Ta bort Key Frame +AutoTracker.Wizard.Checkbox.LookAhead=Se frammåt +AutoTracker.Wizard.Checkbox.XAxis=Enbart x-axel +AutoTracker.Wizard.Menuitem.DeleteThis=Denna punkten +AutoTracker.Wizard.Menuitem.DeleteLater=Punkter efter denna +AutoTracker.Wizard.Menuitem.DeleteAll=Alla punkter +TToolBar.Button.AutoTracker.Tooltip=Visa eller dölj autotracker +MainTView.Popup.MenuItem.ZoomIn=Zooma in +MainTView.Popup.MenuItem.ZoomOut=Zooma ut +MainTView.Popup.MenuItem.ZoomToFit=Zooma till fönster +TrackerIO.Dialog.DurationVaries.Title=Variabelt tid mellan bildrutor +TrackerIO.Dialog.DurationVaries.Message1=Denna video innehåller bildrutor med tidsskillnader som avviker från medel med mer än +TrackerIO.Dialog.DurationVaries.Message2=För noggranna hastigheter och accelerationer, bör du utesluta dessa bildrutor från +TrackerIO.Dialog.DurationVaries.Message3=beräkningarna genom att ändra start och slut bildrutorna i videoklippet. +TrackerIO.Dialog.DurationVaries.Message4=Bildrutor att utesluta: +TrackerIO.Dialog.DurationVaries.Message5=Medel tidsskillnad och uppspelningshastighet om uteslutna: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=Ingen resurs kan hämtas från denna noden + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=skift-klick för att markera +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Rensa när programmet stängs +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Bibliotek +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Bibliotek och Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Rensa när programmet stängs +PrefsDialog.Run.BorderTitle=Program som körs vid uppstart +PrefsDialog.FileChooser.Title.Run=Välj körbar fil +PrefsDialog.Button.Save=Spara +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README fil kan inte hittas +Popup.MenuItem.Algorithm=Algoritmer... +AlgorithmDialog.Button.FiniteDifference=Finite skillnad +AlgorithmDialog.Button.BounceDetect=Studsdetektion +AlgorithmDialog.TitledBorder.Choose=Välj algoritm för att beräkna hastighet och acceleration: +AlgorithmDialog.Title=Algoritmer +AlgorithmDialog.FiniteDifference.Message1=Detta är standard algoritmen. +AlgorithmDialog.FiniteDifference.Message2=Hastighet: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=Denna algoritmen jämnar ut hastigheten och accelerationen samt detekterar plötsliga ändringar i hastigheten. +AlgorithmDialog.BounceDetect.Message2=Varning: kan skapa artefakter. För mer information, se: +TMenuBar.Menu.Diagnostics=Diagnostik + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Ogiltig XML +Tracker.Dialog.Invalid.Message=Filen kan inte läsas. +TrackPlottingPanel.Popup.Menu.CompareWith=Jämför med +TrackerPanel.DataBuilder.TrackType.Unknown=okänd +TrackerPanel.DataBuilder.Button.Load.Tooltip=Läs in datafunktioner från en XML fil +TrackerPanel.DataBuilder.Button.Save.Tooltip=Spara datafunktioner i en XML fil +TrackerPanel.DataBuilder.Load.Title=Läs in datafunktioner +TrackerPanel.DataBuilder.Load.Message=Välj funktioner att läsa in: +TrackerPanel.DataBuilder.Save.Title=Spara datafunktioner +TrackerPanel.DataBuilder.Save.Message=Välj funktioner attspara: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Läs in till alla +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Läs indast in i +TrackerPanel.DataBuilder.Dialog.Load.Title=Spår Val +TrackerPanel.DataBuilder.Dialog.Load.Message=Vill du läsa in funktioner till alla spår av typen +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Ogiltig spårtyp +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Filen definierar datafunktioner för spårtyp +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Dom kan inte läsas till typ +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Felaktig typ +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Filen definierar inga datafunktioner. +TToolbar.Button.Refresh=Refresh data och vyer + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=ZIP resursen har sparats som +ExportTRKDialog.Complete.Message2=Vill du öppna den i Tracker nu? +ExportTRKDialog.Complete.Title=Export fullförd +ExportTRKDialog.Title=Exportera ZIP resurs +ExportTRKDialog.Message1=Denna (1) exporterar videoklipp, (2) konverterar tab data för att matcha den exporterade videon, och (3) sparar tab data som en ny Tracker fil. +ExportTRKDialog.Message2=Tracker filen och videon sparas i samma bibliotek med samma namn men med olik filtyp. +TMenuBar.MenuItem.TabClip=ZIP Resurs +TMenuBar.Menu.CalibrationTools=Kalibrerings verktyg +TrackerIO.Dialog.DurationVaries.Button.SetClip=Sätt Rekommenderat klipp +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=slut +TrackerIO.Dialog.DurationVaries.Recommended=Rekommenderat klipp + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Sätt samman ändar +AttachmentInspector.Label.End=Slut +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Namn +AttachmentInspector.Header.AttachedTo=Bifoga till +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Sätt samman ändar... +PerspectiveTrack.Corner=hörn +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=tid +Protractor.Data.Description.1=gradskiva, vinkel +Protractor.Data.Description.2=längd arm 1 +Protractor.Data.Description.3=längd arm 2 +Protractor.Data.Description.4=steg nummer +Protractor.Data.Description.5=bildruta nummer +TapeMeasure.Data.Description.0=tid +TapeMeasure.Data.Description.1=längd +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=steg nummer +TapeMeasure.Data.Description.4=bildruta nummer + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Denna Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Denna Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Senare Matcher +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Lägg till +Dialog.Button.Remove=Radera +PrefsDialog.Button.ClearHost=Clear webplats +PrefsDialog.Button.ClearHost.Tooltip=ta bort alla filer associerade med den valda webplatsen från OSP cache +PrefsDialog.Button.ClearCache.Tooltip=ta bort alla filer från OSP cache +TActions.Action.SaveZip=Exportera ZIP Resurs +ThumbnailDialog.Title=Exportera Thumbnail bild +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Nuvarande bild +ThumbnailDialog.Label.FrameNumber=bildruta +ThumbnailDialog.Label.StepNumber=steg +ThumbnailDialog.View.VideoOnly=Enbart Video +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG bild +ThumbnailDialog.Format.JPG=JPEG bild +ThumbnailDialog.Chooser.SaveThumbnail.Title=Spara Thumbnail +ThumbnailDialog.Subtitle.Image=bild +TMenuBar.MenuItem.Thumbnail=Thumbnail bild + +TToolBar.Button.SaveZip.Tooltip=Exportera en ZIP resurs för OSP Digital Library Browser +TTrack.MenuItem.DeletePoint=Radera valt steg +ZipResourceDialog.Title=Exportera ZIP resurs +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Namn +ZipResourceDialog.Label.Description=Beskrivning +ZipResourceDialog.Label.Keywords=Nyckelord +ZipResourceDialog.Label.Link=Extern Länk +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=ZIP resursen har sparats som +ZipResourceDialog.Complete.Message2=Vill du öppna den i Tracker nu? +ZipResourceDialog.Complete.Title=Framgång +ZipResourceDialog.Border.Title.Documentation=HTML Dokumentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Exportera ZIP resurs +ZipResourceDialog.FileChooser.AddFile.Title=Lägg till fil i ZIP Resurs +ZipResourceDialog.FileChooser.OpenHTML.Title=Öppna HTML Fil +ZipResourceDialog.Button.AddFiles=Lägg till filer +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Lägg till HTML informations fil +ZipResourceDialog.AddHTMLInfo.Message1=Vill du lägga till en HTML informations fil +ZipResourceDialog.AddHTMLInfo.Message2=till ZIP resursen? +ZipResourceDialog.HTMLField.DefaultText=Om ingen specificerad kommer en tom fil att skapas +ZipResourceDialog.Dialog.AddFiles.Title=Lägg till HTML och PDF Filer +ZipResourceDialog.Tooltip.HTML=Path till HTML filee (finns ingen kommer en tom fil att skapas) +ZipResourceDialog.Tooltip.Author=Författare till denna resurs +ZipResourceDialog.Tooltip.Title=Visa namnet på resursen (inte filnamnet) +ZipResourceDialog.Tooltip.Description=En användbar beskrivning av resurtsen +ZipResourceDialog.Tooltip.Keywords=En lista med nyckelord att söka i DL browsern +ZipResourceDialog.Tooltip.Contact=Kontakt information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL till en extern HTML fil med mer information om denna resursen +ZipResourceDialog.Tooltip.ThumbnailSettings=Ändra thumbnail vy, storlek eller filtyp +ZipResourceDialog.Tooltip.AddFiles=Lägg till HTML och PDF filer till ZIP resursen +ZipResourceDialog.Tooltip.TrimVideo=Markera för att exportera video klippet, avmarkera för att använda original videon +ZipResourceDialog.Tooltip.LoadHTML=Använd en filväljare för att lasta in en HTML info fil diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties index 1d5c0ffd..afaac750 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties @@ -1,1191 +1,1191 @@ -# This is the thai tracker.properties file - -Calibration.Name=Calibration Point Pair -Calibration.New.Name=calibration -CenterOfMass.Name=Center Of Mass -CenterOfMass.New.Name=cm -CenterOfMass.MenuItem.Inspector=Select Masses... -CenterOfMassInspector.Title=Center of Mass -CenterOfMassInspector.Border.Title=Select Masses -ConfigInspector.Border.Title=Check Desired Items -ConfigInspector.Title=Preferences -ConfigInspector.Button.SaveAsDefault=Save As Default -CoordAxes.Name=Axes -CoordAxes.New.Name=axes -Dialog.Button.Cancel=Cancel -Dialog.Button.OK=OK -Dialog.Button.Close=Close -Dialog.Button.All=All -Dialog.Button.None=None -Dialog.Button.Copy=Copy -Dialog.Button.Update=Update -Dialog.Button.SelectAll=Select All -Footprint.Diamond=diamond -Footprint.BoldDiamond=bold diamond -Footprint.SolidDiamond=solid diamond -Footprint.Triangle=triangle -Footprint.BoldTriangle=bold triangle -Footprint.SolidTriangle=solid triangle -Footprint.Circle=circle -Footprint.BoldCircle=bold circle -Footprint.SolidCircle=solid circle -Footprint.VerticalLine=vertical line -Footprint.BoldVerticalLine=bold vertical line -Footprint.HorizontalLine=horizontal line -Footprint.BoldHorizontalLine=bold horizontal line -Footprint.Crosshair=crosshair -Footprint.BoldCrosshair=bold crosshair -Footprint.SimpleAxes=simple axes -Footprint.BoldSimpleAxes=bold simple axes -Footprint.Spot=spot -Footprint.Line=line -Footprint.BoldLine=bold line -Footprint.Outline=outline -Footprint.BoldOutline=bold outline -Footprint.Arrow=arrow -Footprint.BoldArrow=bold arrow -Footprint.DoubleArrow=double arrow -Footprint.BoldDoubleArrow=bold double arrow -Footprint.2xArrow=2x arrow -Footprint.Bold2xArrow=bold 2x arrow -Footprint.4xArrow=4x arrow -Footprint.Bold4xArrow=bold 4x arrow -Footprint.DashArrow=dashed arrow -Footprint.BoldDashArrow=bold dashed arrow -Footprint.BigArrow=big arrow -Footprint.BigDashArrow=big dashed arrow -LineProfile.Name=Line Profile -LineProfile.New.Name=profile -LineProfile.Data.Brightness=brightness -LineProfile.Data.Pixel=pixel -LineProfile.Data.Red=red -LineProfile.Data.Green=green -LineProfile.Data.Blue=blue -LineProfile.Data.Weighting=count -MainTView.Popup.MenuItem.QTPlayer=QuickTime Player -MainTView.Popup.MenuItem.Zoom=Zoom -MainTView.Popup.MenuItem.ToFit=To Fit -OffsetOrigin.Name=Offset Origin -OffsetOrigin.New.Name=offset -PlotTrackView.Button.PlotCount=Plots -PlotTrackView.Button.PlotCount.ToolTip=Select number of plots -PointMass.Name=Point Mass -PointMass.New.Name=mass -PointMass.MenuItem.VectorsToPosition=To Position -PointMass.MenuItem.Velocity=Velocity -PointMass.MenuItem.Acceleration=Acceleration -Star.Name=Star -Star.New.Name=star -TableTrackView.Action.CopyData=Copy Data -TableTrackView.Button.SelectTableData=Data -TableTrackView.Button.SelectTableData.ToolTip=Choose Table Columns -TableTrackView.Popup.MenuItem.Analyze=Analyze... -TableTrackView.Dialog.Border.Title=Visible: -TActions.Action.Description=Notes -TActions.Action.ClearTracks=Clear -TActions.Action.NewTab=New Tab -TActions.Action.Copy=Copy -TActions.Action.Paste=Paste -TActions.Action.Open=Open... -TActions.Action.Close=Close -TActions.Action.Import=Import... -TActions.Action.Save=Save -TActions.Action.SaveAs=Save As... -TActions.Action.Export=Export... -TActions.Action.CaptureVideo=Capture Video... -TActions.Action.Delete=Delete -TActions.Action.Config=Preferences... -TActions.Action.AxesVisible=Visible -TActions.Action.TapeVisible=Visible -TActions.Action.Print=Print... -TActions.Action.ClearFilters=Clear -TActions.Action.ImportVideo=Import... -TActions.Action.CloseVideo=Close -TActions.Action.CloseAll=Close All -TActions.Action.Exit=Exit -TActions.Dialog.PrintError.Message=A printing error occurred. -TActions.Dialog.PrintError.Title=Printing Error -TActions.Dialog.Description.Title=Notes: -TActions.Dialog.DeleteLockedTracks.Message=Some tracks are locked. Delete anyway? -TActions.Dialog.DeleteLockedTracks.Title=Delete Locked Tracks? -TActions.Dialog.NewPointMass.Title=New Point Mass -TapeMeasure.Name=Tape Measure -TapeMeasure.New.Name=tape -TapeMeasure.MenuItem.Fixed=Fixed -TFrame.View.Plot=Plot View -TFrame.View.Table=Table View -TFrame.View.World=World View -TFrame.View.Video=Video View -TFrame.Dialog.Help.Title=Tracker Help -TMenuBar.Menu.File=File -TMenuBar.Menu.Edit=Edit -TMenuBar.Menu.Video=Video -TMenuBar.Menu.Tracks=Tracks -TMenuBar.Menu.Coords=Coords -TMenuBar.Menu.Window=Window -TMenuBar.Menu.Help=Help -TMenuBar.MenuItem.EditProperties=Properties... -TMenuBar.MenuItem.VideoVisible=Visible -TMenuBar.MenuItem.VideoFilters=Filters -TMenuBar.MenuItem.NewVideoFilter=New -TMenuBar.MenuItem.NewTrack=New -TMenuBar.MenuItem.CoordsLocked=Locked -TMenuBar.MenuItem.CoordsFixedOrigin=Fixed Origin -TMenuBar.MenuItem.CoordsFixedAngle=Fixed Angle -TMenuBar.MenuItem.CoordsFixedScale=Fixed Scale -TMenuBar.MenuItem.CoordsRefFrame=Reference Frame -TMenuBar.MenuItem.CoordsDefault=Default -TMenuBar.MenuItem.WindowRight=Right View -TMenuBar.MenuItem.WindowBottom=Bottom View -TMenuBar.MenuItem.PlayAllSteps=Play All Steps -TMenuBar.MenuItem.Record=Record -TMenuBar.MenuItem.MatSize=Mat Size -TMenuBar.MenuItem.Language=Language -TMenuBar.MenuItem.DeleteTrack=Delete -TMenuBar.MenuItem.TrackerHelp=Tracker Help... -TMenuBar.MenuItem.MessageLog=Message Log... -TrackControl.Name=Track Control -TrackControl.Button.NewTrack=Create -TrackControl.Button.NewTrack.ToolTip=Create a new track -TrackControl.Button.Trails.ToolTip=Set trail length -TrackControl.Button.Labels.ToolTip=Show or hide numbering -TrackControl.Button.StretchVectors.ToolTip=Stretch vectors -TrackControl.Button.Accelerations.ToolTip=Show or hide acceleration vectors -TrackControl.Button.Xmass.ToolTip=Multiply vectors by mass -TrackControl.Button.Vectors.ToolTip=Vectors -TrackControl.Button.Velocities.ToolTip=Show or hide velocity vectors -TrackControl.Button.Properties.ToolTip=Click to select -TrackControl.Button.Positions.ToolTip=Show or hide positions -Tracker.Popup.MenuItem.Snapshot=Snapshot... -Tracker.Popup.MenuItem.Help=Help... -Tracker.Cursor.Crosshair.Description=Crosshair cursor -Tracker.Action.AboutTracker=About Tracker... -Tracker.Dialog.AboutTracker.Title=About Tracker -Tracker.Action.AboutJava=About Java... -Tracker.Dialog.AboutJava.Title=About Java -Tracker.Dialog.AboutJava.UnknownVersion=unknown -Tracker.Dialog.AboutJava.Message=Java version -Tracker.Action.AboutQT=About QuickTime... -Tracker.Dialog.AboutQT.Title=About QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: -Tracker.Dialog.NoQT.Title=QTJava.zip not found -Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. -Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. -Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. -Tracker.Dialog.UpdateQT.Title=Update QTJava.zip -Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at -Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? -Tracker.Dialog.CopyQT.Title=Copy QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from -Tracker.Dialog.CopyQT.Message3= to -Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. -Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? -Tracker.Dialog.CopyFailed.Title=Copy failed -Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. -Tracker.Dialog.CopiedTo.Title=Copy succeeded -Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to -Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. -Tracker.Splash.Loading=Loading -TrackerIO.Dialog.Import.Title=Import -TrackerIO.Dialog.Import.Message=Select items to import -TrackerIO.Dialog.ImportVideo.Title=Import Video -TrackerIO.Dialog.Export.Title=Export -TrackerIO.Dialog.Export.Message=Select items to export -TrackerIO.Dialog.ReplaceFile.Title=Replace Existing File? -TrackerIO.Dialog.ReplaceFile.Message=already exists. Do you want to replace it? -TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML -TrackerIO.Dialog.NotTrackerXML.Message=contains xml data for a different application. -TrackerIO.Dialog.BadVideo.Message=Video could not be opened: -TrackerPanel.NewTab.Name=Untitled -TrackerPanel.DragToMark.Hint=Shift-drag to mark -TrackerPanel.ClickToMark.Hint=Shift-click to mark -TrackerPanel.Dialog.LoadFailed.Title=File Not Loaded -TrackerPanel.Dialog.LoadFailed.Message=File could not be loaded: -TrackerPanel.Dialog.SaveChanges.Title=Save Changes -TrackerPanel.Dialog.SaveChanges.Message=Save changes to -TrackPlottingPanel.Popup.MenuItem.Lines=Lines -TrackPlottingPanel.Popup.MenuItem.Points=Points -TrackPlottingPanel.Popup.MenuItem.Scale=Scale... -TrackPlottingPanel.Popup.MenuItem.Print=Print... -TrackPlottingPanel.Popup.MenuItem.Measure=Scale to Fit -TrackPlottingPanel.Popup.MenuItem.Analyze=Analyze... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In -TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscale -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box -TrackPlottingPanelInspector.Title=Scale -TrackPlottingPanelInspector.Label.Min=Min -TrackPlottingPanelInspector.Label.Max=Max -TrackPlottingPanelInspector.Label.Auto=Auto -TToolBar.Button.Footprint.Tooltip=Set Footprint -TToolBar.Dropdown.SelectedTrack.Tooltip=Select Track -TToolBar.Dropdown.SelectedTrack.None=None -TTrack.MenuItem.Delete=Delete -TTrack.MenuItem.Color=Color... -TTrack.Dialog.Color.Title=Choose Track Color -TTrack.MenuItem.Name=Name... -TTrack.MenuItem.Footprint=Footprint -TTrack.MenuItem.Description=Notes... -TTrack.MenuItem.Visible=Visible -TTrack.MenuItem.TrailVisible=Trail Visible -TTrack.MenuItem.Autostep=Autostep -TTrack.MenuItem.MarkByDefault=Mark by Default -TTrack.MenuItem.Locked=Locked -TTrack.MenuItem.Delete=Delete -TTrack.Name.None=no name -TTrack.Dialog.Description.Title=Notes: -TTrack.Dialog.Name.Title=Set Name -TTrack.Dialog.Name.Label=Name: -TViewChooser.Button.Choose.Tooltip=Choose a View -Vector.Name=Vector -Vector.New.Name=vector -Vector.MenuItem.ToOrigin=To Origin -Vector.MenuItem.Label=Label Visible -VectorSum.Name=Vector Sum -VectorSum.New.Name=sum -VectorSum.MenuItem.Inspector=Select Vectors... -VectorSumInspector.Title=Vector Sum -VectorSumInspector.Border.Title=Select Vectors -WorldTView.Popup.MenuItem.Projectile=Projectile Model - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=Analytic Particle Model -AnalyticParticle.Inspector.Title=Analytic Particle Model -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=Radius 4 -CircleFootprint.Circle_6=Radius 6 -CircleFootprint.Circle_8=Radius 8 -DynamicParticle.Name=Dynamic Particle Model (Cartesian) -DynamicParticle.Inspector.Title=Dynamic Particle Model -DynamicParticle.Property.ForceX=force x -DynamicParticle.Property.ForceY=force y -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=Fixed -ParticleModel.New.Name=model -ParticleModel.MenuItem.InspectModel=Model Builder... -ParticleModel.Inspector.Button.Undo=Undo -ParticleModel.Inspector.Button.Redo=Redo -ParticleModel.Inspector.Button.Close=Close -ParticleModel.Inspector.Button.Help=Help - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=X Only -Calibration.Axes.YOnly=Y Only -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=Select calibration axes -Calibration.Label.Axes=axes -Calibration.Dialog.InvalidCoordinates.Title=Invalid Coordinates -Calibration.Dialog.InvalidCoordinates.Message=Points cannot have the same world coordinates. -Calibration.Dialog.InvalidXCoordinates.Message=Points cannot have the same world x-coordinates. -Calibration.Dialog.InvalidYCoordinates.Message=Points cannot have the same world y-coordinates. -SpectralLineFilter.Title=Gas Spectra -SpectralLineFilter.H=Hydrogen -SpectralLineFilter.He=Helium -SpectralLineFilter.Ne=Neon -SpectralLineFilter.Hg=Mercury -TFrame.View.Unknown=View -TMenuBar.MenuItem.Undo=Undo -TMenuBar.MenuItem.Redo=Redo -TMenuBar.MenuItem.Replace=Replace... -TMenuBar.Menu.AddImage=Import Images -TMenuBar.MenuItem.AddBefore=Before This Frame... -TMenuBar.MenuItem.AddAfter=After This Frame... -TMenuBar.MenuItem.RemoveImage=Remove This Frame -TMenuBar.Menu.Tools=Tools -TMenuBar.MenuItem.DataFunctionTool=Data Builder -TMenuBar.MenuItem.DatasetTool=Data Tool -TMenuBar.Menu.CopyImage=Copy Image -TMenuBar.MenuItem.CopyMainView=Main View -TMenuBar.MenuItem.CopyFrame=Frame -TMenuBar.MenuItem.PrintFrame=Print... -TrackerIO.Dialog.AddImage.Title=Import Images (choose one or more) -TTrack.Dialog.Name.BadName=is in use. Please choose another name. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=net force -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=Plot view of track data will appear here. -TableTView.Label.NoData=Table view of track data will appear here. -TrackerPanel.Message.NoData0=Main view of video and tracks will appear here. -TrackerPanel.Message.NoData1=Choose File|Open or Tracks|New to start. -WorldTView.Label.NoData=World view of video and tracks will appear here. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=Solver: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=Adaptive Multistep -DynamicParticle.Table.Force.Border.Title=Force Functions (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=Position Functions (t) -ParticleModel.Table.Initial.Border.Title=Initial Values -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=Paste Image -TMenuBar.MenuItem.PasteAfter=After This Frame -TMenuBar.MenuItem.PasteBefore=Before This Frame -TMenuBar.MenuItem.PasteReplace=Replace Video - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=Getting Started... -Tracker.Splash.HelpMessage=New user? Choose - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=angle from horizontal -LineProfile.Checkbox.Rotates=rotates -LineProfile.Label.Spread=spread -RGBRegion.Name=RGB Region -RGBRegion.New.Name=region -RGBRegion.MenuItem.Fixed=Fixed Position -RGBRegion.Label.Radius=pixel radius -TTrack.Label.Step=step - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=position number -LineProfile.Data.Description.1=position x-component -LineProfile.Data.Description.2=position y-component -LineProfile.Data.Description.3=red -LineProfile.Data.Description.4=green -LineProfile.Data.Description.5=blue -LineProfile.Data.Description.6=perceived brightness -LineProfile.Data.Description.7=line width -ParticleModel.MenuItem.TraceVisible=Trace Visible -ParticleModel.MenuItem.StepsVisible=Steps Visible -PointMass.Data.Description.0=time -PointMass.Data.Description.1=position x-component -PointMass.Data.Description.2=position y-component -PointMass.Data.Description.3=position magnitude -PointMass.Data.Description.4=position angle -PointMass.Data.Description.5=velocity x-component -PointMass.Data.Description.6=velocity y-component -PointMass.Data.Description.7=velocity magnitude -PointMass.Data.Description.8=velocity angle -PointMass.Data.Description.9=acceleration x-component -PointMass.Data.Description.10=acceleration y-component -PointMass.Data.Description.11=acceleration magnitude -PointMass.Data.Description.12=acceleration angle -PointMass.Data.Description.13=rotation angle -PointMass.Data.Description.14=angular velocity -PointMass.Data.Description.15=angular acceleration -PointMass.Data.Description.16=step number -PointMass.Data.Description.17=frame number -PointMass.Data.Description.18=momentum x-component -PointMass.Data.Description.19=momentum y-component -PointMass.Data.Description.20=momentum magnitude -PointMass.Data.Description.21=momentum angle -PointMass.Data.Description.22=kinetic energy -RGBRegion.Data.Description.0=time -RGBRegion.Data.Description.1=position x-component -RGBRegion.Data.Description.2=position y-component -RGBRegion.Data.Description.3=red -RGBRegion.Data.Description.4=green -RGBRegion.Data.Description.5=blue -RGBRegion.Data.Description.6=perceived brightness -RGBRegion.Data.Description.7=pixel count -RGBRegion.Data.Description.8=step number -RGBRegion.Data.Description.9=frame number -TView.Menuitem.Define=Define... -Vector.Data.Description.0=time -Vector.Data.Description.1=x-component -Vector.Data.Description.2=y-component -Vector.Data.Description.3=magnitude -Vector.Data.Description.4=angle -Vector.Data.Description.5=tail position x-component -Vector.Data.Description.6=tail position y-component -Vector.Data.Description.7=step number -Vector.Data.Description.8=frame number -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=Mass of this particle -ParticleModel.Parameter.InitialTime.Description=Initial time -AnalyticParticle.PositionFunction.X.Description=Position x-component -AnalyticParticle.PositionFunction.Y.Description=Position y-component -DynamicParticle.ForceFunction.X.Description=Force x-component -DynamicParticle.ForceFunction.Y.Description=Force y-component -DynamicParticle.Parameter.InitialX.Description=Initial position x-component -DynamicParticle.Parameter.InitialY.Description=Initial position y-component -DynamicParticle.Parameter.InitialVelocityX.Description=Initial velocity x-component -DynamicParticle.Parameter.InitialVelocityY.Description=Initial velocity y-component -TrackerPanel.ModelBuilder.Title=Model Builder -TrackerPanel.DataBuilder.Title=Data Builder -TrackControl.TrailMenu.NoTrail=No trails -TrackControl.TrailMenu.ShortTrail=Short trails -TrackControl.TrailMenu.LongTrail=Long trails -TrackControl.TrailMenu.FullTrail=Past and future -TrackerPanel.ModelBuilder.Spinner.Tooltip=Currently selected model -TrackerPanel.ModelBuilder.LineButton.Text=Line Style -TrackerPanel.ModelBuilder.LineButton.Tooltip=Set line style -ParticleModel.LineStyle.None=No line -ParticleModel.LineStyle.Connect=Connect steps -ParticleModel.LineStyle.Smooth=Smooth line -ModelFunctionPanel.Label=Model -AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functions -DynamicFunctionPanel.FunctionEditor.Border.Title=Force Functions - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=Visible Table Columns -Tracker.About.ProjectOf=A project of: -Tracker.About.TranslationBy=Translation by -# following entry (Tracker.About.Translator) purposely left blank -Tracker.About.Translator= -TMenuBar.Menu.SaveVideoAs=Save Clip As -TActions.SaveClipAs.ProgressMonitor.Message=Saving clip as -TActions.SaveClipAs.ProgressMonitor.Progress=Completed - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sync -PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronize horizontal axes -RGBRegion.MenuItem.FixedRadius=Fixed Radius -Tracker.VideoZoom.Hint=click to zoom in or out, double-click to zoom to fit -Tracker.PlotZoomIn.Hint=drag to zoom in, double-click to autoscale -Tracker.PlotZoomOut.Hint=click to zoom out -Tracker.MenuItem.Hints=Show Hints -TapeMeasure.Label.Length=scaled length -TapeMeasure.Label.TapeAngle=tape angle -TapeMeasure.Label.ArcAngle=protractor angle -TrackerIO.Dialog.NotAnImage.Title=Incorrect File Type -TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. -TrackerIO.Dialog.NotAnImage.Message2=Do you wish to continue? -TToolBar.Button.Zoom.Tooltip=Zoom Tool (shortcut: Z key) -TrackChooserTView.DropDown.Tooltip=Select a track -TapeMeasure.Field.ArcAngle.Tooltip=Angle from tape to protractor arm -TapeMeasure.Field.TapeAngle.Tooltip=Angle from positive x-axis to tape -TapeMeasure.Field.Magnitude.Tooltip=Length of tape in scaled world units -TapeMeasure.Readout.Magnitude.Name=length readout -TapeMeasure.Readout.Magnitude.Hint=click to set the scale -TapeMeasure.Readout.Angle.Name=angle readout -TapeMeasure.Readout.Angle.Hint=click to set the angle -TapeMeasure.Arm.Name=protractor arm -TapeMeasure.Arm.Hint=drag to measure angles, shorten to close -TapeMeasure.End.Name=end -TapeMeasure.End.Hint=drag to measure distances or calibrate the scale -TapeMeasure.Handle.Name=handle -TapeMeasure.Handle.Hint=drag to move tape -Vector.Tip.Name=tip -Vector.Tip.Hint=drag or enter coordinates to change components -Vector.Handle.Name=handle -Vector.Handle.Hint=drag to move vector -Vector.ShortHandle.Hint=drag to move, alt-click to select tip -PointMass.Position.Name=position -PointMass.Position.Hint=drag or enter coordinates to change position -PointMass.Velocity.Name=velocity -PointMass.Acceleration.Name=acceleration -PointMass.Vector.Hint=drag to move -PointMass.Position.Locked.Hint=click to select--cannot be dragged -CoordAxes.Handle.Name=+x-axis -CoordAxes.Handle.Hint=drag to change tilt -CoordAxes.Origin.Name=origin -CoordAxes.Origin.Hint=drag to change position -OffsetOrigin.Position.Name=position -OffsetOrigin.Position.Hint=drag or enter coordinates to move origin -Calibration.Point.Name=point -Calibration.Point.Hint=drag or enter coordinates to change axes and scale -RGBRegion.Position.Name=position -RGBRegion.Position.Hint=drag or enter coordinates to change position -LineProfile.End.Name=end -LineProfile.End.Hint=drag to adjust line length -LineProfile.Handle.Name=handle -LineProfile.Handle.Hint=drag to move line -PointMass.Hint=set mass on toolbar -PointMass.Unmarked.Hint=, shift-click to mark positions -TTrack.Unselected.Hint=click to select and/or set properties -Vector.Unmarked.Hint=shift-drag to draw vectors -OffsetOrigin.Unmarked.Hint=shift-click to mark the offset point -Calibration.Unmarked.Hint=shift-click to mark the first point -Calibration.Halfmarked.Hint=shift-click to re-mark -CenterOfMass.Empty.Hint=select masses to define system -VectorSum.Empty.Hint=select vectors to define sum -TapeMeasure.Hint=set length to change scale, set angle to change x-axis tilt -CoordAxes.Hint=set angle to change tilt -ParticleModel.Hint=set mass on toolbar, enter expressions in Model Builder to animate -RGBRegion.Hint=enter radius to change size -RGBRegion.Unmarked.Hint=shift-click to mark positions -TTrack.ImportVideo.Hint=import video or image to measure RGB -TTrack.Selected.Hint=selected -LineProfile.Hint=enter spread to change line width -LineProfile.Unmarked.Hint=shift-drag to draw line -LineProfile.Menu.Orientation=Orientation -LineProfile.MenuItem.Horizontal=Horizontal -LineProfile.MenuItem.XAxis=Along X-Axis -Footprint.PositionVector=vector -Footprint.BoldPositionVector=bold vector -Tracker.Startup.Hint=look here for hints (or turn off hints in the Help menu), press F1 key at any time for help -TrackerPanel.NoVideo.Hint=open or import a video or image to analyze -TrackerPanel.CalibrateVideo.Hint=identify a video feature with known length and set the scale using the tape measure -TrackerPanel.NoTracks.Hint=create a new track to measure video features of interest -TrackerPanel.SetClip.Hint=set or review video clip settings -TrackerPanel.ShowAxes.Hint=set the origin and angle of the coordinate axes -VideoPlayer.Step.Hint=step forward (shortcut: PageDown key) -VideoPlayer.Back.Hint=step back (shortcut: PageUp key) -TrackerPanel.DVVideo.Hint=apply a resize filter to correct distortions in DV-format videos -TrackerIO.DataFileFilter.Description=Tracker Files -Tracker.Button.PDFHelp=Printable PDF Version -TToolbar.Button.TapeVisible.Tooltip=Tape Measure with Protractor Arm - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=Track Control -TMenuBar.MenuItem.Description=Notes -TrackPlottingPanel.RightDrag.Hint=right-drag for options -TMenuBar.MenuItem.DeleteSelectedPoint=Selected Point -TFrame.InfoDialog.SaveChanges.Title=Save Changes -TFrame.InfoDialog.SaveChanges.Message=Do you wish to save changes? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesian -DynamicParticle.Editor.Button.Polar=Polar -DynamicParticle.Parameter.InitialR.Description=Initial radius -DynamicParticle.Parameter.InitialTheta.Description=Initial angle -DynamicParticle.Parameter.InitialVelocityR.Description=Initial radial velocity -DynamicParticle.Parameter.InitialOmega.Description=Initial angular velocity -DynamicParticle.ForceFunction.R.Description=Force radial component -DynamicParticle.ForceFunction.Theta.Description=Force tangential component -DynamicParticlePolar.Name=Dynamic Particle Model (Polar) -DynamicTwoBody.Editor.Button.Particle1=Particle 1 -DynamicTwoBody.Editor.Button.Particle2=Particle 2 -DynamicTwoBody.Name=Dynamic Two-Body Model -TMenuBar.Menu.DynamicParticle=Dynamic Particle Model -TMenuBar.MenuItem.Cartesian=Cartesian -TMenuBar.MenuItem.Polar=Polar - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=Autotracker... -Dialog.Button.Help=Help -AutoTracker.Wizard.Title=Autotracker: -AutoTracker.Wizard.Button.Reset=Reset -AutoTracker.Wizard.Button.Back=Back -AutoTracker.Wizard.Button.Next=Next -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.Start=Start -AutoTracker.Wizard.Button.Pause=Pause -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Label.Mask=Mask Image -AutoTracker.Label.Target=Target Offset -AutoTracker.Label.AcceptLevel=Accept Scores Above -AutoTracker.TabbedPane.TabTitle.Mask=Mask -AutoTracker.TabbedPane.TabTitle.Target=Target -AutoTracker.TabbedPane.TabTitle.Settings=Accept -AutoTracker.TabbedPane.TabTitle.Search=Search -AutoTracker.Info.GetStarted=Please click the video feature you wish to autotrack. -AutoTracker.Info.Mask1=The mask defines the image to be matched in each video frame. Move or resize the mask by dragging its center or handle, respectively. -AutoTracker.Info.Mask2=Tip: the mask need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. -AutoTracker.Info.MaskLocked1=The mask is in use and locked. -AutoTracker.Info.MaskLocked2=Click the Reset button to clear all steps, unlock the mask and start over. -AutoTracker.Info.Target1=The target is where steps will be marked relative to the mask. Move the target by dragging it. -AutoTracker.Info.Target2=Tip: You can adjust the target position even after steps have been marked. Existing steps will automatically move along with the target. -AutoTracker.Info.TargetLocked=The target is in use and tied to existing step positions. Moving it will move the steps as well. -AutoTracker.Info.Settings1=Match scores above the acceptance level shown are marked automatically. -AutoTracker.Info.Settings2=Tip: reducing the acceptance level speeds up the marking process but increases the likelihood of errors. -AutoTracker.Info.Search1=The rectangle shown will be searched for the best match. Move or resize the search area by dragging its center or handle, respectively. -AutoTracker.Info.Search2=Tip: The search area need not be large. After finding the first two matches, a look-ahead algorithm moves the search area to predicted match positions. -AutoTracker.Info.Frame=Frame -AutoTracker.Info.Match=The match shown was marked automatically at the target position. -AutoTracker.Info.Possible=A possible match was found in the search area shown. Your options are: -AutoTracker.Info.NoMatch=No match was found in the search area shown. Your options are: -AutoTracker.Info.Outside=The search area is outside the image. Your options are: -AutoTracker.Info.Accepted=The match shown was accepted by the user. -AutoTracker.Info.MarkedByUser=The step was marked manually by the user. -AutoTracker.Info.NoVideo=Autotracking requires a video. Please import a video or close this Autotracker. -AutoTracker.Info.Height=height -AutoTracker.Info.Width=width -AutoTracker.Info.Accept=--accept the match -AutoTracker.Info.Retry=--move the search area and search again -AutoTracker.Info.Mark=--shift-click to mark the step manually -AutoTracker.Info.Skip=--skip this frame and continue tracking -AutoTracker.Info.Reset=--reset and start over with a modified mask -AutoTracker.Info.MatchScore=match score -AutoTracker.Dialog.MaskLocked.Title=Mask Locked -PointMass.Cursor.Autotrack.Description=Autotracker cursor -VideoPlayer.StartFrame.Hint=drag to set the start frame -VideoPlayer.EndFrame.Hint=drag to set the end frame -VideoPlayer.Slider.Hint=drag to scan through the video -FileDropHandler.Dialog.BadFile.Message=could not be loaded. -FileDropHandler.Dialog.BadFile.Title=Unrecognized File - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=Apply -DynamicParticle.Dialog.Delete.Message=Deleting this particle will remove it from a system. Delete anyway? -DynamicParticle.Dialog.Delete.Title=Dynamic System -DynamicParticle.System.In=in -DynamicSystem.Empty=empty -DynamicSystem.Force.Name.Internal=internal -DynamicSystem.ForceFunction.R.Description=Internal force radial component -DynamicSystem.ForceFunction.Theta.Description=Internal force tangential component -DynamicSystem.MenuItem.Inspector=Select Particles... -DynamicSystem.Name=Dynamic Two-Body System -DynamicSystem.New.Name=system -DynamicSystem.Parameter.Of=of -DynamicSystem.Parameter.RelativeTo=relative to -DynamicSystem.Parameter.Name.Relative=relative -DynamicSystem.Parameter.ParticleMass.Description=Mass of -DynamicSystem.Parameter.Mass.Description=Total mass of this system -DynamicSystemInspector.Border.Title=Particle -DynamicSystemInspector.Title=Two-Body System -DynamicSystemInspector.Button.Change=Change To... -DynamicSystemInspector.ParticleName.None=(none) -TMenuBar.MenuItem.Clone=Clone -TMenuBar.MenuItem.TwoBody=Two-Body System -TrackerPanel.DataBuilder.Dropdown.Tooltip=Currently selected track -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertical Axes -TrackControl.Button.Trace.ToolTip=Show or hide paths -TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab -TToolBar.Button.Save.Tooltip=Save the current tab in file -TToolBar.Button.SelectTrack=Select -TToolBar.Button.SelectTrack.Tooltip=Select an existing track -TTrack.MenuItem.ClearSteps=Clear Steps -PointMass.MenuItem.Position=Position -TMenuBar.MenuItem.Empty=(Empty) -TTrackBar.Button.Memory=memory in use: -TTrackBar.Button.Memory.Tooltip=Monitor and manage memory -TTrackBar.Memory.PopupItem.Launch1=Launch -TTrackBar.Memory.PopupItem.Launch2=with memory -TButton.Track.ToolTip=Set properties of -Tracker.Dialog.OutOfMemory.Message1=Tracker has run out of memory. -Tracker.Dialog.OutOfMemory.Message2=Click the memory button for options. -Tracker.Dialog.OutOfMemory.Title=Out of Memory - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Label.Original=Initial -AutoTracker.Label.NoMask=none -AutoTracker.Label.Rate=Evolution Rate: -AutoTracker.Info.Mask3=Tip: the template need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Info.SearchOnAxis1=The x-axis within the rectangle shown will be searched for the best match. Move or resize the search area by dragging its center or handle, respectively. -AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: -AutoTracker.Info.NoMatchOnAxis=No match was found along the x-axis in the search area shown. Your options are: -AutoTracker.Info.RetryOnAxis=--move the search area or x-axis and search again -AutoTracker.Wizard.Button.Delete=Delete This Point -AutoTracker.Wizard.Button.DeleteMore=Delete This And Later Points -Button.Define.Tooltip=Define functions of existing column variables -Calibration.Label.Point=point -CalibrationStick.Hint=set length or drag end to change scale, set angle to change axis tilt -CalibrationStick.End.Hint=drag to change the scale -CalibrationStick.New.Name=calibration stick -CalibrationTapeMeasure.New.Name=calibration tape -CalibrationTapeMeasure.Readout.Magnitude.Hint=click to enter a known length in world units -CalibrationTapeMeasure.Hint=set length to change scale, set angle to change axis tilt -DynamicSystem.Data.Description.0=relative distance between particles -DynamicSystem.Data.Description.1=relative angle -DynamicSystem.Data.Description.2=relative radial velocity -DynamicSystem.Data.Description.3=relative angular velocity -ExportDataDialog.Subtitle.Table=Data Table -ExportDataDialog.Subtitle.Content=Cells -ExportDataDialog.Subtitle.Format=Number Format -ExportDataDialog.Subtitle.Delimiter=Delimiter -ExportDataDialog.Title=Export Data -ExportDataDialog.Delimiter.Add=Add... -ExportDataDialog.Delimiter.Remove=Remove... -ExportDataDialog.Content.AllCells=All Cells -ExportDataDialog.Content.SelectedCells=Selected Cells -ExportDataDialog.MenuItem.RemoveDelimiter=Remove custom delimiter -ExportDataDialog.Chooser.SaveData.Title=Save Data As -ExportVideoDialog.Button.SaveAs=Save As... -ExportVideoDialog.Button.FullSize=Full size -ExportVideoDialog.Button.DrawnSize=As drawn -ExportVideoDialog.Content.VideoOnly=Video only -ExportVideoDialog.Content.VideoAndGraphics=Video and graphics -ExportVideoDialog.Content.GraphicsOnly=Graphics only -ExportVideoDialog.Title=Export Video Clip -ExportVideoDialog.Label.ClipSettings=Clip settings -ExportVideoDialog.Subtitle.Size=Size -ExportVideoDialog.Subtitle.Content=Content -ExportVideoDialog.Subtitle.View=View -ExportVideoDialog.Subtitle.Format=Format -ExportVideoDialog.Complete.Message1=The video has been saved as -ExportVideoDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportVideoDialog.Complete.Title=Export Complete -ExportVideoDialog.VideoSize=video size -ExportVideoDialog.MatSize=mat size -ExportVideo.Dialog.HiddenPlots.Message=Plots must be fully visible for exporting. -ExportVideo.Dialog.HiddenPlots.Title=Incomplete View -Footprint.DoubleTarget=double crosshair -Footprint.BoldDoubleTarget=bold double crosshair -OffsetOrigin.MenuItem.Fixed=Fixed World Coordinates -ParticleModel.Dialog.Offscreen.Message1=Some model steps are empty because they are too far off screen. -ParticleModel.Dialog.Offscreen.Message2=To fix this, change the model or rescale the video. -ParticleModel.Dialog.Offscreen.Title=Out of Bounds -PrefsDialog.Tab.Configuration.Title=Configuration -PrefsDialog.Memory.BorderTitle=Memory Size -PrefsDialog.Tab.General.Title=Other -PrefsDialog.RecentFiles.BorderTitle=Open Recent Menu -PrefsDialog.Label.RecentSize=File count -PrefsDialog.Hints.BorderTitle=Hints -PrefsDialog.Button.Relaunch=Relaunch Now -PrefsDialog.Button.ClearRecent=Clear -PrefsDialog.Checkbox.DefaultSize=Use default -PrefsDialog.Checkbox.HintsOn=Show hints by default -PrefsDialog.Tab.Video.Title=Video -PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle (recommended) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. -PrefsDialog.Dialog.WebStart.Title=Web Start Mode -PrefsDialog.LookFeel.BorderTitle=Look And Feel -PrefsDialog.Language.BorderTitle=Language -PrefsDialog.Upgrades.BorderTitle=Check For Upgrades -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=Display -PrefsDialog.Language.Default=default -PrefsDialog.Upgrades.Always=Every Time -PrefsDialog.Upgrades.Weekly=Weekly -PrefsDialog.Upgrades.Monthly=Monthly -PrefsDialog.Upgrades.Never=Never -PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) -PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool -Protractor.Name=Protractor -Protractor.New.Name=protractor -Protractor.Hint=drag arms to measure angles -Protractor.Label.Angle=angle -Protractor.Field.Angle.Tooltip=angle between protractor arms -Protractor.Vertex.Name=vertex -Protractor.Vertex.Hint=drag to move the vertex -Protractor.End.Name=arm end -Protractor.End.Hint=drag to rotate the arm -Protractor.Handle.Name=handle -Protractor.Handle.Hint=drag to move the protractor -Protractor.Rotator.Name=rotator -Protractor.Rotator.Hint=drag to rotate the protractor -Protractor.Readout.Name=readout -Protractor.Readout.Hint=angle between protractor arms -ProtractorFootprint.Circle3=small circle -ProtractorFootprint.Circle5=large circle -ProtractorFootprint.Circle3Bold=bold small circle -ProtractorFootprint.Circle5Bold=bold large circle -Stick.Name=Measuring Stick -Stick.New.Name=measuring stick -TableTrackView.MenuItem.Unformatted=Full Precision -TableTrackView.MenuItem.Formatted=As Formatted -TableTrackView.Menu.SetDelimiter=Set Delimiter -TableTrackView.MenuItem.AddDelimiter=Add... -TableTrackView.MenuItem.RemoveDelimiter=Remove... -TableTrackView.Dialog.CustomDelimiter.Message=Enter a new delimiter string: -TableTrackView.Dialog.CustomDelimiter.Title=Add Delimiter -TableTrackView.Header.Tooltip=Click to sort or double-click to select column -TableTrackView.MenuItem.CopySelectedData=Copy Selected Data -TableTrackView.Dialog.RemoveDelimiter.Message=Select the delimiter to remove: -TableTrackView.Dialog.RemoveDelimiter.Title=Remove Delimiter -TableTrackView.Radians.Tooltip=in radians -TableTrackView.Degrees.Tooltip=in degrees -TableTrackView.RadiansPerSecond.Tooltip=in radians/s -TableTrackView.DegreesPerSecond.Tooltip=in degrees/s -TableTrackView.RadiansPerSecondSquared.Tooltip=in radians/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=in degrees/s^2 -TableTrackView.MenuItem.DeleteDataFunction=Delete Data Function -TActions.Action.SaveFrame=Save Tabset As... -TActions.AboutVideo=Properties... -TActions.Dialog.AboutVideo.Title=Video Properties -TActions.Dialog.AboutVideo.Type=Type -TActions.Dialog.AboutVideo.Size=Dimensions -TActions.Dialog.AboutVideo.Length=Length -TActions.Dialog.AboutVideo.Frames=frames -TActions.Dialog.AboutVideo.Seconds=seconds -TActions.Dialog.AboutVideo.FrameRate=Frame Rate -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=Path -TActions.Action.ImportTRK=Tracker File... -TActions.Action.ProtractorVisible=Visible -TapeMeasure.MenuItem.FixedLength=Fixed Length -TextTView.Label.NoTab=Display text and HTML pages here. -TextTView.NewTab.Text1=Double-click to edit the text or title. Right-click for more options. -TextTView.NewTab.Text2=To display an HTML page, enter the url or right-click to open a file. -TextTView.NewTab.Title=Untitled -TextTView.Dialog.TabTitle.Title=Set Title -TextTView.MenuItem.OpenHTML=Open HTML... -TextTView.MenuItem.SetTitle=Set Title... -TextTView.Button.NewTab=New -TextTView.TextEdit.Description=Text -TFrame.Dialog.FileNotFound.Message=File could not be found: -TFrame.Dialog.FileNotFound.Title=File Not Found -TFrame.View.Text=Text/HTML View -TFrame.View.Main=Main View -TMenuBar.Menu.OpenRecent=Open Recent -TMenuBar.Menu.Import=Import -TMenuBar.Menu.Export=Export -TMenuBar.MenuItem.Video=Video... -TMenuBar.MenuItem.Data=Data File... -TMenuBar.Menu.CopyObject=Copy Object -TMenuBar.MenuItem.Coords=Coordinate System -TMenuBar.MenuItem.VideoClip=Video Clip -TMenuBar.Menu.MeasuringTools=Measuring Tools -TMenuBar.Menu.AngleUnits=Angle Units -TMenuBar.MenuItem.Degrees=Degrees -TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: -Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can -Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=To install Xuggle, Tracker's preferred video engine on -Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from -Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's preferred video engine, is not yet installed. -Tracker.Dialog.NoXuggle.Message2=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Missing Xuggle -Tracker.About.DefaultLocale=Default locale -Tracker.About.CurrentLanguage=Language -Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory -Tracker.Dialog.InsufficientMemory.Message=The requested memory size is too large. -TrackerIO.Dialog.TabMustBeSaved.Message1=Tab -TrackerIO.Dialog.TabMustBeSaved.Message2=must be saved as a tracker file to be included in the tabset. -TrackerIO.Dialog.TabMustBeSaved.Message3=Do you wish to save it? -TrackerIO.Dialog.TabMustBeSaved.Title=Unsaved Tab -TrackerIO.Dialog.NoTabs.Message=There are no tabs to save! -TrackerIO.Dialog.NoTabs.Title=Empty Tabset -TrackerIO.Dialog.SaveTabset.Title=Save Tabset -TrackerIO.Dialog.SaveTab.Title=Save Tab -TrackerIO.Delimiter.Tab=Tab -TrackerIO.Delimiter.Space=Space -TrackerIO.Delimiter.Comma=Comma -TrackerIO.Delimiter.Semicolon=Semicolon -TrackerIO.VideoAndDataFileFilter.Description=Video and Tracker Files -TrackerPanel.Dialog.Version.Message1=You are opening a file created with Tracker -TrackerPanel.Dialog.Version.Message2=which may refer to -TrackerPanel.Dialog.Version.Message3=features missing in the version you are running -TrackerPanel.Dialog.Version.Message4=The latest Tracker is available at -TrackerPanel.Dialog.Version.Title=Version Mismatch -TrackerPanel.Label.ModelStart=Start -TrackerPanel.Label.ModelEnd=End -TrackerPanel.Spinner.ModelStart.Tooltip=Set the start frame for this model -TrackerPanel.Spinner.ModelEnd.Tooltip=Set the end frame for this model -TToolbar.Button.ProtractorVisible.Tooltip=Show or hide the protractor -TToolbar.Button.AxesVisible.Tooltip=Show or hide the coordinate axes -TToolBar.Button.TrackControl.Tooltip=Show or hide the track control -TTrack.Dialog.StepSizeWarning.Message1=Caution: some tracks were marked at a step size greater than one, leaving skipped frames unmarked. -TTrack.Dialog.StepSizeWarning.Message2=Changing the step size is therefore likely to result in gaps in the data set. -TTrack.Dialog.StepSizeWarning.Message3=Velocities and accelerations around the gaps cannot be determined until all steps are marked. -TTrack.Dialog.StepSizeWarning.Title=Caution -TTrack.Dialog.SkippedStepWarning.Message1=Caution: skipping steps when marking positions leaves gaps in the data set. -TTrack.Dialog.SkippedStepWarning.Title=Caution -TTrack.Dialog.SkippedStepWarning.Checkbox=Don't show this again -TTrack.Locked.Hint=locked -TTrack.AngleField.Radians.Tooltip=angle in radians -TTrack.AngleField.Degrees.Tooltip=angle in degrees -TTrack.AngleField.Popup.Radians=Switch To Radians -TTrack.AngleField.Popup.Degrees=Switch To Degrees -TTrackBar.Memory.Menu.SetSize=Set memory size... -TTrackBar.Button.Version=Now available: version -TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... -TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Calibration Tape -CircleFootprint.Circle=circle -CircleFootprint.FilledCircle=filled circle -CircleFootprint.Dialog.Title=Circle Footprint -CircleFootprint.Dialog.Label.Radius=Radius -CircleFootprint.Dialog.Checkbox.Bold=Bold -CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot -LineProfile.Hint.Marking=drag mouse to mark the line profile -PageTView.Button.Page=Page -PageTView.MenuItem.ClosePage=Close Page -PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step -PrefsDialog.Dialog.NewVersion.Title=Upgrades -PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=is now available at -PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. -RGBRegion.Hint.Marking=click mouse to mark the center of the region -TMenuBar.MenuItem.Restore=Restore Views -TrackControl.StretchVectors.None=No stretch -TViewChooser.Maximize.Tooltip=Maximize this view -TViewChooser.Restore.Tooltip=Restore views -Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step -WorldTView.Button.World=World - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Warnings -PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors -PropertiesDialog.Title=Properties -PropertiesDialog.Label.Author=Author -PropertiesDialog.Label.Contact=Contact -TActions.Action.Properties=Properties... -TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame -TFrame.Progress.ClickToCancel=(click to cancel) -TFrame.Dialog.StalledVideo.Title=Error Loading Video -TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. -TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. -TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: -TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. -TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. -TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stop -TFrame.Dialog.StalledVideo.Button.Wait=Wait -Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again -TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found -TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinematic Particle -DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) -DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) -DynamicSystem.Builder.Title=Dynamic System (Internal) -PropertiesDialog.Button.CopyFilePath=Copy File Path -PropertiesDialog.Button.CopyVideoPath=Copy Video Path -PropertiesDialog.Tab.TrackerFile=Tracker File -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=Property -PropertiesDialog.Header.Value=Value -TActions.Action.OpenURL=Open URL... -TActions.Dialog.OpenURL.Title=Open URL -TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file -TActions.Dialog.AboutVideo.Name=Name - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cached Web Files -PrefsDialog.Button.ClearCache=Clear - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-click to re-mark highlighted position -PointMass.Remarking.Hint=click mouse to re-mark position -PointMass.PositionSelected.Hint=drag or enter position on toolbar -PointMass.VectorSelected.Hint=drag to move -Vector.Remark.Hint=shift-click to re-mark highlighted tip -Vector.TipSelected.Hint=drag or enter components on toolbar -Vector.HandleSelected.Hint=drag to move -Vector.Remarking.Hint=click mouse to re-mark tip -AutoTracker.Label.Search=Search -AutoTracker.Label.Target=Target -AutoTracker.Label.Frame=Frame -AutoTracker.Label.Point=Point -AutoTracker.Label.Template=Template -AutoTracker.Label.Track=Track -AutoTracker.Label.Match=Match -AutoTracker.Label.NoTemplate=No Template -AutoTracker.Label.EvolutionRate=Evolution Rate -AutoTracker.Label.Automark=Automark -AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. -AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. -AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. -AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. -AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. -AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. -AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. -AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. -AutoTracker.Info.Search=The search area is scanned for the best match. -AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. -AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. -AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. -AutoTracker.Info.Target=The target is where the targeted track point is marked. -AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. -AutoTracker.Info.Title.Settings=Settings -AutoTracker.Info.Title.Tip=Tip -AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. -AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: -AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame -AutoTracker.Info.Replace=--accept the match and replace the existing point -AutoTracker.Info.Keep=--keep the existing point -AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Wizard.Button.Replace=Replace -AutoTracker.Wizard.Button.Keep=Keep -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.SearchThis=Search This -AutoTracker.Wizard.Button.SearchNext=Search Next -AutoTracker.Wizard.Button.Delete=Delete -AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Wizard.Menuitem.DeleteThis=This Point -AutoTracker.Wizard.Menuitem.DeleteLater=Later Points -AutoTracker.Wizard.Menuitem.DeleteAll=All Points -TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker -MainTView.Popup.MenuItem.ZoomIn=Zoom In -MainTView.Popup.MenuItem.ZoomOut=Zoom Out -MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit -TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration -TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than -TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from -TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. -TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: -TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=No resource could be loaded for node - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift-click to mark -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Directories -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Clear on exit -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=Save -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=Algorithms... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: -AlgorithmDialog.Title=Algorithms -AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. -AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. -AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: -TMenuBar.Menu.Diagnostics=Diagnostics - - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=The file cannot be read. -TrackPlottingPanel.Popup.Menu.CompareWith=Compare With -TrackerPanel.DataBuilder.TrackType.Unknown=unknown -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=Load Data Functions -TrackerPanel.DataBuilder.Load.Message=Select functions to load: -TrackerPanel.DataBuilder.Save.Title=Save Data Functions -TrackerPanel.DataBuilder.Save.Message=Select functions to save: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into -TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection -TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type -TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. -TToolbar.Button.Refresh=Refresh data and views - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as -ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportTRKDialog.Complete.Title=Export Complete -ExportTRKDialog.Title=Export ZIP Resource -ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. -ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. -TMenuBar.MenuItem.TabClip=ZIP Resource -TMenuBar.Menu.CalibrationTools=Calibration Tools -TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=end -TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Attach Ends -AttachmentInspector.Label.End=End -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Name -AttachmentInspector.Header.AttachedTo=Attach To -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Attach Ends... -PerspectiveTrack.Corner=corner -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=time -Protractor.Data.Description.1=protractor angle -Protractor.Data.Description.2=length of arm 1 -Protractor.Data.Description.3=length of arm 2 -Protractor.Data.Description.4=step number -Protractor.Data.Description.5=frame number -TapeMeasure.Data.Description.0=time -TapeMeasure.Data.Description.1=length -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=step number -TapeMeasure.Data.Description.4=frame number - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Add -Dialog.Button.Remove=Remove -PrefsDialog.Button.ClearHost=Clear Host -PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache -PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache -TActions.Action.SaveZip=Export ZIP Resource -ThumbnailDialog.Title=Export Thumbnail Image -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Current image -ThumbnailDialog.Label.FrameNumber=frame -ThumbnailDialog.Label.StepNumber=step -ThumbnailDialog.View.VideoOnly=Video Only -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Thumbnail Image -TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser -TTrack.MenuItem.DeletePoint=Delete Selected Step -ZipResourceDialog.Title=Export ZIP Resource -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Name -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Keywords -ZipResourceDialog.Label.Link=External Link -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Success -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource -ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource -ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File -ZipResourceDialog.Button.AddFiles=Add Files -ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File -ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file -ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? -ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch -ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files -ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) -ZipResourceDialog.Tooltip.Author=Authors of this resource -ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) -ZipResourceDialog.Tooltip.Description=A useful description of this resource -ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser -ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource -ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type -ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource -ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video -ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file +# This is the thai tracker.properties file + +Calibration.Name=Calibration Point Pair +Calibration.New.Name=calibration +CenterOfMass.Name=Center Of Mass +CenterOfMass.New.Name=cm +CenterOfMass.MenuItem.Inspector=Select Masses... +CenterOfMassInspector.Title=Center of Mass +CenterOfMassInspector.Border.Title=Select Masses +ConfigInspector.Border.Title=Check Desired Items +ConfigInspector.Title=Preferences +ConfigInspector.Button.SaveAsDefault=Save As Default +CoordAxes.Name=Axes +CoordAxes.New.Name=axes +Dialog.Button.Cancel=Cancel +Dialog.Button.OK=OK +Dialog.Button.Close=Close +Dialog.Button.All=All +Dialog.Button.None=None +Dialog.Button.Copy=Copy +Dialog.Button.Update=Update +Dialog.Button.SelectAll=Select All +Footprint.Diamond=diamond +Footprint.BoldDiamond=bold diamond +Footprint.SolidDiamond=solid diamond +Footprint.Triangle=triangle +Footprint.BoldTriangle=bold triangle +Footprint.SolidTriangle=solid triangle +Footprint.Circle=circle +Footprint.BoldCircle=bold circle +Footprint.SolidCircle=solid circle +Footprint.VerticalLine=vertical line +Footprint.BoldVerticalLine=bold vertical line +Footprint.HorizontalLine=horizontal line +Footprint.BoldHorizontalLine=bold horizontal line +Footprint.Crosshair=crosshair +Footprint.BoldCrosshair=bold crosshair +Footprint.SimpleAxes=simple axes +Footprint.BoldSimpleAxes=bold simple axes +Footprint.Spot=spot +Footprint.Line=line +Footprint.BoldLine=bold line +Footprint.Outline=outline +Footprint.BoldOutline=bold outline +Footprint.Arrow=arrow +Footprint.BoldArrow=bold arrow +Footprint.DoubleArrow=double arrow +Footprint.BoldDoubleArrow=bold double arrow +Footprint.2xArrow=2x arrow +Footprint.Bold2xArrow=bold 2x arrow +Footprint.4xArrow=4x arrow +Footprint.Bold4xArrow=bold 4x arrow +Footprint.DashArrow=dashed arrow +Footprint.BoldDashArrow=bold dashed arrow +Footprint.BigArrow=big arrow +Footprint.BigDashArrow=big dashed arrow +LineProfile.Name=Line Profile +LineProfile.New.Name=profile +LineProfile.Data.Brightness=brightness +LineProfile.Data.Pixel=pixel +LineProfile.Data.Red=red +LineProfile.Data.Green=green +LineProfile.Data.Blue=blue +LineProfile.Data.Weighting=count +MainTView.Popup.MenuItem.QTPlayer=QuickTime Player +MainTView.Popup.MenuItem.Zoom=Zoom +MainTView.Popup.MenuItem.ToFit=To Fit +OffsetOrigin.Name=Offset Origin +OffsetOrigin.New.Name=offset +PlotTrackView.Button.PlotCount=Plots +PlotTrackView.Button.PlotCount.ToolTip=Select number of plots +PointMass.Name=Point Mass +PointMass.New.Name=mass +PointMass.MenuItem.VectorsToPosition=To Position +PointMass.MenuItem.Velocity=Velocity +PointMass.MenuItem.Acceleration=Acceleration +Star.Name=Star +Star.New.Name=star +TableTrackView.Action.CopyData=Copy Data +TableTrackView.Button.SelectTableData=Data +TableTrackView.Button.SelectTableData.ToolTip=Choose Table Columns +TableTrackView.Popup.MenuItem.Analyze=Analyze... +TableTrackView.Dialog.Border.Title=Visible: +TActions.Action.Description=Notes +TActions.Action.ClearTracks=Clear +TActions.Action.NewTab=New Tab +TActions.Action.Copy=Copy +TActions.Action.Paste=Paste +TActions.Action.Open=Open... +TActions.Action.Close=Close +TActions.Action.Import=Import... +TActions.Action.Save=Save +TActions.Action.SaveAs=Save As... +TActions.Action.Export=Export... +TActions.Action.CaptureVideo=Capture Video... +TActions.Action.Delete=Delete +TActions.Action.Config=Preferences... +TActions.Action.AxesVisible=Visible +TActions.Action.TapeVisible=Visible +TActions.Action.Print=Print... +TActions.Action.ClearFilters=Clear +TActions.Action.ImportVideo=Import... +TActions.Action.CloseVideo=Close +TActions.Action.CloseAll=Close All +TActions.Action.Exit=Exit +TActions.Dialog.PrintError.Message=A printing error occurred. +TActions.Dialog.PrintError.Title=Printing Error +TActions.Dialog.Description.Title=Notes: +TActions.Dialog.DeleteLockedTracks.Message=Some tracks are locked. Delete anyway? +TActions.Dialog.DeleteLockedTracks.Title=Delete Locked Tracks? +TActions.Dialog.NewPointMass.Title=New Point Mass +TapeMeasure.Name=Tape Measure +TapeMeasure.New.Name=tape +TapeMeasure.MenuItem.Fixed=Fixed +TFrame.View.Plot=Plot View +TFrame.View.Table=Table View +TFrame.View.World=World View +TFrame.View.Video=Video View +TFrame.Dialog.Help.Title=Tracker Help +TMenuBar.Menu.File=File +TMenuBar.Menu.Edit=Edit +TMenuBar.Menu.Video=Video +TMenuBar.Menu.Tracks=Tracks +TMenuBar.Menu.Coords=Coords +TMenuBar.Menu.Window=Window +TMenuBar.Menu.Help=Help +TMenuBar.MenuItem.EditProperties=Properties... +TMenuBar.MenuItem.VideoVisible=Visible +TMenuBar.MenuItem.VideoFilters=Filters +TMenuBar.MenuItem.NewVideoFilter=New +TMenuBar.MenuItem.NewTrack=New +TMenuBar.MenuItem.CoordsLocked=Locked +TMenuBar.MenuItem.CoordsFixedOrigin=Fixed Origin +TMenuBar.MenuItem.CoordsFixedAngle=Fixed Angle +TMenuBar.MenuItem.CoordsFixedScale=Fixed Scale +TMenuBar.MenuItem.CoordsRefFrame=Reference Frame +TMenuBar.MenuItem.CoordsDefault=Default +TMenuBar.MenuItem.WindowRight=Right View +TMenuBar.MenuItem.WindowBottom=Bottom View +TMenuBar.MenuItem.PlayAllSteps=Play All Steps +TMenuBar.MenuItem.Record=Record +TMenuBar.MenuItem.MatSize=Mat Size +TMenuBar.MenuItem.Language=Language +TMenuBar.MenuItem.DeleteTrack=Delete +TMenuBar.MenuItem.TrackerHelp=Tracker Help... +TMenuBar.MenuItem.MessageLog=Message Log... +TrackControl.Name=Track Control +TrackControl.Button.NewTrack=Create +TrackControl.Button.NewTrack.ToolTip=Create a new track +TrackControl.Button.Trails.ToolTip=Set trail length +TrackControl.Button.Labels.ToolTip=Show or hide numbering +TrackControl.Button.StretchVectors.ToolTip=Stretch vectors +TrackControl.Button.Accelerations.ToolTip=Show or hide acceleration vectors +TrackControl.Button.Xmass.ToolTip=Multiply vectors by mass +TrackControl.Button.Vectors.ToolTip=Vectors +TrackControl.Button.Velocities.ToolTip=Show or hide velocity vectors +TrackControl.Button.Properties.ToolTip=Click to select +TrackControl.Button.Positions.ToolTip=Show or hide positions +Tracker.Popup.MenuItem.Snapshot=Snapshot... +Tracker.Popup.MenuItem.Help=Help... +Tracker.Cursor.Crosshair.Description=Crosshair cursor +Tracker.Action.AboutTracker=About Tracker... +Tracker.Dialog.AboutTracker.Title=About Tracker +Tracker.Action.AboutJava=About Java... +Tracker.Dialog.AboutJava.Title=About Java +Tracker.Dialog.AboutJava.UnknownVersion=unknown +Tracker.Dialog.AboutJava.Message=Java version +Tracker.Action.AboutQT=About QuickTime... +Tracker.Dialog.AboutQT.Title=About QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime version +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava version +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava path: +Tracker.Dialog.NoQT.Title=QTJava.zip not found +Tracker.Dialog.NoQT.Message1=QuickTime for Java does not appear to be installed. +Tracker.Dialog.NoQT.Message2=If you wish to analyze QuickTime movies, please reinstall QuickTime. +Tracker.Dialog.NoQT.Message3=NOTE: QuickTime for Java MUST BE SELECTED when installing QuickTime. +Tracker.Dialog.UpdateQT.Title=Update QTJava.zip +Tracker.Dialog.UpdateQT.Message1=A newer version of QTJava.zip has been found at +Tracker.Dialog.UpdateQT.Message2=Do you wish to update the existing file? +Tracker.Dialog.CopyQT.Title=Copy QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime is installed, but before Tracker can use it: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip must be copied from +Tracker.Dialog.CopyQT.Message3= to +Tracker.Dialog.CopyQT.Message4= 2. Tracker must be restarted. +Tracker.Dialog.CopyQT.Message5=Do you wish to copy QTJava.zip now? +Tracker.Dialog.CopyFailed.Title=Copy failed +Tracker.Dialog.CopyFailed.Message=QTJava.zip could not be copied. +Tracker.Dialog.CopiedTo.Title=Copy succeeded +Tracker.Dialog.CopiedTo.Message1=QTJava.zip has been successfully copied to +Tracker.Dialog.CopiedTo.Message2=Tracker must be restarted and will now exit. +Tracker.Splash.Loading=Loading +TrackerIO.Dialog.Import.Title=Import +TrackerIO.Dialog.Import.Message=Select items to import +TrackerIO.Dialog.ImportVideo.Title=Import Video +TrackerIO.Dialog.Export.Title=Export +TrackerIO.Dialog.Export.Message=Select items to export +TrackerIO.Dialog.ReplaceFile.Title=Replace Existing File? +TrackerIO.Dialog.ReplaceFile.Message=already exists. Do you want to replace it? +TrackerIO.Dialog.NotTrackerXML.Title=Mismatched XML +TrackerIO.Dialog.NotTrackerXML.Message=contains xml data for a different application. +TrackerIO.Dialog.BadVideo.Message=Video could not be opened: +TrackerPanel.NewTab.Name=Untitled +TrackerPanel.DragToMark.Hint=Shift-drag to mark +TrackerPanel.ClickToMark.Hint=Shift-click to mark +TrackerPanel.Dialog.LoadFailed.Title=File Not Loaded +TrackerPanel.Dialog.LoadFailed.Message=File could not be loaded: +TrackerPanel.Dialog.SaveChanges.Title=Save Changes +TrackerPanel.Dialog.SaveChanges.Message=Save changes to +TrackPlottingPanel.Popup.MenuItem.Lines=Lines +TrackPlottingPanel.Popup.MenuItem.Points=Points +TrackPlottingPanel.Popup.MenuItem.Scale=Scale... +TrackPlottingPanel.Popup.MenuItem.Print=Print... +TrackPlottingPanel.Popup.MenuItem.Measure=Scale to Fit +TrackPlottingPanel.Popup.MenuItem.Analyze=Analyze... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zoom In +TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zoom Out +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Autoscale +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zoom To Box +TrackPlottingPanelInspector.Title=Scale +TrackPlottingPanelInspector.Label.Min=Min +TrackPlottingPanelInspector.Label.Max=Max +TrackPlottingPanelInspector.Label.Auto=Auto +TToolBar.Button.Footprint.Tooltip=Set Footprint +TToolBar.Dropdown.SelectedTrack.Tooltip=Select Track +TToolBar.Dropdown.SelectedTrack.None=None +TTrack.MenuItem.Delete=Delete +TTrack.MenuItem.Color=Color... +TTrack.Dialog.Color.Title=Choose Track Color +TTrack.MenuItem.Name=Name... +TTrack.MenuItem.Footprint=Footprint +TTrack.MenuItem.Description=Notes... +TTrack.MenuItem.Visible=Visible +TTrack.MenuItem.TrailVisible=Trail Visible +TTrack.MenuItem.Autostep=Autostep +TTrack.MenuItem.MarkByDefault=Mark by Default +TTrack.MenuItem.Locked=Locked +TTrack.MenuItem.Delete=Delete +TTrack.Name.None=no name +TTrack.Dialog.Description.Title=Notes: +TTrack.Dialog.Name.Title=Set Name +TTrack.Dialog.Name.Label=Name: +TViewChooser.Button.Choose.Tooltip=Choose a View +Vector.Name=Vector +Vector.New.Name=vector +Vector.MenuItem.ToOrigin=To Origin +Vector.MenuItem.Label=Label Visible +VectorSum.Name=Vector Sum +VectorSum.New.Name=sum +VectorSum.MenuItem.Inspector=Select Vectors... +VectorSumInspector.Title=Vector Sum +VectorSumInspector.Border.Title=Select Vectors +WorldTView.Popup.MenuItem.Projectile=Projectile Model + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=Analytic Particle Model +AnalyticParticle.Inspector.Title=Analytic Particle Model +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=Radius 4 +CircleFootprint.Circle_6=Radius 6 +CircleFootprint.Circle_8=Radius 8 +DynamicParticle.Name=Dynamic Particle Model (Cartesian) +DynamicParticle.Inspector.Title=Dynamic Particle Model +DynamicParticle.Property.ForceX=force x +DynamicParticle.Property.ForceY=force y +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=Fixed +ParticleModel.New.Name=model +ParticleModel.MenuItem.InspectModel=Model Builder... +ParticleModel.Inspector.Button.Undo=Undo +ParticleModel.Inspector.Button.Redo=Redo +ParticleModel.Inspector.Button.Close=Close +ParticleModel.Inspector.Button.Help=Help + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=X Only +Calibration.Axes.YOnly=Y Only +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=Select calibration axes +Calibration.Label.Axes=axes +Calibration.Dialog.InvalidCoordinates.Title=Invalid Coordinates +Calibration.Dialog.InvalidCoordinates.Message=Points cannot have the same world coordinates. +Calibration.Dialog.InvalidXCoordinates.Message=Points cannot have the same world x-coordinates. +Calibration.Dialog.InvalidYCoordinates.Message=Points cannot have the same world y-coordinates. +SpectralLineFilter.Title=Gas Spectra +SpectralLineFilter.H=Hydrogen +SpectralLineFilter.He=Helium +SpectralLineFilter.Ne=Neon +SpectralLineFilter.Hg=Mercury +TFrame.View.Unknown=View +TMenuBar.MenuItem.Undo=Undo +TMenuBar.MenuItem.Redo=Redo +TMenuBar.MenuItem.Replace=Replace... +TMenuBar.Menu.AddImage=Import Images +TMenuBar.MenuItem.AddBefore=Before This Frame... +TMenuBar.MenuItem.AddAfter=After This Frame... +TMenuBar.MenuItem.RemoveImage=Remove This Frame +TMenuBar.Menu.Tools=Tools +TMenuBar.MenuItem.DataFunctionTool=Data Builder +TMenuBar.MenuItem.DatasetTool=Data Tool +TMenuBar.Menu.CopyImage=Copy Image +TMenuBar.MenuItem.CopyMainView=Main View +TMenuBar.MenuItem.CopyFrame=Frame +TMenuBar.MenuItem.PrintFrame=Print... +TrackerIO.Dialog.AddImage.Title=Import Images (choose one or more) +TTrack.Dialog.Name.BadName=is in use. Please choose another name. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=net force +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=Plot view of track data will appear here. +TableTView.Label.NoData=Table view of track data will appear here. +TrackerPanel.Message.NoData0=Main view of video and tracks will appear here. +TrackerPanel.Message.NoData1=Choose File|Open or Tracks|New to start. +WorldTView.Label.NoData=World view of video and tracks will appear here. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=Solver: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=Adaptive Multistep +DynamicParticle.Table.Force.Border.Title=Force Functions (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=Position Functions (t) +ParticleModel.Table.Initial.Border.Title=Initial Values +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=Paste Image +TMenuBar.MenuItem.PasteAfter=After This Frame +TMenuBar.MenuItem.PasteBefore=Before This Frame +TMenuBar.MenuItem.PasteReplace=Replace Video + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=Getting Started... +Tracker.Splash.HelpMessage=New user? Choose + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=angle from horizontal +LineProfile.Checkbox.Rotates=rotates +LineProfile.Label.Spread=spread +RGBRegion.Name=RGB Region +RGBRegion.New.Name=region +RGBRegion.MenuItem.Fixed=Fixed Position +RGBRegion.Label.Radius=pixel radius +TTrack.Label.Step=step + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=position number +LineProfile.Data.Description.1=position x-component +LineProfile.Data.Description.2=position y-component +LineProfile.Data.Description.3=red +LineProfile.Data.Description.4=green +LineProfile.Data.Description.5=blue +LineProfile.Data.Description.6=perceived brightness +LineProfile.Data.Description.7=line width +ParticleModel.MenuItem.TraceVisible=Trace Visible +ParticleModel.MenuItem.StepsVisible=Steps Visible +PointMass.Data.Description.0=time +PointMass.Data.Description.1=position x-component +PointMass.Data.Description.2=position y-component +PointMass.Data.Description.3=position magnitude +PointMass.Data.Description.4=position angle +PointMass.Data.Description.5=velocity x-component +PointMass.Data.Description.6=velocity y-component +PointMass.Data.Description.7=velocity magnitude +PointMass.Data.Description.8=velocity angle +PointMass.Data.Description.9=acceleration x-component +PointMass.Data.Description.10=acceleration y-component +PointMass.Data.Description.11=acceleration magnitude +PointMass.Data.Description.12=acceleration angle +PointMass.Data.Description.13=rotation angle +PointMass.Data.Description.14=angular velocity +PointMass.Data.Description.15=angular acceleration +PointMass.Data.Description.16=step number +PointMass.Data.Description.17=frame number +PointMass.Data.Description.18=momentum x-component +PointMass.Data.Description.19=momentum y-component +PointMass.Data.Description.20=momentum magnitude +PointMass.Data.Description.21=momentum angle +PointMass.Data.Description.22=kinetic energy +RGBRegion.Data.Description.0=time +RGBRegion.Data.Description.1=position x-component +RGBRegion.Data.Description.2=position y-component +RGBRegion.Data.Description.3=red +RGBRegion.Data.Description.4=green +RGBRegion.Data.Description.5=blue +RGBRegion.Data.Description.6=perceived brightness +RGBRegion.Data.Description.7=pixel count +RGBRegion.Data.Description.8=step number +RGBRegion.Data.Description.9=frame number +TView.Menuitem.Define=Define... +Vector.Data.Description.0=time +Vector.Data.Description.1=x-component +Vector.Data.Description.2=y-component +Vector.Data.Description.3=magnitude +Vector.Data.Description.4=angle +Vector.Data.Description.5=tail position x-component +Vector.Data.Description.6=tail position y-component +Vector.Data.Description.7=step number +Vector.Data.Description.8=frame number +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=Mass of this particle +ParticleModel.Parameter.InitialTime.Description=Initial time +AnalyticParticle.PositionFunction.X.Description=Position x-component +AnalyticParticle.PositionFunction.Y.Description=Position y-component +DynamicParticle.ForceFunction.X.Description=Force x-component +DynamicParticle.ForceFunction.Y.Description=Force y-component +DynamicParticle.Parameter.InitialX.Description=Initial position x-component +DynamicParticle.Parameter.InitialY.Description=Initial position y-component +DynamicParticle.Parameter.InitialVelocityX.Description=Initial velocity x-component +DynamicParticle.Parameter.InitialVelocityY.Description=Initial velocity y-component +TrackerPanel.ModelBuilder.Title=Model Builder +TrackerPanel.DataBuilder.Title=Data Builder +TrackControl.TrailMenu.NoTrail=No trails +TrackControl.TrailMenu.ShortTrail=Short trails +TrackControl.TrailMenu.LongTrail=Long trails +TrackControl.TrailMenu.FullTrail=Past and future +TrackerPanel.ModelBuilder.Spinner.Tooltip=Currently selected model +TrackerPanel.ModelBuilder.LineButton.Text=Line Style +TrackerPanel.ModelBuilder.LineButton.Tooltip=Set line style +ParticleModel.LineStyle.None=No line +ParticleModel.LineStyle.Connect=Connect steps +ParticleModel.LineStyle.Smooth=Smooth line +ModelFunctionPanel.Label=Model +AnalyticFunctionPanel.FunctionEditor.Border.Title=Position Functions +DynamicFunctionPanel.FunctionEditor.Border.Title=Force Functions + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=Visible Table Columns +Tracker.About.ProjectOf=A project of: +Tracker.About.TranslationBy=Translation by +# following entry (Tracker.About.Translator) purposely left blank +Tracker.About.Translator= +TMenuBar.Menu.SaveVideoAs=Save Clip As +TActions.SaveClipAs.ProgressMonitor.Message=Saving clip as +TActions.SaveClipAs.ProgressMonitor.Progress=Completed + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sync +PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronize horizontal axes +RGBRegion.MenuItem.FixedRadius=Fixed Radius +Tracker.VideoZoom.Hint=click to zoom in or out, double-click to zoom to fit +Tracker.PlotZoomIn.Hint=drag to zoom in, double-click to autoscale +Tracker.PlotZoomOut.Hint=click to zoom out +Tracker.MenuItem.Hints=Show Hints +TapeMeasure.Label.Length=scaled length +TapeMeasure.Label.TapeAngle=tape angle +TapeMeasure.Label.ArcAngle=protractor angle +TrackerIO.Dialog.NotAnImage.Title=Incorrect File Type +TrackerIO.Dialog.NotAnImage.Message1=is not a JPG or GIF image. +TrackerIO.Dialog.NotAnImage.Message2=Do you wish to continue? +TToolBar.Button.Zoom.Tooltip=Zoom Tool (shortcut: Z key) +TrackChooserTView.DropDown.Tooltip=Select a track +TapeMeasure.Field.ArcAngle.Tooltip=Angle from tape to protractor arm +TapeMeasure.Field.TapeAngle.Tooltip=Angle from positive x-axis to tape +TapeMeasure.Field.Magnitude.Tooltip=Length of tape in scaled world units +TapeMeasure.Readout.Magnitude.Name=length readout +TapeMeasure.Readout.Magnitude.Hint=click to set the scale +TapeMeasure.Readout.Angle.Name=angle readout +TapeMeasure.Readout.Angle.Hint=click to set the angle +TapeMeasure.Arm.Name=protractor arm +TapeMeasure.Arm.Hint=drag to measure angles, shorten to close +TapeMeasure.End.Name=end +TapeMeasure.End.Hint=drag to measure distances or calibrate the scale +TapeMeasure.Handle.Name=handle +TapeMeasure.Handle.Hint=drag to move tape +Vector.Tip.Name=tip +Vector.Tip.Hint=drag or enter coordinates to change components +Vector.Handle.Name=handle +Vector.Handle.Hint=drag to move vector +Vector.ShortHandle.Hint=drag to move, alt-click to select tip +PointMass.Position.Name=position +PointMass.Position.Hint=drag or enter coordinates to change position +PointMass.Velocity.Name=velocity +PointMass.Acceleration.Name=acceleration +PointMass.Vector.Hint=drag to move +PointMass.Position.Locked.Hint=click to select--cannot be dragged +CoordAxes.Handle.Name=+x-axis +CoordAxes.Handle.Hint=drag to change tilt +CoordAxes.Origin.Name=origin +CoordAxes.Origin.Hint=drag to change position +OffsetOrigin.Position.Name=position +OffsetOrigin.Position.Hint=drag or enter coordinates to move origin +Calibration.Point.Name=point +Calibration.Point.Hint=drag or enter coordinates to change axes and scale +RGBRegion.Position.Name=position +RGBRegion.Position.Hint=drag or enter coordinates to change position +LineProfile.End.Name=end +LineProfile.End.Hint=drag to adjust line length +LineProfile.Handle.Name=handle +LineProfile.Handle.Hint=drag to move line +PointMass.Hint=set mass on toolbar +PointMass.Unmarked.Hint=, shift-click to mark positions +TTrack.Unselected.Hint=click to select and/or set properties +Vector.Unmarked.Hint=shift-drag to draw vectors +OffsetOrigin.Unmarked.Hint=shift-click to mark the offset point +Calibration.Unmarked.Hint=shift-click to mark the first point +Calibration.Halfmarked.Hint=shift-click to re-mark +CenterOfMass.Empty.Hint=select masses to define system +VectorSum.Empty.Hint=select vectors to define sum +TapeMeasure.Hint=set length to change scale, set angle to change x-axis tilt +CoordAxes.Hint=set angle to change tilt +ParticleModel.Hint=set mass on toolbar, enter expressions in Model Builder to animate +RGBRegion.Hint=enter radius to change size +RGBRegion.Unmarked.Hint=shift-click to mark positions +TTrack.ImportVideo.Hint=import video or image to measure RGB +TTrack.Selected.Hint=selected +LineProfile.Hint=enter spread to change line width +LineProfile.Unmarked.Hint=shift-drag to draw line +LineProfile.Menu.Orientation=Orientation +LineProfile.MenuItem.Horizontal=Horizontal +LineProfile.MenuItem.XAxis=Along X-Axis +Footprint.PositionVector=vector +Footprint.BoldPositionVector=bold vector +Tracker.Startup.Hint=look here for hints (or turn off hints in the Help menu), press F1 key at any time for help +TrackerPanel.NoVideo.Hint=open or import a video or image to analyze +TrackerPanel.CalibrateVideo.Hint=identify a video feature with known length and set the scale using the tape measure +TrackerPanel.NoTracks.Hint=create a new track to measure video features of interest +TrackerPanel.SetClip.Hint=set or review video clip settings +TrackerPanel.ShowAxes.Hint=set the origin and angle of the coordinate axes +VideoPlayer.Step.Hint=step forward (shortcut: PageDown key) +VideoPlayer.Back.Hint=step back (shortcut: PageUp key) +TrackerPanel.DVVideo.Hint=apply a resize filter to correct distortions in DV-format videos +TrackerIO.DataFileFilter.Description=Tracker Files +Tracker.Button.PDFHelp=Printable PDF Version +TToolbar.Button.TapeVisible.Tooltip=Tape Measure with Protractor Arm + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=Track Control +TMenuBar.MenuItem.Description=Notes +TrackPlottingPanel.RightDrag.Hint=right-drag for options +TMenuBar.MenuItem.DeleteSelectedPoint=Selected Point +TFrame.InfoDialog.SaveChanges.Title=Save Changes +TFrame.InfoDialog.SaveChanges.Message=Do you wish to save changes? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesian +DynamicParticle.Editor.Button.Polar=Polar +DynamicParticle.Parameter.InitialR.Description=Initial radius +DynamicParticle.Parameter.InitialTheta.Description=Initial angle +DynamicParticle.Parameter.InitialVelocityR.Description=Initial radial velocity +DynamicParticle.Parameter.InitialOmega.Description=Initial angular velocity +DynamicParticle.ForceFunction.R.Description=Force radial component +DynamicParticle.ForceFunction.Theta.Description=Force tangential component +DynamicParticlePolar.Name=Dynamic Particle Model (Polar) +DynamicTwoBody.Editor.Button.Particle1=Particle 1 +DynamicTwoBody.Editor.Button.Particle2=Particle 2 +DynamicTwoBody.Name=Dynamic Two-Body Model +TMenuBar.Menu.DynamicParticle=Dynamic Particle Model +TMenuBar.MenuItem.Cartesian=Cartesian +TMenuBar.MenuItem.Polar=Polar + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=Autotracker... +Dialog.Button.Help=Help +AutoTracker.Wizard.Title=Autotracker: +AutoTracker.Wizard.Button.Reset=Reset +AutoTracker.Wizard.Button.Back=Back +AutoTracker.Wizard.Button.Next=Next +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.Start=Start +AutoTracker.Wizard.Button.Pause=Pause +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Label.Mask=Mask Image +AutoTracker.Label.Target=Target Offset +AutoTracker.Label.AcceptLevel=Accept Scores Above +AutoTracker.TabbedPane.TabTitle.Mask=Mask +AutoTracker.TabbedPane.TabTitle.Target=Target +AutoTracker.TabbedPane.TabTitle.Settings=Accept +AutoTracker.TabbedPane.TabTitle.Search=Search +AutoTracker.Info.GetStarted=Please click the video feature you wish to autotrack. +AutoTracker.Info.Mask1=The mask defines the image to be matched in each video frame. Move or resize the mask by dragging its center or handle, respectively. +AutoTracker.Info.Mask2=Tip: the mask need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. +AutoTracker.Info.MaskLocked1=The mask is in use and locked. +AutoTracker.Info.MaskLocked2=Click the Reset button to clear all steps, unlock the mask and start over. +AutoTracker.Info.Target1=The target is where steps will be marked relative to the mask. Move the target by dragging it. +AutoTracker.Info.Target2=Tip: You can adjust the target position even after steps have been marked. Existing steps will automatically move along with the target. +AutoTracker.Info.TargetLocked=The target is in use and tied to existing step positions. Moving it will move the steps as well. +AutoTracker.Info.Settings1=Match scores above the acceptance level shown are marked automatically. +AutoTracker.Info.Settings2=Tip: reducing the acceptance level speeds up the marking process but increases the likelihood of errors. +AutoTracker.Info.Search1=The rectangle shown will be searched for the best match. Move or resize the search area by dragging its center or handle, respectively. +AutoTracker.Info.Search2=Tip: The search area need not be large. After finding the first two matches, a look-ahead algorithm moves the search area to predicted match positions. +AutoTracker.Info.Frame=Frame +AutoTracker.Info.Match=The match shown was marked automatically at the target position. +AutoTracker.Info.Possible=A possible match was found in the search area shown. Your options are: +AutoTracker.Info.NoMatch=No match was found in the search area shown. Your options are: +AutoTracker.Info.Outside=The search area is outside the image. Your options are: +AutoTracker.Info.Accepted=The match shown was accepted by the user. +AutoTracker.Info.MarkedByUser=The step was marked manually by the user. +AutoTracker.Info.NoVideo=Autotracking requires a video. Please import a video or close this Autotracker. +AutoTracker.Info.Height=height +AutoTracker.Info.Width=width +AutoTracker.Info.Accept=--accept the match +AutoTracker.Info.Retry=--move the search area and search again +AutoTracker.Info.Mark=--shift-click to mark the step manually +AutoTracker.Info.Skip=--skip this frame and continue tracking +AutoTracker.Info.Reset=--reset and start over with a modified mask +AutoTracker.Info.MatchScore=match score +AutoTracker.Dialog.MaskLocked.Title=Mask Locked +PointMass.Cursor.Autotrack.Description=Autotracker cursor +VideoPlayer.StartFrame.Hint=drag to set the start frame +VideoPlayer.EndFrame.Hint=drag to set the end frame +VideoPlayer.Slider.Hint=drag to scan through the video +FileDropHandler.Dialog.BadFile.Message=could not be loaded. +FileDropHandler.Dialog.BadFile.Title=Unrecognized File + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=Apply +DynamicParticle.Dialog.Delete.Message=Deleting this particle will remove it from a system. Delete anyway? +DynamicParticle.Dialog.Delete.Title=Dynamic System +DynamicParticle.System.In=in +DynamicSystem.Empty=empty +DynamicSystem.Force.Name.Internal=internal +DynamicSystem.ForceFunction.R.Description=Internal force radial component +DynamicSystem.ForceFunction.Theta.Description=Internal force tangential component +DynamicSystem.MenuItem.Inspector=Select Particles... +DynamicSystem.Name=Dynamic Two-Body System +DynamicSystem.New.Name=system +DynamicSystem.Parameter.Of=of +DynamicSystem.Parameter.RelativeTo=relative to +DynamicSystem.Parameter.Name.Relative=relative +DynamicSystem.Parameter.ParticleMass.Description=Mass of +DynamicSystem.Parameter.Mass.Description=Total mass of this system +DynamicSystemInspector.Border.Title=Particle +DynamicSystemInspector.Title=Two-Body System +DynamicSystemInspector.Button.Change=Change To... +DynamicSystemInspector.ParticleName.None=(none) +TMenuBar.MenuItem.Clone=Clone +TMenuBar.MenuItem.TwoBody=Two-Body System +TrackerPanel.DataBuilder.Dropdown.Tooltip=Currently selected track +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync Vertical Axes +TrackControl.Button.Trace.ToolTip=Show or hide paths +TToolBar.Button.Open.Tooltip=Open a video or tracker file in a new tab +TToolBar.Button.Save.Tooltip=Save the current tab in file +TToolBar.Button.SelectTrack=Select +TToolBar.Button.SelectTrack.Tooltip=Select an existing track +TTrack.MenuItem.ClearSteps=Clear Steps +PointMass.MenuItem.Position=Position +TMenuBar.MenuItem.Empty=(Empty) +TTrackBar.Button.Memory=memory in use: +TTrackBar.Button.Memory.Tooltip=Monitor and manage memory +TTrackBar.Memory.PopupItem.Launch1=Launch +TTrackBar.Memory.PopupItem.Launch2=with memory +TButton.Track.ToolTip=Set properties of +Tracker.Dialog.OutOfMemory.Message1=Tracker has run out of memory. +Tracker.Dialog.OutOfMemory.Message2=Click the memory button for options. +Tracker.Dialog.OutOfMemory.Title=Out of Memory + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Label.Original=Initial +AutoTracker.Label.NoMask=none +AutoTracker.Label.Rate=Evolution Rate: +AutoTracker.Info.Mask3=Tip: the template need not be large nor include the whole object. A feature that is unique and includes high-contrast edges generally works best. +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Info.SearchOnAxis1=The x-axis within the rectangle shown will be searched for the best match. Move or resize the search area by dragging its center or handle, respectively. +AutoTracker.Info.PossibleOnAxis=A possible match was found along the x-axis in the search area shown. Your options are: +AutoTracker.Info.NoMatchOnAxis=No match was found along the x-axis in the search area shown. Your options are: +AutoTracker.Info.RetryOnAxis=--move the search area or x-axis and search again +AutoTracker.Wizard.Button.Delete=Delete This Point +AutoTracker.Wizard.Button.DeleteMore=Delete This And Later Points +Button.Define.Tooltip=Define functions of existing column variables +Calibration.Label.Point=point +CalibrationStick.Hint=set length or drag end to change scale, set angle to change axis tilt +CalibrationStick.End.Hint=drag to change the scale +CalibrationStick.New.Name=calibration stick +CalibrationTapeMeasure.New.Name=calibration tape +CalibrationTapeMeasure.Readout.Magnitude.Hint=click to enter a known length in world units +CalibrationTapeMeasure.Hint=set length to change scale, set angle to change axis tilt +DynamicSystem.Data.Description.0=relative distance between particles +DynamicSystem.Data.Description.1=relative angle +DynamicSystem.Data.Description.2=relative radial velocity +DynamicSystem.Data.Description.3=relative angular velocity +ExportDataDialog.Subtitle.Table=Data Table +ExportDataDialog.Subtitle.Content=Cells +ExportDataDialog.Subtitle.Format=Number Format +ExportDataDialog.Subtitle.Delimiter=Delimiter +ExportDataDialog.Title=Export Data +ExportDataDialog.Delimiter.Add=Add... +ExportDataDialog.Delimiter.Remove=Remove... +ExportDataDialog.Content.AllCells=All Cells +ExportDataDialog.Content.SelectedCells=Selected Cells +ExportDataDialog.MenuItem.RemoveDelimiter=Remove custom delimiter +ExportDataDialog.Chooser.SaveData.Title=Save Data As +ExportVideoDialog.Button.SaveAs=Save As... +ExportVideoDialog.Button.FullSize=Full size +ExportVideoDialog.Button.DrawnSize=As drawn +ExportVideoDialog.Content.VideoOnly=Video only +ExportVideoDialog.Content.VideoAndGraphics=Video and graphics +ExportVideoDialog.Content.GraphicsOnly=Graphics only +ExportVideoDialog.Title=Export Video Clip +ExportVideoDialog.Label.ClipSettings=Clip settings +ExportVideoDialog.Subtitle.Size=Size +ExportVideoDialog.Subtitle.Content=Content +ExportVideoDialog.Subtitle.View=View +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=The video has been saved as +ExportVideoDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportVideoDialog.Complete.Title=Export Complete +ExportVideoDialog.VideoSize=video size +ExportVideoDialog.MatSize=mat size +ExportVideo.Dialog.HiddenPlots.Message=Plots must be fully visible for exporting. +ExportVideo.Dialog.HiddenPlots.Title=Incomplete View +Footprint.DoubleTarget=double crosshair +Footprint.BoldDoubleTarget=bold double crosshair +OffsetOrigin.MenuItem.Fixed=Fixed World Coordinates +ParticleModel.Dialog.Offscreen.Message1=Some model steps are empty because they are too far off screen. +ParticleModel.Dialog.Offscreen.Message2=To fix this, change the model or rescale the video. +ParticleModel.Dialog.Offscreen.Title=Out of Bounds +PrefsDialog.Tab.Configuration.Title=Configuration +PrefsDialog.Memory.BorderTitle=Memory Size +PrefsDialog.Tab.General.Title=Other +PrefsDialog.RecentFiles.BorderTitle=Open Recent Menu +PrefsDialog.Label.RecentSize=File count +PrefsDialog.Hints.BorderTitle=Hints +PrefsDialog.Button.Relaunch=Relaunch Now +PrefsDialog.Button.ClearRecent=Clear +PrefsDialog.Checkbox.DefaultSize=Use default +PrefsDialog.Checkbox.HintsOn=Show hints by default +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Video Engine +PrefsDialog.Button.Xuggle=Xuggle (recommended) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. +PrefsDialog.Dialog.WebStart.Title=Web Start Mode +PrefsDialog.LookFeel.BorderTitle=Look And Feel +PrefsDialog.Language.BorderTitle=Language +PrefsDialog.Upgrades.BorderTitle=Check For Upgrades +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=Display +PrefsDialog.Language.Default=default +PrefsDialog.Upgrades.Always=Every Time +PrefsDialog.Upgrades.Weekly=Weekly +PrefsDialog.Upgrades.Monthly=Monthly +PrefsDialog.Upgrades.Never=Never +PrefsDialog.Button.CheckForUpgrade=Check Now +PrefsDialog.Xuggle.Speed.BorderTitle=Video Playback +PrefsDialog.Xuggle.Slow=Smooth (may be slow) +PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool +Protractor.Name=Protractor +Protractor.New.Name=protractor +Protractor.Hint=drag arms to measure angles +Protractor.Label.Angle=angle +Protractor.Field.Angle.Tooltip=angle between protractor arms +Protractor.Vertex.Name=vertex +Protractor.Vertex.Hint=drag to move the vertex +Protractor.End.Name=arm end +Protractor.End.Hint=drag to rotate the arm +Protractor.Handle.Name=handle +Protractor.Handle.Hint=drag to move the protractor +Protractor.Rotator.Name=rotator +Protractor.Rotator.Hint=drag to rotate the protractor +Protractor.Readout.Name=readout +Protractor.Readout.Hint=angle between protractor arms +ProtractorFootprint.Circle3=small circle +ProtractorFootprint.Circle5=large circle +ProtractorFootprint.Circle3Bold=bold small circle +ProtractorFootprint.Circle5Bold=bold large circle +Stick.Name=Measuring Stick +Stick.New.Name=measuring stick +TableTrackView.MenuItem.Unformatted=Full Precision +TableTrackView.MenuItem.Formatted=As Formatted +TableTrackView.Menu.SetDelimiter=Set Delimiter +TableTrackView.MenuItem.AddDelimiter=Add... +TableTrackView.MenuItem.RemoveDelimiter=Remove... +TableTrackView.Dialog.CustomDelimiter.Message=Enter a new delimiter string: +TableTrackView.Dialog.CustomDelimiter.Title=Add Delimiter +TableTrackView.Header.Tooltip=Click to sort or double-click to select column +TableTrackView.MenuItem.CopySelectedData=Copy Selected Data +TableTrackView.Dialog.RemoveDelimiter.Message=Select the delimiter to remove: +TableTrackView.Dialog.RemoveDelimiter.Title=Remove Delimiter +TableTrackView.Radians.Tooltip=in radians +TableTrackView.Degrees.Tooltip=in degrees +TableTrackView.RadiansPerSecond.Tooltip=in radians/s +TableTrackView.DegreesPerSecond.Tooltip=in degrees/s +TableTrackView.RadiansPerSecondSquared.Tooltip=in radians/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=in degrees/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Delete Data Function +TActions.Action.SaveFrame=Save Tabset As... +TActions.AboutVideo=Properties... +TActions.Dialog.AboutVideo.Title=Video Properties +TActions.Dialog.AboutVideo.Type=Type +TActions.Dialog.AboutVideo.Size=Dimensions +TActions.Dialog.AboutVideo.Length=Length +TActions.Dialog.AboutVideo.Frames=frames +TActions.Dialog.AboutVideo.Seconds=seconds +TActions.Dialog.AboutVideo.FrameRate=Frame Rate +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Path +TActions.Action.ImportTRK=Tracker File... +TActions.Action.ProtractorVisible=Visible +TapeMeasure.MenuItem.FixedLength=Fixed Length +TextTView.Label.NoTab=Display text and HTML pages here. +TextTView.NewTab.Text1=Double-click to edit the text or title. Right-click for more options. +TextTView.NewTab.Text2=To display an HTML page, enter the url or right-click to open a file. +TextTView.NewTab.Title=Untitled +TextTView.Dialog.TabTitle.Title=Set Title +TextTView.MenuItem.OpenHTML=Open HTML... +TextTView.MenuItem.SetTitle=Set Title... +TextTView.Button.NewTab=New +TextTView.TextEdit.Description=Text +TFrame.Dialog.FileNotFound.Message=File could not be found: +TFrame.Dialog.FileNotFound.Title=File Not Found +TFrame.View.Text=Text/HTML View +TFrame.View.Main=Main View +TMenuBar.Menu.OpenRecent=Open Recent +TMenuBar.Menu.Import=Import +TMenuBar.Menu.Export=Export +TMenuBar.MenuItem.Video=Video... +TMenuBar.MenuItem.Data=Data File... +TMenuBar.Menu.CopyObject=Copy Object +TMenuBar.MenuItem.Coords=Coordinate System +TMenuBar.MenuItem.VideoClip=Video Clip +TMenuBar.Menu.MeasuringTools=Measuring Tools +TMenuBar.Menu.AngleUnits=Angle Units +TMenuBar.MenuItem.Degrees=Degrees +TMenuBar.MenuItem.Radians=Radians +Tracker.Dialog.NoXuggle.Title=Xuggle not found +Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. +Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=About Xuggle... +Tracker.Dialog.AboutXuggle.Title=About Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can +Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. +Tracker.Dialog.NoVideoEngine.Message3=To install Xuggle, Tracker's preferred video engine on +Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from +Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine +Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's preferred video engine, is not yet installed. +Tracker.Dialog.NoXuggle.Message2=To install Xuggle, download the latest Tracker installer from +Tracker.Dialog.NoXuggle.Title=Missing Xuggle +Tracker.About.DefaultLocale=Default locale +Tracker.About.CurrentLanguage=Language +Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory +Tracker.Dialog.InsufficientMemory.Message=The requested memory size is too large. +TrackerIO.Dialog.TabMustBeSaved.Message1=Tab +TrackerIO.Dialog.TabMustBeSaved.Message2=must be saved as a tracker file to be included in the tabset. +TrackerIO.Dialog.TabMustBeSaved.Message3=Do you wish to save it? +TrackerIO.Dialog.TabMustBeSaved.Title=Unsaved Tab +TrackerIO.Dialog.NoTabs.Message=There are no tabs to save! +TrackerIO.Dialog.NoTabs.Title=Empty Tabset +TrackerIO.Dialog.SaveTabset.Title=Save Tabset +TrackerIO.Dialog.SaveTab.Title=Save Tab +TrackerIO.Delimiter.Tab=Tab +TrackerIO.Delimiter.Space=Space +TrackerIO.Delimiter.Comma=Comma +TrackerIO.Delimiter.Semicolon=Semicolon +TrackerIO.VideoAndDataFileFilter.Description=Video and Tracker Files +TrackerPanel.Dialog.Version.Message1=You are opening a file created with Tracker +TrackerPanel.Dialog.Version.Message2=which may refer to +TrackerPanel.Dialog.Version.Message3=features missing in the version you are running +TrackerPanel.Dialog.Version.Message4=The latest Tracker is available at +TrackerPanel.Dialog.Version.Title=Version Mismatch +TrackerPanel.Label.ModelStart=Start +TrackerPanel.Label.ModelEnd=End +TrackerPanel.Spinner.ModelStart.Tooltip=Set the start frame for this model +TrackerPanel.Spinner.ModelEnd.Tooltip=Set the end frame for this model +TToolbar.Button.ProtractorVisible.Tooltip=Show or hide the protractor +TToolbar.Button.AxesVisible.Tooltip=Show or hide the coordinate axes +TToolBar.Button.TrackControl.Tooltip=Show or hide the track control +TTrack.Dialog.StepSizeWarning.Message1=Caution: some tracks were marked at a step size greater than one, leaving skipped frames unmarked. +TTrack.Dialog.StepSizeWarning.Message2=Changing the step size is therefore likely to result in gaps in the data set. +TTrack.Dialog.StepSizeWarning.Message3=Velocities and accelerations around the gaps cannot be determined until all steps are marked. +TTrack.Dialog.StepSizeWarning.Title=Caution +TTrack.Dialog.SkippedStepWarning.Message1=Caution: skipping steps when marking positions leaves gaps in the data set. +TTrack.Dialog.SkippedStepWarning.Title=Caution +TTrack.Dialog.SkippedStepWarning.Checkbox=Don't show this again +TTrack.Locked.Hint=locked +TTrack.AngleField.Radians.Tooltip=angle in radians +TTrack.AngleField.Degrees.Tooltip=angle in degrees +TTrack.AngleField.Popup.Radians=Switch To Radians +TTrack.AngleField.Popup.Degrees=Switch To Degrees +TTrackBar.Memory.Menu.SetSize=Set memory size... +TTrackBar.Button.Version=Now available: version +TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... +TTrackBar.Popup.MenuItem.Ignore=Ignore +XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Calibration Tape +CircleFootprint.Circle=circle +CircleFootprint.FilledCircle=filled circle +CircleFootprint.Dialog.Title=Circle Footprint +CircleFootprint.Dialog.Label.Radius=Radius +CircleFootprint.Dialog.Checkbox.Bold=Bold +CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot +LineProfile.Hint.Marking=drag mouse to mark the line profile +PageTView.Button.Page=Page +PageTView.MenuItem.ClosePage=Close Page +PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step +PrefsDialog.Dialog.NewVersion.Title=Upgrades +PrefsDialog.Dialog.NewVersion.Message1=Version +PrefsDialog.Dialog.NewVersion.Message2=is now available at +PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. +RGBRegion.Hint.Marking=click mouse to mark the center of the region +TMenuBar.MenuItem.Restore=Restore Views +TrackControl.StretchVectors.None=No stretch +TViewChooser.Maximize.Tooltip=Maximize this view +TViewChooser.Restore.Tooltip=Restore views +Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step +WorldTView.Button.World=World + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Warnings +PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PropertiesDialog.Title=Properties +PropertiesDialog.Label.Author=Author +PropertiesDialog.Label.Contact=Contact +TActions.Action.Properties=Properties... +TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.ClickToCancel=(click to cancel) +TFrame.Dialog.StalledVideo.Title=Error Loading Video +TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. +TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. +TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: +TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. +TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. +TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stop +TFrame.Dialog.StalledVideo.Button.Wait=Wait +Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again +TrackerIO.ZipFileFilter.Description=ZIP files +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found +TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinematic Particle +DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) +DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) +DynamicSystem.Builder.Title=Dynamic System (Internal) +PropertiesDialog.Button.CopyFilePath=Copy File Path +PropertiesDialog.Button.CopyVideoPath=Copy Video Path +PropertiesDialog.Tab.TrackerFile=Tracker File +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Property +PropertiesDialog.Header.Value=Value +TActions.Action.OpenURL=Open URL... +TActions.Dialog.OpenURL.Title=Open URL +TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file +TActions.Dialog.AboutVideo.Name=Name + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cached Web Files +PrefsDialog.Button.ClearCache=Clear + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-click to re-mark highlighted position +PointMass.Remarking.Hint=click mouse to re-mark position +PointMass.PositionSelected.Hint=drag or enter position on toolbar +PointMass.VectorSelected.Hint=drag to move +Vector.Remark.Hint=shift-click to re-mark highlighted tip +Vector.TipSelected.Hint=drag or enter components on toolbar +Vector.HandleSelected.Hint=drag to move +Vector.Remarking.Hint=click mouse to re-mark tip +AutoTracker.Label.Search=Search +AutoTracker.Label.Target=Target +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Point +AutoTracker.Label.Template=Template +AutoTracker.Label.Track=Track +AutoTracker.Label.Match=Match +AutoTracker.Label.NoTemplate=No Template +AutoTracker.Label.EvolutionRate=Evolution Rate +AutoTracker.Label.Automark=Automark +AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. +AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. +AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. +AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. +AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. +AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. +AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. +AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. +AutoTracker.Info.Search=The search area is scanned for the best match. +AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. +AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. +AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. +AutoTracker.Info.Target=The target is where the targeted track point is marked. +AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. +AutoTracker.Info.Title.Settings=Settings +AutoTracker.Info.Title.Tip=Tip +AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. +AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: +AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame +AutoTracker.Info.Replace=--accept the match and replace the existing point +AutoTracker.Info.Keep=--keep the existing point +AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Wizard.Button.Replace=Replace +AutoTracker.Wizard.Button.Keep=Keep +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.SearchThis=Search This +AutoTracker.Wizard.Button.SearchNext=Search Next +AutoTracker.Wizard.Button.Delete=Delete +AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Wizard.Menuitem.DeleteThis=This Point +AutoTracker.Wizard.Menuitem.DeleteLater=Later Points +AutoTracker.Wizard.Menuitem.DeleteAll=All Points +TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker +MainTView.Popup.MenuItem.ZoomIn=Zoom In +MainTView.Popup.MenuItem.ZoomOut=Zoom Out +MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit +TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration +TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than +TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from +TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. +TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: +TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=No resource could be loaded for node + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift-click to mark +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Directories +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Clear on exit +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=Save +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=Algorithms... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: +AlgorithmDialog.Title=Algorithms +AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. +AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. +AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: +TMenuBar.Menu.Diagnostics=Diagnostics + + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=The file cannot be read. +TrackPlottingPanel.Popup.Menu.CompareWith=Compare With +TrackerPanel.DataBuilder.TrackType.Unknown=unknown +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=Load Data Functions +TrackerPanel.DataBuilder.Load.Message=Select functions to load: +TrackerPanel.DataBuilder.Save.Title=Save Data Functions +TrackerPanel.DataBuilder.Save.Message=Select functions to save: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into +TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection +TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type +TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. +TToolbar.Button.Refresh=Refresh data and views + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as +ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportTRKDialog.Complete.Title=Export Complete +ExportTRKDialog.Title=Export ZIP Resource +ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. +ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. +TMenuBar.MenuItem.TabClip=ZIP Resource +TMenuBar.Menu.CalibrationTools=Calibration Tools +TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=end +TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Attach Ends +AttachmentInspector.Label.End=End +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Name +AttachmentInspector.Header.AttachedTo=Attach To +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Attach Ends... +PerspectiveTrack.Corner=corner +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=time +Protractor.Data.Description.1=protractor angle +Protractor.Data.Description.2=length of arm 1 +Protractor.Data.Description.3=length of arm 2 +Protractor.Data.Description.4=step number +Protractor.Data.Description.5=frame number +TapeMeasure.Data.Description.0=time +TapeMeasure.Data.Description.1=length +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=step number +TapeMeasure.Data.Description.4=frame number + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export ZIP Resource +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export ZIP Resource +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource +ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties index 5488eb0a..55abf894 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties @@ -1,1177 +1,1177 @@ -# This is the Simplified Chinese tracker.properties file -# Translated by Xiaobin Ding, Nov 2011 -Calibration.Name=\u5b9a\u6807\u70b9 -Calibration.New.Name=\u5b9a\u6807\u70b9 -CenterOfMass.Name=\u8d28\u5fc3 -CenterOfMass.New.Name=\u5398\u7c73 -CenterOfMass.MenuItem.Inspector=\u9009\u62e9\u8d28\u70b9... -CenterOfMassInspector.Title=\u8d28\u5fc3 -CenterOfMassInspector.Border.Title=\u9009\u62e9\u8d28\u70b9 -ConfigInspector.Border.Title=Desired Features -ConfigInspector.Title=\u504f\u597d\u8bbe\u5b9a -ConfigInspector.Button.SaveAsDefault=\u4fdd\u5b58\u4e3a\u9ed8\u8ba4 -CoordAxes.Name=\u8f74 -CoordAxes.New.Name=\u8f74 -Dialog.Button.Cancel=\u53d6\u6d88 -Dialog.Button.OK=\u786e\u8ba4 -Dialog.Button.Close=\u5173\u95ed -Dialog.Button.All=\u6240\u6709 -Dialog.Button.None=\u65e0 -Dialog.Button.Copy=\u590d\u5236 -Dialog.Button.Update=\u66f4\u65b0 -Dialog.Button.SelectAll=\u9009\u62e9\u6240\u6709 -Footprint.Diamond=\u83f1\u5f62 -Footprint.BoldDiamond=\u7c97\u83f1\u5f62 -Footprint.SolidDiamond=\u5b9e\u5fc3\u83f1\u5f62 -Footprint.Triangle=\u4e09\u89d2\u5f62 -Footprint.BoldTriangle=\u7c97\u4e09\u89d2\u5f62 -Footprint.SolidTriangle=\u5b9e\u5fc3\u4e09\u89d2\u5f62 -Footprint.Circle=\u5706\u5f62 -Footprint.BoldCircle=\u7c97\u5706\u5f62 -Footprint.SolidCircle=\u5b9e\u5fc3\u5706\u5f62 -Footprint.VerticalLine=\u7ad6\u7ebf -Footprint.BoldVerticalLine=\u7c97\u7ad6\u7ebf -Footprint.HorizontalLine=\u6c34\u5e73\u7ebf -Footprint.BoldHorizontalLine=\u7c97\u6c34\u5e73\u7ebf -Footprint.Crosshair=\u4ea4\u53c9\u7ebf -Footprint.BoldCrosshair=\u7c97\u4ea4\u53c9\u7ebf -Footprint.SimpleAxes=\u8f74\u7ebf -Footprint.BoldSimpleAxes=\u7c97\u8f74\u7ebf -Footprint.Spot=\u70b9 -Footprint.Line=\u7ebf -Footprint.BoldLine=\u7c97\u7ebf -Footprint.Outline=\u8f6e\u5ed3\u7ebf -Footprint.BoldOutline=\u7c97\u8f6e\u5ed3\u7ebf -Footprint.Arrow=\u7bad\u5934 -Footprint.BoldArrow=\u7c97\u7bad\u5934 -Footprint.DoubleArrow=\u53cc\u5411\u7bad\u5934 -Footprint.BoldDoubleArrow=\u7c97\u53cc\u5411\u7bad\u5934 -Footprint.2xArrow=2x arrow -Footprint.Bold2xArrow=bold 2x arrow -Footprint.4xArrow=4x arrow -Footprint.Bold4xArrow=bold 4x arrow -Footprint.DashArrow=\u865a\u7ebf\u7bad\u5934 -Footprint.BoldDashArrow=\u7c97\u865a\u7ebf\u7bad\u5934 -Footprint.BigArrow=\u5927\u7bad\u5934 -Footprint.BigDashArrow=\u5927\u865a\u7ebf\u7bad\u5934 -LineProfile.Name=\u7ebf\u578b -LineProfile.New.Name=\u7ebf\u578b -LineProfile.Data.Brightness=\u4eae\u5ea6 -LineProfile.Data.Pixel=\u50cf\u7d20 -LineProfile.Data.Red=\u7ea2 -LineProfile.Data.Green=\u7eff -LineProfile.Data.Blue=\u84dd -LineProfile.Data.Weighting=count -MainTView.Popup.MenuItem.QTPlayer=QuickTime \u64ad\u653e\u5668 -MainTView.Popup.MenuItem.Zoom=\u7f29\u653e -MainTView.Popup.MenuItem.ToFit=\u81ea\u9002\u5e94 -OffsetOrigin.Name=\u539f\u70b9\u504f\u79fb -OffsetOrigin.New.Name=\u539f\u70b9\u504f\u79fb -PlotTrackView.Button.PlotCount=\u753b\u56fe -PlotTrackView.Button.PlotCount.ToolTip=\u8bbe\u7f6e\u753b\u56fe\u6570\u76ee -PointMass.Name=\u8d28\u70b9 -PointMass.New.Name=\u8d28\u91cf -PointMass.MenuItem.VectorsToPosition=\u4f4d\u7f6e\u77e2\u91cf -PointMass.MenuItem.Velocity=\u901f\u5ea6 -PointMass.MenuItem.Acceleration=\u52a0\u901f\u5ea6 -Star.Name=\u661f\u5f62 -Star.New.Name=\u661f\u5f62 -TableTrackView.Action.CopyData=\u590d\u5236\u6570\u636e -TableTrackView.Button.SelectTableData=\u8868\u683c -TableTrackView.Button.SelectTableData.ToolTip=\u9009\u62e9\u8868\u683c\u5217 -TableTrackView.Popup.MenuItem.Analyze=\u5206\u6790... -TableTrackView.Dialog.Border.Title=\u53ef\u89c1: -TActions.Action.Description=\u5907\u6ce8 -TActions.Action.ClearTracks=\u6e05\u9664\u6240\u6709 -TActions.Action.NewTab=\u65b0\u5efa\u6807\u7b7e\u9875 -TActions.Action.Copy=\u590d\u5236 -TActions.Action.Paste=\u7c98\u8d34 -TActions.Action.Open=\u6253\u5f00... -TActions.Action.Close=\u5173\u95ed\u6807\u7b7e -TActions.Action.Import=\u5bfc\u5165... -TActions.Action.Save=\u5b58\u50a8\u6807\u7b7e -TActions.Action.SaveAs=\u6807\u7b7e\u53e6\u5b58\u4e3a... -TActions.Action.Export=\u5bfc\u51fa... -TActions.Action.CaptureVideo=\u6355\u83b7\u89c6\u9891... -TActions.Action.Delete=\u5220\u9664 -TActions.Action.Config=\u504f\u597d\u8bbe\u7f6e... -TActions.Action.AxesVisible=\u663e\u793a -TActions.Action.TapeVisible=\u663e\u793a -TActions.Action.Print=\u6253\u5370... -TActions.Action.ClearFilters=\u6e05\u9664 -TActions.Action.ImportVideo=\u5bfc\u5165... -TActions.Action.CloseVideo=\u5173\u95ed -TActions.Action.CloseAll=\u5173\u95ed\u6240\u6709\u6807\u7b7e -TActions.Action.Exit=\u9000\u51fa -TActions.Dialog.PrintError.Message=\u6253\u5370\u9519\u8bef -TActions.Dialog.PrintError.Title=\u6253\u5370\u9519\u8bef -TActions.Dialog.Description.Title=\u8bf4\u660e: -TActions.Dialog.DeleteLockedTracks.Message=\u90e8\u5206\u8f68\u8ff9\u5df2\u88ab\u9501\u5b9a\uff0c\u662f\u5426\u7ee7\u7eed\u5220\u9664? -TActions.Dialog.DeleteLockedTracks.Title=\u5220\u9664\u9501\u5b9a\u8f68\u8ff9? -TActions.Dialog.NewPointMass.Title=\u65b0\u8d28\u70b9 -TapeMeasure.Name=\u6d4b\u91cf\u5c3a -TapeMeasure.New.Name=\u5c3a\u5b50 -TapeMeasure.MenuItem.Fixed=\u56fa\u5b9a\u70b9 -TFrame.View.Plot=\u56fe\u5f62\u89c6\u56fe -TFrame.View.Table=\u8868\u683c\u89c6\u56fe -TFrame.View.World=\u5168\u90e8\u89c6\u56fe -TFrame.View.Video=\u89c6\u9891\u89c6\u56fe -TFrame.Dialog.Help.Title=Tracker\u5e2e\u52a9 -TMenuBar.Menu.File=\u6587\u4ef6 -TMenuBar.Menu.Edit=\u7f16\u8f91 -TMenuBar.Menu.Video=\u89c6\u9891 -TMenuBar.Menu.Tracks=\u8f68\u8ff9 -TMenuBar.Menu.Coords=\u5ea7\u6807\u7cfb -TMenuBar.Menu.Window=\u7a97\u53e3 -TMenuBar.Menu.Help=\u5e2e\u52a9 -TMenuBar.MenuItem.EditProperties=\u5c5e\u6027... -TMenuBar.MenuItem.VideoVisible=\u663e\u793a -TMenuBar.MenuItem.VideoFilters=\u6ee4\u955c -TMenuBar.MenuItem.NewVideoFilter=\u6dfb\u52a0 -TMenuBar.MenuItem.NewTrack=\u65b0\u5efa -TMenuBar.MenuItem.CoordsLocked=\u9501\u5b9a -TMenuBar.MenuItem.CoordsFixedOrigin=\u56fd\u5b9a\u539f\u70b9 -TMenuBar.MenuItem.CoordsFixedAngle=\u56fa\u5b9a\u89d2\u5ea6 -TMenuBar.MenuItem.CoordsFixedScale=\u56fa\u5b9a\u6bd4\u4f8b -TMenuBar.MenuItem.CoordsRefFrame=\u53c2\u8003\u7cfb -TMenuBar.MenuItem.CoordsDefault=\u9ed8\u8ba4 -TMenuBar.MenuItem.WindowRight=\u53f3\u8fb9\u680f -TMenuBar.MenuItem.WindowBottom=\u4e0b\u8fb9\u680f -TMenuBar.MenuItem.PlayAllSteps=\u64ad\u653e\u6240\u6709\u6b65\u9aa4 -TMenuBar.MenuItem.Record=\u5f55\u5236 -TMenuBar.MenuItem.MatSize=\u533a\u57df\u5927\u5c0f -TMenuBar.MenuItem.Language=\u8bed\u8a00 -TMenuBar.MenuItem.DeleteTrack=\u5220\u9664 -TMenuBar.MenuItem.TrackerHelp=Tracker \u5e2e\u52a9... -TMenuBar.MenuItem.MessageLog=\u4fe1\u606f\u65e5\u5fd7... -TrackControl.Name=\u8f68\u8ff9\u63a7\u5236 -TrackControl.Button.NewTrack=\u521b\u5efa -TrackControl.Button.NewTrack.ToolTip=\u521b\u5efa\u4e00\u4e2a\u65b0\u8f68\u8ff9 -TrackControl.Button.Trails.ToolTip=\u8bbe\u5b9a\u8f68\u8ff9\u957f\u5ea6 -TrackControl.Button.Labels.ToolTip=\u663e\u793a/\u9690\u85cf\u7f16\u53f7 -TrackControl.Button.StretchVectors.ToolTip=\u62c9\u957f\u77e2\u91cf -TrackControl.Button.Accelerations.ToolTip=\u663e\u793a/\u9690\u85cf\u52a0\u901f\u5ea6\u77e2\u91cf -TrackControl.Button.Xmass.ToolTip=\u8d28\u91cf\u4e58\u4ee5\u77e2\u91cf -TrackControl.Button.Vectors.ToolTip=\u77e2\u91cf -TrackControl.Button.Velocities.ToolTip=\u663e\u793a/\u9690\u85cf\u901f\u5ea6\u77e2\u91cf -TrackControl.Button.Properties.ToolTip=\u70b9\u51fb\u5e76\u9009\u62e9 -TrackControl.Button.Positions.ToolTip=\u663e\u793a/\u9690\u85cf\u4f4d\u7f6e -Tracker.Popup.MenuItem.Snapshot=\u5feb\u7167... -Tracker.Popup.MenuItem.Help=\u5e2e\u52a9... -Tracker.Cursor.Crosshair.Description=\u5341\u5b57\u7ebf\u9f20\u6807 -Tracker.Action.AboutTracker=\u5173\u4e8eTracker... -Tracker.Dialog.AboutTracker.Title=\u5173\u4e8eTracker -Tracker.Action.AboutJava=\u5173\u4e8eJava... -Tracker.Dialog.AboutJava.Title=\u5173\u4e8eJava -Tracker.Dialog.AboutJava.UnknownVersion=\u672a\u77e5 -Tracker.Dialog.AboutJava.Message=Java\u7248\u672c -Tracker.Action.AboutQT=\u5173\u4e8eQuickTime... -Tracker.Dialog.AboutQT.Title=\u5173\u4e8eQuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime\u7248\u672c -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava\u7248\u672c -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava\u8def\u5f84: -Tracker.Dialog.NoQT.Title=QTJava.zip \u672a\u627e\u5230 -Tracker.Dialog.NoQT.Message1=QuickTime for Java\u5c1a\u672a\u5b89\u88c5. -Tracker.Dialog.NoQT.Message2=\u5982\u679c\u60a8\u8981\u5206\u6790QuickTime\u89c6\u9891\uff0c\u8bf7\u91cd\u65b0\u5b89\u88c5QuickTime. -Tracker.Dialog.NoQT.Message3=\u6ce8\u610f:\u5728\u60a8\u5b89\u88c5Quicktime\u65f6\uff0c\u8bf7\u9009\u62e9QuickTime for Java. -Tracker.Dialog.UpdateQT.Title=\u66f4\u65b0QTJava.zip -Tracker.Dialog.UpdateQT.Message1=\u53d1\u73b0\u65b0\u7248QTJava.zip -Tracker.Dialog.UpdateQT.Message2=\u662f\u5426\u8981\u66f4\u65b0\u73b0\u6709\u7684\u6587\u4ef6? -Tracker.Dialog.CopyQT.Title=\u590d\u5236QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime\u5df2\u7ecf\u5b89\u88c5,\u4f46\u5728Tracker\u80fd\u4f7f\u7528\u4e4b\u524d: -Tracker.Dialog.CopyQT.Message2= 1. \u5fc5\u987b\u5c06QTJava.zip\u4ece -Tracker.Dialog.CopyQT.Message3= \u590d\u5236\u5230 -Tracker.Dialog.CopyQT.Message4= 2. \u5fc5\u987b\u91cd\u542fTracker. -Tracker.Dialog.CopyQT.Message5=\u73b0\u5728\u5c31\u8981\u590d\u5236QTJava.zip\u5417? -Tracker.Dialog.CopyFailed.Title=\u590d\u5236\u5931\u8d25 -Tracker.Dialog.CopyFailed.Message=\u4e0d\u80fd\u590d\u5236QTJava.zip. -Tracker.Dialog.CopiedTo.Title=\u590d\u5236\u6210\u529f -Tracker.Dialog.CopiedTo.Message1=QTJava.zip\u88ab\u6210\u529f\u7684\u590d\u5236\u5230 -Tracker.Dialog.CopiedTo.Message2=\u5fc5\u987b\u91cd\u542fTracker, \u73b0\u5728\u5c06\u8981\u9000\u51fa\u7a0b\u5e8f. -Tracker.Splash.Loading=\u8f7d\u5165 -TrackerIO.Dialog.Import.Title=\u5bfc\u5165Tracker\u6587\u4ef6 -TrackerIO.Dialog.Import.Message=\u5bfc\u51fa\u9009\u5b9a\u9879\u76ee -TrackerIO.Dialog.ImportVideo.Title=\u5bfc\u5165\u89c6\u9891 -TrackerIO.Dialog.Export.Title=\u5bfc\u51fa -TrackerIO.Dialog.Export.Message=\u5bfc\u51fa\u9009\u5b9a\u9879\u76ee -TrackerIO.Dialog.ReplaceFile.Title=\u662f\u5426\u66ff\u6362\u73b0\u5b58\u6587\u4ef6? -TrackerIO.Dialog.ReplaceFile.Message=\u6587\u4ef6\u5df2\u7ecf\u5b58\u5728. \u662f\u5426\u66ff\u6362? -TrackerIO.Dialog.NotTrackerXML.Title=XML\u4e0d\u5339\u914d -TrackerIO.Dialog.NotTrackerXML.Message=\u5305\u542b\u6765\u81ea\u4e8e\u4e0d\u540c\u5e94\u7528\u7684xml\u6570\u636e. -TrackerIO.Dialog.BadVideo.Message=\u65e0\u6cd5\u8bc6\u522b\u7684\u89c6\u9891\u7c7b\u578b: -TrackerIO.Dialog.BadVideo.Title=\u65e0\u6cd5\u8bc6\u522b\u89c6\u9891 -TrackerPanel.NewTab.Name=\u65e0\u6807\u9898 -TrackerPanel.DragToMark.Hint=\u6309\u4f4fShift\u952e\u5e76\u62d6\u52a8\u6807\u8bb0 -TrackerPanel.ClickToMark.Hint=\u6309\u4f4fShift\u952e\u5e76\u70b9\u51fb\u9f20\u6807\u5de6\u952e\u6807\u8bb0 -TrackerPanel.Dialog.LoadFailed.Title=Tracker\u6587\u4ef6\u8f7d\u5165\u5931\u8d25 -TrackerPanel.Dialog.LoadFailed.Message=Tracker\u6587\u4ef6\u683c\u5f0f\u9519\u8bef: -TrackerPanel.Dialog.SaveChanges.Title=\u4fdd\u5b58\u4fee\u6539 -TrackerPanel.Dialog.SaveChanges.Message=\u4fee\u6539\u4fdd\u5b58\u4e3a -TrackPlottingPanel.Popup.MenuItem.Lines=\u76f4\u7ebf -TrackPlottingPanel.Popup.MenuItem.Points=\u70b9 -TrackPlottingPanel.Popup.MenuItem.Scale=\u7f29\u653e... -TrackPlottingPanel.Popup.MenuItem.Print=\u6253\u5370... -TrackPlottingPanel.Popup.MenuItem.Measure=\u81ea\u52a8\u7f29\u653e -TrackPlottingPanel.Popup.MenuItem.Analyze=\u5206\u6790... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u7f29\u5c0f -TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u653e\u5927 -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u81ea\u52a8\u7f29\u653e -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u7f29\u653e\u81f3\u5408\u9002\u6bd4\u4f8b -TrackPlottingPanelInspector.Title=\u7f29\u653e -TrackPlottingPanelInspector.Label.Min=\u6700\u5c0f\u503c -TrackPlottingPanelInspector.Label.Max=\u6700\u5927\u503c -TrackPlottingPanelInspector.Label.Auto=\u81ea\u52a8 -TToolBar.Button.Footprint.Tooltip=\u8bbe\u7f6e\u8f68\u8ff9 -TToolBar.Dropdown.SelectedTrack.Tooltip=\u9009\u53d6\u8f68\u8ff9 -TToolBar.Dropdown.SelectedTrack.None=\u672a\u9009\u62e9\u8f68\u8ff9 -TTrack.MenuItem.Delete=\u5220\u9664 -TTrack.MenuItem.Color=\u989c\u8272... -TTrack.Dialog.Color.Title=\u9009\u62e9\u8f68\u8ff9\u989c\u8272 -TTrack.MenuItem.Name=\u547d\u540d... -TTrack.MenuItem.Footprint=\u8f68\u8ff9 -TTrack.MenuItem.Description=\u5907\u6ce8... -TTrack.MenuItem.Visible=\u53ef\u89c1 -TTrack.MenuItem.TrailVisible=\u8f68\u8ff9\u53ef\u89c1 -TTrack.MenuItem.Autostep=\u81ea\u52a8\u8865\u507f -TTrack.MenuItem.MarkByDefault=\u6807\u8bb0\u4e3a\u9ed8\u8ba4 -TTrack.MenuItem.Locked=\u9501\u5b9a -TTrack.MenuItem.Delete=\u5220\u9664 -TTrack.Name.None=\u672a\u547d\u540d -TTrack.Dialog.Description.Title=\u8bf4\u660e: -TTrack.Dialog.Name.Title=\u8bbe\u7f6e\u540d\u79f0 -TTrack.Dialog.Name.Label=\u540d\u79f0: -TViewChooser.Button.Choose.Tooltip=\u9009\u62e9\u89c6\u56fe -Vector.Name=\u77e2\u91cf -Vector.New.Name=\u77e2\u91cf -Vector.MenuItem.ToOrigin=\u5230\u539f\u70b9 -Vector.MenuItem.Label=\u663e\u793a\u6807\u7b7e -VectorSum.Name=\u77e2\u91cf\u548c -VectorSum.New.Name=\u6c42\u548c -VectorSum.MenuItem.Inspector=\u9009\u62e9\u77e2\u91cf... -VectorSumInspector.Title=\u77e2\u91cf\u548c -VectorSumInspector.Border.Title=\u9009\u62e9\u77e2\u91cf -WorldTView.Popup.MenuItem.Projectile=\u629b\u7269\u8fd0\u52a8\u6a21\u578b - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=\u7c92\u5b50\u8fd0\u52a8\u5b66\u6a21\u578b -AnalyticParticle.Inspector.Title=\u7c92\u5b50\u8fd0\u52a8\u5b66\u6a21\u578b -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=\u534a\u5f84 4 -CircleFootprint.Circle_6=\u534a\u5f84 6 -CircleFootprint.Circle_8=\u534a\u5f84 8 -DynamicParticle.Name=\u7c92\u5b50\u52a8\u529b\u5b66\u6a21\u578b(\u7b1b\u5361\u5c14\u5ea7\u6807\u7cfb) -DynamicParticle.Inspector.Title=\u7c92\u5b50\u52a8\u529b\u5b66\u6a21\u578b -DynamicParticle.Property.ForceX=x\u65b9\u5411\u5206\u529b -DynamicParticle.Property.ForceY=y\u65b9\u5411\u5206\u529b -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=\u56fa\u5b9a\u4f4d\u7f6e -ParticleModel.New.Name=\u6a21\u578b -ParticleModel.MenuItem.InspectModel=\u6a21\u578b\u521b\u5efa\u5de5\u5177... -ParticleModel.Inspector.Button.Undo=\u64a4\u9500 -ParticleModel.Inspector.Button.Redo=\u6062\u590d\u64a4\u9500 -ParticleModel.Inspector.Button.Close=\u5173\u95ed -ParticleModel.Inspector.Button.Help=\u5e2e\u52a9 - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=\u4ec5X -Calibration.Axes.YOnly=\u4ec5Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=\u9009\u62e9\u5b9a\u6807\u8f74 -Calibration.Label.Axes=\u8f74 -Calibration.Dialog.InvalidCoordinates.Title=\u4e0d\u6b63\u786e\u7684\u5750\u6807 -Calibration.Dialog.InvalidCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u5177\u6709\u76f8\u540c\u7684\u5ea7\u6807\u503c. -Calibration.Dialog.InvalidXCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u6709\u76f8\u540c\u7684x\u5ea7\u6807\u503c. -Calibration.Dialog.InvalidYCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u6709\u76f8\u540c\u7684y\u5ea7\u6807\u503c. -SpectralLineFilter.Title=\u6c14\u4f53\u5149\u8c31 -SpectralLineFilter.H=\u6c22 H -SpectralLineFilter.He=\u6c26 He -SpectralLineFilter.Ne=\u6c16 Ne -SpectralLineFilter.Hg=\u6c5e Hg -TFrame.View.Unknown=\u67e5\u770b -TMenuBar.MenuItem.Undo=\u64a4\u9500 -TMenuBar.MenuItem.Redo=\u6062\u590d\u64a4\u9500 -TMenuBar.MenuItem.Replace=\u66ff\u6362... -TMenuBar.Menu.AddImage=\u5bfc\u5165\u56fe\u50cf -TMenuBar.MenuItem.AddBefore=\u5728\u6b64\u5e27\u524d... -TMenuBar.MenuItem.AddAfter=\u5728\u6b64\u5e27\u540e... -TMenuBar.MenuItem.RemoveImage=\u5220\u9664\u8be5\u5e27 -TMenuBar.Menu.Tools=\u5de5\u5177 -TMenuBar.MenuItem.DataFunctionTool=\u6570\u503c\u521b\u5efa\u5de5\u5177 -TMenuBar.MenuItem.DatasetTool=\u6570\u503c\u5de5\u5177 -TMenuBar.Menu.CopyImage=\u590d\u5236\u56fe\u50cf -TMenuBar.MenuItem.CopyMainView=\u4e3b\u89c6\u56fe -TMenuBar.MenuItem.CopyFrame=\u5e27 -TMenuBar.MenuItem.PrintFrame=\u6253\u5370... -TrackerIO.Dialog.AddImage.Title=\u5bfc\u5165\u9009\u5b9a\u7684\u4e00\u4e2a\u6216\u591a\u4e2a\u56fe\u50cf -TTrack.Dialog.Name.BadName=\u5df2\u88ab\u4f7f\u7528. \u8bf7\u53e6\u9009\u5176\u4ed6\u540d\u79f0. -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=\u5408\u529b -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=\u7ed8\u56fe\u5f62\u5f0f\u7684\u8f68\u8ff9\u8d44\u6599. -TableTView.Label.NoData=\u8868\u683c\u5f62\u5f0f\u7684\u8f68\u8ff9\u8d44\u6599. -TrackerPanel.Message.NoData0=\u89c6\u9891\u53ca\u8f68\u8ff9\u7684\u4e3b\u8981\u663e\u793a\u533a\u57df. -TrackerPanel.Message.NoData1=\u9009\u62e9 \u6587\u4ef6|\u6253\u5f00 \u6216 \u8f68\u8ff9|\u65b0\u5efa \u5f00\u59cb. -WorldTView.Label.NoData=\u5750\u6807\u53ca\u8f68\u8ff9\u7684\u4e3b\u8981\u663e\u793a\u533a\u57df. - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=\u8fd4\u7a0b\u6c42\u89e3\u65b9\u6cd5: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=\u81ea\u9002\u5e94\u591a\u6b65\u957f\u65b9\u6cd5 -DynamicParticle.Table.Force.Border.Title=\u529b\u51fd\u6570 (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=\u4f4d\u7f6e\u51fd\u6570 (t) -ParticleModel.Table.Initial.Border.Title=\u521d\u503c -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=\u7c98\u8d34\u56fe\u50cf -TMenuBar.MenuItem.PasteAfter=\u5728\u6b64\u5e27\u540e -TMenuBar.MenuItem.PasteBefore=\u5728\u6b64\u5e27\u524d -TMenuBar.MenuItem.PasteReplace=\u66ff\u6362\u89c6\u9891 - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=\u5f00\u59cb... -Tracker.Splash.HelpMessage=\u65b0\u7528\u6237\u8bf7\u70b9\u51fb - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=\u4e0e\u6c34\u5e73\u65b9\u5411\u5939\u89d2 -LineProfile.Checkbox.Rotates=\u65cb\u8f6c -LineProfile.Label.Spread=\u5e73\u94fa -RGBRegion.Name=RGB\u533a\u57df -RGBRegion.New.Name=\u533a\u57df -RGBRegion.MenuItem.Fixed=\u56fa\u5b9a\u70b9 -RGBRegion.Label.Radius=\u50cf\u7d20\u534a\u5f84 -TTrack.Label.Step=\u6b65\u9aa4 - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=\u4f4d\u7f6e\u9700\u8981 -LineProfile.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf -LineProfile.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf -LineProfile.Data.Description.3=\u7ea2 -LineProfile.Data.Description.4=\u7eff -LineProfile.Data.Description.5=\u84dd -LineProfile.Data.Description.6=\u89c6\u89c9\u4eae\u5ea6 -LineProfile.Data.Description.7=\u7ebf\u5bbd -ParticleModel.MenuItem.TraceVisible=\u663e\u793a\u8f68\u8ff9 -ParticleModel.MenuItem.StepsVisible=\u663e\u793a\u6b65\u9aa4 -PointMass.Data.Description.0=\u65f6\u95f4 -PointMass.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf -PointMass.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf -PointMass.Data.Description.3=\u4f4d\u7f6e\u5927\u5c0f -PointMass.Data.Description.4=\u4f4d\u7f6e\u89d2\u5ea6 -PointMass.Data.Description.5=\u901f\u5ea6x\u5206\u91cf -PointMass.Data.Description.6=\u901f\u5ea6y\u5206\u91cf -PointMass.Data.Description.7=\u901f\u5ea6\u5927\u5c0f -PointMass.Data.Description.8=\u901f\u5ea6\u89d2\u5ea6 -PointMass.Data.Description.9=\u52a0\u901f\u5ea6x\u5206\u91cf -PointMass.Data.Description.10=\u52a0\u901f\u5ea6y\u5206\u91cf -PointMass.Data.Description.11=\u52a0\u901f\u5ea6\u5927\u5c0f -PointMass.Data.Description.12=\u52a0\u901f\u5ea6\u89d2\u5ea6 -PointMass.Data.Description.13=\u65cb\u8f6c\u89d2\u5ea6 -PointMass.Data.Description.14=\u89d2\u901f\u5ea6 -PointMass.Data.Description.15=\u89d2\u52a0\u901f\u5ea6 -PointMass.Data.Description.16=\u6b65\u9aa4\u5e8f\u53f7 -PointMass.Data.Description.17=\u5e27\u5e8f\u53f7 -PointMass.Data.Description.18=\u52a8\u91cfx\u5206\u91cf -PointMass.Data.Description.19=\u52a8\u91cfy\u5206\u91cf -PointMass.Data.Description.20=\u52a8\u91cf\u5927\u5c0f -PointMass.Data.Description.21=\u52a8\u91cf\u89d2\u5ea6 -PointMass.Data.Description.22=\u52a8\u80fd -RGBRegion.Data.Description.0=\u65f6\u95f4 -RGBRegion.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf -RGBRegion.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf -RGBRegion.Data.Description.3=\u7ea2 -RGBRegion.Data.Description.4=\u7eff -RGBRegion.Data.Description.5=\u84dd -RGBRegion.Data.Description.6=\u89c6\u89c9\u4eae\u5ea6 -RGBRegion.Data.Description.7=\u50cf\u7d20\u5e8f\u53f7 -RGBRegion.Data.Description.8=\u6b65\u9aa4\u5e8f\u53f7 -RGBRegion.Data.Description.9=\u5e27\u5e8f\u53f7 -TView.Menuitem.Define=\u5b9a\u4e49... -Vector.Data.Description.0=\u65f6\u95f4 -Vector.Data.Description.1=x\u65b9\u5411 -Vector.Data.Description.2=y\u65b9\u5411 -Vector.Data.Description.3=\u5927\u5c0f -Vector.Data.Description.4=\u89d2\u5ea6 -Vector.Data.Description.5=\u8f68\u8ff9\u5c3e\u90e8\u4f4d\u7f6ex\u5206\u91cf -Vector.Data.Description.6=\u8f68\u8ff9\u5c3e\u90e8\u4f4d\u7f6ey\u5206\u91cf -Vector.Data.Description.7=\u6b65\u9aa4\u5e8f\u53f7 -Vector.Data.Description.8=\u5e27\u5e8f\u53f7 - -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=\u7c92\u5b50\u7684\u8d28\u91cf -ParticleModel.Parameter.InitialTime.Description=\u521d\u59cb\u65f6\u523b -AnalyticParticle.PositionFunction.X.Description=\u4f4d\u7f6ex\u5206\u91cf -AnalyticParticle.PositionFunction.Y.Description=\u4f4d\u7f6ey\u5206\u91cf -DynamicParticle.ForceFunction.X.Description=\u529bx\u5206\u91cf -DynamicParticle.ForceFunction.Y.Description=\u529by\u5206\u91cf -DynamicParticle.Parameter.InitialX.Description=\u521d\u59cb\u4f4d\u7f6ex\u5206\u91cf -DynamicParticle.Parameter.InitialY.Description=\u521d\u59cb\u4f4d\u7f6ey\u5206\u91cf -DynamicParticle.Parameter.InitialVelocityX.Description=\u521d\u59cb\u901f\u5ea6x\u5206\u91cf -DynamicParticle.Parameter.InitialVelocityY.Description=\u521d\u59cb\u901f\u5ea6y\u5206\u91cf -TrackerPanel.ModelBuilder.Title=\u6a21\u578b\u6784\u5efa\u5de5\u5177 -TrackerPanel.DataBuilder.Title=\u6570\u636e\u6784\u5efa\u5de5\u5177 -TrackControl.TrailMenu.NoTrail=\u65e0\u8f68\u8ff9 -TrackControl.TrailMenu.ShortTrail=\u77ed\u8f68\u8ff9 -TrackControl.TrailMenu.LongTrail=\u5e38\u8f68\u8ff9 -TrackControl.TrailMenu.FullTrail=\u5b8c\u6574\u8f68\u8ff9 -TrackerPanel.ModelBuilder.Spinner.Tooltip=\u5f53\u524d\u9009\u5b9a\u8f68\u8ff9 -TrackerPanel.ModelBuilder.LineButton.Text=\u7ebf\u578b\u6837\u5f0f -TrackerPanel.ModelBuilder.LineButton.Tooltip=\u8bbe\u7f6e\u7ebf\u578b\u6837\u5f0f -ParticleModel.LineStyle.None=\u65e0\u76f4\u7ebf -ParticleModel.LineStyle.Connect=\u8fde\u63a5\u6b65\u9aa4 -ParticleModel.LineStyle.Smooth=\u5e73\u6ed1\u7ebf -ModelFunctionPanel.Label=\u6a21\u578b -AnalyticFunctionPanel.FunctionEditor.Border.Title=\u4f4d\u7f6e\u51fd\u6570 -DynamicFunctionPanel.FunctionEditor.Border.Title=\u529b\u51fd\u6570 - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=\u663e\u793a\u8868\u683c\u5217 -Tracker.About.ProjectOf=\u9879\u76ee\u4e3b\u6301\u4eba: -Tracker.About.TranslationBy=\u7ffb\u8bd1\u8005 -Tracker.About.Translator=Ding Xiaobin -TMenuBar.Menu.SaveVideoAs=\u89c6\u9891\u53e6\u5b58\u4e3a -TActions.SaveClipAs.ProgressMonitor.Message=\u89c6\u9891\u53e6\u5b58\u4e3a -TActions.SaveClipAs.ProgressMonitor.Progress=\u5b8c\u6210 - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=\u540c\u6b65 -PlotTrackView.Checkbox.Synchronize.Tooltip=\u7eb5\u5750\u6807\u540c\u6b65 -RGBRegion.MenuItem.FixedRadius=\u56fa\u5b9a\u534a\u5f84 -Tracker.VideoZoom.Hint=\u5355\u51fb\u9f20\u6807\u4ee5\u653e\u5927\u6216\u7f29\u5c0f\u67e5\u770b\uff0c\u53cc\u51fb\u5219\u81ea\u52a8\u7f29\u653e\u5230\u5408\u9002\u7684\u5927\u5c0f\u67e5\u770b -Tracker.PlotZoomIn.Hint=\u62d6\u52a8\u9f20\u6807\u7f29\u5c0f, \u53cc\u51fb\u5219\u81ea\u52a8\u7f29\u653e\u5230\u5408\u9002\u7684\u5927\u5c0f\u67e5\u770b -Tracker.PlotZoomOut.Hint=\u5355\u51fb\u9f20\u6807\u653e\u5927 -Tracker.MenuItem.Hints=\u663e\u793a\u63d0\u793a -TapeMeasure.Label.Length=\u957f\u5ea6 -TapeMeasure.Label.TapeAngle=\u4e0ex\u8f74\u4e4b\u95f4\u5939\u89d2 -TapeMeasure.Label.ArcAngle=\u91cf\u89d2\u5668\u89d2\u5ea6 -TrackerIO.Dialog.NotAnImage.Title=\u4e0d\u6b63\u786e\u7684\u6587\u4ef6\u7c7b\u578b. -TrackerIO.Dialog.NotAnImage.Message1=\u4e0d\u662fJPG\u6216GIF\u56fe\u50cf. -TrackerIO.Dialog.NotAnImage.Message2=\u662f\u5426\u7ee7\u7eed? -TToolBar.Button.Zoom.Tooltip=\u7f29\u653e\u5de5\u5177(Z) -TrackChooserTView.DropDown.Tooltip=\u9009\u62e9\u8f68\u8ff9 -TapeMeasure.Field.TapeAngle.Tooltip=x\u8f74\u6b63\u5411\u4e0e\u5377\u5c3a\u4e4b\u95f4\u7684\u89d2\u5ea6 -TapeMeasure.Field.Magnitude.Tooltip=\u957f\u5ea6\u5df2\u7ecf\u7528\u5750\u6807\u7cfb\u4e2d\u5355\u4f4d\u8868\u793a -TapeMeasure.Readout.Magnitude.Name=\u957f\u5ea6 -TapeMeasure.Readout.Magnitude.Hint=\u5750\u6807\u5355\u4f4d -TapeMeasure.Readout.Angle.Name=\u89d2\u5ea6\u8bfb\u6570 -TapeMeasure.Readout.Angle.Hint=\u4ece+x\u8f74\u6d4b\u5f97\u7684\u89d2\u5ea6 -TapeMeasure.End.Name=\u7ec8\u70b9 -TapeMeasure.End.Hint=\u62d6\u52a8\u9f20\u6807\u4ee5\u6d4b\u5b9a\u8ddd\u79bb\u548c\u89d2\u5ea6,\u6309\u4f4fShift\u952e\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0 -TapeMeasure.Handle.Name=\u628a\u624b -TapeMeasure.Handle.Hint=\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u62d6\u52a8\u4ee5\u79fb\u52a8\u5bf9\u8c61 -Vector.Tip.Name=\u5c16\u7aef -Vector.Tip.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 -Vector.Handle.Name=\u628a\u624b -Vector.Handle.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 -Vector.ShortHandle.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730,\u6309\u4f4fAlt\u952e\u70b9\u51fb\u9f20\u6807\u9009\u62e9\u5c16\u7aef -PointMass.Position.Name=\u4f4d\u7f6e -PointMass.Position.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 -PointMass.Velocity.Name=\u901f\u5ea6 -PointMass.Acceleration.Name=\u52a0\u901f\u5ea6 -PointMass.Vector.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 -PointMass.Position.Locked.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u4e0d\u80fd\u62d6\u52a8 -CoordAxes.Handle.Name=+x\u8f74 -CoordAxes.Handle.Hint=\u62d6\u52a8\u4ee5\u6539\u53d8\u503e\u659c\u89d2\u5ea6 -CoordAxes.Origin.Name=\u539f\u70b9 -CoordAxes.Origin.Hint=\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 -OffsetOrigin.Position.Name=\u4f4d\u7f6e -OffsetOrigin.Position.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u79fb\u52a8\u539f\u70b9\u7684\u5750\u6807 -Calibration.Point.Name=\u70b9 -Calibration.Point.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u6539\u53d8\u5750\u6807\u8f74\u548c\u6bd4\u4f8b\u5c3a\u7684\u5750\u6807 -RGBRegion.Position.Name=\u4f4d\u7f6e -RGBRegion.Position.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u5750\u6807\u4ee5\u6539\u53d8\u4f4d\u7f6e -LineProfile.End.Name=\u7ec8\u70b9 -LineProfile.End.Hint=\u62d6\u52a8\u4ee5\u8c03\u6574\u7ebf\u957f\u5ea6 -LineProfile.Handle.Name=\u628a\u624b -LineProfile.Handle.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8\u76f4\u7ebf -PointMass.Hint=\u5728\u5de5\u5177\u680f\u4e2d\u8bbe\u7f6e\u8d28\u91cf -PointMass.Unmarked.Hint=, \u6309\u4f4fShift\u952e\u5355\u51fb\u4ee5\u9009\u62e9 -TTrack.Unselected.Hint=\u5355\u51fb\u9009\u62e9\u5bf9\u8c61\u6216\u8bbe\u7f6e\u5c5e\u6027 -Vector.Unmarked.Hint=\u6309\u4f4fshift\u952e\u62d6\u52a8\u9f20\u6807\u6807\u8bb0 -OffsetOrigin.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u9f20\u6807\u4ee5\u91cd\u65b0\u6807\u8bb0 -Calibration.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u9f20\u6807\u6807\u8bb0\u7b2c\u4e00\u4e2a\u70b9 -Calibration.Halfmarked.Hint=\u6309\u4f4fshift\u5355\u51fb\u91cd\u65b0\u6807\u8bb0 -CenterOfMass.Empty.Hint=\u9009\u62e9\u8d28\u70b9\u4ee5\u5b9a\u4e49\u7cfb\u7edf -VectorSum.Empty.Hint=\u9009\u62e9\u77e2\u91cf\u4ee5\u5b9a\u4e49\u77e2\u91cf\u548c -TapeMeasure.Hint=\u62d6\u52a8\u7ec8\u70b9\u4ee5\u6d4b\u91cf\u8ddd\u79bb\u548c\u89d2\u5ea6 -CoordAxes.Hint=\u8bbe\u7f6e\u89d2\u5ea6\u4ee5\u6539\u53d8\u503e\u659c\u89d2 -ParticleModel.Hint=\u5728\u5de5\u5177\u680f\u4e2d\u8bbe\u7f6e\u5bf9\u8c61\u8d28\u91cf\uff0c\u5728\u6a21\u578b\u6784\u5efa\u5de5\u5177\u4e2d\u8212\u670d\u8868\u8fbe\u5f0f\u5f00\u59cb\u52a8\u753b\u6a21\u62df -RGBRegion.Hint=\u8f93\u5165\u6539\u53d8\u5927\u5c0f\u7684\u534a\u5f84 -RGBRegion.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u6807\u8bb0\u4f4d\u7f6e -TTrack.ImportVideo.Hint=\u5bfc\u5165\u89c6\u9891\u6216\u56fe\u50cf\u4ee5\u6d4b\u91cfRGB\u989c\u8272 -TTrack.Selected.Hint=\u9009\u5b9a\u7684 -LineProfile.Hint=\u8f93\u5165\u5bbd\u5ea6\u4ee5\u6539\u53d8\u7ebf\u5bbd -LineProfile.Unmarked.Hint=\u6309\u4f4fshift\u952e\u62d6\u52a8\u753b\u7ebf -LineProfile.Menu.Orientation=\u671d\u5411 -LineProfile.MenuItem.Horizontal=\u6c34\u5e73\u7684 -LineProfile.MenuItem.XAxis=\u6cbfX\u8f74\u65b9\u5411 -Footprint.PositionVector=\u77e2\u91cf -Footprint.BoldPositionVector=\u7c97\u77e2\u91cf -Tracker.Startup.Hint=\u8bf7\u67e5\u770b\u8fd9\u91cc\u7684\u63d0\u793a(\u6216\u8005\u5728\u5e2e\u52a9\u83dc\u5355\u4e2d\u5173\u95ed\u63d0\u793a). \u5728\u4efb\u4f55\u65f6\u5019\u6309F1\u90fd\u53ef\u83b7\u53d6\u5e2e\u52a9 -TrackerPanel.NoVideo.Hint=\u6253\u5f00\u6216\u5bfc\u5165\u89c6\u9891\u548c\u56fe\u50cf\u8fdb\u884c\u5206\u6790 -TrackerPanel.CalibrateVideo.Hint=\u4f7f\u7528\u5b9a\u6807\u5de5\u5177\u4e3a\u89c6\u9891\u5b9a\u6807 -TrackerPanel.NoTracks.Hint=\u521b\u5efa\u65b0\u7684\u8f68\u8ff9\u6d4b\u91cf\u611f\u5174\u8da3\u7684\u7279\u5f81 -TrackerPanel.SetClip.Hint=\u8bbe\u7f6e\u6216\u67e5\u770b\u89c6\u9891\u526a\u8f91\u8bbe\u7f6e -TrackerPanel.ShowAxes.Hint=\u8bbe\u7f6e\u5750\u6807\u539f\u70b9\u548c\u5750\u6807\u8f74\u89d2\u5ea6 -VideoPlayer.Step.Hint=\u5411\u524d\u4e00\u6b65(PageDown) -VideoPlayer.Back.Hint=\u5411\u540e\u4e00\u6b65(PageUp) -TrackerPanel.DVVideo.Hint=\u4f7f\u7528\u91cd\u5b9a\u4e49\u5927\u5c0f\u6ee4\u955c\u4fee\u6b63\u89c6\u9891\u526a\u8f91\u7684\u626d\u66f2 -TrackerIO.DataFileFilter.Description=Tracker\u6587\u4ef6 -Tracker.Button.PDFHelp=\u53ef\u6253\u5370\u7684PDF\u7248 -TToolbar.Button.TapeVisible.Tooltip=\u663e\u793a,\u9690\u85cf\u6216\u9009\u62e9\u5b9a\u6807\u5de5\u5177 - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=\u8f68\u8ff9\u63a7\u5236 -TMenuBar.MenuItem.Description=\u8bf4\u660e -TrackPlottingPanel.RightDrag.Hint=\u53f3\u952e\u62d6\u52a8\u663e\u793a\u9009\u9879 -TMenuBar.MenuItem.DeleteSelectedPoint=\u5df2\u9009\u53d6\u7684\u70b9 -TFrame.InfoDialog.SaveChanges.Title=\u4fdd\u5b58\u6539\u53d8 -TFrame.InfoDialog.SaveChanges.Message=\u8981\u5b58\u50a8\u6539\u53d8\u5417? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=\u7b1b\u5361\u5c14\u5750\u6807 -DynamicParticle.Editor.Button.Polar=\u6781\u5750\u6807 -DynamicParticle.Parameter.InitialR.Description=\u521d\u59cb\u534a\u5f84 -DynamicParticle.Parameter.InitialTheta.Description=\u521d\u59cb\u89d2 -DynamicParticle.Parameter.InitialVelocityR.Description=\u521d\u59cb\u5f84\u5411\u901f\u5ea6 -DynamicParticle.Parameter.InitialOmega.Description=\u521d\u59cb\u89d2\u5411\u901f\u5ea6 -DynamicParticle.ForceFunction.R.Description=\u529b\u7684\u5f84\u5411\u5206\u91cf -DynamicParticle.ForceFunction.Theta.Description=\u529b\u7684\u5207\u5411\u5206\u91cf -DynamicParticlePolar.Name=\u7c92\u5b50\u7684\u52a8\u529b\u5b66\u6a21\u578b(\u6781\u5750\u6807) -TMenuBar.Menu.DynamicParticle=\u7c92\u5b50\u7684\u52a8\u529b\u5b66\u6a21\u578b -TMenuBar.MenuItem.Cartesian=\u7b1b\u5361\u5c14\u5750\u6807 -TMenuBar.MenuItem.Polar=\u6781\u5750\u6807 - -# Additions by Doug Brown 2009-08-24 -PointMass.MenuItem.Autotrack=\u81ea\u52a8\u8ffd\u8e2a... -Dialog.Button.Help=\u5e2e\u52a9 -AutoTracker.Wizard.Title=\u81ea\u52a8\u8ffd\u8e2a -AutoTracker.Wizard.Button.Reset=\u91cd\u7f6e -AutoTracker.Wizard.Button.Back=\u524d\u4e00\u4e2a -AutoTracker.Wizard.Button.Next=\u4e0b\u4e00\u4e2a -AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 -AutoTracker.Wizard.Button.Search=\u641c\u7d22 -AutoTracker.Wizard.Button.Pause=\u6682\u505c -AutoTracker.Wizard.Button.Skip=\u8df3\u8fc7 -AutoTracker.Label.Mask=\u6a21\u677f -AutoTracker.Label.AcceptLevel=\u9608\u503c -AutoTracker.TabbedPane.TabTitle.Mask=\u6a21\u677f -AutoTracker.TabbedPane.TabTitle.Target=\u76ee\u6807 -AutoTracker.TabbedPane.TabTitle.Settings=\u63a5\u53d7 -AutoTracker.TabbedPane.TabTitle.Search=\u641c\u7d22 -AutoTracker.Info.GetStarted=\u6309\u4f4fShift+Control\u70b9\u51fb\u89c6\u9891\u4e2d\u8981\u63d2\u5165\u65b0\u5173\u952e\u5e27\u7684\u4f4d\u7f6e\u53ef\u63d2\u5165\u65b0\u7684\u5173\u952e\u5e27. -AutoTracker.Info.Mask1=\u5b9a\u4e49\u6a21\u677f\u7684\u56fe\u50cf\u5fc5\u987b\u4e0e\u6bcf\u4e2a\u89c6\u9891\u5e27\u90fd\u5339\u914d. -AutoTracker.Info.Mask2=\u6a21\u677f\u53ef\u4ee5\u4f7f\u7528\u5f62\u72b6\u548c\u989c\u8272\u968f\u7740\u65f6\u95f4\u53d8\u5316\u7684\u5f62\u5f0f, \u53d8\u5316\u7684\u901f\u5ea6\u8d8a\u5feb\u8d8a\u80fd\u8ffd\u6700\u5230\u66f4\u5feb\u7684\u6539\u53d8\uff0c\u4f46\u662f\u4ece\u957f\u65f6\u95f4\u6765\u770b\u7cbe\u5ea6\u5c06\u4f1a\u964d\u4f4e\u3002 @@ It evolves to adapt to shape and color changes over time. Higher evolution rates track more rapid changes, but are less accurate over long times. -AutoTracker.Info.MaskLocked1=\u8be5\u6a21\u677f\u5df2\u88ab\u4f7f\u7528,\u5e76\u88ab\u9501\u5b9a. -AutoTracker.Info.MaskLocked2=\u70b9\u51fb\u91cd\u7f6e\u6309\u94ae, \u6e05\u9664\u6240\u6709\u5df2\u8ffd\u8e2a\u7684\u8bb0\u5f55\u5e76\u91cd\u65b0\u5f00\u59cb. -AutoTracker.Info.Target1=\u6ee1\u8db3\u81ea\u52a8\u6807\u8bb0\u8981\u6c42\u7684\u76ee\u6807\u8fd0\u52a8\u90fd\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. -AutoTracker.Info.Target2=\u63d0\u793a: \u5728\u6bcf\u6b65\u8fd0\u52a8\u90fd\u88ab\u6807\u8bb0\u51fa\u6765\u4e4b\u540e,\u7528\u6237\u4f9d\u7136\u53ef\u4ee5\u8c03\u6574\u7269\u4f53\u7684\u4f4d\u7f6e. \u5df2\u7ecf\u6807\u8bb0\u51fa\u6765\u7684\u4f4d\u7f6e\u5c06\u4f1a\u968f\u7740\u76ee\u6807\u7684\u79fb\u52a8\u91cd\u65b0\u81ea\u52a8\u8c03\u6574. -AutoTracker.Info.TargetLocked=\u76ee\u6807\u6b63\u5728\u4f7f\u7528,\u5e76\u4e14\u5df2\u7ecf\u4e0e\u5b58\u5728\u7684\u6807\u8bb0\u7ed1\u5b9a. \u79fb\u52a8\u76ee\u6807\u4f4d\u7f6e\u5c06\u4f1a\u79fb\u52a8\u6807\u8bb0\u4f4d\u7f6e. -AutoTracker.Info.Settings1=\u6ee1\u8db3\u81ea\u52a8\u6807\u8bb0\u8981\u6c42\u7684\u76ee\u6807\u8fd0\u52a8\u90fd\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. -AutoTracker.Info.Settings2=\u63d0\u793a: \u964d\u4f4e\u81ea\u52a8\u6807\u8bb0\u6807\u51c6\u5c06\u4f1a\u589e\u52a0\u9519\u8bef\u6807\u8bb0\u7684\u53ef\u80fd\u6027.\u8bf7\u5c1d\u8bd5\u589e\u52a0\u81ea\u52a8\u8ffd\u8e2a\u7684\u65f6\u95f4\u95f4\u9694. @@Tip: reducing the automark level may increase the likelihood of marking false matches. Try increasing the evolution rate instead. -AutoTracker.Info.Search1=\u5728\u641c\u7d22\u533a\u57df\u5185\u626b\u63cf\u5e76\u5bfb\u627e\u6700\u4f73\u5339\u914d, \u901a\u8fc7\u62d6\u52a8\u641c\u7d22\u6846\u7684\u8fb9\u754c\u548c\u53e5\u67c4\u53ef\u4ee5\u6539\u53d8\u641c\u7d22\u533a\u57df\u7684\u5927\u5c0f. -AutoTracker.Info.Search2=\u63d0\u793a: \u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u641c\u7d22\u533a\u57df\u4e0d\u7528\u592a\u5927.\u5411\u524d\u641c\u7d22\u9009\u9879\u5c06\u81ea\u52a8\u7684\u628a\u641c\u7d22\u533a\u57df\u79fb\u52a8\u5230\u9884\u5b9a\u7684\u5339\u914d\u533a\u57df.. -AutoTracker.Info.Frame=\u5e27 -AutoTracker.Info.Match=\u4e0e\u6a21\u677f\u5339\u914d\u7684\u70b9\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. -AutoTracker.Info.Possible=\u641c\u7d22\u533a\u57df\u53d1\u73b0\u4e00\u4e2a\u53ef\u80fd\u5339\u914d\u76ee\u6807.\u60a8\u53ef\u4ee5: -AutoTracker.Info.NoMatch=\u5728\u641c\u7d22\u533a\u57df\u5185\u4e3a\u53d1\u73b0\u5339\u914d\u76ee\u6807.\u60a8\u53ef\u4ee5: -AutoTracker.Info.Outside=\u641c\u7d22\u533a\u57df\u5728\u56fe\u50cf\u4ee5\u5916.\u60a8\u53ef\u4ee5: -AutoTracker.Info.Accepted=\u7528\u6237\u63a5\u53d7\u4e86\u5f53\u524d\u7684\u5339\u914d\u70b9. -AutoTracker.Info.MarkedByUser=\u7528\u6237\u624b\u5de5\u6807\u8bb0\u4e86\u8fd9\u4e00\u6b65\u8fd0\u52a8. -AutoTracker.Info.NoVideo=\u81ea\u52a8\u8ffd\u8e2a\u9700\u8981\u5206\u6790\u89c6\u9891. -AutoTracker.Info.Height=\u9ad8\u5ea6 -AutoTracker.Info.Width=\u5bbd\u5ea6 -AutoTracker.Info.Accept=--\u63a5\u53d7\u5339\u914d\u70b9 -AutoTracker.Info.Retry=--\u79fb\u52a8\u641c\u7d22\u533a\u57df\u5e76\u518d\u6b21\u641c\u7d22 -AutoTracker.Info.Mark=--\u6309\u4f4fshift\u952e\u70b9\u51fb\u9f20\u6807,\u624b\u5de5\u6807\u8bb0\u8fd9\u4e00\u6b65 -AutoTracker.Info.Skip=--\u8df3\u8fc7\u8be5\u5e27\u5e76\u7ee7\u7eed\u641c\u7d22 -AutoTracker.Info.Reset=--\u8df3\u56de\u524d\u4e00\u6b21\u6b63\u786e\u6807\u8bb0\u7684\u5e27,\u6309\u4f4fShift+Control\u952e\u5e76\u5355\u51fb\u5b9a\u4e49\u4e00\u4e2a\u65b0\u7684\u5173\u952e\u5e27 -AutoTracker.Info.MatchScore=\u5339\u914d\u6807\u51c6 -AutoTracker.Dialog.MaskLocked.Title=\u6a21\u677f\u9501\u5b9a -PointMass.Cursor.Autotrack.Description=\u81ea\u52a8\u8ffd\u8e2a\u5149\u6807 -VideoPlayer.StartFrame.Hint=\u62d6\u52a8\u5e76\u8bbe\u7f6e\u8d77\u59cb\u5e27 -VideoPlayer.EndFrame.Hint=\u62d6\u52a8\u88ab\u8bbe\u7f6e\u7ed3\u675f\u5e27 -VideoPlayer.Slider.Hint=\u62d6\u52a8\u626b\u63cf\u6574\u4e2a\u89c6\u9891 -FileDropHandler.Dialog.BadFile.Message=\u65e0\u6cd5\u52a0\u8f7d. -FileDropHandler.Dialog.BadFile.Title=\u65e0\u6cd5\u8bc6\u522b\u7684\u6587\u4ef6 - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=\u5e94\u7528 -DynamicParticle.Dialog.Delete.Message=\u5220\u9664\u8be5\u7c92\u5b50\u5c06\u4f1a\u5c06\u8be5\u7c92\u5b50\u4ece\u7cfb\u7edf\u4e2d\u79fb\u9664.\u8fd8\u8981\u5220\u9664\u5417? -DynamicParticle.Dialog.Delete.Title=\u52a8\u529b\u5b66\u7cfb\u7edf -DynamicParticle.System.In=\u5728\u5176\u4e2d -DynamicSystem.Empty=\u7a7a\u7684 -DynamicSystem.Force.Name.Internal=\u5185\u90e8\u7684 -DynamicSystem.ForceFunction.R.Description=\u5185\u90e8\u4f5c\u7528\u529b\u7684\u5f84\u5411\u5206\u91cf -DynamicSystem.ForceFunction.Theta.Description=\u5185\u90e8\u4f5c\u7528\u529b\u7684\u5207\u5411\u5206\u91cf -DynamicSystem.MenuItem.Inspector=\u9009\u62e9\u7c92\u5b50... -DynamicSystem.Name=\u4e24\u4f53\u52a8\u529b\u5b66\u7cfb\u7edf -DynamicSystem.New.Name=\u7cfb\u7edf -DynamicSystem.Parameter.Of=of -DynamicSystem.Parameter.RelativeTo=\u76f8\u5bf9\u4e8e -DynamicSystem.Parameter.Name.Relative=\u76f8\u5bf9 -DynamicSystem.Parameter.ParticleMass.Description=\u8d28\u91cf -DynamicSystem.Parameter.Mass.Description=\u7cfb\u7edf\u7684\u603b\u8d28\u91cf -DynamicSystemInspector.Border.Title=\u7c92\u5b50 -DynamicSystemInspector.Title=\u4e24\u4f53\u7cfb\u7edf -DynamicSystemInspector.Button.Change=\u6539\u53d8... -DynamicSystemInspector.ParticleName.None=(none) -TMenuBar.MenuItem.Clone=\u514b\u9686 -TMenuBar.MenuItem.TwoBody=\u4e24\u4f53\u7cfb\u7edf -TrackerPanel.DataBuilder.Dropdown.Tooltip=\u5f53\u524d\u9009\u5b9a\u7684\u8f68\u8ff9 -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\u7eb5\u8f74\u540c\u6b65 -TrackControl.Button.Trace.ToolTip=\u663e\u793a/\u9690\u85cf\u8def\u5f84 -TToolBar.Button.Open.Tooltip=\u5728\u65b0\u6807\u7b7e\u9875\u4e2d\u6253\u5f00\u89c6\u9891\u6216tracker\u6587\u4ef6 -TToolBar.Button.Save.Tooltip=\u5f53\u524d\u6807\u7b7e\u9875\u5b58\u50a8\u4e3a -TToolBar.Button.SelectTrack=\u9009\u62e9 -TToolBar.Button.SelectTrack.Tooltip=\u9009\u53d6\u5df2\u5b58\u5728\u7684\u8f68\u8ff9 -TTrack.MenuItem.ClearSteps=\u6e05\u9664\u6b65\u9aa4 -PointMass.MenuItem.Position=\u4f4d\u7f6e -TMenuBar.MenuItem.Empty=(\u7a7a) -TTrackBar.Button.Memory=memory in use: -TTrackBar.Button.Memory.Tooltip=\u5185\u5b58\u4f7f\u7528\u76d1\u89c6\u4e0e\u7ba1\u7406 -TTrackBar.Memory.PopupItem.Launch1=\u542f\u52a8 -TTrackBar.Memory.PopupItem.Launch2=\u5185\u5b58 -TButton.Track.ToolTip=\u8bbe\u7f6e\u5c5e\u6027 -Tracker.Dialog.OutOfMemory.Message1=Tracker\u5df2\u4f7f\u7528\u5b8c\u53ef\u4f7f\u7528\u5185\u5b58. -Tracker.Dialog.OutOfMemory.Message2=\u70b9\u51fb\u5185\u5b58\u6309\u94ae\u67e5\u770b\u66f4\u591a\u9009\u9879. -Tracker.Dialog.OutOfMemory.Title=\u5185\u5b58\u4e0d\u8db3 - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=\u5411\u524d\u67e5\u627e -AutoTracker.Label.Original=\u5173\u952e\u5e27 -AutoTracker.Label.NoMask=\u65e0 -AutoTracker.Label.Rate=\u901f\u7387: -AutoTracker.Info.Mask3=\u63d0\u793a: \u6a21\u677f\u4e0d\u9700\u8981\u592a\u5927\u4e5f\u4e0d\u9700\u8981\u5305\u62ec\u6574\u4e2a\u5bf9\u8c61.\u53ea\u8981\u5305\u542b\u6709\u9c9c\u660e\u7684\u7279\u5f81\u6216\u9ad8\u5bf9\u6bd4\u5ea6\u5373\u53ef. -AutoTracker.Wizard.Checkbox.XAxis=\u4ec5X\u8f74 -AutoTracker.Info.SearchOnAxis1=\u626b\u63cf\u641c\u7d22\u6846\u7684x\u8f74\u65b9\u5411\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d.\u901a\u8fc7\u5176\u4e2d\u5fc3\u548c\u53e5\u67c4\u53ef\u4ee5\u8c03\u6574\u641c\u7d22\u6846\u7684\u4f4d\u7f6e\u548c\u5927\u5c0f. -AutoTracker.Info.PossibleOnAxis=\u5728\u641c\u7d22\u533ax\u8f74\u627e\u5230\u4e00\u4e2a\u53ef\u80fd\u7684\u5339\u914d\u70b9.\u60a8\u53ef\u4ee5: -AutoTracker.Info.NoMatchOnAxis=\u5728\u641c\u7d22\u533ax\u8f74\u5e76\u672a\u627e\u5230\u53ef\u80fd\u7684\u5339\u914d\u70b9.\u60a8\u53ef\u4ee5: -AutoTracker.Info.RetryOnAxis=--\u79fb\u52a8\u641c\u7d22\u533a\u6216\u8005x\u8f74\u5e76\u518d\u6b21\u641c\u7d22 -AutoTracker.Wizard.Button.Delete=\u5220\u9664 -AutoTracker.Wizard.Button.DeleteMore=\u5220\u9664\u540e\u9762\u7684\u70b9 -Button.Define.Tooltip=\u4e3a\u73b0\u5b58\u7684\u5217\u53d8\u91cf\u5b9a\u4e49\u51fd\u6570 -Calibration.Label.Point=\u70b9 -CalibrationStick.Hint=\u8bbe\u7f6e\u957f\u5ea6,\u6216\u8005\u62d6\u52a8\u5b9a\u6807\u5de5\u5177\u7aef\u70b9\u5b9a\u4e49\u957f\u5ea6,\u8bbe\u7f6e\u503e\u659c\u89d2\u5ea6 -CalibrationStick.End.Hint=\u62d6\u52a8\u4ee5\u6539\u53d8\u5c3a\u5ea6,\u6309\u4f4fShift\u952e\u5355\u51fb\u91cd\u65b0\u6807\u8bb0 -CalibrationStick.New.Name=\u5b9a\u6807\u68d2 -CalibrationTapeMeasure.New.Name=\u5b9a\u6807\u5c3a -CalibrationTapeMeasure.Readout.Magnitude.Hint=\u70b9\u51fb\u5e76\u8f93\u5165\u5750\u6807\u7cfb\u4e2d\u4e00\u4e2a\u5df2\u77e5\u7684\u957f\u5ea6 -CalibrationTapeMeasure.Hint=\u8bbe\u7f6e\u957f\u5ea6\u4ee5\u6539\u53d8\u6bd4\u4f8b,\u8bbe\u7f6e\u503e\u659c\u89d2 -DynamicSystem.Data.Description.0=\u4e24\u7c92\u5b50\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e -DynamicSystem.Data.Description.1=\u76f8\u5bf9\u89d2\u5ea6 -DynamicSystem.Data.Description.2=\u76f8\u5bf9\u5f84\u5411\u901f\u5ea6 -DynamicSystem.Data.Description.3=\u76f8\u5bf9\u89d2\u901f\u5ea6 -ExportDataDialog.Subtitle.Table=\u6570\u636e\u8868\u683c -ExportDataDialog.Subtitle.Content=\u5355\u5143\u683c -ExportDataDialog.Subtitle.Format=\u6570\u5b57\u683c\u5f0f -ExportDataDialog.Subtitle.Delimiter=\u5206\u9694\u7b26 -ExportDataDialog.Title=\u5bfc\u51fa\u6570\u636e -ExportDataDialog.Delimiter.Add=\u589e\u52a0... -ExportDataDialog.Delimiter.Remove=\u79fb\u9664... -ExportDataDialog.Content.AllCells=\u6240\u6709\u5355\u5143\u683c -ExportDataDialog.Content.SelectedCells=\u9009\u5b9a\u7684\u5355\u5143\u683c -ExportDataDialog.MenuItem.RemoveDelimiter=\u79fb\u9664\u7279\u5b9a\u7684\u6570\u636e\u5206\u5272\u7b26 -ExportDataDialog.Chooser.SaveData.Title=\u6570\u636e\u53e6\u5b58\u4e3a -ExportVideoDialog.Button.SaveAs=\u53e6\u5b58\u4e3a... -ExportVideoDialog.Button.FullSize=\u5168\u5c3a\u5bf8\u5927\u5c0f -ExportVideoDialog.Button.DrawnSize=\u5982\u56fe\u6240\u793a -ExportVideoDialog.Content.VideoOnly=\u4ec5\u89c6\u9891 -ExportVideoDialog.Content.VideoAndGraphics=\u89c6\u9891\u4e0e\u56fe\u50cf -ExportVideoDialog.Content.GraphicsOnly=\u4ec5\u56fe\u50cf -ExportVideoDialog.Title=\u5bfc\u51fa\u89c6\u9891\u526a\u8f91 -ExportVideoDialog.Label.ClipSettings=\u526a\u8f91\u8bbe\u5b9a -ExportVideoDialog.Subtitle.Size=\u5927\u5c0f -ExportVideoDialog.Subtitle.Content=\u5185\u5bb9 -ExportVideoDialog.Subtitle.View=\u663e\u793a -ExportVideoDialog.Subtitle.Format=\u683c\u5f0f -ExportVideoDialog.Complete.Message1=\u89c6\u9891\u5df2\u88ab\u53e6\u5b58\u4e3a -ExportVideoDialog.Complete.Message2=\u73b0\u5728\u8981\u5728Tracker\u4e2d\u6253\u5f00\u5417? -ExportVideoDialog.Complete.Title=\u5b8c\u5168\u5bfc\u51fa -ExportVideoDialog.VideoSize=\u89c6\u9891\u5927\u5c0f -ExportVideoDialog.MatSize=mat\u5927\u5c0f -ExportVideo.Dialog.HiddenPlots.Message=\u5fc5\u987b\u663e\u793a\u6240\u6709\u7684\u56fe\u5f62\u4ee5\u4fbf\u5bfc\u51fa. -ExportVideo.Dialog.HiddenPlots.Title=\u663e\u793a\u4e0d\u5b8c\u6574 -Footprint.DoubleTarget=\u53cc\u4ea4\u53c9\u7ebf -Footprint.BoldDoubleTarget=\u7c97\u53cc\u4ea4\u53c9\u7ebf -OffsetOrigin.MenuItem.Fixed=\u56fa\u5b9a\u5ea7\u6807\u7cfb -ParticleModel.Dialog.Offscreen.Message1=\u7531\u4e8e\u4e00\u4e9b\u6b65\u9aa4\u70b9\u5728\u5c4f\u5e55\u4ee5\u5916,\u56e0\u6b64\u8fd9\u4e9b\u70b9\u88ab\u7701\u7565. -ParticleModel.Dialog.Offscreen.Message2=\u8bf7\u4fee\u6539\u6a21\u578b\u6216\u7f29\u653e\u89c6\u9891. -ParticleModel.Dialog.Offscreen.Title=\u8d85\u51fa\u8303\u56f4 -PrefsDialog.Tab.Configuration.Title=\u914d\u7f6e -PrefsDialog.Memory.BorderTitle=\u5185\u5b58\u5927\u5c0f -PrefsDialog.Tab.General.Title=\u5176\u4ed6 -PrefsDialog.RecentFiles.BorderTitle=\u6253\u5f00\u6700\u8fd1\u4f7f\u7528\u83dc\u5355 -PrefsDialog.Label.RecentSize=\u6587\u4ef6\u4e2a\u6570 -PrefsDialog.Hints.BorderTitle=\u63d0\u793a -PrefsDialog.Button.Relaunch=\u73b0\u5728\u91cd\u542f -PrefsDialog.Button.ClearRecent=\u6e05\u9664 -PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9ed8\u8ba4 -PrefsDialog.Checkbox.HintsOn=\u9ed8\u8ba4\u663e\u793a\u63d0\u793a -PrefsDialog.Tab.Video.Title=\u89c6\u9891 -PrefsDialog.VideoPref.BorderTitle=\u89c6\u9891\u5f15\u64ce -PrefsDialog.Button.Xuggle=Xuggle (\u63a8\u8350) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=\u4f7f\u7528Web Start\u65f6\u5185\u5b58\u7ba1\u7406\u4e0d\u53ef\u7528. -PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f -PrefsDialog.LookFeel.BorderTitle=\u5916\u89c2 -PrefsDialog.Language.BorderTitle=\u8bed\u8a00 -PrefsDialog.Upgrades.BorderTitle=\u68c0\u67e5\u66f4\u65b0 -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=\u663e\u793a -PrefsDialog.Language.Default=\u9ed8\u8ba4 -PrefsDialog.Upgrades.Always=\u6bcf\u6b21 -PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 -PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 -PrefsDialog.Upgrades.Never=\u4ece\u4e0d -PrefsDialog.Button.CheckForUpgrade=\u73b0\u5728\u68c0\u67e5 -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle\u64ad\u653e\u5f71\u7247 -PrefsDialog.Xuggle.Slow=\u5149\u6ed1 (\u53ef\u80fd\u4f1a\u53d8\u6162) -PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u4f1a\u6709\u952f\u9f7f) -PrefsDialog.CalibrationTool.BorderTitle=\u9ed8\u8ba4\u5b9a\u6807\u5de5\u5177 -Protractor.Name=\u91cf\u89d2\u5668 -Protractor.New.Name=\u91cf\u89d2\u5668 -Protractor.Hint=\u62d6\u52a8\u4e24\u8fb9\u6d4b\u91cf\u5939\u89d2 -Protractor.Label.Angle=\u5939\u89d2 -Protractor.Field.Angle.Tooltip=\u91cf\u89d2\u5668\u4e24\u8fb9\u7684\u5939\u89d2 -Protractor.Vertex.Name=\u9876\u70b9 -Protractor.Vertex.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8\u9876\u70b9 -Protractor.End.Name=\u7ec8\u8fb9 -Protractor.End.Hint=\u62d6\u52a8\u5e76\u65cb\u8f6c\u8fb9 -Protractor.Handle.Name=\u53e5\u67c4 -Protractor.Handle.Hint=\u62d6\u52a8\u5e76\u79fb\u52a8\u91cf\u89d2\u5668 -Protractor.Rotator.Name=\u65cb\u8f6c -Protractor.Rotator.Hint=\u62d6\u52a8\u5e76\u65cb\u8f6c\u91cf\u89d2\u5668 -Protractor.Readout.Name=\u8bfb\u6570 -Protractor.Readout.Hint=\u91cf\u89d2\u5668\u4e24\u8fb9\u4e4b\u95f4\u7684\u5939\u89d2 -ProtractorFootprint.Circle3=\u5c0f\u5706 -ProtractorFootprint.Circle5=\u5927\u5706 -ProtractorFootprint.Circle3Bold=\u7c97\u4f53\u5c0f\u5706 -ProtractorFootprint.Circle5Bold=\u7c97\u4f53\u5927\u5706 -Stick.Name=\u5b9a\u6807\u6746 -Stick.New.Name=\u5b9a\u6807\u6746 -TableTrackView.MenuItem.Unformatted=\u5168\u7cbe\u5ea6 -TableTrackView.MenuItem.Formatted=\u5982\u683c\u5f0f -TableTrackView.Menu.SetDelimiter=\u8bbe\u7f6e\u5206\u9694\u7b26 -TableTrackView.MenuItem.AddDelimiter=\u589e\u52a0... -TableTrackView.MenuItem.RemoveDelimiter=\u79fb\u9664... -TableTrackView.Dialog.CustomDelimiter.Message=\u8f93\u5165\u65b0\u7684\u5206\u9694\u7b26\u5b57\u7b26\u4e32: -TableTrackView.Dialog.CustomDelimiter.Title=\u589e\u52a0\u5206\u9694\u7b26 -TableTrackView.Header.Tooltip=\u5355\u51fb\u6392\u5e8f,\u53cc\u51fb\u9009\u5b9a\u5217 -TableTrackView.MenuItem.CopySelectedData=\u590d\u5236\u9009\u5b9a\u7684\u6570\u636e -TableTrackView.Dialog.RemoveDelimiter.Message=\u9009\u62e9\u8981\u79fb\u9664\u7684\u5206\u9694\u7b26: -TableTrackView.Dialog.RemoveDelimiter.Title=\u79fb\u9664\u5206\u9694\u7b26 -TableTrackView.Radians.Tooltip=\u5f27\u5ea6 -TableTrackView.Degrees.Tooltip=\u89d2\u5ea6 -TableTrackView.RadiansPerSecond.Tooltip=\u5f27\u5ea6/\u79d2 -TableTrackView.DegreesPerSecond.Tooltip=\u89d2\u5ea6/\u79d2 -TableTrackView.RadiansPerSecondSquared.Tooltip=\u5f27\u5ea6/\u79d2^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=\u89d2\u5ea6/\u79d2^2 -TableTrackView.MenuItem.DeleteDataFunction=\u5220\u9664\u6570\u636e\u51fd\u6570 -TActions.Action.SaveFrame=\u89c6\u9891\u5e27\u53e6\u5b58\u4e3a... -TActions.AboutVideo=\u5c5e\u6027... -TActions.Dialog.AboutVideo.Title=\u89c6\u9891\u5c5e\u6027 -TActions.Dialog.AboutVideo.Type=\u7c7b\u578b -TActions.Dialog.AboutVideo.Size=\u5927\u5c0f -TActions.Dialog.AboutVideo.Length=\u957f\u5ea6 -TActions.Dialog.AboutVideo.Frames=\u5e27 -TActions.Dialog.AboutVideo.Seconds=\u79d2 -TActions.Dialog.AboutVideo.FrameRate=\u5e27\u7387 -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=\u8def\u5f84 -TActions.Action.ImportTRK=Tracker\u6587\u4ef6... -TActions.Action.ProtractorVisible=\u663e\u793a -TapeMeasure.MenuItem.FixedLength=\u56fa\u5b9a\u957f\u5ea6 -TextTView.Label.NoTab=\u70b9\u51fb"\u9875\u9762"\u5728\u8fd9\u91cc\u6dfb\u52a0\u6587\u672c\u6216HTML\u4ee3\u7801. -TextTView.NewTab.Text1=\u53cc\u51fb\u7f16\u8f91\u6587\u672c\u6216\u6807\u9898.\u70b9\u51fb\u53f3\u952e\u4e86\u89e3\u66f4\u591a\u9009\u9879. -TextTView.NewTab.Text2=\u4e3a\u4e86\u663e\u793aHTML\u9875\u9762,\u8bf7\u8f93\u5165URL\u6216\u8005\u4f7f\u7528\u90ae\u4ef6\u6253\u5f00\u6587\u4ef6. -TextTView.NewTab.Title=\u65e0\u6807\u9898 -TextTView.Dialog.TabTitle.Title=\u8bbe\u7f6e\u6807\u9898 -TextTView.MenuItem.OpenHTML=\u6253\u5f00HTML... -TextTView.MenuItem.SetTitle=\u8bbe\u7f6e\u6807\u9898... -TextTView.Button.NewTab=\u65b0\u5efa -TextTView.TextEdit.Description=\u6587\u5b57 -TFrame.Dialog.FileNotFound.Message=\u6587\u4ef6\u672a\u627e\u5230: -TFrame.Dialog.FileNotFound.Title=\u6587\u4ef6\u672a\u627e\u5230 -TFrame.View.Text=\u9875\u9762\u89c6\u56fe -TFrame.View.Main=\u4e3b\u89c6\u56fe -TMenuBar.Menu.OpenRecent=\u6700\u8fd1\u6253\u5f00 -TMenuBar.Menu.Import=\u5bfc\u5165 -TMenuBar.Menu.Export=\u5bfc\u51fa -TMenuBar.MenuItem.Video=\u89c6\u9891... -TMenuBar.MenuItem.Data=\u6570\u636e\u6587\u4ef6... -TMenuBar.Menu.CopyObject=\u590d\u5236\u5bf9\u8c61 -TMenuBar.MenuItem.Coords=\u5750\u6807\u7cfb -TMenuBar.MenuItem.VideoClip=\u89c6\u9891\u7247\u6bb5 -TMenuBar.Menu.MeasuringTools=\u6d4b\u91cf\u5de5\u5177 -TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u5355\u4f4d -TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 -TMenuBar.MenuItem.Radians=\u5f27\u5ea6 -Tracker.Dialog.NoXuggle.Title=Xuggle\u672a\u627e\u5230 -Tracker.Dialog.NoXuggle.Message1=Xuggle (\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ce)\u672a\u5b89\u88c5. -Tracker.Dialog.NoXuggle.Message2=\u4ecehttp://www.xuggle.com/xuggler/downloads/ \u4e0b\u8f7dXuggle. -Tracker.Action.AboutXuggle=\u5173\u4e8eXuggle... -Tracker.Dialog.AboutXuggle.Title=\u5173\u4e8eXuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle\u7248\u672c -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle\u4e3b\u9875: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle\u8def\u5f84: -Tracker.Dialog.NoVideoEngine.Message1=\u9ed8\u8ba4\u60c5\u51b5\u4e0b,Tracker\u53ef\u4ee5\u6253\u5f00\u52a8\u753bgif\u56fe\u50cf\u53ca\u56fe\u7247\u5e8f\u5217, -Tracker.Dialog.NoVideoEngine.Message2=\u5982\u679c\u8981\u6253\u5f00\u5176\u4ed6\u7c7b\u578b\u7684\u89c6\u9891\u5219\u9700\u8981\u5176\u4ed6\u7684\u89c6\u9891\u5f15\u64ce. -Tracker.Dialog.NoVideoEngine.Message3=\u63a8\u8350\u5b89\u88c5\u81ea\u7531\u5f00\u6e90\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ceXuggle -Tracker.Dialog.NoVideoEngine.Message4=\u6700\u65b0\u7248Tracker\u4e0b\u8f7d -Tracker.Dialog.NoVideoEngine.Title=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce -Tracker.Dialog.NoXuggle.Message1=Xuggle\u672a\u5b89\u88c5\u6216\u5de5\u4f5c\u4e0d\u6b63\u5e38(\u672a\u77e5\u539f\u56e0). -Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f7d\u6700\u65b0\u7684Xuggle\u5b89\u88c5 -Tracker.Dialog.NoXuggle.Title=Xuggle\u4e0d\u53ef\u7528 -Tracker.About.DefaultLocale=\u9ed8\u8ba4\u533a\u57df -Tracker.About.CurrentLanguage=\u8bed\u8a00 -Tracker.Dialog.InsufficientMemory.Title=\u5185\u5b58\u4e0d\u8db3 -Tracker.Dialog.InsufficientMemory.Message=\u6240\u9700\u5185\u5b58\u8fc7\u5927. -TrackerIO.Dialog.TabMustBeSaved.Message1=\u6807\u7b7e -TrackerIO.Dialog.TabMustBeSaved.Message2=\u5fc5\u987b\u88ab\u5b58\u4e3atracker\u6587\u4ef6\u4e4b\u540e\u624d\u80fd\u5305\u62ec\u5230\u6807\u7b7e\u7ec4\u4e2d. -TrackerIO.Dialog.TabMustBeSaved.Message3=\u8981\u5b58\u50a8\u5b83\u5417? -TrackerIO.Dialog.TabMustBeSaved.Title=\u672a\u5b58\u50a8\u6807\u7b7e\u9875 -TrackerIO.Dialog.NoTabs.Message=\u6ca1\u6709\u9700\u8981\u5b58\u50a8\u7684\u6807\u7b7e\u9875! -TrackerIO.Dialog.NoTabs.Title=\u7a7a\u6807\u7b7e\u9875\u7ec4 -TrackerIO.Dialog.SaveTabset.Title=\u5b58\u50a8\u6807\u7b7e\u9875\u7ec4 -TrackerIO.Dialog.SaveTab.Title=\u5b58\u50a8\u6807\u7b7e\u9875 -TrackerIO.Delimiter.Tab=Tab\u5236\u8868\u7b26 -TrackerIO.Delimiter.Space=\u7a7a\u683c -TrackerIO.Delimiter.Comma=\u9017\u53f7 -TrackerIO.Delimiter.Semicolon=\u5206\u53f7 -TrackerIO.VideoAndDataFileFilter.Description=\u89c6\u9891\u548cTracker\u6587\u4ef6 -TrackerPanel.Dialog.Version.Message1=\u60a8\u6240\u6253\u5f00\u7684\u6587\u4ef6\u662f\u7531Tracker\u521b\u5efa\u7684 -TrackerPanel.Dialog.Version.Message2=which may refer to -TrackerPanel.Dialog.Version.Message3=\u5f53\u524d\u8fd0\u884c\u7684\u7248\u672c\u6ca1\u6709\u6b64\u529f\u80fd -TrackerPanel.Dialog.Version.Message4=\u53ef\u7528\u7684\u6700\u65b0\u7248\u672c: -TrackerPanel.Dialog.Version.Title=\u7248\u672c\u4e0d\u5339\u914d -TrackerPanel.Label.ModelStart=\u5f00\u59cb -TrackerPanel.Label.ModelEnd=\u7ed3\u675f -TrackerPanel.Spinner.ModelStart.Tooltip=\u4e3a\u8be5\u6a21\u578b\u8bbe\u7f6e\u8d77\u59cb\u5e27 -TrackerPanel.Spinner.ModelEnd.Tooltip=\u4e3a\u8be5\u6a21\u578b\u8bbe\u7f6e\u7ed3\u675f\u5e27 -TToolbar.Button.ProtractorVisible.Tooltip=\u663e\u793a/\u9690\u85cf\u91cf\u89d2\u5668 -TToolbar.Button.AxesVisible.Tooltip=\u663e\u793a/\u9690\u85cf\u5750\u6807\u8f74 -TToolBar.Button.TrackControl.Tooltip=\u663e\u793a/\u9690\u85cf\u8f68\u8ff9\u63a7\u5236 -TTrack.Dialog.StepSizeWarning.Message1=\u6ce8\u610f: \u8f68\u8ff9\u4e2d\u6807\u8bb0\u51fa\u7684\u4e00\u4e9b\u70b9\u4e4b\u95f4\u5927\u4e8e\u4e00\u4e2a\u65f6\u95f4\u6b65\u957f,\u5373\u6709\u4e9b\u5e27\u88ab\u8df3\u8fc7,\u4fdd\u6301\u8fd9\u4e9b\u5e27\u4e0d\u88ab\u6807\u8bb0. -TTrack.Dialog.StepSizeWarning.Message2=\u6539\u53d8\u6b65\u957f\u6709\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6570\u636e\u4e2d\u51fa\u73b0\u4e00\u4e9b\u7a7a\u767d\u95f4\u9699. -TTrack.Dialog.StepSizeWarning.Message3=\u5728\u7a7a\u9699\u5468\u56f4\u7684\u901f\u5ea6\u548c\u52a0\u901f\u5ea6\u4e0d\u80fd\u51c6\u786e\u786e\u5b9a\uff0c\u9664\u975e\u6240\u6709\u70b9\u7684\u8fd0\u52a8\u8f68\u8ff9\u90fd\u88ab\u6807\u8bb0\u51fa\u6765. -TTrack.Dialog.StepSizeWarning.Title=\u6ce8\u610f -TTrack.Dialog.SkippedStepWarning.Message1=\u6ce8\u610f: \u5728\u6807\u8bb0\u4f4d\u7f6e\u65f6\u8df3\u8fc7\u4e00\u4e9b\u4f4d\u7f6e\u70b9\u5c06\u4f1a\u5bfc\u81f4\u6570\u7ec4\u4e3a\u7a7a. -TTrack.Dialog.SkippedStepWarning.Title=\u6ce8\u610f -TTrack.Dialog.SkippedStepWarning.Checkbox=\u4e0d\u518d\u663e\u793a\u8be5\u4fe1\u606f -TTrack.Locked.Hint=\u9501\u5b9a -TTrack.AngleField.Radians.Tooltip=\u89d2(\u5f27\u5ea6) -TTrack.AngleField.Degrees.Tooltip=\u89d2(\u89d2\u5ea6) -TTrack.AngleField.Popup.Radians=\u8f6c\u6362\u4e3a\u5f27\u5ea6 -TTrack.AngleField.Popup.Degrees=\u8f6c\u6362\u4e3a\u89d2\u5ea6 -TTrackBar.Memory.Menu.SetSize=\u8bbe\u7f6e\u5185\u5b58\u5927\u5c0f... -TTrackBar.Button.Version=\u5f53\u524d\u53ef\u7528\u7248\u672c: version -TTrackBar.Popup.MenuItem.Upgrade=\u73b0\u5728\u5347\u7ea7... -TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 -XuggleVideo.MenuItem.SmoothPlay=\u5e73\u6ed1\u64ad\u653e(\u7a0d\u6162) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=\u5b9a\u6807\u5c3a -CircleFootprint.Circle=\u5706 -CircleFootprint.FilledCircle=\u5b9e\u5fc3\u5706 -CircleFootprint.Dialog.Title=\u5706\u5f62\u8f68\u8ff9\u70b9 -CircleFootprint.Dialog.Label.Radius=\u534a\u5f84 -CircleFootprint.Dialog.Checkbox.Bold=\u7c97\u4f53 -CircleFootprint.Dialog.Checkbox.CenterSpot=\u5706\u5fc3 -LineProfile.Hint.Marking=\u62d6\u52a8\u9f20\u6807\u6807\u8bb0\u7ebf\u578b -PageTView.Button.Page=\u9875\u9762 -PageTView.MenuItem.ClosePage=\u5173\u95ed\u9875\u9762 -PointMass.Hint.Marking=\u70b9\u51fb\u9f20\u6807\u6807\u8bb0, \u56de\u8f66\u952e\u514b\u9686\u524d\u4e00\u6b65 -PrefsDialog.Dialog.NewVersion.Title=\u5347\u7ea7 -PrefsDialog.Dialog.NewVersion.Message1=version -PrefsDialog.Dialog.NewVersion.Message2=\u73b0\u5728\u53ef\u7528 -PrefsDialog.Dialog.NewVersion.None.Message=\u5f53\u524d\u65e0\u66f4\u65b0\u7684\u7248\u672c\u53ef\u7528. -RGBRegion.Hint.Marking=\u70b9\u51fb\u9f20\u6807\u6807\u8bb0\u533a\u57df\u7684\u4e2d\u5fc3 -TMenuBar.MenuItem.Restore=\u6062\u590d\u89c6\u56fe -TrackControl.StretchVectors.None=\u672a\u62c9\u4f38 -TViewChooser.Maximize.Tooltip=\u6700\u5927\u5316\u89c6\u56fe -TViewChooser.Restore.Tooltip=\u6062\u590d\u89c6\u56fe -Vector.Hint.Marking=\u62d6\u52a8\u9f20\u6807\u6807\u8bb0,\u56de\u8f66\u952e\u514b\u9686\u524d\u4e00\u6b65 -WorldTView.Button.World=\u89c6\u9891 - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=\u8b66\u544a -PrefsDialog.Checkbox.WarnIfNoEngine=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce -PrefsDialog.Checkbox.WarnIfXuggleError=\u4e0d\u4e25\u91cd\u7684Xuggle\u9519\u8bef -PropertiesDialog.Title=\u5c5e\u6027 -PropertiesDialog.Label.Author=\u4f5c\u8005 -PropertiesDialog.Label.Contact=\u8054\u7cfb -TActions.Action.Properties=\u5c5e\u6027... -TActions.Action.OpenBrowser=\u6253\u5f00\u5e93\u6d4f\u89c8\u5668... -TFrame.Progress.Xuggle=Xuggle\u6b63\u5728\u8f7d\u5165\u5e27 -TFrame.Progress.ClickToCancel=(\u70b9\u51fb\u53d6\u6d88) -TFrame.Dialog.StalledVideo.Title=\u8f7d\u5165\u89c6\u9891\u9519\u8bef -TFrame.Dialog.StalledVideo.Message0=\u8f7d\u5165\u89c6\u9891\u65f6\u53d1\u751f\u672a\u77e5\u9519\u8bef,\u6709\u53ef\u80fd\u662f\u6682\u65f6\u7684. -TFrame.Dialog.StalledVideo.Message1=\u60a8\u53ef\u4ee5\u9009\u62e9\u505c\u6b62\u8f7d\u5165\u89c6\u9891\u6216\u8005\u7ee7\u7eed\u7b49\u5f85. -TFrame.Dialog.StalledVideo.Message2=\u6253\u5f00\u89c6\u9891\u7684\u5176\u4ed6\u9009\u9879: -TFrame.Dialog.StalledVideo.Message3=1. \u4f7f\u7528\u89c6\u9891\u8f6c\u6362\u8f6f\u4ef6\u5c06\u5176\u8f6c\u6362\u6210\u4e0d\u540c\u7684\u683c\u5f0f. -TFrame.Dialog.StalledVideo.Message4=2. \u5728\u6253\u5f00\u6587\u4ef6\u5bf9\u8bdd\u6846\u4e2d\uff0c\u91c7\u7528QuickTime\u5f15\u64ce\u6765\u6253\u5f00\u6587\u4ef6. -TFrame.Dialog.StalledVideo.MessageMac=2. \u5c06Tracker\u572832\u4f4d\u7684Java\u865a\u62df\u673a\u4e2d\u542f\u52a8\uff0c\u5e76\u7528QuickTime\u52a0\u8f7d\u89c6\u9891\u6587\u4ef6. -TFrame.Dialog.StalledVideo.Button.Stop=\u7ec8\u6b62 -TFrame.Dialog.StalledVideo.Button.Wait=\u7b49\u5f85 -Tracker.Dialog.NoVideoEngine.Checkbox=\u4e0d\u518d\u663e\u793a\u8be5\u4fe1\u606f -TrackerIO.ZipFileFilter.Description=ZIP\u6587\u4ef6 -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle\u5728\u6253\u5f00\u89c6\u9891\u65f6\u9047\u5230\u5982\u4e0b\u9519\u8bef: -TrackerIO.Dialog.ErrorFFMPEG.Message2=\u5e76\u975e\u6240\u6709\u7684\u9519\u8bef\u90fd\u662f\u4e25\u91cd\u9519\u8bef.\u66f4\u5b8c\u6574\u7684\u9519\u8bef\u4fe1\u606f\u8bf7\u9009\u62e9 \u5e2e\u52a9|\u4fe1\u606f\u8bb0\u5f55 \u67e5\u770b. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5982\u679cXuggle\u5f15\u64ce\u5931\u8d25,\u60a8\u53ef\u4ee5\u8bd5\u7528QuickTime\u6253\u5f00\u89c6\u9891. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u6ce8\u610f: \u5728Mac OSX\u4e2d\u9700\u8981\u572832\u4f4dJava\u865a\u62df\u673a\u4e0a\u8fd0\u884cTracker. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle\u9519\u8bef -TrackerIO.ErrorFFMPEG.LogMessage=\u66f4\u591a\u4fe1\u606f,\u8bf7\u5728\u4e2a\u4eba\u504f\u597d\u8bbe\u5b9a(\u7f16\u8f91|\u4e2a\u4eba\u504f\u597d)\u5f00\u542fXuggle\u8b66\u544a\u4fe1\u606f. -TToolBar.Button.OpenBrowser.Tooltip=\u6253\u5f00\u5f00\u6e90\u7269\u7406(OPS)\u6570\u5b66\u5e93\u6d4f\u89c8\u5668 - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=\u6587\u4ef6\u672a\u627e\u5230 -TFrame.Dialog.NoTRKInComPADRE.Message=\u8be5\u8282\u70b9\u672a\u627e\u5230Tracker\u6587\u4ef6 - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=\u7c92\u5b50\u8fd0\u52a8\u5b66 -DynamicParticle.Builder.Title=\u7c92\u5b50\u52a8\u529b\u5b66 (\u7b1b\u5361\u5c14\u5750\u6807) -DynamicParticlePolar.Builder.Title=\u7c92\u5b50\u52a8\u529b\u5b66 (\u6781\u5750\u6807) -DynamicSystem.Builder.Title=\u52a8\u529b\u5b66\u7cfb\u7edf (\u5185\u90e8\u76f8\u4e92\u4f5c\u7528) -PropertiesDialog.Button.CopyFilePath=\u590d\u5236\u6587\u4ef6\u8def\u5f84 -PropertiesDialog.Button.CopyVideoPath=\u590d\u5236\u89c6\u9891\u8def\u5f84 -PropertiesDialog.Tab.TrackerFile=Tracker\u6587\u4ef6 -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=\u5c5e\u6027 -PropertiesDialog.Header.Value=\u503c -TActions.Action.OpenURL=\u6253\u5f00URL... -TActions.Dialog.OpenURL.Title=\u6253\u5f00URL -TActions.Dialog.OpenURL.Message=\u8f93\u5165\u57fa\u4e8e\u7f51\u7edc\u7684\u89c6\u9891,Tracker\u6587\u4ef6\u4ee5\u53ca\u538b\u7f29Tracker\u6587\u4ef6\u7684URL -TActions.Dialog.AboutVideo.Name=\u540d\u79f0 - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Web\u7f13\u5b58\u6587\u4ef6 -PrefsDialog.Button.ClearCache=\u6e05\u9664 - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, \u6309\u4f4fshift\u952e\u70b9\u51fb\u91cd\u65b0\u6807\u8bb0\u9ad8\u4eae\u663e\u793a\u7684\u4f4d\u7f6e -PointMass.Remarking.Hint=\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0\u4f4d\u7f6e -PointMass.PositionSelected.Hint=\u62d6\u52a8\u6216\u5728\u5de5\u5177\u680f\u8f93\u5165\u4f4d\u7f6e -PointMass.VectorSelected.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8 -Vector.Remark.Hint=\u6309\u4f4fshift\u952e\u70b9\u51fb\u91cd\u65b0\u6807\u8bb0\u9ad8\u4eae\u663e\u793a\u7684\u4f4d\u7f6e -Vector.TipSelected.Hint=\u62d6\u52a8\u6216\u5728\u5de5\u5177\u680f\u4e2d\u8f93\u5165\u5206\u91cf -Vector.HandleSelected.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8 -Vector.Remarking.Hint=\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0 -AutoTracker.Label.Search=\u641c\u7d22 -AutoTracker.Label.Target=\u76ee\u6807 -AutoTracker.Label.KeyFrame=\u5173\u952e\u5e27 -AutoTracker.Label.Frame=\u5e27 -AutoTracker.Label.Point=\u70b9 -AutoTracker.Label.Template=\u6a21\u677f -AutoTracker.Label.Track=\u8f68\u8ff9 -AutoTracker.Label.Match=\u5339\u914d -AutoTracker.Label.EvolutionRate=\u6f14\u5316\u901f\u5ea6 @@ Evolution Rate -AutoTracker.Label.Automark=\u81ea\u52a8\u6807\u8bb0 -AutoTracker.Info.Instructions=\u70b9\u51fb"\u641c\u7d22"\u6309\u94ae,\u5728\u641c\u7d22\u533a\u57df\u4e2d\u5bfb\u627e\u5339\u914d\u7684\u8f68\u8ff9\u70b9. -AutoTracker.Info.KeyFrame.Instructions1=\u8fd9\u4e00\u5173\u952e\u5e27\u5b9a\u4e49\u4e86\u6a21\u677f\u548c\u76ee\u6807.\u70b9\u51fb"\u641c\u7d22"\u6309\u94ae\u5c06\u5728\u641c\u7d22\u533a\u57df\u5bfb\u627e\u5339\u914d\u70b9. -AutoTracker.Info.KeyFrame.Instructions2=\u53ef\u4ee5\u62d6\u52a8\u9f20\u6807\u4ee5\u79fb\u52a8\u76ee\u6807,\u6a21\u677f\u548c\u641c\u7d22\u533a\u57df,\u6216\u8005\u6539\u53d8\u4ed6\u4eec\u7684\u5927\u5c0f. -AutoTracker.Info.MouseOver.Instructions=\u5c06\u9f20\u6807\u60ac\u505c\u5728\u63a7\u4ef6\u4e0a\u65b9\u65f6\u53ef\u4ee5\u770b\u5230\u5173\u4e8e\u8bbe\u7f6e\u548c\u8c03\u6574\u7684\u63d0\u793a\u4fe1\u606f. -AutoTracker.Info.Mask1=\u6a21\u677f\u662f\u62df\u5339\u914d\u7684\u56fe\u50cf.\u4e00\u822c\u662f\u4ece\u4e00\u4e2a\u7279\u5b9a\u7684\u5173\u952e\u5e27\u5f00\u59cb,\u7136\u540e\u53bb\u8ffd\u8e2a\u5f62\u72b6\u6216\u662f\u989c\u8272\u53d1\u751f\u7684\u5bf9\u8c61. -AutoTracker.Info.Mask2=\u81ea\u52a8\u5339\u914d\u6807\u51c6\u662f\u81ea\u52a8\u6807\u8bb0\u6240\u8981\u6ee1\u8db3\u7684\u6700\u4f4e\u6807\u51c6. -AutoTracker.Info.Mask.Instructions=\u901a\u8fc7\u62d6\u52a8\u6a21\u677f\u7684\u8fb9\u6216\u8005\u89d2\u4e0a\u7684\u53e5\u67c4\u53ef\u4ee5\u79fb\u52a8\u6216\u8c03\u6574\u6a21\u677f\u7684\u5927\u5c0f(\u4ec5\u9650\u4e8e\u5173\u952e\u5e27). \u8c03\u6574\u6f14\u5316\u901f\u7387\u548c\u81ea\u52a8\u8ffd\u8e2a\u7ea7\u522b\u4e00\u822c\u4f7f\u7528spinners. -AutoTracker.Info.Mask.Tip=\u81ea\u52a8\u6807\u8bb0\u7ea7\u522b\u8fc7\u4f4e\u4f1a\u5bfc\u81f4\u9519\u8bef\u7684\u6807\u8bb0,\u8bf7\u5c1d\u8bd5\u63d0\u9ad8\u6f14\u5316\u901f\u5ea6. -AutoTracker.Info.Search=\u626b\u63cf\u641c\u7d22\u533a\u57df\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d. -AutoTracker.Info.SearchOnAxis=\u626b\u63cf\u641c\u7d22\u533a\u57dfx\u8f74\u65b9\u5411\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d. -AutoTracker.Info.Search.Instructions=\u901a\u8fc7\u62d6\u52a8\u641c\u7d22\u533a\u57df\u7684\u8fb9\u6216\u89d2\u4e0a\u7684\u53e5\u67c4\u53ef\u4ee5\u79fb\u52a8\u6216\u8005\u6539\u53d8\u641c\u7d22\u533a\u57df\u7684\u5927\u5c0f.\u9009\u62e9\u76f8\u5e94\u7684\u9009\u9879\u8bbe\u7f6e\u6cbfx-axis\u65b9\u5411\u626b\u63cf\u548c\u5411\u524d\u626b\u63cf. -AutoTracker.Info.Search.Tip=\u5728\u5f88\u591a\u60c5\u51b5\u4e0b,\u641c\u7d22\u533a\u57df\u4e0d\u9700\u8981\u5f88\u5927.\u5411\u524d\u641c\u7d22\u9009\u9879\u81ea\u52a8\u7684\u5c06\u641c\u7d22\u533a\u57df\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u9884\u6d4b\u7684\u5339\u914d\u4f4d\u7f6e. -AutoTracker.Info.Target=\u76ee\u6807\u5c31\u5728\u88ab\u6807\u8bb0\u7684\u8f68\u8ff9\u70b9\u51fa. -AutoTracker.Info.Target.Instructions=\u62d6\u52a8\u9f20\u6807\u4ee5\u79fb\u52a8\u76ee\u6807(\u4ec5\u5173\u952e\u5e27). \u4f7f\u7528spinner\u6539\u53d8\u76ee\u6807\u70b9. -AutoTracker.Info.Target.Tip= -AutoTracker.Info.Title.Settings=\u8bbe\u7f6e -AutoTracker.Info.Title.Tip=\u63d0\u793a -AutoTracker.Info.SelectTrack=\u8bf7\u521b\u5efa\u6216\u8005\u9009\u62e9\u81ea\u52a8\u8ffd\u8e2a\u6240\u9700\u8981\u7684\u8f68\u8ff9,\u5750\u6807\u8f74,\u6216\u8005\u5b9a\u6807\u5de5\u5177. -AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 -AutoTracker.Wizard.Button.Pause=\u6682\u505c -AutoTracker.Wizard.Button.Skip=\u8df3\u8fc7 -AutoTracker.Wizard.Button.Search=\u641c\u7d22 -AutoTracker.Wizard.Button.SearchThis=\u641c\u7d22\u8fd9\u4e2a -AutoTracker.Wizard.Button.SearchNext=\u641c\u7d22\u4e0b\u4e00\u4e2a -AutoTracker.Wizard.Button.Delete=\u5220\u9664 -AutoTracker.Wizard.Button.ShowKeyFrame=\u663e\u793a\u5173\u952e\u5e27 -AutoTracker.Wizard.Button.DeleteKeyFrame=\u5220\u9664\u5173\u952e\u5e27 -AutoTracker.Wizard.Checkbox.LookAhead=\u5411\u524d\u67e5\u627e -AutoTracker.Wizard.Checkbox.XAxis=\u4ec5X\u8f74 -AutoTracker.Wizard.Menuitem.DeleteThis=\u5f53\u524d\u70b9 -AutoTracker.Wizard.Menuitem.DeleteLater=\u540e\u7eed\u70b9 -AutoTracker.Wizard.Menuitem.DeleteAll=\u6240\u6709\u70b9 -TToolBar.Button.AutoTracker.Tooltip=\u663e\u793a/\u9690\u85cf\u81ea\u52a8\u8ffd\u8e2a -MainTView.Popup.MenuItem.ZoomIn=Zoom In -MainTView.Popup.MenuItem.ZoomOut=Zoom Out -MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit -TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration -TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than -TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from -TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. -TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: -TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=No resource could be loaded for node - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift-click to mark -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Directories -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Clear on exit -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=Save -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=Algorithms... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: -AlgorithmDialog.Title=Algorithms -AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. -AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. -AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=The file cannot be read. -TrackPlottingPanel.Popup.Menu.CompareWith=Compare With -TrackerPanel.DataBuilder.TrackType.Unknown=unknown -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=Load Data Functions -TrackerPanel.DataBuilder.Load.Message=Select functions to load: -TrackerPanel.DataBuilder.Save.Title=Save Data Functions -TrackerPanel.DataBuilder.Save.Message=Select functions to save: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into -TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection -TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type -TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. -TToolbar.Button.Refresh=Refresh data and views - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as -ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportTRKDialog.Complete.Title=Export Complete -ExportTRKDialog.Title=Export ZIP Resource -ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. -ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. -TMenuBar.MenuItem.TabClip=ZIP Resource -TMenuBar.Menu.CalibrationTools=Calibration Tools -TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=end -TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Attach Ends -AttachmentInspector.Label.End=End -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Name -AttachmentInspector.Header.AttachedTo=Attach To -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Attach Ends... -PerspectiveTrack.Corner=corner -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=time -Protractor.Data.Description.1=protractor angle -Protractor.Data.Description.2=length of arm 1 -Protractor.Data.Description.3=length of arm 2 -Protractor.Data.Description.4=step number -Protractor.Data.Description.5=frame number -TapeMeasure.Data.Description.0=time -TapeMeasure.Data.Description.1=length -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=step number -TapeMeasure.Data.Description.4=frame number - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Add -Dialog.Button.Remove=Remove -PrefsDialog.Button.ClearHost=Clear Host -PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache -PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache -TActions.Action.SaveZip=Export ZIP Resource -ThumbnailDialog.Title=Export Thumbnail Image -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Current image -ThumbnailDialog.Label.FrameNumber=frame -ThumbnailDialog.Label.StepNumber=step -ThumbnailDialog.View.VideoOnly=Video Only -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Thumbnail Image -TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser -TTrack.MenuItem.DeletePoint=Delete Selected Step -ZipResourceDialog.Title=Export ZIP Resource -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Name -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Keywords -ZipResourceDialog.Label.Link=External Link -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Success -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource -ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource -ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File -ZipResourceDialog.Button.AddFiles=Add Files -ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File -ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file -ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? -ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch -ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files -ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) -ZipResourceDialog.Tooltip.Author=Authors of this resource -ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) -ZipResourceDialog.Tooltip.Description=A useful description of this resource -ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser -ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource -ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type -ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource -ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video -ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file +# This is the Simplified Chinese tracker.properties file +# Translated by Xiaobin Ding, Nov 2011 +Calibration.Name=\u5b9a\u6807\u70b9 +Calibration.New.Name=\u5b9a\u6807\u70b9 +CenterOfMass.Name=\u8d28\u5fc3 +CenterOfMass.New.Name=\u5398\u7c73 +CenterOfMass.MenuItem.Inspector=\u9009\u62e9\u8d28\u70b9... +CenterOfMassInspector.Title=\u8d28\u5fc3 +CenterOfMassInspector.Border.Title=\u9009\u62e9\u8d28\u70b9 +ConfigInspector.Border.Title=Desired Features +ConfigInspector.Title=\u504f\u597d\u8bbe\u5b9a +ConfigInspector.Button.SaveAsDefault=\u4fdd\u5b58\u4e3a\u9ed8\u8ba4 +CoordAxes.Name=\u8f74 +CoordAxes.New.Name=\u8f74 +Dialog.Button.Cancel=\u53d6\u6d88 +Dialog.Button.OK=\u786e\u8ba4 +Dialog.Button.Close=\u5173\u95ed +Dialog.Button.All=\u6240\u6709 +Dialog.Button.None=\u65e0 +Dialog.Button.Copy=\u590d\u5236 +Dialog.Button.Update=\u66f4\u65b0 +Dialog.Button.SelectAll=\u9009\u62e9\u6240\u6709 +Footprint.Diamond=\u83f1\u5f62 +Footprint.BoldDiamond=\u7c97\u83f1\u5f62 +Footprint.SolidDiamond=\u5b9e\u5fc3\u83f1\u5f62 +Footprint.Triangle=\u4e09\u89d2\u5f62 +Footprint.BoldTriangle=\u7c97\u4e09\u89d2\u5f62 +Footprint.SolidTriangle=\u5b9e\u5fc3\u4e09\u89d2\u5f62 +Footprint.Circle=\u5706\u5f62 +Footprint.BoldCircle=\u7c97\u5706\u5f62 +Footprint.SolidCircle=\u5b9e\u5fc3\u5706\u5f62 +Footprint.VerticalLine=\u7ad6\u7ebf +Footprint.BoldVerticalLine=\u7c97\u7ad6\u7ebf +Footprint.HorizontalLine=\u6c34\u5e73\u7ebf +Footprint.BoldHorizontalLine=\u7c97\u6c34\u5e73\u7ebf +Footprint.Crosshair=\u4ea4\u53c9\u7ebf +Footprint.BoldCrosshair=\u7c97\u4ea4\u53c9\u7ebf +Footprint.SimpleAxes=\u8f74\u7ebf +Footprint.BoldSimpleAxes=\u7c97\u8f74\u7ebf +Footprint.Spot=\u70b9 +Footprint.Line=\u7ebf +Footprint.BoldLine=\u7c97\u7ebf +Footprint.Outline=\u8f6e\u5ed3\u7ebf +Footprint.BoldOutline=\u7c97\u8f6e\u5ed3\u7ebf +Footprint.Arrow=\u7bad\u5934 +Footprint.BoldArrow=\u7c97\u7bad\u5934 +Footprint.DoubleArrow=\u53cc\u5411\u7bad\u5934 +Footprint.BoldDoubleArrow=\u7c97\u53cc\u5411\u7bad\u5934 +Footprint.2xArrow=2x arrow +Footprint.Bold2xArrow=bold 2x arrow +Footprint.4xArrow=4x arrow +Footprint.Bold4xArrow=bold 4x arrow +Footprint.DashArrow=\u865a\u7ebf\u7bad\u5934 +Footprint.BoldDashArrow=\u7c97\u865a\u7ebf\u7bad\u5934 +Footprint.BigArrow=\u5927\u7bad\u5934 +Footprint.BigDashArrow=\u5927\u865a\u7ebf\u7bad\u5934 +LineProfile.Name=\u7ebf\u578b +LineProfile.New.Name=\u7ebf\u578b +LineProfile.Data.Brightness=\u4eae\u5ea6 +LineProfile.Data.Pixel=\u50cf\u7d20 +LineProfile.Data.Red=\u7ea2 +LineProfile.Data.Green=\u7eff +LineProfile.Data.Blue=\u84dd +LineProfile.Data.Weighting=count +MainTView.Popup.MenuItem.QTPlayer=QuickTime \u64ad\u653e\u5668 +MainTView.Popup.MenuItem.Zoom=\u7f29\u653e +MainTView.Popup.MenuItem.ToFit=\u81ea\u9002\u5e94 +OffsetOrigin.Name=\u539f\u70b9\u504f\u79fb +OffsetOrigin.New.Name=\u539f\u70b9\u504f\u79fb +PlotTrackView.Button.PlotCount=\u753b\u56fe +PlotTrackView.Button.PlotCount.ToolTip=\u8bbe\u7f6e\u753b\u56fe\u6570\u76ee +PointMass.Name=\u8d28\u70b9 +PointMass.New.Name=\u8d28\u91cf +PointMass.MenuItem.VectorsToPosition=\u4f4d\u7f6e\u77e2\u91cf +PointMass.MenuItem.Velocity=\u901f\u5ea6 +PointMass.MenuItem.Acceleration=\u52a0\u901f\u5ea6 +Star.Name=\u661f\u5f62 +Star.New.Name=\u661f\u5f62 +TableTrackView.Action.CopyData=\u590d\u5236\u6570\u636e +TableTrackView.Button.SelectTableData=\u8868\u683c +TableTrackView.Button.SelectTableData.ToolTip=\u9009\u62e9\u8868\u683c\u5217 +TableTrackView.Popup.MenuItem.Analyze=\u5206\u6790... +TableTrackView.Dialog.Border.Title=\u53ef\u89c1: +TActions.Action.Description=\u5907\u6ce8 +TActions.Action.ClearTracks=\u6e05\u9664\u6240\u6709 +TActions.Action.NewTab=\u65b0\u5efa\u6807\u7b7e\u9875 +TActions.Action.Copy=\u590d\u5236 +TActions.Action.Paste=\u7c98\u8d34 +TActions.Action.Open=\u6253\u5f00... +TActions.Action.Close=\u5173\u95ed\u6807\u7b7e +TActions.Action.Import=\u5bfc\u5165... +TActions.Action.Save=\u5b58\u50a8\u6807\u7b7e +TActions.Action.SaveAs=\u6807\u7b7e\u53e6\u5b58\u4e3a... +TActions.Action.Export=\u5bfc\u51fa... +TActions.Action.CaptureVideo=\u6355\u83b7\u89c6\u9891... +TActions.Action.Delete=\u5220\u9664 +TActions.Action.Config=\u504f\u597d\u8bbe\u7f6e... +TActions.Action.AxesVisible=\u663e\u793a +TActions.Action.TapeVisible=\u663e\u793a +TActions.Action.Print=\u6253\u5370... +TActions.Action.ClearFilters=\u6e05\u9664 +TActions.Action.ImportVideo=\u5bfc\u5165... +TActions.Action.CloseVideo=\u5173\u95ed +TActions.Action.CloseAll=\u5173\u95ed\u6240\u6709\u6807\u7b7e +TActions.Action.Exit=\u9000\u51fa +TActions.Dialog.PrintError.Message=\u6253\u5370\u9519\u8bef +TActions.Dialog.PrintError.Title=\u6253\u5370\u9519\u8bef +TActions.Dialog.Description.Title=\u8bf4\u660e: +TActions.Dialog.DeleteLockedTracks.Message=\u90e8\u5206\u8f68\u8ff9\u5df2\u88ab\u9501\u5b9a\uff0c\u662f\u5426\u7ee7\u7eed\u5220\u9664? +TActions.Dialog.DeleteLockedTracks.Title=\u5220\u9664\u9501\u5b9a\u8f68\u8ff9? +TActions.Dialog.NewPointMass.Title=\u65b0\u8d28\u70b9 +TapeMeasure.Name=\u6d4b\u91cf\u5c3a +TapeMeasure.New.Name=\u5c3a\u5b50 +TapeMeasure.MenuItem.Fixed=\u56fa\u5b9a\u70b9 +TFrame.View.Plot=\u56fe\u5f62\u89c6\u56fe +TFrame.View.Table=\u8868\u683c\u89c6\u56fe +TFrame.View.World=\u5168\u90e8\u89c6\u56fe +TFrame.View.Video=\u89c6\u9891\u89c6\u56fe +TFrame.Dialog.Help.Title=Tracker\u5e2e\u52a9 +TMenuBar.Menu.File=\u6587\u4ef6 +TMenuBar.Menu.Edit=\u7f16\u8f91 +TMenuBar.Menu.Video=\u89c6\u9891 +TMenuBar.Menu.Tracks=\u8f68\u8ff9 +TMenuBar.Menu.Coords=\u5ea7\u6807\u7cfb +TMenuBar.Menu.Window=\u7a97\u53e3 +TMenuBar.Menu.Help=\u5e2e\u52a9 +TMenuBar.MenuItem.EditProperties=\u5c5e\u6027... +TMenuBar.MenuItem.VideoVisible=\u663e\u793a +TMenuBar.MenuItem.VideoFilters=\u6ee4\u955c +TMenuBar.MenuItem.NewVideoFilter=\u6dfb\u52a0 +TMenuBar.MenuItem.NewTrack=\u65b0\u5efa +TMenuBar.MenuItem.CoordsLocked=\u9501\u5b9a +TMenuBar.MenuItem.CoordsFixedOrigin=\u56fd\u5b9a\u539f\u70b9 +TMenuBar.MenuItem.CoordsFixedAngle=\u56fa\u5b9a\u89d2\u5ea6 +TMenuBar.MenuItem.CoordsFixedScale=\u56fa\u5b9a\u6bd4\u4f8b +TMenuBar.MenuItem.CoordsRefFrame=\u53c2\u8003\u7cfb +TMenuBar.MenuItem.CoordsDefault=\u9ed8\u8ba4 +TMenuBar.MenuItem.WindowRight=\u53f3\u8fb9\u680f +TMenuBar.MenuItem.WindowBottom=\u4e0b\u8fb9\u680f +TMenuBar.MenuItem.PlayAllSteps=\u64ad\u653e\u6240\u6709\u6b65\u9aa4 +TMenuBar.MenuItem.Record=\u5f55\u5236 +TMenuBar.MenuItem.MatSize=\u533a\u57df\u5927\u5c0f +TMenuBar.MenuItem.Language=\u8bed\u8a00 +TMenuBar.MenuItem.DeleteTrack=\u5220\u9664 +TMenuBar.MenuItem.TrackerHelp=Tracker \u5e2e\u52a9... +TMenuBar.MenuItem.MessageLog=\u4fe1\u606f\u65e5\u5fd7... +TrackControl.Name=\u8f68\u8ff9\u63a7\u5236 +TrackControl.Button.NewTrack=\u521b\u5efa +TrackControl.Button.NewTrack.ToolTip=\u521b\u5efa\u4e00\u4e2a\u65b0\u8f68\u8ff9 +TrackControl.Button.Trails.ToolTip=\u8bbe\u5b9a\u8f68\u8ff9\u957f\u5ea6 +TrackControl.Button.Labels.ToolTip=\u663e\u793a/\u9690\u85cf\u7f16\u53f7 +TrackControl.Button.StretchVectors.ToolTip=\u62c9\u957f\u77e2\u91cf +TrackControl.Button.Accelerations.ToolTip=\u663e\u793a/\u9690\u85cf\u52a0\u901f\u5ea6\u77e2\u91cf +TrackControl.Button.Xmass.ToolTip=\u8d28\u91cf\u4e58\u4ee5\u77e2\u91cf +TrackControl.Button.Vectors.ToolTip=\u77e2\u91cf +TrackControl.Button.Velocities.ToolTip=\u663e\u793a/\u9690\u85cf\u901f\u5ea6\u77e2\u91cf +TrackControl.Button.Properties.ToolTip=\u70b9\u51fb\u5e76\u9009\u62e9 +TrackControl.Button.Positions.ToolTip=\u663e\u793a/\u9690\u85cf\u4f4d\u7f6e +Tracker.Popup.MenuItem.Snapshot=\u5feb\u7167... +Tracker.Popup.MenuItem.Help=\u5e2e\u52a9... +Tracker.Cursor.Crosshair.Description=\u5341\u5b57\u7ebf\u9f20\u6807 +Tracker.Action.AboutTracker=\u5173\u4e8eTracker... +Tracker.Dialog.AboutTracker.Title=\u5173\u4e8eTracker +Tracker.Action.AboutJava=\u5173\u4e8eJava... +Tracker.Dialog.AboutJava.Title=\u5173\u4e8eJava +Tracker.Dialog.AboutJava.UnknownVersion=\u672a\u77e5 +Tracker.Dialog.AboutJava.Message=Java\u7248\u672c +Tracker.Action.AboutQT=\u5173\u4e8eQuickTime... +Tracker.Dialog.AboutQT.Title=\u5173\u4e8eQuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime\u7248\u672c +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava\u7248\u672c +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava\u8def\u5f84: +Tracker.Dialog.NoQT.Title=QTJava.zip \u672a\u627e\u5230 +Tracker.Dialog.NoQT.Message1=QuickTime for Java\u5c1a\u672a\u5b89\u88c5. +Tracker.Dialog.NoQT.Message2=\u5982\u679c\u60a8\u8981\u5206\u6790QuickTime\u89c6\u9891\uff0c\u8bf7\u91cd\u65b0\u5b89\u88c5QuickTime. +Tracker.Dialog.NoQT.Message3=\u6ce8\u610f:\u5728\u60a8\u5b89\u88c5Quicktime\u65f6\uff0c\u8bf7\u9009\u62e9QuickTime for Java. +Tracker.Dialog.UpdateQT.Title=\u66f4\u65b0QTJava.zip +Tracker.Dialog.UpdateQT.Message1=\u53d1\u73b0\u65b0\u7248QTJava.zip +Tracker.Dialog.UpdateQT.Message2=\u662f\u5426\u8981\u66f4\u65b0\u73b0\u6709\u7684\u6587\u4ef6? +Tracker.Dialog.CopyQT.Title=\u590d\u5236QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime\u5df2\u7ecf\u5b89\u88c5,\u4f46\u5728Tracker\u80fd\u4f7f\u7528\u4e4b\u524d: +Tracker.Dialog.CopyQT.Message2= 1. \u5fc5\u987b\u5c06QTJava.zip\u4ece +Tracker.Dialog.CopyQT.Message3= \u590d\u5236\u5230 +Tracker.Dialog.CopyQT.Message4= 2. \u5fc5\u987b\u91cd\u542fTracker. +Tracker.Dialog.CopyQT.Message5=\u73b0\u5728\u5c31\u8981\u590d\u5236QTJava.zip\u5417? +Tracker.Dialog.CopyFailed.Title=\u590d\u5236\u5931\u8d25 +Tracker.Dialog.CopyFailed.Message=\u4e0d\u80fd\u590d\u5236QTJava.zip. +Tracker.Dialog.CopiedTo.Title=\u590d\u5236\u6210\u529f +Tracker.Dialog.CopiedTo.Message1=QTJava.zip\u88ab\u6210\u529f\u7684\u590d\u5236\u5230 +Tracker.Dialog.CopiedTo.Message2=\u5fc5\u987b\u91cd\u542fTracker, \u73b0\u5728\u5c06\u8981\u9000\u51fa\u7a0b\u5e8f. +Tracker.Splash.Loading=\u8f7d\u5165 +TrackerIO.Dialog.Import.Title=\u5bfc\u5165Tracker\u6587\u4ef6 +TrackerIO.Dialog.Import.Message=\u5bfc\u51fa\u9009\u5b9a\u9879\u76ee +TrackerIO.Dialog.ImportVideo.Title=\u5bfc\u5165\u89c6\u9891 +TrackerIO.Dialog.Export.Title=\u5bfc\u51fa +TrackerIO.Dialog.Export.Message=\u5bfc\u51fa\u9009\u5b9a\u9879\u76ee +TrackerIO.Dialog.ReplaceFile.Title=\u662f\u5426\u66ff\u6362\u73b0\u5b58\u6587\u4ef6? +TrackerIO.Dialog.ReplaceFile.Message=\u6587\u4ef6\u5df2\u7ecf\u5b58\u5728. \u662f\u5426\u66ff\u6362? +TrackerIO.Dialog.NotTrackerXML.Title=XML\u4e0d\u5339\u914d +TrackerIO.Dialog.NotTrackerXML.Message=\u5305\u542b\u6765\u81ea\u4e8e\u4e0d\u540c\u5e94\u7528\u7684xml\u6570\u636e. +TrackerIO.Dialog.BadVideo.Message=\u65e0\u6cd5\u8bc6\u522b\u7684\u89c6\u9891\u7c7b\u578b: +TrackerIO.Dialog.BadVideo.Title=\u65e0\u6cd5\u8bc6\u522b\u89c6\u9891 +TrackerPanel.NewTab.Name=\u65e0\u6807\u9898 +TrackerPanel.DragToMark.Hint=\u6309\u4f4fShift\u952e\u5e76\u62d6\u52a8\u6807\u8bb0 +TrackerPanel.ClickToMark.Hint=\u6309\u4f4fShift\u952e\u5e76\u70b9\u51fb\u9f20\u6807\u5de6\u952e\u6807\u8bb0 +TrackerPanel.Dialog.LoadFailed.Title=Tracker\u6587\u4ef6\u8f7d\u5165\u5931\u8d25 +TrackerPanel.Dialog.LoadFailed.Message=Tracker\u6587\u4ef6\u683c\u5f0f\u9519\u8bef: +TrackerPanel.Dialog.SaveChanges.Title=\u4fdd\u5b58\u4fee\u6539 +TrackerPanel.Dialog.SaveChanges.Message=\u4fee\u6539\u4fdd\u5b58\u4e3a +TrackPlottingPanel.Popup.MenuItem.Lines=\u76f4\u7ebf +TrackPlottingPanel.Popup.MenuItem.Points=\u70b9 +TrackPlottingPanel.Popup.MenuItem.Scale=\u7f29\u653e... +TrackPlottingPanel.Popup.MenuItem.Print=\u6253\u5370... +TrackPlottingPanel.Popup.MenuItem.Measure=\u81ea\u52a8\u7f29\u653e +TrackPlottingPanel.Popup.MenuItem.Analyze=\u5206\u6790... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u7f29\u5c0f +TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u653e\u5927 +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u81ea\u52a8\u7f29\u653e +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u7f29\u653e\u81f3\u5408\u9002\u6bd4\u4f8b +TrackPlottingPanelInspector.Title=\u7f29\u653e +TrackPlottingPanelInspector.Label.Min=\u6700\u5c0f\u503c +TrackPlottingPanelInspector.Label.Max=\u6700\u5927\u503c +TrackPlottingPanelInspector.Label.Auto=\u81ea\u52a8 +TToolBar.Button.Footprint.Tooltip=\u8bbe\u7f6e\u8f68\u8ff9 +TToolBar.Dropdown.SelectedTrack.Tooltip=\u9009\u53d6\u8f68\u8ff9 +TToolBar.Dropdown.SelectedTrack.None=\u672a\u9009\u62e9\u8f68\u8ff9 +TTrack.MenuItem.Delete=\u5220\u9664 +TTrack.MenuItem.Color=\u989c\u8272... +TTrack.Dialog.Color.Title=\u9009\u62e9\u8f68\u8ff9\u989c\u8272 +TTrack.MenuItem.Name=\u547d\u540d... +TTrack.MenuItem.Footprint=\u8f68\u8ff9 +TTrack.MenuItem.Description=\u5907\u6ce8... +TTrack.MenuItem.Visible=\u53ef\u89c1 +TTrack.MenuItem.TrailVisible=\u8f68\u8ff9\u53ef\u89c1 +TTrack.MenuItem.Autostep=\u81ea\u52a8\u8865\u507f +TTrack.MenuItem.MarkByDefault=\u6807\u8bb0\u4e3a\u9ed8\u8ba4 +TTrack.MenuItem.Locked=\u9501\u5b9a +TTrack.MenuItem.Delete=\u5220\u9664 +TTrack.Name.None=\u672a\u547d\u540d +TTrack.Dialog.Description.Title=\u8bf4\u660e: +TTrack.Dialog.Name.Title=\u8bbe\u7f6e\u540d\u79f0 +TTrack.Dialog.Name.Label=\u540d\u79f0: +TViewChooser.Button.Choose.Tooltip=\u9009\u62e9\u89c6\u56fe +Vector.Name=\u77e2\u91cf +Vector.New.Name=\u77e2\u91cf +Vector.MenuItem.ToOrigin=\u5230\u539f\u70b9 +Vector.MenuItem.Label=\u663e\u793a\u6807\u7b7e +VectorSum.Name=\u77e2\u91cf\u548c +VectorSum.New.Name=\u6c42\u548c +VectorSum.MenuItem.Inspector=\u9009\u62e9\u77e2\u91cf... +VectorSumInspector.Title=\u77e2\u91cf\u548c +VectorSumInspector.Border.Title=\u9009\u62e9\u77e2\u91cf +WorldTView.Popup.MenuItem.Projectile=\u629b\u7269\u8fd0\u52a8\u6a21\u578b + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=\u7c92\u5b50\u8fd0\u52a8\u5b66\u6a21\u578b +AnalyticParticle.Inspector.Title=\u7c92\u5b50\u8fd0\u52a8\u5b66\u6a21\u578b +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=\u534a\u5f84 4 +CircleFootprint.Circle_6=\u534a\u5f84 6 +CircleFootprint.Circle_8=\u534a\u5f84 8 +DynamicParticle.Name=\u7c92\u5b50\u52a8\u529b\u5b66\u6a21\u578b(\u7b1b\u5361\u5c14\u5ea7\u6807\u7cfb) +DynamicParticle.Inspector.Title=\u7c92\u5b50\u52a8\u529b\u5b66\u6a21\u578b +DynamicParticle.Property.ForceX=x\u65b9\u5411\u5206\u529b +DynamicParticle.Property.ForceY=y\u65b9\u5411\u5206\u529b +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=\u56fa\u5b9a\u4f4d\u7f6e +ParticleModel.New.Name=\u6a21\u578b +ParticleModel.MenuItem.InspectModel=\u6a21\u578b\u521b\u5efa\u5de5\u5177... +ParticleModel.Inspector.Button.Undo=\u64a4\u9500 +ParticleModel.Inspector.Button.Redo=\u6062\u590d\u64a4\u9500 +ParticleModel.Inspector.Button.Close=\u5173\u95ed +ParticleModel.Inspector.Button.Help=\u5e2e\u52a9 + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=\u4ec5X +Calibration.Axes.YOnly=\u4ec5Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=\u9009\u62e9\u5b9a\u6807\u8f74 +Calibration.Label.Axes=\u8f74 +Calibration.Dialog.InvalidCoordinates.Title=\u4e0d\u6b63\u786e\u7684\u5750\u6807 +Calibration.Dialog.InvalidCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u5177\u6709\u76f8\u540c\u7684\u5ea7\u6807\u503c. +Calibration.Dialog.InvalidXCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u6709\u76f8\u540c\u7684x\u5ea7\u6807\u503c. +Calibration.Dialog.InvalidYCoordinates.Message=\u591a\u70b9\u4e0d\u80fd\u6709\u76f8\u540c\u7684y\u5ea7\u6807\u503c. +SpectralLineFilter.Title=\u6c14\u4f53\u5149\u8c31 +SpectralLineFilter.H=\u6c22 H +SpectralLineFilter.He=\u6c26 He +SpectralLineFilter.Ne=\u6c16 Ne +SpectralLineFilter.Hg=\u6c5e Hg +TFrame.View.Unknown=\u67e5\u770b +TMenuBar.MenuItem.Undo=\u64a4\u9500 +TMenuBar.MenuItem.Redo=\u6062\u590d\u64a4\u9500 +TMenuBar.MenuItem.Replace=\u66ff\u6362... +TMenuBar.Menu.AddImage=\u5bfc\u5165\u56fe\u50cf +TMenuBar.MenuItem.AddBefore=\u5728\u6b64\u5e27\u524d... +TMenuBar.MenuItem.AddAfter=\u5728\u6b64\u5e27\u540e... +TMenuBar.MenuItem.RemoveImage=\u5220\u9664\u8be5\u5e27 +TMenuBar.Menu.Tools=\u5de5\u5177 +TMenuBar.MenuItem.DataFunctionTool=\u6570\u503c\u521b\u5efa\u5de5\u5177 +TMenuBar.MenuItem.DatasetTool=\u6570\u503c\u5de5\u5177 +TMenuBar.Menu.CopyImage=\u590d\u5236\u56fe\u50cf +TMenuBar.MenuItem.CopyMainView=\u4e3b\u89c6\u56fe +TMenuBar.MenuItem.CopyFrame=\u5e27 +TMenuBar.MenuItem.PrintFrame=\u6253\u5370... +TrackerIO.Dialog.AddImage.Title=\u5bfc\u5165\u9009\u5b9a\u7684\u4e00\u4e2a\u6216\u591a\u4e2a\u56fe\u50cf +TTrack.Dialog.Name.BadName=\u5df2\u88ab\u4f7f\u7528. \u8bf7\u53e6\u9009\u5176\u4ed6\u540d\u79f0. +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=\u5408\u529b +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=\u7ed8\u56fe\u5f62\u5f0f\u7684\u8f68\u8ff9\u8d44\u6599. +TableTView.Label.NoData=\u8868\u683c\u5f62\u5f0f\u7684\u8f68\u8ff9\u8d44\u6599. +TrackerPanel.Message.NoData0=\u89c6\u9891\u53ca\u8f68\u8ff9\u7684\u4e3b\u8981\u663e\u793a\u533a\u57df. +TrackerPanel.Message.NoData1=\u9009\u62e9 \u6587\u4ef6|\u6253\u5f00 \u6216 \u8f68\u8ff9|\u65b0\u5efa \u5f00\u59cb. +WorldTView.Label.NoData=\u5750\u6807\u53ca\u8f68\u8ff9\u7684\u4e3b\u8981\u663e\u793a\u533a\u57df. + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=\u8fd4\u7a0b\u6c42\u89e3\u65b9\u6cd5: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=\u81ea\u9002\u5e94\u591a\u6b65\u957f\u65b9\u6cd5 +DynamicParticle.Table.Force.Border.Title=\u529b\u51fd\u6570 (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=\u4f4d\u7f6e\u51fd\u6570 (t) +ParticleModel.Table.Initial.Border.Title=\u521d\u503c +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=\u7c98\u8d34\u56fe\u50cf +TMenuBar.MenuItem.PasteAfter=\u5728\u6b64\u5e27\u540e +TMenuBar.MenuItem.PasteBefore=\u5728\u6b64\u5e27\u524d +TMenuBar.MenuItem.PasteReplace=\u66ff\u6362\u89c6\u9891 + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=\u5f00\u59cb... +Tracker.Splash.HelpMessage=\u65b0\u7528\u6237\u8bf7\u70b9\u51fb + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=\u4e0e\u6c34\u5e73\u65b9\u5411\u5939\u89d2 +LineProfile.Checkbox.Rotates=\u65cb\u8f6c +LineProfile.Label.Spread=\u5e73\u94fa +RGBRegion.Name=RGB\u533a\u57df +RGBRegion.New.Name=\u533a\u57df +RGBRegion.MenuItem.Fixed=\u56fa\u5b9a\u70b9 +RGBRegion.Label.Radius=\u50cf\u7d20\u534a\u5f84 +TTrack.Label.Step=\u6b65\u9aa4 + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=\u4f4d\u7f6e\u9700\u8981 +LineProfile.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf +LineProfile.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf +LineProfile.Data.Description.3=\u7ea2 +LineProfile.Data.Description.4=\u7eff +LineProfile.Data.Description.5=\u84dd +LineProfile.Data.Description.6=\u89c6\u89c9\u4eae\u5ea6 +LineProfile.Data.Description.7=\u7ebf\u5bbd +ParticleModel.MenuItem.TraceVisible=\u663e\u793a\u8f68\u8ff9 +ParticleModel.MenuItem.StepsVisible=\u663e\u793a\u6b65\u9aa4 +PointMass.Data.Description.0=\u65f6\u95f4 +PointMass.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf +PointMass.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf +PointMass.Data.Description.3=\u4f4d\u7f6e\u5927\u5c0f +PointMass.Data.Description.4=\u4f4d\u7f6e\u89d2\u5ea6 +PointMass.Data.Description.5=\u901f\u5ea6x\u5206\u91cf +PointMass.Data.Description.6=\u901f\u5ea6y\u5206\u91cf +PointMass.Data.Description.7=\u901f\u5ea6\u5927\u5c0f +PointMass.Data.Description.8=\u901f\u5ea6\u89d2\u5ea6 +PointMass.Data.Description.9=\u52a0\u901f\u5ea6x\u5206\u91cf +PointMass.Data.Description.10=\u52a0\u901f\u5ea6y\u5206\u91cf +PointMass.Data.Description.11=\u52a0\u901f\u5ea6\u5927\u5c0f +PointMass.Data.Description.12=\u52a0\u901f\u5ea6\u89d2\u5ea6 +PointMass.Data.Description.13=\u65cb\u8f6c\u89d2\u5ea6 +PointMass.Data.Description.14=\u89d2\u901f\u5ea6 +PointMass.Data.Description.15=\u89d2\u52a0\u901f\u5ea6 +PointMass.Data.Description.16=\u6b65\u9aa4\u5e8f\u53f7 +PointMass.Data.Description.17=\u5e27\u5e8f\u53f7 +PointMass.Data.Description.18=\u52a8\u91cfx\u5206\u91cf +PointMass.Data.Description.19=\u52a8\u91cfy\u5206\u91cf +PointMass.Data.Description.20=\u52a8\u91cf\u5927\u5c0f +PointMass.Data.Description.21=\u52a8\u91cf\u89d2\u5ea6 +PointMass.Data.Description.22=\u52a8\u80fd +RGBRegion.Data.Description.0=\u65f6\u95f4 +RGBRegion.Data.Description.1=\u4f4d\u7f6ex\u5206\u91cf +RGBRegion.Data.Description.2=\u4f4d\u7f6ey\u5206\u91cf +RGBRegion.Data.Description.3=\u7ea2 +RGBRegion.Data.Description.4=\u7eff +RGBRegion.Data.Description.5=\u84dd +RGBRegion.Data.Description.6=\u89c6\u89c9\u4eae\u5ea6 +RGBRegion.Data.Description.7=\u50cf\u7d20\u5e8f\u53f7 +RGBRegion.Data.Description.8=\u6b65\u9aa4\u5e8f\u53f7 +RGBRegion.Data.Description.9=\u5e27\u5e8f\u53f7 +TView.Menuitem.Define=\u5b9a\u4e49... +Vector.Data.Description.0=\u65f6\u95f4 +Vector.Data.Description.1=x\u65b9\u5411 +Vector.Data.Description.2=y\u65b9\u5411 +Vector.Data.Description.3=\u5927\u5c0f +Vector.Data.Description.4=\u89d2\u5ea6 +Vector.Data.Description.5=\u8f68\u8ff9\u5c3e\u90e8\u4f4d\u7f6ex\u5206\u91cf +Vector.Data.Description.6=\u8f68\u8ff9\u5c3e\u90e8\u4f4d\u7f6ey\u5206\u91cf +Vector.Data.Description.7=\u6b65\u9aa4\u5e8f\u53f7 +Vector.Data.Description.8=\u5e27\u5e8f\u53f7 + +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=\u7c92\u5b50\u7684\u8d28\u91cf +ParticleModel.Parameter.InitialTime.Description=\u521d\u59cb\u65f6\u523b +AnalyticParticle.PositionFunction.X.Description=\u4f4d\u7f6ex\u5206\u91cf +AnalyticParticle.PositionFunction.Y.Description=\u4f4d\u7f6ey\u5206\u91cf +DynamicParticle.ForceFunction.X.Description=\u529bx\u5206\u91cf +DynamicParticle.ForceFunction.Y.Description=\u529by\u5206\u91cf +DynamicParticle.Parameter.InitialX.Description=\u521d\u59cb\u4f4d\u7f6ex\u5206\u91cf +DynamicParticle.Parameter.InitialY.Description=\u521d\u59cb\u4f4d\u7f6ey\u5206\u91cf +DynamicParticle.Parameter.InitialVelocityX.Description=\u521d\u59cb\u901f\u5ea6x\u5206\u91cf +DynamicParticle.Parameter.InitialVelocityY.Description=\u521d\u59cb\u901f\u5ea6y\u5206\u91cf +TrackerPanel.ModelBuilder.Title=\u6a21\u578b\u6784\u5efa\u5de5\u5177 +TrackerPanel.DataBuilder.Title=\u6570\u636e\u6784\u5efa\u5de5\u5177 +TrackControl.TrailMenu.NoTrail=\u65e0\u8f68\u8ff9 +TrackControl.TrailMenu.ShortTrail=\u77ed\u8f68\u8ff9 +TrackControl.TrailMenu.LongTrail=\u5e38\u8f68\u8ff9 +TrackControl.TrailMenu.FullTrail=\u5b8c\u6574\u8f68\u8ff9 +TrackerPanel.ModelBuilder.Spinner.Tooltip=\u5f53\u524d\u9009\u5b9a\u8f68\u8ff9 +TrackerPanel.ModelBuilder.LineButton.Text=\u7ebf\u578b\u6837\u5f0f +TrackerPanel.ModelBuilder.LineButton.Tooltip=\u8bbe\u7f6e\u7ebf\u578b\u6837\u5f0f +ParticleModel.LineStyle.None=\u65e0\u76f4\u7ebf +ParticleModel.LineStyle.Connect=\u8fde\u63a5\u6b65\u9aa4 +ParticleModel.LineStyle.Smooth=\u5e73\u6ed1\u7ebf +ModelFunctionPanel.Label=\u6a21\u578b +AnalyticFunctionPanel.FunctionEditor.Border.Title=\u4f4d\u7f6e\u51fd\u6570 +DynamicFunctionPanel.FunctionEditor.Border.Title=\u529b\u51fd\u6570 + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=\u663e\u793a\u8868\u683c\u5217 +Tracker.About.ProjectOf=\u9879\u76ee\u4e3b\u6301\u4eba: +Tracker.About.TranslationBy=\u7ffb\u8bd1\u8005 +Tracker.About.Translator=Ding Xiaobin +TMenuBar.Menu.SaveVideoAs=\u89c6\u9891\u53e6\u5b58\u4e3a +TActions.SaveClipAs.ProgressMonitor.Message=\u89c6\u9891\u53e6\u5b58\u4e3a +TActions.SaveClipAs.ProgressMonitor.Progress=\u5b8c\u6210 + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=\u540c\u6b65 +PlotTrackView.Checkbox.Synchronize.Tooltip=\u7eb5\u5750\u6807\u540c\u6b65 +RGBRegion.MenuItem.FixedRadius=\u56fa\u5b9a\u534a\u5f84 +Tracker.VideoZoom.Hint=\u5355\u51fb\u9f20\u6807\u4ee5\u653e\u5927\u6216\u7f29\u5c0f\u67e5\u770b\uff0c\u53cc\u51fb\u5219\u81ea\u52a8\u7f29\u653e\u5230\u5408\u9002\u7684\u5927\u5c0f\u67e5\u770b +Tracker.PlotZoomIn.Hint=\u62d6\u52a8\u9f20\u6807\u7f29\u5c0f, \u53cc\u51fb\u5219\u81ea\u52a8\u7f29\u653e\u5230\u5408\u9002\u7684\u5927\u5c0f\u67e5\u770b +Tracker.PlotZoomOut.Hint=\u5355\u51fb\u9f20\u6807\u653e\u5927 +Tracker.MenuItem.Hints=\u663e\u793a\u63d0\u793a +TapeMeasure.Label.Length=\u957f\u5ea6 +TapeMeasure.Label.TapeAngle=\u4e0ex\u8f74\u4e4b\u95f4\u5939\u89d2 +TapeMeasure.Label.ArcAngle=\u91cf\u89d2\u5668\u89d2\u5ea6 +TrackerIO.Dialog.NotAnImage.Title=\u4e0d\u6b63\u786e\u7684\u6587\u4ef6\u7c7b\u578b. +TrackerIO.Dialog.NotAnImage.Message1=\u4e0d\u662fJPG\u6216GIF\u56fe\u50cf. +TrackerIO.Dialog.NotAnImage.Message2=\u662f\u5426\u7ee7\u7eed? +TToolBar.Button.Zoom.Tooltip=\u7f29\u653e\u5de5\u5177(Z) +TrackChooserTView.DropDown.Tooltip=\u9009\u62e9\u8f68\u8ff9 +TapeMeasure.Field.TapeAngle.Tooltip=x\u8f74\u6b63\u5411\u4e0e\u5377\u5c3a\u4e4b\u95f4\u7684\u89d2\u5ea6 +TapeMeasure.Field.Magnitude.Tooltip=\u957f\u5ea6\u5df2\u7ecf\u7528\u5750\u6807\u7cfb\u4e2d\u5355\u4f4d\u8868\u793a +TapeMeasure.Readout.Magnitude.Name=\u957f\u5ea6 +TapeMeasure.Readout.Magnitude.Hint=\u5750\u6807\u5355\u4f4d +TapeMeasure.Readout.Angle.Name=\u89d2\u5ea6\u8bfb\u6570 +TapeMeasure.Readout.Angle.Hint=\u4ece+x\u8f74\u6d4b\u5f97\u7684\u89d2\u5ea6 +TapeMeasure.End.Name=\u7ec8\u70b9 +TapeMeasure.End.Hint=\u62d6\u52a8\u9f20\u6807\u4ee5\u6d4b\u5b9a\u8ddd\u79bb\u548c\u89d2\u5ea6,\u6309\u4f4fShift\u952e\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0 +TapeMeasure.Handle.Name=\u628a\u624b +TapeMeasure.Handle.Hint=\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u62d6\u52a8\u4ee5\u79fb\u52a8\u5bf9\u8c61 +Vector.Tip.Name=\u5c16\u7aef +Vector.Tip.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 +Vector.Handle.Name=\u628a\u624b +Vector.Handle.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 +Vector.ShortHandle.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730,\u6309\u4f4fAlt\u952e\u70b9\u51fb\u9f20\u6807\u9009\u62e9\u5c16\u7aef +PointMass.Position.Name=\u4f4d\u7f6e +PointMass.Position.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 +PointMass.Velocity.Name=\u901f\u5ea6 +PointMass.Acceleration.Name=\u52a0\u901f\u5ea6 +PointMass.Vector.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 +PointMass.Position.Locked.Hint=\u70b9\u51fb\u9f20\u6807\u9009\u62e9,\u4e0d\u80fd\u62d6\u52a8 +CoordAxes.Handle.Name=+x\u8f74 +CoordAxes.Handle.Hint=\u62d6\u52a8\u4ee5\u6539\u53d8\u503e\u659c\u89d2\u5ea6 +CoordAxes.Origin.Name=\u539f\u70b9 +CoordAxes.Origin.Hint=\u62d6\u52a8\u5bf9\u8c61\u79fb\u52a8\u5230\u76ee\u7684\u5730 +OffsetOrigin.Position.Name=\u4f4d\u7f6e +OffsetOrigin.Position.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u79fb\u52a8\u539f\u70b9\u7684\u5750\u6807 +Calibration.Point.Name=\u70b9 +Calibration.Point.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u6539\u53d8\u5750\u6807\u8f74\u548c\u6bd4\u4f8b\u5c3a\u7684\u5750\u6807 +RGBRegion.Position.Name=\u4f4d\u7f6e +RGBRegion.Position.Hint=\u62d6\u52a8\u6216\u8f93\u5165\u5750\u6807\u4ee5\u6539\u53d8\u4f4d\u7f6e +LineProfile.End.Name=\u7ec8\u70b9 +LineProfile.End.Hint=\u62d6\u52a8\u4ee5\u8c03\u6574\u7ebf\u957f\u5ea6 +LineProfile.Handle.Name=\u628a\u624b +LineProfile.Handle.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8\u76f4\u7ebf +PointMass.Hint=\u5728\u5de5\u5177\u680f\u4e2d\u8bbe\u7f6e\u8d28\u91cf +PointMass.Unmarked.Hint=, \u6309\u4f4fShift\u952e\u5355\u51fb\u4ee5\u9009\u62e9 +TTrack.Unselected.Hint=\u5355\u51fb\u9009\u62e9\u5bf9\u8c61\u6216\u8bbe\u7f6e\u5c5e\u6027 +Vector.Unmarked.Hint=\u6309\u4f4fshift\u952e\u62d6\u52a8\u9f20\u6807\u6807\u8bb0 +OffsetOrigin.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u9f20\u6807\u4ee5\u91cd\u65b0\u6807\u8bb0 +Calibration.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u9f20\u6807\u6807\u8bb0\u7b2c\u4e00\u4e2a\u70b9 +Calibration.Halfmarked.Hint=\u6309\u4f4fshift\u5355\u51fb\u91cd\u65b0\u6807\u8bb0 +CenterOfMass.Empty.Hint=\u9009\u62e9\u8d28\u70b9\u4ee5\u5b9a\u4e49\u7cfb\u7edf +VectorSum.Empty.Hint=\u9009\u62e9\u77e2\u91cf\u4ee5\u5b9a\u4e49\u77e2\u91cf\u548c +TapeMeasure.Hint=\u62d6\u52a8\u7ec8\u70b9\u4ee5\u6d4b\u91cf\u8ddd\u79bb\u548c\u89d2\u5ea6 +CoordAxes.Hint=\u8bbe\u7f6e\u89d2\u5ea6\u4ee5\u6539\u53d8\u503e\u659c\u89d2 +ParticleModel.Hint=\u5728\u5de5\u5177\u680f\u4e2d\u8bbe\u7f6e\u5bf9\u8c61\u8d28\u91cf\uff0c\u5728\u6a21\u578b\u6784\u5efa\u5de5\u5177\u4e2d\u8212\u670d\u8868\u8fbe\u5f0f\u5f00\u59cb\u52a8\u753b\u6a21\u62df +RGBRegion.Hint=\u8f93\u5165\u6539\u53d8\u5927\u5c0f\u7684\u534a\u5f84 +RGBRegion.Unmarked.Hint=\u6309\u4f4fshift\u952e\u5355\u51fb\u6807\u8bb0\u4f4d\u7f6e +TTrack.ImportVideo.Hint=\u5bfc\u5165\u89c6\u9891\u6216\u56fe\u50cf\u4ee5\u6d4b\u91cfRGB\u989c\u8272 +TTrack.Selected.Hint=\u9009\u5b9a\u7684 +LineProfile.Hint=\u8f93\u5165\u5bbd\u5ea6\u4ee5\u6539\u53d8\u7ebf\u5bbd +LineProfile.Unmarked.Hint=\u6309\u4f4fshift\u952e\u62d6\u52a8\u753b\u7ebf +LineProfile.Menu.Orientation=\u671d\u5411 +LineProfile.MenuItem.Horizontal=\u6c34\u5e73\u7684 +LineProfile.MenuItem.XAxis=\u6cbfX\u8f74\u65b9\u5411 +Footprint.PositionVector=\u77e2\u91cf +Footprint.BoldPositionVector=\u7c97\u77e2\u91cf +Tracker.Startup.Hint=\u8bf7\u67e5\u770b\u8fd9\u91cc\u7684\u63d0\u793a(\u6216\u8005\u5728\u5e2e\u52a9\u83dc\u5355\u4e2d\u5173\u95ed\u63d0\u793a). \u5728\u4efb\u4f55\u65f6\u5019\u6309F1\u90fd\u53ef\u83b7\u53d6\u5e2e\u52a9 +TrackerPanel.NoVideo.Hint=\u6253\u5f00\u6216\u5bfc\u5165\u89c6\u9891\u548c\u56fe\u50cf\u8fdb\u884c\u5206\u6790 +TrackerPanel.CalibrateVideo.Hint=\u4f7f\u7528\u5b9a\u6807\u5de5\u5177\u4e3a\u89c6\u9891\u5b9a\u6807 +TrackerPanel.NoTracks.Hint=\u521b\u5efa\u65b0\u7684\u8f68\u8ff9\u6d4b\u91cf\u611f\u5174\u8da3\u7684\u7279\u5f81 +TrackerPanel.SetClip.Hint=\u8bbe\u7f6e\u6216\u67e5\u770b\u89c6\u9891\u526a\u8f91\u8bbe\u7f6e +TrackerPanel.ShowAxes.Hint=\u8bbe\u7f6e\u5750\u6807\u539f\u70b9\u548c\u5750\u6807\u8f74\u89d2\u5ea6 +VideoPlayer.Step.Hint=\u5411\u524d\u4e00\u6b65(PageDown) +VideoPlayer.Back.Hint=\u5411\u540e\u4e00\u6b65(PageUp) +TrackerPanel.DVVideo.Hint=\u4f7f\u7528\u91cd\u5b9a\u4e49\u5927\u5c0f\u6ee4\u955c\u4fee\u6b63\u89c6\u9891\u526a\u8f91\u7684\u626d\u66f2 +TrackerIO.DataFileFilter.Description=Tracker\u6587\u4ef6 +Tracker.Button.PDFHelp=\u53ef\u6253\u5370\u7684PDF\u7248 +TToolbar.Button.TapeVisible.Tooltip=\u663e\u793a,\u9690\u85cf\u6216\u9009\u62e9\u5b9a\u6807\u5de5\u5177 + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=\u8f68\u8ff9\u63a7\u5236 +TMenuBar.MenuItem.Description=\u8bf4\u660e +TrackPlottingPanel.RightDrag.Hint=\u53f3\u952e\u62d6\u52a8\u663e\u793a\u9009\u9879 +TMenuBar.MenuItem.DeleteSelectedPoint=\u5df2\u9009\u53d6\u7684\u70b9 +TFrame.InfoDialog.SaveChanges.Title=\u4fdd\u5b58\u6539\u53d8 +TFrame.InfoDialog.SaveChanges.Message=\u8981\u5b58\u50a8\u6539\u53d8\u5417? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=\u7b1b\u5361\u5c14\u5750\u6807 +DynamicParticle.Editor.Button.Polar=\u6781\u5750\u6807 +DynamicParticle.Parameter.InitialR.Description=\u521d\u59cb\u534a\u5f84 +DynamicParticle.Parameter.InitialTheta.Description=\u521d\u59cb\u89d2 +DynamicParticle.Parameter.InitialVelocityR.Description=\u521d\u59cb\u5f84\u5411\u901f\u5ea6 +DynamicParticle.Parameter.InitialOmega.Description=\u521d\u59cb\u89d2\u5411\u901f\u5ea6 +DynamicParticle.ForceFunction.R.Description=\u529b\u7684\u5f84\u5411\u5206\u91cf +DynamicParticle.ForceFunction.Theta.Description=\u529b\u7684\u5207\u5411\u5206\u91cf +DynamicParticlePolar.Name=\u7c92\u5b50\u7684\u52a8\u529b\u5b66\u6a21\u578b(\u6781\u5750\u6807) +TMenuBar.Menu.DynamicParticle=\u7c92\u5b50\u7684\u52a8\u529b\u5b66\u6a21\u578b +TMenuBar.MenuItem.Cartesian=\u7b1b\u5361\u5c14\u5750\u6807 +TMenuBar.MenuItem.Polar=\u6781\u5750\u6807 + +# Additions by Doug Brown 2009-08-24 +PointMass.MenuItem.Autotrack=\u81ea\u52a8\u8ffd\u8e2a... +Dialog.Button.Help=\u5e2e\u52a9 +AutoTracker.Wizard.Title=\u81ea\u52a8\u8ffd\u8e2a +AutoTracker.Wizard.Button.Reset=\u91cd\u7f6e +AutoTracker.Wizard.Button.Back=\u524d\u4e00\u4e2a +AutoTracker.Wizard.Button.Next=\u4e0b\u4e00\u4e2a +AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 +AutoTracker.Wizard.Button.Search=\u641c\u7d22 +AutoTracker.Wizard.Button.Pause=\u6682\u505c +AutoTracker.Wizard.Button.Skip=\u8df3\u8fc7 +AutoTracker.Label.Mask=\u6a21\u677f +AutoTracker.Label.AcceptLevel=\u9608\u503c +AutoTracker.TabbedPane.TabTitle.Mask=\u6a21\u677f +AutoTracker.TabbedPane.TabTitle.Target=\u76ee\u6807 +AutoTracker.TabbedPane.TabTitle.Settings=\u63a5\u53d7 +AutoTracker.TabbedPane.TabTitle.Search=\u641c\u7d22 +AutoTracker.Info.GetStarted=\u6309\u4f4fShift+Control\u70b9\u51fb\u89c6\u9891\u4e2d\u8981\u63d2\u5165\u65b0\u5173\u952e\u5e27\u7684\u4f4d\u7f6e\u53ef\u63d2\u5165\u65b0\u7684\u5173\u952e\u5e27. +AutoTracker.Info.Mask1=\u5b9a\u4e49\u6a21\u677f\u7684\u56fe\u50cf\u5fc5\u987b\u4e0e\u6bcf\u4e2a\u89c6\u9891\u5e27\u90fd\u5339\u914d. +AutoTracker.Info.Mask2=\u6a21\u677f\u53ef\u4ee5\u4f7f\u7528\u5f62\u72b6\u548c\u989c\u8272\u968f\u7740\u65f6\u95f4\u53d8\u5316\u7684\u5f62\u5f0f, \u53d8\u5316\u7684\u901f\u5ea6\u8d8a\u5feb\u8d8a\u80fd\u8ffd\u6700\u5230\u66f4\u5feb\u7684\u6539\u53d8\uff0c\u4f46\u662f\u4ece\u957f\u65f6\u95f4\u6765\u770b\u7cbe\u5ea6\u5c06\u4f1a\u964d\u4f4e\u3002 @@ It evolves to adapt to shape and color changes over time. Higher evolution rates track more rapid changes, but are less accurate over long times. +AutoTracker.Info.MaskLocked1=\u8be5\u6a21\u677f\u5df2\u88ab\u4f7f\u7528,\u5e76\u88ab\u9501\u5b9a. +AutoTracker.Info.MaskLocked2=\u70b9\u51fb\u91cd\u7f6e\u6309\u94ae, \u6e05\u9664\u6240\u6709\u5df2\u8ffd\u8e2a\u7684\u8bb0\u5f55\u5e76\u91cd\u65b0\u5f00\u59cb. +AutoTracker.Info.Target1=\u6ee1\u8db3\u81ea\u52a8\u6807\u8bb0\u8981\u6c42\u7684\u76ee\u6807\u8fd0\u52a8\u90fd\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. +AutoTracker.Info.Target2=\u63d0\u793a: \u5728\u6bcf\u6b65\u8fd0\u52a8\u90fd\u88ab\u6807\u8bb0\u51fa\u6765\u4e4b\u540e,\u7528\u6237\u4f9d\u7136\u53ef\u4ee5\u8c03\u6574\u7269\u4f53\u7684\u4f4d\u7f6e. \u5df2\u7ecf\u6807\u8bb0\u51fa\u6765\u7684\u4f4d\u7f6e\u5c06\u4f1a\u968f\u7740\u76ee\u6807\u7684\u79fb\u52a8\u91cd\u65b0\u81ea\u52a8\u8c03\u6574. +AutoTracker.Info.TargetLocked=\u76ee\u6807\u6b63\u5728\u4f7f\u7528,\u5e76\u4e14\u5df2\u7ecf\u4e0e\u5b58\u5728\u7684\u6807\u8bb0\u7ed1\u5b9a. \u79fb\u52a8\u76ee\u6807\u4f4d\u7f6e\u5c06\u4f1a\u79fb\u52a8\u6807\u8bb0\u4f4d\u7f6e. +AutoTracker.Info.Settings1=\u6ee1\u8db3\u81ea\u52a8\u6807\u8bb0\u8981\u6c42\u7684\u76ee\u6807\u8fd0\u52a8\u90fd\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. +AutoTracker.Info.Settings2=\u63d0\u793a: \u964d\u4f4e\u81ea\u52a8\u6807\u8bb0\u6807\u51c6\u5c06\u4f1a\u589e\u52a0\u9519\u8bef\u6807\u8bb0\u7684\u53ef\u80fd\u6027.\u8bf7\u5c1d\u8bd5\u589e\u52a0\u81ea\u52a8\u8ffd\u8e2a\u7684\u65f6\u95f4\u95f4\u9694. @@Tip: reducing the automark level may increase the likelihood of marking false matches. Try increasing the evolution rate instead. +AutoTracker.Info.Search1=\u5728\u641c\u7d22\u533a\u57df\u5185\u626b\u63cf\u5e76\u5bfb\u627e\u6700\u4f73\u5339\u914d, \u901a\u8fc7\u62d6\u52a8\u641c\u7d22\u6846\u7684\u8fb9\u754c\u548c\u53e5\u67c4\u53ef\u4ee5\u6539\u53d8\u641c\u7d22\u533a\u57df\u7684\u5927\u5c0f. +AutoTracker.Info.Search2=\u63d0\u793a: \u5927\u591a\u6570\u60c5\u51b5\u4e0b\uff0c\u641c\u7d22\u533a\u57df\u4e0d\u7528\u592a\u5927.\u5411\u524d\u641c\u7d22\u9009\u9879\u5c06\u81ea\u52a8\u7684\u628a\u641c\u7d22\u533a\u57df\u79fb\u52a8\u5230\u9884\u5b9a\u7684\u5339\u914d\u533a\u57df.. +AutoTracker.Info.Frame=\u5e27 +AutoTracker.Info.Match=\u4e0e\u6a21\u677f\u5339\u914d\u7684\u70b9\u4f1a\u88ab\u81ea\u52a8\u7684\u6807\u8bb0. +AutoTracker.Info.Possible=\u641c\u7d22\u533a\u57df\u53d1\u73b0\u4e00\u4e2a\u53ef\u80fd\u5339\u914d\u76ee\u6807.\u60a8\u53ef\u4ee5: +AutoTracker.Info.NoMatch=\u5728\u641c\u7d22\u533a\u57df\u5185\u4e3a\u53d1\u73b0\u5339\u914d\u76ee\u6807.\u60a8\u53ef\u4ee5: +AutoTracker.Info.Outside=\u641c\u7d22\u533a\u57df\u5728\u56fe\u50cf\u4ee5\u5916.\u60a8\u53ef\u4ee5: +AutoTracker.Info.Accepted=\u7528\u6237\u63a5\u53d7\u4e86\u5f53\u524d\u7684\u5339\u914d\u70b9. +AutoTracker.Info.MarkedByUser=\u7528\u6237\u624b\u5de5\u6807\u8bb0\u4e86\u8fd9\u4e00\u6b65\u8fd0\u52a8. +AutoTracker.Info.NoVideo=\u81ea\u52a8\u8ffd\u8e2a\u9700\u8981\u5206\u6790\u89c6\u9891. +AutoTracker.Info.Height=\u9ad8\u5ea6 +AutoTracker.Info.Width=\u5bbd\u5ea6 +AutoTracker.Info.Accept=--\u63a5\u53d7\u5339\u914d\u70b9 +AutoTracker.Info.Retry=--\u79fb\u52a8\u641c\u7d22\u533a\u57df\u5e76\u518d\u6b21\u641c\u7d22 +AutoTracker.Info.Mark=--\u6309\u4f4fshift\u952e\u70b9\u51fb\u9f20\u6807,\u624b\u5de5\u6807\u8bb0\u8fd9\u4e00\u6b65 +AutoTracker.Info.Skip=--\u8df3\u8fc7\u8be5\u5e27\u5e76\u7ee7\u7eed\u641c\u7d22 +AutoTracker.Info.Reset=--\u8df3\u56de\u524d\u4e00\u6b21\u6b63\u786e\u6807\u8bb0\u7684\u5e27,\u6309\u4f4fShift+Control\u952e\u5e76\u5355\u51fb\u5b9a\u4e49\u4e00\u4e2a\u65b0\u7684\u5173\u952e\u5e27 +AutoTracker.Info.MatchScore=\u5339\u914d\u6807\u51c6 +AutoTracker.Dialog.MaskLocked.Title=\u6a21\u677f\u9501\u5b9a +PointMass.Cursor.Autotrack.Description=\u81ea\u52a8\u8ffd\u8e2a\u5149\u6807 +VideoPlayer.StartFrame.Hint=\u62d6\u52a8\u5e76\u8bbe\u7f6e\u8d77\u59cb\u5e27 +VideoPlayer.EndFrame.Hint=\u62d6\u52a8\u88ab\u8bbe\u7f6e\u7ed3\u675f\u5e27 +VideoPlayer.Slider.Hint=\u62d6\u52a8\u626b\u63cf\u6574\u4e2a\u89c6\u9891 +FileDropHandler.Dialog.BadFile.Message=\u65e0\u6cd5\u52a0\u8f7d. +FileDropHandler.Dialog.BadFile.Title=\u65e0\u6cd5\u8bc6\u522b\u7684\u6587\u4ef6 + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=\u5e94\u7528 +DynamicParticle.Dialog.Delete.Message=\u5220\u9664\u8be5\u7c92\u5b50\u5c06\u4f1a\u5c06\u8be5\u7c92\u5b50\u4ece\u7cfb\u7edf\u4e2d\u79fb\u9664.\u8fd8\u8981\u5220\u9664\u5417? +DynamicParticle.Dialog.Delete.Title=\u52a8\u529b\u5b66\u7cfb\u7edf +DynamicParticle.System.In=\u5728\u5176\u4e2d +DynamicSystem.Empty=\u7a7a\u7684 +DynamicSystem.Force.Name.Internal=\u5185\u90e8\u7684 +DynamicSystem.ForceFunction.R.Description=\u5185\u90e8\u4f5c\u7528\u529b\u7684\u5f84\u5411\u5206\u91cf +DynamicSystem.ForceFunction.Theta.Description=\u5185\u90e8\u4f5c\u7528\u529b\u7684\u5207\u5411\u5206\u91cf +DynamicSystem.MenuItem.Inspector=\u9009\u62e9\u7c92\u5b50... +DynamicSystem.Name=\u4e24\u4f53\u52a8\u529b\u5b66\u7cfb\u7edf +DynamicSystem.New.Name=\u7cfb\u7edf +DynamicSystem.Parameter.Of=of +DynamicSystem.Parameter.RelativeTo=\u76f8\u5bf9\u4e8e +DynamicSystem.Parameter.Name.Relative=\u76f8\u5bf9 +DynamicSystem.Parameter.ParticleMass.Description=\u8d28\u91cf +DynamicSystem.Parameter.Mass.Description=\u7cfb\u7edf\u7684\u603b\u8d28\u91cf +DynamicSystemInspector.Border.Title=\u7c92\u5b50 +DynamicSystemInspector.Title=\u4e24\u4f53\u7cfb\u7edf +DynamicSystemInspector.Button.Change=\u6539\u53d8... +DynamicSystemInspector.ParticleName.None=(none) +TMenuBar.MenuItem.Clone=\u514b\u9686 +TMenuBar.MenuItem.TwoBody=\u4e24\u4f53\u7cfb\u7edf +TrackerPanel.DataBuilder.Dropdown.Tooltip=\u5f53\u524d\u9009\u5b9a\u7684\u8f68\u8ff9 +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=\u7eb5\u8f74\u540c\u6b65 +TrackControl.Button.Trace.ToolTip=\u663e\u793a/\u9690\u85cf\u8def\u5f84 +TToolBar.Button.Open.Tooltip=\u5728\u65b0\u6807\u7b7e\u9875\u4e2d\u6253\u5f00\u89c6\u9891\u6216tracker\u6587\u4ef6 +TToolBar.Button.Save.Tooltip=\u5f53\u524d\u6807\u7b7e\u9875\u5b58\u50a8\u4e3a +TToolBar.Button.SelectTrack=\u9009\u62e9 +TToolBar.Button.SelectTrack.Tooltip=\u9009\u53d6\u5df2\u5b58\u5728\u7684\u8f68\u8ff9 +TTrack.MenuItem.ClearSteps=\u6e05\u9664\u6b65\u9aa4 +PointMass.MenuItem.Position=\u4f4d\u7f6e +TMenuBar.MenuItem.Empty=(\u7a7a) +TTrackBar.Button.Memory=memory in use: +TTrackBar.Button.Memory.Tooltip=\u5185\u5b58\u4f7f\u7528\u76d1\u89c6\u4e0e\u7ba1\u7406 +TTrackBar.Memory.PopupItem.Launch1=\u542f\u52a8 +TTrackBar.Memory.PopupItem.Launch2=\u5185\u5b58 +TButton.Track.ToolTip=\u8bbe\u7f6e\u5c5e\u6027 +Tracker.Dialog.OutOfMemory.Message1=Tracker\u5df2\u4f7f\u7528\u5b8c\u53ef\u4f7f\u7528\u5185\u5b58. +Tracker.Dialog.OutOfMemory.Message2=\u70b9\u51fb\u5185\u5b58\u6309\u94ae\u67e5\u770b\u66f4\u591a\u9009\u9879. +Tracker.Dialog.OutOfMemory.Title=\u5185\u5b58\u4e0d\u8db3 + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=\u5411\u524d\u67e5\u627e +AutoTracker.Label.Original=\u5173\u952e\u5e27 +AutoTracker.Label.NoMask=\u65e0 +AutoTracker.Label.Rate=\u901f\u7387: +AutoTracker.Info.Mask3=\u63d0\u793a: \u6a21\u677f\u4e0d\u9700\u8981\u592a\u5927\u4e5f\u4e0d\u9700\u8981\u5305\u62ec\u6574\u4e2a\u5bf9\u8c61.\u53ea\u8981\u5305\u542b\u6709\u9c9c\u660e\u7684\u7279\u5f81\u6216\u9ad8\u5bf9\u6bd4\u5ea6\u5373\u53ef. +AutoTracker.Wizard.Checkbox.XAxis=\u4ec5X\u8f74 +AutoTracker.Info.SearchOnAxis1=\u626b\u63cf\u641c\u7d22\u6846\u7684x\u8f74\u65b9\u5411\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d.\u901a\u8fc7\u5176\u4e2d\u5fc3\u548c\u53e5\u67c4\u53ef\u4ee5\u8c03\u6574\u641c\u7d22\u6846\u7684\u4f4d\u7f6e\u548c\u5927\u5c0f. +AutoTracker.Info.PossibleOnAxis=\u5728\u641c\u7d22\u533ax\u8f74\u627e\u5230\u4e00\u4e2a\u53ef\u80fd\u7684\u5339\u914d\u70b9.\u60a8\u53ef\u4ee5: +AutoTracker.Info.NoMatchOnAxis=\u5728\u641c\u7d22\u533ax\u8f74\u5e76\u672a\u627e\u5230\u53ef\u80fd\u7684\u5339\u914d\u70b9.\u60a8\u53ef\u4ee5: +AutoTracker.Info.RetryOnAxis=--\u79fb\u52a8\u641c\u7d22\u533a\u6216\u8005x\u8f74\u5e76\u518d\u6b21\u641c\u7d22 +AutoTracker.Wizard.Button.Delete=\u5220\u9664 +AutoTracker.Wizard.Button.DeleteMore=\u5220\u9664\u540e\u9762\u7684\u70b9 +Button.Define.Tooltip=\u4e3a\u73b0\u5b58\u7684\u5217\u53d8\u91cf\u5b9a\u4e49\u51fd\u6570 +Calibration.Label.Point=\u70b9 +CalibrationStick.Hint=\u8bbe\u7f6e\u957f\u5ea6,\u6216\u8005\u62d6\u52a8\u5b9a\u6807\u5de5\u5177\u7aef\u70b9\u5b9a\u4e49\u957f\u5ea6,\u8bbe\u7f6e\u503e\u659c\u89d2\u5ea6 +CalibrationStick.End.Hint=\u62d6\u52a8\u4ee5\u6539\u53d8\u5c3a\u5ea6,\u6309\u4f4fShift\u952e\u5355\u51fb\u91cd\u65b0\u6807\u8bb0 +CalibrationStick.New.Name=\u5b9a\u6807\u68d2 +CalibrationTapeMeasure.New.Name=\u5b9a\u6807\u5c3a +CalibrationTapeMeasure.Readout.Magnitude.Hint=\u70b9\u51fb\u5e76\u8f93\u5165\u5750\u6807\u7cfb\u4e2d\u4e00\u4e2a\u5df2\u77e5\u7684\u957f\u5ea6 +CalibrationTapeMeasure.Hint=\u8bbe\u7f6e\u957f\u5ea6\u4ee5\u6539\u53d8\u6bd4\u4f8b,\u8bbe\u7f6e\u503e\u659c\u89d2 +DynamicSystem.Data.Description.0=\u4e24\u7c92\u5b50\u4e4b\u95f4\u7684\u76f8\u5bf9\u4f4d\u7f6e +DynamicSystem.Data.Description.1=\u76f8\u5bf9\u89d2\u5ea6 +DynamicSystem.Data.Description.2=\u76f8\u5bf9\u5f84\u5411\u901f\u5ea6 +DynamicSystem.Data.Description.3=\u76f8\u5bf9\u89d2\u901f\u5ea6 +ExportDataDialog.Subtitle.Table=\u6570\u636e\u8868\u683c +ExportDataDialog.Subtitle.Content=\u5355\u5143\u683c +ExportDataDialog.Subtitle.Format=\u6570\u5b57\u683c\u5f0f +ExportDataDialog.Subtitle.Delimiter=\u5206\u9694\u7b26 +ExportDataDialog.Title=\u5bfc\u51fa\u6570\u636e +ExportDataDialog.Delimiter.Add=\u589e\u52a0... +ExportDataDialog.Delimiter.Remove=\u79fb\u9664... +ExportDataDialog.Content.AllCells=\u6240\u6709\u5355\u5143\u683c +ExportDataDialog.Content.SelectedCells=\u9009\u5b9a\u7684\u5355\u5143\u683c +ExportDataDialog.MenuItem.RemoveDelimiter=\u79fb\u9664\u7279\u5b9a\u7684\u6570\u636e\u5206\u5272\u7b26 +ExportDataDialog.Chooser.SaveData.Title=\u6570\u636e\u53e6\u5b58\u4e3a +ExportVideoDialog.Button.SaveAs=\u53e6\u5b58\u4e3a... +ExportVideoDialog.Button.FullSize=\u5168\u5c3a\u5bf8\u5927\u5c0f +ExportVideoDialog.Button.DrawnSize=\u5982\u56fe\u6240\u793a +ExportVideoDialog.Content.VideoOnly=\u4ec5\u89c6\u9891 +ExportVideoDialog.Content.VideoAndGraphics=\u89c6\u9891\u4e0e\u56fe\u50cf +ExportVideoDialog.Content.GraphicsOnly=\u4ec5\u56fe\u50cf +ExportVideoDialog.Title=\u5bfc\u51fa\u89c6\u9891\u526a\u8f91 +ExportVideoDialog.Label.ClipSettings=\u526a\u8f91\u8bbe\u5b9a +ExportVideoDialog.Subtitle.Size=\u5927\u5c0f +ExportVideoDialog.Subtitle.Content=\u5185\u5bb9 +ExportVideoDialog.Subtitle.View=\u663e\u793a +ExportVideoDialog.Subtitle.Format=\u683c\u5f0f +ExportVideoDialog.Complete.Message1=\u89c6\u9891\u5df2\u88ab\u53e6\u5b58\u4e3a +ExportVideoDialog.Complete.Message2=\u73b0\u5728\u8981\u5728Tracker\u4e2d\u6253\u5f00\u5417? +ExportVideoDialog.Complete.Title=\u5b8c\u5168\u5bfc\u51fa +ExportVideoDialog.VideoSize=\u89c6\u9891\u5927\u5c0f +ExportVideoDialog.MatSize=mat\u5927\u5c0f +ExportVideo.Dialog.HiddenPlots.Message=\u5fc5\u987b\u663e\u793a\u6240\u6709\u7684\u56fe\u5f62\u4ee5\u4fbf\u5bfc\u51fa. +ExportVideo.Dialog.HiddenPlots.Title=\u663e\u793a\u4e0d\u5b8c\u6574 +Footprint.DoubleTarget=\u53cc\u4ea4\u53c9\u7ebf +Footprint.BoldDoubleTarget=\u7c97\u53cc\u4ea4\u53c9\u7ebf +OffsetOrigin.MenuItem.Fixed=\u56fa\u5b9a\u5ea7\u6807\u7cfb +ParticleModel.Dialog.Offscreen.Message1=\u7531\u4e8e\u4e00\u4e9b\u6b65\u9aa4\u70b9\u5728\u5c4f\u5e55\u4ee5\u5916,\u56e0\u6b64\u8fd9\u4e9b\u70b9\u88ab\u7701\u7565. +ParticleModel.Dialog.Offscreen.Message2=\u8bf7\u4fee\u6539\u6a21\u578b\u6216\u7f29\u653e\u89c6\u9891. +ParticleModel.Dialog.Offscreen.Title=\u8d85\u51fa\u8303\u56f4 +PrefsDialog.Tab.Configuration.Title=\u914d\u7f6e +PrefsDialog.Memory.BorderTitle=\u5185\u5b58\u5927\u5c0f +PrefsDialog.Tab.General.Title=\u5176\u4ed6 +PrefsDialog.RecentFiles.BorderTitle=\u6253\u5f00\u6700\u8fd1\u4f7f\u7528\u83dc\u5355 +PrefsDialog.Label.RecentSize=\u6587\u4ef6\u4e2a\u6570 +PrefsDialog.Hints.BorderTitle=\u63d0\u793a +PrefsDialog.Button.Relaunch=\u73b0\u5728\u91cd\u542f +PrefsDialog.Button.ClearRecent=\u6e05\u9664 +PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9ed8\u8ba4 +PrefsDialog.Checkbox.HintsOn=\u9ed8\u8ba4\u663e\u793a\u63d0\u793a +PrefsDialog.Tab.Video.Title=\u89c6\u9891 +PrefsDialog.VideoPref.BorderTitle=\u89c6\u9891\u5f15\u64ce +PrefsDialog.Button.Xuggle=Xuggle (\u63a8\u8350) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=\u4f7f\u7528Web Start\u65f6\u5185\u5b58\u7ba1\u7406\u4e0d\u53ef\u7528. +PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f +PrefsDialog.LookFeel.BorderTitle=\u5916\u89c2 +PrefsDialog.Language.BorderTitle=\u8bed\u8a00 +PrefsDialog.Upgrades.BorderTitle=\u68c0\u67e5\u66f4\u65b0 +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=\u663e\u793a +PrefsDialog.Language.Default=\u9ed8\u8ba4 +PrefsDialog.Upgrades.Always=\u6bcf\u6b21 +PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 +PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 +PrefsDialog.Upgrades.Never=\u4ece\u4e0d +PrefsDialog.Button.CheckForUpgrade=\u73b0\u5728\u68c0\u67e5 +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle\u64ad\u653e\u5f71\u7247 +PrefsDialog.Xuggle.Slow=\u5149\u6ed1 (\u53ef\u80fd\u4f1a\u53d8\u6162) +PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u4f1a\u6709\u952f\u9f7f) +PrefsDialog.CalibrationTool.BorderTitle=\u9ed8\u8ba4\u5b9a\u6807\u5de5\u5177 +Protractor.Name=\u91cf\u89d2\u5668 +Protractor.New.Name=\u91cf\u89d2\u5668 +Protractor.Hint=\u62d6\u52a8\u4e24\u8fb9\u6d4b\u91cf\u5939\u89d2 +Protractor.Label.Angle=\u5939\u89d2 +Protractor.Field.Angle.Tooltip=\u91cf\u89d2\u5668\u4e24\u8fb9\u7684\u5939\u89d2 +Protractor.Vertex.Name=\u9876\u70b9 +Protractor.Vertex.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8\u9876\u70b9 +Protractor.End.Name=\u7ec8\u8fb9 +Protractor.End.Hint=\u62d6\u52a8\u5e76\u65cb\u8f6c\u8fb9 +Protractor.Handle.Name=\u53e5\u67c4 +Protractor.Handle.Hint=\u62d6\u52a8\u5e76\u79fb\u52a8\u91cf\u89d2\u5668 +Protractor.Rotator.Name=\u65cb\u8f6c +Protractor.Rotator.Hint=\u62d6\u52a8\u5e76\u65cb\u8f6c\u91cf\u89d2\u5668 +Protractor.Readout.Name=\u8bfb\u6570 +Protractor.Readout.Hint=\u91cf\u89d2\u5668\u4e24\u8fb9\u4e4b\u95f4\u7684\u5939\u89d2 +ProtractorFootprint.Circle3=\u5c0f\u5706 +ProtractorFootprint.Circle5=\u5927\u5706 +ProtractorFootprint.Circle3Bold=\u7c97\u4f53\u5c0f\u5706 +ProtractorFootprint.Circle5Bold=\u7c97\u4f53\u5927\u5706 +Stick.Name=\u5b9a\u6807\u6746 +Stick.New.Name=\u5b9a\u6807\u6746 +TableTrackView.MenuItem.Unformatted=\u5168\u7cbe\u5ea6 +TableTrackView.MenuItem.Formatted=\u5982\u683c\u5f0f +TableTrackView.Menu.SetDelimiter=\u8bbe\u7f6e\u5206\u9694\u7b26 +TableTrackView.MenuItem.AddDelimiter=\u589e\u52a0... +TableTrackView.MenuItem.RemoveDelimiter=\u79fb\u9664... +TableTrackView.Dialog.CustomDelimiter.Message=\u8f93\u5165\u65b0\u7684\u5206\u9694\u7b26\u5b57\u7b26\u4e32: +TableTrackView.Dialog.CustomDelimiter.Title=\u589e\u52a0\u5206\u9694\u7b26 +TableTrackView.Header.Tooltip=\u5355\u51fb\u6392\u5e8f,\u53cc\u51fb\u9009\u5b9a\u5217 +TableTrackView.MenuItem.CopySelectedData=\u590d\u5236\u9009\u5b9a\u7684\u6570\u636e +TableTrackView.Dialog.RemoveDelimiter.Message=\u9009\u62e9\u8981\u79fb\u9664\u7684\u5206\u9694\u7b26: +TableTrackView.Dialog.RemoveDelimiter.Title=\u79fb\u9664\u5206\u9694\u7b26 +TableTrackView.Radians.Tooltip=\u5f27\u5ea6 +TableTrackView.Degrees.Tooltip=\u89d2\u5ea6 +TableTrackView.RadiansPerSecond.Tooltip=\u5f27\u5ea6/\u79d2 +TableTrackView.DegreesPerSecond.Tooltip=\u89d2\u5ea6/\u79d2 +TableTrackView.RadiansPerSecondSquared.Tooltip=\u5f27\u5ea6/\u79d2^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=\u89d2\u5ea6/\u79d2^2 +TableTrackView.MenuItem.DeleteDataFunction=\u5220\u9664\u6570\u636e\u51fd\u6570 +TActions.Action.SaveFrame=\u89c6\u9891\u5e27\u53e6\u5b58\u4e3a... +TActions.AboutVideo=\u5c5e\u6027... +TActions.Dialog.AboutVideo.Title=\u89c6\u9891\u5c5e\u6027 +TActions.Dialog.AboutVideo.Type=\u7c7b\u578b +TActions.Dialog.AboutVideo.Size=\u5927\u5c0f +TActions.Dialog.AboutVideo.Length=\u957f\u5ea6 +TActions.Dialog.AboutVideo.Frames=\u5e27 +TActions.Dialog.AboutVideo.Seconds=\u79d2 +TActions.Dialog.AboutVideo.FrameRate=\u5e27\u7387 +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=\u8def\u5f84 +TActions.Action.ImportTRK=Tracker\u6587\u4ef6... +TActions.Action.ProtractorVisible=\u663e\u793a +TapeMeasure.MenuItem.FixedLength=\u56fa\u5b9a\u957f\u5ea6 +TextTView.Label.NoTab=\u70b9\u51fb"\u9875\u9762"\u5728\u8fd9\u91cc\u6dfb\u52a0\u6587\u672c\u6216HTML\u4ee3\u7801. +TextTView.NewTab.Text1=\u53cc\u51fb\u7f16\u8f91\u6587\u672c\u6216\u6807\u9898.\u70b9\u51fb\u53f3\u952e\u4e86\u89e3\u66f4\u591a\u9009\u9879. +TextTView.NewTab.Text2=\u4e3a\u4e86\u663e\u793aHTML\u9875\u9762,\u8bf7\u8f93\u5165URL\u6216\u8005\u4f7f\u7528\u90ae\u4ef6\u6253\u5f00\u6587\u4ef6. +TextTView.NewTab.Title=\u65e0\u6807\u9898 +TextTView.Dialog.TabTitle.Title=\u8bbe\u7f6e\u6807\u9898 +TextTView.MenuItem.OpenHTML=\u6253\u5f00HTML... +TextTView.MenuItem.SetTitle=\u8bbe\u7f6e\u6807\u9898... +TextTView.Button.NewTab=\u65b0\u5efa +TextTView.TextEdit.Description=\u6587\u5b57 +TFrame.Dialog.FileNotFound.Message=\u6587\u4ef6\u672a\u627e\u5230: +TFrame.Dialog.FileNotFound.Title=\u6587\u4ef6\u672a\u627e\u5230 +TFrame.View.Text=\u9875\u9762\u89c6\u56fe +TFrame.View.Main=\u4e3b\u89c6\u56fe +TMenuBar.Menu.OpenRecent=\u6700\u8fd1\u6253\u5f00 +TMenuBar.Menu.Import=\u5bfc\u5165 +TMenuBar.Menu.Export=\u5bfc\u51fa +TMenuBar.MenuItem.Video=\u89c6\u9891... +TMenuBar.MenuItem.Data=\u6570\u636e\u6587\u4ef6... +TMenuBar.Menu.CopyObject=\u590d\u5236\u5bf9\u8c61 +TMenuBar.MenuItem.Coords=\u5750\u6807\u7cfb +TMenuBar.MenuItem.VideoClip=\u89c6\u9891\u7247\u6bb5 +TMenuBar.Menu.MeasuringTools=\u6d4b\u91cf\u5de5\u5177 +TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u5355\u4f4d +TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 +TMenuBar.MenuItem.Radians=\u5f27\u5ea6 +Tracker.Dialog.NoXuggle.Title=Xuggle\u672a\u627e\u5230 +Tracker.Dialog.NoXuggle.Message1=Xuggle (\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ce)\u672a\u5b89\u88c5. +Tracker.Dialog.NoXuggle.Message2=\u4ecehttp://www.xuggle.com/xuggler/downloads/ \u4e0b\u8f7dXuggle. +Tracker.Action.AboutXuggle=\u5173\u4e8eXuggle... +Tracker.Dialog.AboutXuggle.Title=\u5173\u4e8eXuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle\u7248\u672c +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle\u4e3b\u9875: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle\u8def\u5f84: +Tracker.Dialog.NoVideoEngine.Message1=\u9ed8\u8ba4\u60c5\u51b5\u4e0b,Tracker\u53ef\u4ee5\u6253\u5f00\u52a8\u753bgif\u56fe\u50cf\u53ca\u56fe\u7247\u5e8f\u5217, +Tracker.Dialog.NoVideoEngine.Message2=\u5982\u679c\u8981\u6253\u5f00\u5176\u4ed6\u7c7b\u578b\u7684\u89c6\u9891\u5219\u9700\u8981\u5176\u4ed6\u7684\u89c6\u9891\u5f15\u64ce. +Tracker.Dialog.NoVideoEngine.Message3=\u63a8\u8350\u5b89\u88c5\u81ea\u7531\u5f00\u6e90\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ceXuggle +Tracker.Dialog.NoVideoEngine.Message4=\u6700\u65b0\u7248Tracker\u4e0b\u8f7d +Tracker.Dialog.NoVideoEngine.Title=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce +Tracker.Dialog.NoXuggle.Message1=Xuggle\u672a\u5b89\u88c5\u6216\u5de5\u4f5c\u4e0d\u6b63\u5e38(\u672a\u77e5\u539f\u56e0). +Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f7d\u6700\u65b0\u7684Xuggle\u5b89\u88c5 +Tracker.Dialog.NoXuggle.Title=Xuggle\u4e0d\u53ef\u7528 +Tracker.About.DefaultLocale=\u9ed8\u8ba4\u533a\u57df +Tracker.About.CurrentLanguage=\u8bed\u8a00 +Tracker.Dialog.InsufficientMemory.Title=\u5185\u5b58\u4e0d\u8db3 +Tracker.Dialog.InsufficientMemory.Message=\u6240\u9700\u5185\u5b58\u8fc7\u5927. +TrackerIO.Dialog.TabMustBeSaved.Message1=\u6807\u7b7e +TrackerIO.Dialog.TabMustBeSaved.Message2=\u5fc5\u987b\u88ab\u5b58\u4e3atracker\u6587\u4ef6\u4e4b\u540e\u624d\u80fd\u5305\u62ec\u5230\u6807\u7b7e\u7ec4\u4e2d. +TrackerIO.Dialog.TabMustBeSaved.Message3=\u8981\u5b58\u50a8\u5b83\u5417? +TrackerIO.Dialog.TabMustBeSaved.Title=\u672a\u5b58\u50a8\u6807\u7b7e\u9875 +TrackerIO.Dialog.NoTabs.Message=\u6ca1\u6709\u9700\u8981\u5b58\u50a8\u7684\u6807\u7b7e\u9875! +TrackerIO.Dialog.NoTabs.Title=\u7a7a\u6807\u7b7e\u9875\u7ec4 +TrackerIO.Dialog.SaveTabset.Title=\u5b58\u50a8\u6807\u7b7e\u9875\u7ec4 +TrackerIO.Dialog.SaveTab.Title=\u5b58\u50a8\u6807\u7b7e\u9875 +TrackerIO.Delimiter.Tab=Tab\u5236\u8868\u7b26 +TrackerIO.Delimiter.Space=\u7a7a\u683c +TrackerIO.Delimiter.Comma=\u9017\u53f7 +TrackerIO.Delimiter.Semicolon=\u5206\u53f7 +TrackerIO.VideoAndDataFileFilter.Description=\u89c6\u9891\u548cTracker\u6587\u4ef6 +TrackerPanel.Dialog.Version.Message1=\u60a8\u6240\u6253\u5f00\u7684\u6587\u4ef6\u662f\u7531Tracker\u521b\u5efa\u7684 +TrackerPanel.Dialog.Version.Message2=which may refer to +TrackerPanel.Dialog.Version.Message3=\u5f53\u524d\u8fd0\u884c\u7684\u7248\u672c\u6ca1\u6709\u6b64\u529f\u80fd +TrackerPanel.Dialog.Version.Message4=\u53ef\u7528\u7684\u6700\u65b0\u7248\u672c: +TrackerPanel.Dialog.Version.Title=\u7248\u672c\u4e0d\u5339\u914d +TrackerPanel.Label.ModelStart=\u5f00\u59cb +TrackerPanel.Label.ModelEnd=\u7ed3\u675f +TrackerPanel.Spinner.ModelStart.Tooltip=\u4e3a\u8be5\u6a21\u578b\u8bbe\u7f6e\u8d77\u59cb\u5e27 +TrackerPanel.Spinner.ModelEnd.Tooltip=\u4e3a\u8be5\u6a21\u578b\u8bbe\u7f6e\u7ed3\u675f\u5e27 +TToolbar.Button.ProtractorVisible.Tooltip=\u663e\u793a/\u9690\u85cf\u91cf\u89d2\u5668 +TToolbar.Button.AxesVisible.Tooltip=\u663e\u793a/\u9690\u85cf\u5750\u6807\u8f74 +TToolBar.Button.TrackControl.Tooltip=\u663e\u793a/\u9690\u85cf\u8f68\u8ff9\u63a7\u5236 +TTrack.Dialog.StepSizeWarning.Message1=\u6ce8\u610f: \u8f68\u8ff9\u4e2d\u6807\u8bb0\u51fa\u7684\u4e00\u4e9b\u70b9\u4e4b\u95f4\u5927\u4e8e\u4e00\u4e2a\u65f6\u95f4\u6b65\u957f,\u5373\u6709\u4e9b\u5e27\u88ab\u8df3\u8fc7,\u4fdd\u6301\u8fd9\u4e9b\u5e27\u4e0d\u88ab\u6807\u8bb0. +TTrack.Dialog.StepSizeWarning.Message2=\u6539\u53d8\u6b65\u957f\u6709\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6570\u636e\u4e2d\u51fa\u73b0\u4e00\u4e9b\u7a7a\u767d\u95f4\u9699. +TTrack.Dialog.StepSizeWarning.Message3=\u5728\u7a7a\u9699\u5468\u56f4\u7684\u901f\u5ea6\u548c\u52a0\u901f\u5ea6\u4e0d\u80fd\u51c6\u786e\u786e\u5b9a\uff0c\u9664\u975e\u6240\u6709\u70b9\u7684\u8fd0\u52a8\u8f68\u8ff9\u90fd\u88ab\u6807\u8bb0\u51fa\u6765. +TTrack.Dialog.StepSizeWarning.Title=\u6ce8\u610f +TTrack.Dialog.SkippedStepWarning.Message1=\u6ce8\u610f: \u5728\u6807\u8bb0\u4f4d\u7f6e\u65f6\u8df3\u8fc7\u4e00\u4e9b\u4f4d\u7f6e\u70b9\u5c06\u4f1a\u5bfc\u81f4\u6570\u7ec4\u4e3a\u7a7a. +TTrack.Dialog.SkippedStepWarning.Title=\u6ce8\u610f +TTrack.Dialog.SkippedStepWarning.Checkbox=\u4e0d\u518d\u663e\u793a\u8be5\u4fe1\u606f +TTrack.Locked.Hint=\u9501\u5b9a +TTrack.AngleField.Radians.Tooltip=\u89d2(\u5f27\u5ea6) +TTrack.AngleField.Degrees.Tooltip=\u89d2(\u89d2\u5ea6) +TTrack.AngleField.Popup.Radians=\u8f6c\u6362\u4e3a\u5f27\u5ea6 +TTrack.AngleField.Popup.Degrees=\u8f6c\u6362\u4e3a\u89d2\u5ea6 +TTrackBar.Memory.Menu.SetSize=\u8bbe\u7f6e\u5185\u5b58\u5927\u5c0f... +TTrackBar.Button.Version=\u5f53\u524d\u53ef\u7528\u7248\u672c: version +TTrackBar.Popup.MenuItem.Upgrade=\u73b0\u5728\u5347\u7ea7... +TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 +XuggleVideo.MenuItem.SmoothPlay=\u5e73\u6ed1\u64ad\u653e(\u7a0d\u6162) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=\u5b9a\u6807\u5c3a +CircleFootprint.Circle=\u5706 +CircleFootprint.FilledCircle=\u5b9e\u5fc3\u5706 +CircleFootprint.Dialog.Title=\u5706\u5f62\u8f68\u8ff9\u70b9 +CircleFootprint.Dialog.Label.Radius=\u534a\u5f84 +CircleFootprint.Dialog.Checkbox.Bold=\u7c97\u4f53 +CircleFootprint.Dialog.Checkbox.CenterSpot=\u5706\u5fc3 +LineProfile.Hint.Marking=\u62d6\u52a8\u9f20\u6807\u6807\u8bb0\u7ebf\u578b +PageTView.Button.Page=\u9875\u9762 +PageTView.MenuItem.ClosePage=\u5173\u95ed\u9875\u9762 +PointMass.Hint.Marking=\u70b9\u51fb\u9f20\u6807\u6807\u8bb0, \u56de\u8f66\u952e\u514b\u9686\u524d\u4e00\u6b65 +PrefsDialog.Dialog.NewVersion.Title=\u5347\u7ea7 +PrefsDialog.Dialog.NewVersion.Message1=version +PrefsDialog.Dialog.NewVersion.Message2=\u73b0\u5728\u53ef\u7528 +PrefsDialog.Dialog.NewVersion.None.Message=\u5f53\u524d\u65e0\u66f4\u65b0\u7684\u7248\u672c\u53ef\u7528. +RGBRegion.Hint.Marking=\u70b9\u51fb\u9f20\u6807\u6807\u8bb0\u533a\u57df\u7684\u4e2d\u5fc3 +TMenuBar.MenuItem.Restore=\u6062\u590d\u89c6\u56fe +TrackControl.StretchVectors.None=\u672a\u62c9\u4f38 +TViewChooser.Maximize.Tooltip=\u6700\u5927\u5316\u89c6\u56fe +TViewChooser.Restore.Tooltip=\u6062\u590d\u89c6\u56fe +Vector.Hint.Marking=\u62d6\u52a8\u9f20\u6807\u6807\u8bb0,\u56de\u8f66\u952e\u514b\u9686\u524d\u4e00\u6b65 +WorldTView.Button.World=\u89c6\u9891 + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=\u8b66\u544a +PrefsDialog.Checkbox.WarnIfNoEngine=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce +PrefsDialog.Checkbox.WarnIfXuggleError=\u4e0d\u4e25\u91cd\u7684Xuggle\u9519\u8bef +PropertiesDialog.Title=\u5c5e\u6027 +PropertiesDialog.Label.Author=\u4f5c\u8005 +PropertiesDialog.Label.Contact=\u8054\u7cfb +TActions.Action.Properties=\u5c5e\u6027... +TActions.Action.OpenBrowser=\u6253\u5f00\u5e93\u6d4f\u89c8\u5668... +TFrame.Progress.Xuggle=Xuggle\u6b63\u5728\u8f7d\u5165\u5e27 +TFrame.Progress.ClickToCancel=(\u70b9\u51fb\u53d6\u6d88) +TFrame.Dialog.StalledVideo.Title=\u8f7d\u5165\u89c6\u9891\u9519\u8bef +TFrame.Dialog.StalledVideo.Message0=\u8f7d\u5165\u89c6\u9891\u65f6\u53d1\u751f\u672a\u77e5\u9519\u8bef,\u6709\u53ef\u80fd\u662f\u6682\u65f6\u7684. +TFrame.Dialog.StalledVideo.Message1=\u60a8\u53ef\u4ee5\u9009\u62e9\u505c\u6b62\u8f7d\u5165\u89c6\u9891\u6216\u8005\u7ee7\u7eed\u7b49\u5f85. +TFrame.Dialog.StalledVideo.Message2=\u6253\u5f00\u89c6\u9891\u7684\u5176\u4ed6\u9009\u9879: +TFrame.Dialog.StalledVideo.Message3=1. \u4f7f\u7528\u89c6\u9891\u8f6c\u6362\u8f6f\u4ef6\u5c06\u5176\u8f6c\u6362\u6210\u4e0d\u540c\u7684\u683c\u5f0f. +TFrame.Dialog.StalledVideo.Message4=2. \u5728\u6253\u5f00\u6587\u4ef6\u5bf9\u8bdd\u6846\u4e2d\uff0c\u91c7\u7528QuickTime\u5f15\u64ce\u6765\u6253\u5f00\u6587\u4ef6. +TFrame.Dialog.StalledVideo.MessageMac=2. \u5c06Tracker\u572832\u4f4d\u7684Java\u865a\u62df\u673a\u4e2d\u542f\u52a8\uff0c\u5e76\u7528QuickTime\u52a0\u8f7d\u89c6\u9891\u6587\u4ef6. +TFrame.Dialog.StalledVideo.Button.Stop=\u7ec8\u6b62 +TFrame.Dialog.StalledVideo.Button.Wait=\u7b49\u5f85 +Tracker.Dialog.NoVideoEngine.Checkbox=\u4e0d\u518d\u663e\u793a\u8be5\u4fe1\u606f +TrackerIO.ZipFileFilter.Description=ZIP\u6587\u4ef6 +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle\u5728\u6253\u5f00\u89c6\u9891\u65f6\u9047\u5230\u5982\u4e0b\u9519\u8bef: +TrackerIO.Dialog.ErrorFFMPEG.Message2=\u5e76\u975e\u6240\u6709\u7684\u9519\u8bef\u90fd\u662f\u4e25\u91cd\u9519\u8bef.\u66f4\u5b8c\u6574\u7684\u9519\u8bef\u4fe1\u606f\u8bf7\u9009\u62e9 \u5e2e\u52a9|\u4fe1\u606f\u8bb0\u5f55 \u67e5\u770b. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5982\u679cXuggle\u5f15\u64ce\u5931\u8d25,\u60a8\u53ef\u4ee5\u8bd5\u7528QuickTime\u6253\u5f00\u89c6\u9891. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u6ce8\u610f: \u5728Mac OSX\u4e2d\u9700\u8981\u572832\u4f4dJava\u865a\u62df\u673a\u4e0a\u8fd0\u884cTracker. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle\u9519\u8bef +TrackerIO.ErrorFFMPEG.LogMessage=\u66f4\u591a\u4fe1\u606f,\u8bf7\u5728\u4e2a\u4eba\u504f\u597d\u8bbe\u5b9a(\u7f16\u8f91|\u4e2a\u4eba\u504f\u597d)\u5f00\u542fXuggle\u8b66\u544a\u4fe1\u606f. +TToolBar.Button.OpenBrowser.Tooltip=\u6253\u5f00\u5f00\u6e90\u7269\u7406(OPS)\u6570\u5b66\u5e93\u6d4f\u89c8\u5668 + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=\u6587\u4ef6\u672a\u627e\u5230 +TFrame.Dialog.NoTRKInComPADRE.Message=\u8be5\u8282\u70b9\u672a\u627e\u5230Tracker\u6587\u4ef6 + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=\u7c92\u5b50\u8fd0\u52a8\u5b66 +DynamicParticle.Builder.Title=\u7c92\u5b50\u52a8\u529b\u5b66 (\u7b1b\u5361\u5c14\u5750\u6807) +DynamicParticlePolar.Builder.Title=\u7c92\u5b50\u52a8\u529b\u5b66 (\u6781\u5750\u6807) +DynamicSystem.Builder.Title=\u52a8\u529b\u5b66\u7cfb\u7edf (\u5185\u90e8\u76f8\u4e92\u4f5c\u7528) +PropertiesDialog.Button.CopyFilePath=\u590d\u5236\u6587\u4ef6\u8def\u5f84 +PropertiesDialog.Button.CopyVideoPath=\u590d\u5236\u89c6\u9891\u8def\u5f84 +PropertiesDialog.Tab.TrackerFile=Tracker\u6587\u4ef6 +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=\u5c5e\u6027 +PropertiesDialog.Header.Value=\u503c +TActions.Action.OpenURL=\u6253\u5f00URL... +TActions.Dialog.OpenURL.Title=\u6253\u5f00URL +TActions.Dialog.OpenURL.Message=\u8f93\u5165\u57fa\u4e8e\u7f51\u7edc\u7684\u89c6\u9891,Tracker\u6587\u4ef6\u4ee5\u53ca\u538b\u7f29Tracker\u6587\u4ef6\u7684URL +TActions.Dialog.AboutVideo.Name=\u540d\u79f0 + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Web\u7f13\u5b58\u6587\u4ef6 +PrefsDialog.Button.ClearCache=\u6e05\u9664 + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, \u6309\u4f4fshift\u952e\u70b9\u51fb\u91cd\u65b0\u6807\u8bb0\u9ad8\u4eae\u663e\u793a\u7684\u4f4d\u7f6e +PointMass.Remarking.Hint=\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0\u4f4d\u7f6e +PointMass.PositionSelected.Hint=\u62d6\u52a8\u6216\u5728\u5de5\u5177\u680f\u8f93\u5165\u4f4d\u7f6e +PointMass.VectorSelected.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8 +Vector.Remark.Hint=\u6309\u4f4fshift\u952e\u70b9\u51fb\u91cd\u65b0\u6807\u8bb0\u9ad8\u4eae\u663e\u793a\u7684\u4f4d\u7f6e +Vector.TipSelected.Hint=\u62d6\u52a8\u6216\u5728\u5de5\u5177\u680f\u4e2d\u8f93\u5165\u5206\u91cf +Vector.HandleSelected.Hint=\u62d6\u52a8\u4ee5\u79fb\u52a8 +Vector.Remarking.Hint=\u70b9\u51fb\u9f20\u6807\u91cd\u65b0\u6807\u8bb0 +AutoTracker.Label.Search=\u641c\u7d22 +AutoTracker.Label.Target=\u76ee\u6807 +AutoTracker.Label.KeyFrame=\u5173\u952e\u5e27 +AutoTracker.Label.Frame=\u5e27 +AutoTracker.Label.Point=\u70b9 +AutoTracker.Label.Template=\u6a21\u677f +AutoTracker.Label.Track=\u8f68\u8ff9 +AutoTracker.Label.Match=\u5339\u914d +AutoTracker.Label.EvolutionRate=\u6f14\u5316\u901f\u5ea6 @@ Evolution Rate +AutoTracker.Label.Automark=\u81ea\u52a8\u6807\u8bb0 +AutoTracker.Info.Instructions=\u70b9\u51fb"\u641c\u7d22"\u6309\u94ae,\u5728\u641c\u7d22\u533a\u57df\u4e2d\u5bfb\u627e\u5339\u914d\u7684\u8f68\u8ff9\u70b9. +AutoTracker.Info.KeyFrame.Instructions1=\u8fd9\u4e00\u5173\u952e\u5e27\u5b9a\u4e49\u4e86\u6a21\u677f\u548c\u76ee\u6807.\u70b9\u51fb"\u641c\u7d22"\u6309\u94ae\u5c06\u5728\u641c\u7d22\u533a\u57df\u5bfb\u627e\u5339\u914d\u70b9. +AutoTracker.Info.KeyFrame.Instructions2=\u53ef\u4ee5\u62d6\u52a8\u9f20\u6807\u4ee5\u79fb\u52a8\u76ee\u6807,\u6a21\u677f\u548c\u641c\u7d22\u533a\u57df,\u6216\u8005\u6539\u53d8\u4ed6\u4eec\u7684\u5927\u5c0f. +AutoTracker.Info.MouseOver.Instructions=\u5c06\u9f20\u6807\u60ac\u505c\u5728\u63a7\u4ef6\u4e0a\u65b9\u65f6\u53ef\u4ee5\u770b\u5230\u5173\u4e8e\u8bbe\u7f6e\u548c\u8c03\u6574\u7684\u63d0\u793a\u4fe1\u606f. +AutoTracker.Info.Mask1=\u6a21\u677f\u662f\u62df\u5339\u914d\u7684\u56fe\u50cf.\u4e00\u822c\u662f\u4ece\u4e00\u4e2a\u7279\u5b9a\u7684\u5173\u952e\u5e27\u5f00\u59cb,\u7136\u540e\u53bb\u8ffd\u8e2a\u5f62\u72b6\u6216\u662f\u989c\u8272\u53d1\u751f\u7684\u5bf9\u8c61. +AutoTracker.Info.Mask2=\u81ea\u52a8\u5339\u914d\u6807\u51c6\u662f\u81ea\u52a8\u6807\u8bb0\u6240\u8981\u6ee1\u8db3\u7684\u6700\u4f4e\u6807\u51c6. +AutoTracker.Info.Mask.Instructions=\u901a\u8fc7\u62d6\u52a8\u6a21\u677f\u7684\u8fb9\u6216\u8005\u89d2\u4e0a\u7684\u53e5\u67c4\u53ef\u4ee5\u79fb\u52a8\u6216\u8c03\u6574\u6a21\u677f\u7684\u5927\u5c0f(\u4ec5\u9650\u4e8e\u5173\u952e\u5e27). \u8c03\u6574\u6f14\u5316\u901f\u7387\u548c\u81ea\u52a8\u8ffd\u8e2a\u7ea7\u522b\u4e00\u822c\u4f7f\u7528spinners. +AutoTracker.Info.Mask.Tip=\u81ea\u52a8\u6807\u8bb0\u7ea7\u522b\u8fc7\u4f4e\u4f1a\u5bfc\u81f4\u9519\u8bef\u7684\u6807\u8bb0,\u8bf7\u5c1d\u8bd5\u63d0\u9ad8\u6f14\u5316\u901f\u5ea6. +AutoTracker.Info.Search=\u626b\u63cf\u641c\u7d22\u533a\u57df\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d. +AutoTracker.Info.SearchOnAxis=\u626b\u63cf\u641c\u7d22\u533a\u57dfx\u8f74\u65b9\u5411\u4ee5\u83b7\u5f97\u6700\u4f73\u5339\u914d. +AutoTracker.Info.Search.Instructions=\u901a\u8fc7\u62d6\u52a8\u641c\u7d22\u533a\u57df\u7684\u8fb9\u6216\u89d2\u4e0a\u7684\u53e5\u67c4\u53ef\u4ee5\u79fb\u52a8\u6216\u8005\u6539\u53d8\u641c\u7d22\u533a\u57df\u7684\u5927\u5c0f.\u9009\u62e9\u76f8\u5e94\u7684\u9009\u9879\u8bbe\u7f6e\u6cbfx-axis\u65b9\u5411\u626b\u63cf\u548c\u5411\u524d\u626b\u63cf. +AutoTracker.Info.Search.Tip=\u5728\u5f88\u591a\u60c5\u51b5\u4e0b,\u641c\u7d22\u533a\u57df\u4e0d\u9700\u8981\u5f88\u5927.\u5411\u524d\u641c\u7d22\u9009\u9879\u81ea\u52a8\u7684\u5c06\u641c\u7d22\u533a\u57df\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u9884\u6d4b\u7684\u5339\u914d\u4f4d\u7f6e. +AutoTracker.Info.Target=\u76ee\u6807\u5c31\u5728\u88ab\u6807\u8bb0\u7684\u8f68\u8ff9\u70b9\u51fa. +AutoTracker.Info.Target.Instructions=\u62d6\u52a8\u9f20\u6807\u4ee5\u79fb\u52a8\u76ee\u6807(\u4ec5\u5173\u952e\u5e27). \u4f7f\u7528spinner\u6539\u53d8\u76ee\u6807\u70b9. +AutoTracker.Info.Target.Tip= +AutoTracker.Info.Title.Settings=\u8bbe\u7f6e +AutoTracker.Info.Title.Tip=\u63d0\u793a +AutoTracker.Info.SelectTrack=\u8bf7\u521b\u5efa\u6216\u8005\u9009\u62e9\u81ea\u52a8\u8ffd\u8e2a\u6240\u9700\u8981\u7684\u8f68\u8ff9,\u5750\u6807\u8f74,\u6216\u8005\u5b9a\u6807\u5de5\u5177. +AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 +AutoTracker.Wizard.Button.Pause=\u6682\u505c +AutoTracker.Wizard.Button.Skip=\u8df3\u8fc7 +AutoTracker.Wizard.Button.Search=\u641c\u7d22 +AutoTracker.Wizard.Button.SearchThis=\u641c\u7d22\u8fd9\u4e2a +AutoTracker.Wizard.Button.SearchNext=\u641c\u7d22\u4e0b\u4e00\u4e2a +AutoTracker.Wizard.Button.Delete=\u5220\u9664 +AutoTracker.Wizard.Button.ShowKeyFrame=\u663e\u793a\u5173\u952e\u5e27 +AutoTracker.Wizard.Button.DeleteKeyFrame=\u5220\u9664\u5173\u952e\u5e27 +AutoTracker.Wizard.Checkbox.LookAhead=\u5411\u524d\u67e5\u627e +AutoTracker.Wizard.Checkbox.XAxis=\u4ec5X\u8f74 +AutoTracker.Wizard.Menuitem.DeleteThis=\u5f53\u524d\u70b9 +AutoTracker.Wizard.Menuitem.DeleteLater=\u540e\u7eed\u70b9 +AutoTracker.Wizard.Menuitem.DeleteAll=\u6240\u6709\u70b9 +TToolBar.Button.AutoTracker.Tooltip=\u663e\u793a/\u9690\u85cf\u81ea\u52a8\u8ffd\u8e2a +MainTView.Popup.MenuItem.ZoomIn=Zoom In +MainTView.Popup.MenuItem.ZoomOut=Zoom Out +MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit +TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration +TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than +TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from +TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. +TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: +TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=No resource could be loaded for node + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift-click to mark +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Directories +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Clear on exit +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=Save +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=Algorithms... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: +AlgorithmDialog.Title=Algorithms +AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. +AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. +AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=The file cannot be read. +TrackPlottingPanel.Popup.Menu.CompareWith=Compare With +TrackerPanel.DataBuilder.TrackType.Unknown=unknown +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=Load Data Functions +TrackerPanel.DataBuilder.Load.Message=Select functions to load: +TrackerPanel.DataBuilder.Save.Title=Save Data Functions +TrackerPanel.DataBuilder.Save.Message=Select functions to save: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into +TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection +TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type +TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. +TToolbar.Button.Refresh=Refresh data and views + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as +ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportTRKDialog.Complete.Title=Export Complete +ExportTRKDialog.Title=Export ZIP Resource +ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. +ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. +TMenuBar.MenuItem.TabClip=ZIP Resource +TMenuBar.Menu.CalibrationTools=Calibration Tools +TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=end +TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Attach Ends +AttachmentInspector.Label.End=End +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Name +AttachmentInspector.Header.AttachedTo=Attach To +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Attach Ends... +PerspectiveTrack.Corner=corner +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=time +Protractor.Data.Description.1=protractor angle +Protractor.Data.Description.2=length of arm 1 +Protractor.Data.Description.3=length of arm 2 +Protractor.Data.Description.4=step number +Protractor.Data.Description.5=frame number +TapeMeasure.Data.Description.0=time +TapeMeasure.Data.Description.1=length +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=step number +TapeMeasure.Data.Description.4=frame number + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export ZIP Resource +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export ZIP Resource +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource +ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties index 7f224503..972b4cce 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties @@ -1,1190 +1,1190 @@ -# This is the Traditional chinese tracker.properties file -# Translated by Fu-Kwun Hwang Dec 2009 -Calibration.Name=\u4e00\u5c0d\u6821\u6b63\u9ede -Calibration.New.Name=\u6821\u6b63 -CenterOfMass.Name=\u8cea\u5fc3 -CenterOfMass.New.Name=\u516c\u5206 -CenterOfMass.MenuItem.Inspector=\u9078\u53d6\u6240\u6709\u8cea\u9ede... -CenterOfMassInspector.Title=\u8cea\u5fc3 -CenterOfMassInspector.Border.Title=\u9078\u64c7\u9078\u53d6\u6240\u6709\u8cea\u9ede -ConfigInspector.Border.Title=\u6aa2\u67e5\u60f3\u8981\u7684\u9805\u76ee -ConfigInspector.Title=\u500b\u4eba\u559c\u597d -ConfigInspector.Button.SaveAsDefault=\u4ee5\u9810\u8a2d\u65b9\u5f0f\u5132\u5b58 -CoordAxes.Name=\u8ef8\u7dda -CoordAxes.New.Name=\u8ef8\u7dda -Dialog.Button.Cancel=\u53d6\u6d88 -Dialog.Button.OK=\u78ba\u8a8d -Dialog.Button.Close=\u7d50\u675f -Dialog.Button.All=\u6240\u6709 -Dialog.Button.None=\u7121 -Dialog.Button.Copy=\u8907\u88fd -Dialog.Button.Update=\u66f4\u65b0 -Dialog.Button.SelectAll=\u9078\u53d6\u6240\u6709 -Footprint.Diamond=\u7a1c\u5f62 -Footprint.BoldDiamond=\u7c97\u83f1\u5f62 -Footprint.SolidDiamond=\u5be6\u5fc3\u83f1\u5f62 -Footprint.Triangle=\u4e09\u89d2\u5f62 -Footprint.BoldTriangle=\u7c97\u4e09\u89d2\u5f62 -Footprint.SolidTriangle=\u5be6\u5fc3\u4e09\u89d2\u5f62 -Footprint.Circle=\u5713\u5f62 -Footprint.BoldCircle=\u7c97\u5713\u5f62 -Footprint.SolidCircle=\u5be6\u5fc3\u5713 -Footprint.VerticalLine=\u5782\u76f4\u7dda -Footprint.BoldVerticalLine=\u7c97\u5782\u76f4\u7dda -Footprint.HorizontalLine=\u6c34\u5e73\u7dda -Footprint.BoldHorizontalLine=\u7c97\u6c34\u5e73\u7dda -Footprint.Crosshair=\u4ea4\u53c9\u7dda -Footprint.BoldCrosshair=\u7c97\u4ea4\u53c9\u7dda -Footprint.SimpleAxes=\u8ef8\u7dda -Footprint.BoldSimpleAxes=\u7c97\u8ef8\u7dda -Footprint.Spot=\u9ede -Footprint.Line=\u76f4\u7dda -Footprint.BoldLine=\u7c97\u76f4\u7dda -Footprint.Outline=\u8f2a\u5ed3\u7dda -Footprint.BoldOutline=\u7c97\u8f2a\u5ed3\u7dda -Footprint.Arrow=\u7bad\u982d -Footprint.BoldArrow=\u7c97\u7bad\u982d -Footprint.DoubleArrow=\u96d9\u7bad\u982d -Footprint.BoldDoubleArrow=\u7c97\u96d9\u7bad\u982d -Footprint.2xArrow=2x \u7bad\u982d -Footprint.Bold2xArrow=\u7c97 2x \u7bad\u982d -Footprint.4xArrow=4x \u7bad\u982d -Footprint.Bold4xArrow=\u7c97 4x \u7bad\u982d -Footprint.DashArrow=dashed \u7bad\u982d -Footprint.BoldDashArrow=\u7c97\u865b\u7dda\u7bad\u982d -Footprint.BigArrow=\u5927\u7bad\u982d -Footprint.BigDashArrow=\u5927\u865b\u7dda\u7bad\u982d -LineProfile.Name=\u5f37\u5ea6\u5206\u4f48 -LineProfile.New.Name=\u63cf\u7e6a\u8a2d\u5b9a -LineProfile.Data.Brightness=\u4eae\u5ea6 -LineProfile.Data.Pixel=\u756b\u7d20 -LineProfile.Data.Red=\u7d05 -LineProfile.Data.Green=\u7da0 -LineProfile.Data.Blue=\u85cd -LineProfile.Data.Weighting=\u6bd4\u91cd -MainTView.Popup.MenuItem.QTPlayer=QuickTime \u64ad\u653e\u5668 -MainTView.Popup.MenuItem.Zoom=\u7e2e\u653e -MainTView.Popup.MenuItem.ToFit=\u81ea\u52d5\u8a2d\u5b9a -OffsetOrigin.Name=\u6b78\u96f6 -OffsetOrigin.New.Name=\u57fa\u6e96 -PlotTrackView.Button.PlotCount=\u7e6a\u5716 -PlotTrackView.Button.PlotCount.ToolTip=\u9078\u64c7\u7e6a\u5716\u7684\u6578\u76ee -PointMass.Name=\u8cea\u9ede -PointMass.New.Name=\u8cea\u91cf -PointMass.MenuItem.VectorsToPosition=\u7269\u4ef6\u4f4d\u7f6e -PointMass.MenuItem.Velocity=\u901f\u5ea6 -PointMass.MenuItem.Acceleration=\u52a0\u901f\u5ea6 -Star.Name=\u661f\u5f62 -Star.New.Name=\u661f\u5f62 -TableTrackView.Action.CopyData=\u8907\u88fd\u8cc7\u6599 -TableTrackView.Button.SelectTableData=\u8cc7\u6599 -TableTrackView.Button.SelectTableData.ToolTip=\u8907\u88fd\u8cc7\u6599\u8cc7\u6599 -TableTrackView.Popup.MenuItem.Analyze=\u5206\u6790 -TableTrackView.Dialog.Border.Title=\u986f\u793a: -TActions.Action.Description=\u8aaa\u660e -TActions.Action.ClearTracks=\u6e05\u9664 -TActions.Action.NewTab=\u65b0\u589e -TActions.Action.Copy=\u8907\u88fd -TActions.Action.Paste=\u8cbc\u4e0a -TActions.Action.Open=\u958b\u555f... -TActions.Action.Close=\u95dc\u9589 -TActions.Action.Import=\u8f09\u5165... -TActions.Action.Save=\u5132\u5b58 -TActions.Action.SaveAs=\u53e6\u5b58\u65b0\u6a94... -TActions.Action.Export=\u8f38\u51fa... -TActions.Action.CaptureVideo=\u64f7\u53d6\u5f71\u7247... -TActions.Action.Delete=\u522a\u9664 -TActions.Action.Config=\u500b\u4eba\u559c\u597d... -TActions.Action.AxesVisible=\u986f\u793a -TActions.Action.TapeVisible=\u986f\u793a -TActions.Action.Print=\u5217\u5370... -TActions.Action.ClearFilters=\u6e05\u9664 -TActions.Action.ImportVideo=\u8f09\u5165... -TActions.Action.CloseVideo=\u95dc\u9589 -TActions.Action.CloseAll=\u95dc\u9589\u6240\u6709\u8996\u7a97 -TActions.Action.Exit=\u7d50\u675f -TActions.Dialog.PrintError.Message=\u51fa\u73fe\u5217\u5370\u932f\u8aa4 -TActions.Dialog.PrintError.Title=\u5217\u5370\u932f\u8aa4 -TActions.Dialog.Description.Title=\u8aaa\u660e: -TActions.Dialog.DeleteLockedTracks.Message=\u90e8\u5206\u8ecc\u8de1\u88ab\u9396\u5b9a, \u4ecd\u7136\u8981\u522a\u9664? -TActions.Dialog.DeleteLockedTracks.Title=\u522a\u9664\u9396\u5b9a\u8ecc\u8de1? -TActions.Dialog.Description.Title=\u8aaa\u660e: -TActions.Dialog.NewPointMass.Title=\u65b0\u8cea\u9ede -TapeMeasure.Name=\u91cf\u5c3a\u6e2c\u91cf -TapeMeasure.New.Name=\u91cf\u5c3a -TapeMeasure.MenuItem.Fixed=\u56fa\u5b9a -TFrame.View.Plot=\u986f\u793a\u5716\u5f62 -TFrame.View.Table=\u986f\u793a\u8868\u683c -TFrame.View.World=\u5ea7\u6a19\u6a21\u5f0f -TFrame.View.Video=\u5f71\u7247\u6a21\u5f0f -TFrame.Dialog.Help.Title=Tracker\u8aaa\u660e -TMenuBar.Menu.File=\u6a94\u6848 -TMenuBar.Menu.Edit=\u7de8\u8f2f -TMenuBar.Menu.Video=\u5f71\u7247 -TMenuBar.Menu.Tracks=\u8ecc\u8de1 -TMenuBar.Menu.Coords=\u5ea7\u6a19 -TMenuBar.Menu.Window=\u8996\u7a97 -TMenuBar.Menu.Help=\u8aaa\u660e -TMenuBar.MenuItem.EditProperties=\u5c6c\u6027... -TMenuBar.MenuItem.VideoVisible=\u986f\u793a -TMenuBar.MenuItem.VideoFilters=\u6a94\u6848 -TMenuBar.MenuItem.NewVideoFilter=\u65b0\u589e -TMenuBar.MenuItem.NewTrack=\u65b0\u589e -TMenuBar.MenuItem.CoordsLocked=\u9396\u5b9a -TMenuBar.MenuItem.CoordsFixedOrigin=\u56fa\u5b9a\u539f\u9ede -TMenuBar.MenuItem.CoordsFixedAngle=\u56fa\u5b9a\u89d2\u5ea6 -TMenuBar.MenuItem.CoordsFixedScale=\u56fa\u5b9a\u6bd4\u4f8b -TMenuBar.MenuItem.CoordsRefFrame=\u53c3\u8003\u5ea7\u6a19 -TMenuBar.MenuItem.CoordsDefault=\u9810\u8a2d -TMenuBar.MenuItem.WindowRight=\u53f3\u908a\u986f\u793a\u4ecb\u9762 -TMenuBar.MenuItem.WindowBottom=\u4e0b\u65b9\u986f\u793a\u4ecb\u9762 -TMenuBar.MenuItem.PlayAllSteps=\u64ad\u653e\u5168\u90e8\u6b65\u9a5f -TMenuBar.MenuItem.Record=\u8f49\u9304 -TMenuBar.MenuItem.MatSize=\u5340\u57df\u5927\u5c0f -TMenuBar.MenuItem.Language=\u8a9e\u8a00 -TMenuBar.MenuItem.DeleteTrack=\u522a\u9664 -TMenuBar.MenuItem.TrackerHelp=Tracker \u8aaa\u660e... -TMenuBar.MenuItem.MessageLog=\u8a0a\u606f\u8a18\u9304... -TrackControl.Name=Track \u63a7\u5236\u9805 -TrackControl.Button.NewTrack=\u65b0\u589e -TrackControl.Button.NewTrack.ToolTip=\u65b0\u589e\u8ecc\u8de1 -TrackControl.Button.Trails.ToolTip=\u8a2d\u5b9a\u8ecc\u8de1\u9577\u5ea6 -TrackControl.Button.Labels.ToolTip=\u986f\u793a/\u96b1\u85cf \u865f\u78bc -TrackControl.Button.StretchVectors.ToolTip=\u62c9\u9577\u5411\u91cf -TrackControl.Button.Accelerations.ToolTip=\u986f\u793a/\u96b1\u85cf \u52a0\u901f\u5ea6 -TrackControl.Button.Xmass.ToolTip=\u4ee5\u8cea\u91cf\u589e\u52a0\u5411\u91cf\u500d\u6578 -TrackControl.Button.Vectors.ToolTip=\u5411\u91cf -TrackControl.Button.Velocities.ToolTip=\u986f\u793a/\u96b1\u85cf \u901f\u5ea6\u5411\u91cf -TrackControl.Button.Properties.ToolTip=\u6309\u4e00\u4e0b\u9078\u53d6 -TrackControl.Button.Positions.ToolTip=\u986f\u793a/\u96b1\u85cf \u4f4d\u7f6e -Tracker.Popup.MenuItem.Snapshot=\u87a2\u5e55\u5feb\u7167 -Tracker.Popup.MenuItem.Help=\u8aaa\u660e... -Tracker.Cursor.Crosshair.Description=\u5341\u5b57\u7dda \u6e38\u6a19 -Tracker.Action.AboutTracker=\u95dc\u65bc Tracker... -Tracker.Dialog.AboutTracker.Title=\u95dc\u65bc Tracker -Tracker.Action.AboutJava=\u95dc\u65bc Java... -Tracker.Dialog.AboutJava.Title=\u95dc\u65bc Java -Tracker.Dialog.AboutJava.UnknownVersion=\u672a\u77e5\u7684 -Tracker.Dialog.AboutJava.Message=Java \u7248\u672c -Tracker.Action.AboutQT=\u95dc\u65bc QuickTime... -Tracker.Dialog.AboutQT.Title=\u95dc\u65bc QuickTime -Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime \u7248\u672c -Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava \u7248\u672c -Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava \u8def\u5f91: -Tracker.Dialog.NoQT.Title=\u627e\u4e0d\u5230 QTJava.zip -Tracker.Dialog.NoQT.Message1=Java \u7684 QuickTime \u4f3c\u4e4e\u5c1a\u672a\u5b89\u88dd -Tracker.Dialog.NoQT.Message2=\u82e5\u60a8\u60f3\u5206\u6790 QuickTime \u7247, \u8acb\u91cd\u65b0\u5b89\u88dd QuickTime\u3002 -Tracker.Dialog.NoQT.Message3=\u8acb\u6ce8\u610f: \u5b89\u88dd QuickTime \u6642\u5fc5\u9808\u9078\u64c7 Java \u7684 QuickTime\u3002 -Tracker.Dialog.UpdateQT.Title=\u66f4\u65b0 QTJava.zip -Tracker.Dialog.UpdateQT.Message1= \u6b32\u53d6\u5f97 QTJava.zip \u7684\u66f4\u65b0\u7248\u53ef\u9023\u7d50\u81f3 -Tracker.Dialog.UpdateQT.Message2=\u60a8\u60f3\u8981\u66f4\u65b0\u9019\u4e9b\u820a\u6709\u6a94\u6848\u55ce\uff1f -Tracker.Dialog.CopyQT.Title=\u8907\u88fd QTJava.zip -Tracker.Dialog.CopyQT.Message1=QuickTime \u5df2\u7d93\u5b89\u88dd, \u4f46\u5728\u53ef\u4f7f\u7528 Tracker \u4e4b\u524d: -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip \u8907\u88fd\u5fc5\u9808\u5f9e -Tracker.Dialog.CopyQT.Message3= \u5230 -Tracker.Dialog.CopyQT.Message4= 2. Tracker \u5fc5\u9808\u91cd\u65b0\u555f\u52d5\u3002 -Tracker.Dialog.CopyQT.Message5=\u60a8\u73fe\u5728\u60f3\u8907\u88fd QTJava.zip \u55ce\uff1f -Tracker.Dialog.CopyFailed.Title=\u8907\u88fd\u5931\u6557 -Tracker.Dialog.CopyFailed.Message=\u7121\u6cd5\u8907\u88fd QTJava.zip\u3002 -Tracker.Dialog.CopiedTo.Title=\u8907\u88fd\u6210\u529f -Tracker.Dialog.CopiedTo.Message1=QTJava.zip \u5df2\u7d93\u6210\u529f\u5730\u8907\u88fd\u5230 -Tracker.Dialog.CopiedTo.Message2=Tracker \u5fc5\u9808\u91cd\u65b0\u555f\u52d5\u4e26\u4e14\u7acb\u5373\u95dc\u9589\u3002 -Tracker.Splash.Loading=\u4e0b\u8f09 -TrackerIO.Dialog.Import.Title=\u8f09\u5165 -TrackerIO.Dialog.Import.Message=\u9078\u64c7\u8f09\u5165\u9805\u76ee -TrackerIO.Dialog.ImportVideo.Title=\u8f09\u5165\u5f71\u7247 -TrackerIO.Dialog.Export.Title=\u8f38\u51fa -TrackerIO.Dialog.Export.Message=\u9078\u64c7\u8f38\u51fa\u9805\u76ee -TrackerIO.Dialog.ReplaceFile.Title=\u53d6\u4ee3\u820a\u6709\u6a94\u6848? -TrackerIO.Dialog.ReplaceFile.Message=\u5df2\u7d93\u5b58\u5728\uff0c\u60a8\u60f3\u53d6\u4ee3\u55ce\uff1f -TrackerIO.Dialog.NotTrackerXML.Title=\u4e0d\u5408\u7684 XML -TrackerIO.Dialog.NotTrackerXML.Message=\u542b\u6709\u4e0d\u540c\u7a0b\u5f0f\u7684 xml \u8cc7\u6599\u3002 -TrackerIO.Dialog.BadVideo.Message=\u5f71\u7247\u7121\u6cd5\u958b\u555f: -TrackerPanel.NewTab.Name=\u7121\u6a19\u984c\u7684 -TrackerPanel.DragToMark.Hint=\u6309\u4f4f Shift \u9375\u4e26\u62d6\u62c9\u6ed1\u9f20\u4ee5\u6a19\u793a -TrackerPanel.ClickToMark.Hint=\u6309\u4f4f Shift \u9375\u4e26\u6309\u4e00\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a -TrackerPanel.Dialog.LoadFailed.Title=\u6a94\u6848\u5c1a\u672a\u8f09\u5165 -TrackerPanel.Dialog.LoadFailed.Message=\u6a94\u6848\u7121\u6cd5\u8f09\u5165: -TrackerPanel.Dialog.SaveChanges.Title=\u5132\u5b58\u66f4\u65b0 -TrackerPanel.Dialog.SaveChanges.Message=\u66f4\u65b0\u53e6\u5b58\u65bc -TrackPlottingPanel.Popup.MenuItem.Lines=\u76f4\u7dda -TrackPlottingPanel.Popup.MenuItem.Points=\u9ede -TrackPlottingPanel.Popup.MenuItem.Scale=\u7e2e\u653e... -TrackPlottingPanel.Popup.MenuItem.Print=\u5370\u51fa... -TrackPlottingPanel.Popup.MenuItem.Measure=\u7e2e\u653e\u81f3\u5408\u9069\u6bd4\u4f8b -TrackPlottingPanel.Popup.MenuItem.Analyze=\u5206\u6790... -TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u62c9\u8fd1\u653e\u5927\u6aa2\u8996 -TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996 -TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u81ea\u52d5\u7e2e\u653e -TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u7e2e\u653e\u5230\u9810\u8a2d\u9577\u5bec -TrackPlottingPanelInspector.Title=\u7e2e\u653e -TrackPlottingPanelInspector.Label.Min=\u6975\u5c0f\u503c -TrackPlottingPanelInspector.Label.Max=\u6975\u5927\u503c -TrackPlottingPanelInspector.Label.Auto=\u81ea\u52d5 -TToolBar.Button.Footprint.Tooltip=\u8a2d\u5b9a\u8db3\u8de1 -TToolBar.Dropdown.SelectedTrack.Tooltip=\u9078\u53d6\u8ecc\u8de1 -TToolBar.Dropdown.SelectedTrack.None=\u5c1a\u672a\u9078\u53d6 -TTrack.MenuItem.Delete=\u522a\u9664 -TTrack.MenuItem.Color=\u984f\u8272... -TTrack.Dialog.Color.Title=\u9078\u53d6\u8ecc\u8de1\u984f\u8272 -TTrack.MenuItem.Name=\u547d\u540d... -TTrack.MenuItem.Footprint=\u8db3\u8de1 -TTrack.MenuItem.Description=\u8aaa\u660e... -TTrack.MenuItem.Visible=\u986f\u793a\u5c0f\u503c -TrackPlottingPanelInspector.Label.Max=\u6975\u5927\u503c -TrackPlottingPanelInspector.Label.Auto=\u81ea\u52d5 -TTrack.MenuItem.TrailVisible=\u986f\u793a\u8ecc\u8de1 -TTrack.MenuItem.Autostep=\u81ea\u52d5 -TTrack.MenuItem.MarkByDefault=\u9810\u8a2d\u6a19\u793a -TTrack.MenuItem.Locked=\u9396\u5b9a -TTrack.MenuItem.Delete=\u522a\u9664 -TTrack.Name.None=\u7121\u547d\u540d -TTrack.Dialog.Description.Title=\u8aaa\u660e: -TTrack.Dialog.Name.Title=\u547d\u540d -TTrack.Dialog.Name.Label=\u547d\u540d: -TViewChooser.Button.Choose.Tooltip=\u9078\u700f\u89bd\u6a21\u5f0f -Vector.Name=\u5411\u91cf -Vector.New.Name=\u5411\u91cf -Vector.MenuItem.ToOrigin=\u5230\u539f\u9ede -Vector.MenuItem.Label=\u986f\u793a\u6a19\u7c64 -VectorSum.Name=\u5411\u91cf\u548c -VectorSum.New.Name=\u7e3d\u548c -VectorSum.MenuItem.Inspector=\u9078\u53d6\u5411\u91cf... -VectorSumInspector.Title=\u5411\u91cf\u548c -VectorSumInspector.Border.Title=\u9078\u53d6\u5411\u91cf -WorldTView.Popup.MenuItem.Projectile=\u62cb\u9ad4\u6a21\u578b - -# Additions by Doug Brown 2006-11-01 -AnalyticParticle.Name=\u8cea\u9ede\u51fd\u6578\u6a21\u5f0f -AnalyticParticle.Inspector.Title=\u8cea\u9ede\u51fd\u6578\u6a21\u5f0f -AnalyticParticle.Property.FunctionX=x -AnalyticParticle.Property.FunctionY=y -CircleFootprint.Circle_4=\u534a\u5f91 4 -CircleFootprint.Circle_6=\u534a\u5f91 6 -CircleFootprint.Circle_8=\u534a\u5f91 8 -DynamicParticle.Name=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 -DynamicParticle.Inspector.Title=\u8cea\u9ede\u52d5\u529b\u6a21\u5f0f -DynamicParticle.Property.ForceX=\u4f5c\u7528\u529b Fx -DynamicParticle.Property.ForceY=\u4f5c\u7528\u529b Fy -DynamicParticle.Property.InitialX=x -DynamicParticle.Property.InitialY=y -DynamicParticle.Property.InitialVelocityX=vx -DynamicParticle.Property.InitialVelocityY=vy -LineProfile.MenuItem.Fixed=\u56fa\u5b9a\u7684 -ParticleModel.New.Name=\u6a21\u7d44 -ParticleModel.MenuItem.InspectModel=\u6a21\u7d44\u5efa\u69cb\u5de5\u5177... -ParticleModel.Inspector.Button.Undo=\u5fa9\u539f -ParticleModel.Inspector.Button.Redo=\u53d6\u6d88\u5fa9\u539f -ParticleModel.Inspector.Button.Close=\u95dc\u9589 -ParticleModel.Inspector.Button.Help=\u8aaa\u660e - -# Additions by Doug Brown 2006-12-29 -Calibration.Axes.XOnly=\u50c5X -Calibration.Axes.YOnly=\u50c5Y -Calibration.Axes.XY=XY -Calibration.Spinner.Axes.Tooltip=\u9078\u64c7\u6821\u6b63\u8ef8 -Calibration.Label.Axes=\u8ef8 -Calibration.Dialog.InvalidCoordinates.Title=\u4e0d\u6b63\u78ba\u5ea7\u6a19\u8ef8 -Calibration.Dialog.InvalidCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540c\u5ea7\u6a19\u503c -Calibration.Dialog.InvalidXCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540cx\u5ea7\u6a19\u503c -Calibration.Dialog.InvalidYCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540cy\u5ea7\u6a19\u503c -SpectralLineFilter.Title=\u6c23\u9ad4\u5149\u8b5c -SpectralLineFilter.H=\u6c2b H -SpectralLineFilter.He=\u6c26 He -SpectralLineFilter.Ne=\u6c16 Ne -SpectralLineFilter.Hg=\u6c34\u9280 Hg -TFrame.View.Unknown=\u986f\u793a\u4ecb\u9762 -TMenuBar.MenuItem.Undo=\u5fa9\u539f -TMenuBar.MenuItem.Redo=\u91cd\u4f5c -TMenuBar.MenuItem.Replace=\u53d6\u4ee3... -TMenuBar.Menu.AddImage=\u8f09\u5165\u5f71\u50cf -TMenuBar.MenuItem.AddBefore=\u5728\u6b64\u5f71\u683c\u4e4b\u524d... -TMenuBar.MenuItem.AddAfter=\u5728\u6b64\u5f71\u683c\u4e4b\u5f8c... -TMenuBar.MenuItem.RemoveImage=\u79fb\u9664\u6b64\u5f71\u683c -TMenuBar.Menu.Tools=\u5de5\u5177 -TMenuBar.MenuItem.DataFunctionTool=\u6578\u503c\u8cc7\u6599\u5efa\u69cb\u5de5\u5177... -TMenuBar.MenuItem.DatasetTool=\u8cc7\u6599\u5206\u6790\u5de5\u5177... -TMenuBar.Menu.CopyImage=\u8907\u88fd\u5f71\u50cf -TMenuBar.MenuItem.CopyMainView=\u4e3b\u8981\u986f\u793a\u4ecb\u9762 -TMenuBar.MenuItem.CopyFrame=\u5f71\u683c -TMenuBar.MenuItem.PrintFrame=\u5217\u5370... -TrackerIO.Dialog.AddImage.Title=\u6dfb\u52a0\u5f71\u50cf -TTrack.Dialog.Name.BadName=\u5df2\u88ab\u4f7f\u7528! \u8acb\u9078\u7528\u5176\u4ed6\u540d\u7a31 -VectorStep.Label.Momentum=p -VectorStep.Label.Velocity=v -VectorStep.Label.NetForce=\u5408\u529b -VectorStep.Label.Acceleration=a - -# Additions by Doug Brown 2007-02-19 -PlotTView.Label.NoData=\u4ee5\u7e6a\u5716\u986f\u793a\u4ecb\u9762\u6aa2\u8996 track \u8cc7\u6599 -TableTView.Label.NoData=\u4ee5\u5716\u8868\u986f\u793a\u4ecb\u9762\u6aa2\u8996 track \u8cc7\u6599 -TrackerPanel.Message.NoData0=\u5f71\u7247\u53ca track \u4e3b\u8981\u6aa2\u8996\u5340 -TrackerPanel.Message.NoData1=\u9078\u64c7 \u6a94\u6848|\u958b\u555f \u6216 \u8ecc\u8de1|\u65b0\u589e \u555f\u52d5 -WorldTView.Label.NoData=\u4ee5\u5ea7\u6a19\u986f\u793a\u4ecb\u9762\u6aa2\u8996\u5f71\u7247\u53ca track \u8cc7\u6599 - -# Additions by Doug Brown 2007-03-03 -DynamicParticle.Label.Solver=\u6578\u503c\u5206\u6790\u65b9\u6cd5: -DynamicParticle.Solver.Euler=Euler -DynamicParticle.Solver.Verlet=Verlet -DynamicParticle.Solver.RK4=Runge-Kutta -DynamicParticle.Solver.ODEMultistep=\u81ea\u52d5\u8abf\u6574\u591a\u91cd\u6b65\u9a5f\u65b9\u6cd5 @@ Adaptive Multistep -DynamicParticle.Table.Force.Border.Title=\u4f5c\u7528\u529b\u51fd\u6578 (t, x, y, vx, vy) -AnalyticParticle.Table.Functions.Border.Title=\u4f4d\u7f6e\u51fd\u6578 (t) -ParticleModel.Table.Initial.Border.Title=\u521d\u59cb\u503c -ParticleModel.Property.InitialT=t - -# Additions by Doug Brown 2007-04-25 -TMenuBar.MenuItem.PasteImage=\u8cbc\u4e0a\u5f71\u683c -TMenuBar.MenuItem.PasteAfter=\u5728\u6b64\u5f71\u683c\u4e4b\u5f8c -TMenuBar.MenuItem.PasteBefore=\u5728\u6b64\u5f71\u683c\u4e4b\u524d -TMenuBar.MenuItem.PasteReplace=\u66f4\u65b0\u5f71\u7247 - -# Additions by Doug Brown 2007-07-01 -TMenuBar.MenuItem.GettingStarted=\u555f\u52d5... -Tracker.Splash.HelpMessage=\u65b0\u7528\u6236? \u8acb\u9078\u64c7 - -# Additions by Doug Brown 2007-08-12 -CoordAxes.Label.Angle=\u89d2\u5ea6 -LineProfile.Checkbox.Rotates=\u65cb\u8f49 -LineProfile.Label.Spread=spread -RGBRegion.Name=RGB \u5340 -RGBRegion.New.Name=\u5340 -RGBRegion.MenuItem.Fixed=\u56fa\u5b9a\u7684 -RGBRegion.Label.Radius=\u534a\u5f91 -TTrack.Label.Step=\u6b65\u9a5f - -# Additions by Doug Brown 2007-10-24 -LineProfile.Data.Description.0=position number -LineProfile.Data.Description.1= x-\u5206\u91cf\u4f4d\u7f6e -LineProfile.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e -LineProfile.Data.Description.3=\u7d05 -LineProfile.Data.Description.4=\u7387 -LineProfile.Data.Description.5=\u85cd -LineProfile.Data.Description.6=perceived brightness -LineProfile.Data.Description.7=\u7dda\u5bec -ParticleModel.MenuItem.TraceVisible=\u8ecc\u8de1\u986f\u793a -ParticleModel.MenuItem.StepsVisible=\u6b65\u9a5f\u986f\u793a -PointMass.Data.Description.0=\u6642\u9593 -PointMass.Data.Description.1=x-\u5206\u91cf\u4f4d\u7f6e -PointMass.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e -PointMass.Data.Description.3=\u4f4d\u7f6e\u5927\u5c0f -PointMass.Data.Description.4=\u4f4d\u7f6e\u89d2\u5ea6 -PointMass.Data.Description.5=x-\u5206\u91cf\u901f\u5ea6 -PointMass.Data.Description.6=y-\u5206\u91cf\u901f\u5ea6 -PointMass.Data.Description.7=\u901f\u5ea6\u5927\u5c0f -PointMass.Data.Description.8=\u901f\u5ea6\u89d2\u5ea6 -PointMass.Data.Description.9= x-\u5206\u91cf\u52a0\u901f\u5ea6 -PointMass.Data.Description.10= y-\u5206\u91cf\u52a0\u901f\u5ea6 -PointMass.Data.Description.11=\u52a0\u901f\u5ea6\u5927\u5c0f -PointMass.Data.Description.12=\u52a0\u901f\u5ea6\u89d2\u5ea6 -PointMass.Data.Description.13=\u65cb\u8f49\u89d2\u5ea6 -PointMass.Data.Description.14=\u89d2\u901f\u5ea6 -PointMass.Data.Description.15=\u89d2\u52a0\u901f\u5ea6 -PointMass.Data.Description.16=\u6b65\u9a5f\u6578 -PointMass.Data.Description.17=\u5f71\u683c\u6578 -PointMass.Data.Description.18= x-\u5206\u91cf\u52d5\u91cf -PointMass.Data.Description.19=y-\u5206\u91cf\u52d5\u91cf -PointMass.Data.Description.20=\u52d5\u91cf\u5927\u5c0f -PointMass.Data.Description.21=\u89d2\u52d5\u91cf -PointMass.Data.Description.22=\u52d5\u80fd -RGBRegion.Data.Description.0=\u6642\u9593 -RGBRegion.Data.Description.1=x-\u5206\u91cf\u4f4d\u7f6e -RGBRegion.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e -RGBRegion.Data.Description.3=\u7d05 -RGBRegion.Data.Description.4=\u7da0 -RGBRegion.Data.Description.5=\u85cd -RGBRegion.Data.Description.6=\u6709\u611f\u4eae\u5ea6 -RGBRegion.Data.Description.7=\u756b\u7d20\u6578 -RGBRegion.Data.Description.8=\u6b65\u9a5f\u6578 -RGBRegion.Data.Description.9=\u5f71\u683c\u6578 -TView.Menuitem.Define=\u4e26\u6613... -Vector.Data.Description.0=\u6642\u9593 -Vector.Data.Description.1=x-\u5206\u91cf -Vector.Data.Description.2=y-\u5206\u91cf -Vector.Data.Description.3=\u5927\u5c0f -Vector.Data.Description.4=\u89d2 -Vector.Data.Description.5=\u8ecc\u8de1\u672b\u7aef\u7684 x-\u5206\u91cf\u4f4d\u7f6e -Vector.Data.Description.6=\u8ecc\u8de1\u672b\u7aef\u7684 y-\u5206\u91cf\u4f4d\u7f6e -Vector.Data.Description.7=\u6b65\u9a5f\u6578 -Vector.Data.Description.8=\u5f71\u683c\u6578 -# Additions by Doug Brown 2008-01-02 -ParticleModel.Parameter.Mass.Description=\u8cea\u9ede\u8cea\u91cf -ParticleModel.Parameter.InitialTime.Description=\u8d77\u59cb\u6642\u9593 -AnalyticParticle.PositionFunction.X.Description=x-\u5206\u91cf\u4f4d\u7f6e -AnalyticParticle.PositionFunction.Y.Description=y-\u5206\u91cf\u4f4d\u7f6e -DynamicParticle.ForceFunction.X.Description=x-\u5206\u91cf\u529b -DynamicParticle.ForceFunction.Y.Description=y-\u5206\u91cf\u529b -DynamicParticle.Parameter.InitialX.Description=x-\u5206\u91cf\u521d\u59cb\u4f4d\u7f6e -DynamicParticle.Parameter.InitialY.Description=y-\u5206\u91cf\u521d\u59cb\u4f4d\u7f6e -DynamicParticle.Parameter.InitialVelocityX.Description=x-\u5206\u91cf\u521d\u59cb\u5411\u91cf -DynamicParticle.Parameter.InitialVelocityY.Description=y-\u5206\u91cf\u521d\u59cb\u5411\u91cf -TrackerPanel.ModelBuilder.Title=\u6a21\u7d44\u5efa\u69cb\u5de5\u5177 -TrackerPanel.DataBuilder.Title=\u8cc7\u6599\u5efa\u69cb\u5de5\u5177 -TrackControl.TrailMenu.NoTrail=\u7121\u8ecc\u8de1 -TrackControl.TrailMenu.ShortTrail=\u77ed\u7684\u8ecc\u8de1 -TrackControl.TrailMenu.LongTrail=\u9577\u7684\u8ecc\u8de1 -TrackControl.TrailMenu.FullTrail=\u5b8c\u6574\u8ecc\u8de1 -TrackerPanel.ModelBuilder.Spinner.Tooltip=\u76ee\u524d\u9078\u53d6\u7684\u6a21\u5f0f -TrackerPanel.ModelBuilder.LineButton.Text=\u76f4\u7dda\u6a23\u5f0f -TrackerPanel.ModelBuilder.LineButton.Tooltip=\u8a2d\u5b9a\u76f4\u7dda\u6a23\u5f0f -ParticleModel.LineStyle.None=\u7121\u76f4\u7dda -ParticleModel.LineStyle.Connect=\u9023\u7d50\u6b65\u9a5f -ParticleModel.LineStyle.Smooth=\u5e73\u6ed1\u7dda -ModelFunctionPanel.Label=\u6a21\u7d44 -AnalyticFunctionPanel.FunctionEditor.Border.Title=\u4f4d\u7f6e\u51fd\u6578 -DynamicFunctionPanel.FunctionEditor.Border.Title=\u4f5c\u7528\u529b\u51fd\u6578 - -# Additions by Doug Brown 2008-11-14 -TableTView.Dialog.TableColumns.Title=\u986f\u793a\u8868\u683c\u6b04\u4f4d -Tracker.About.ProjectOf=\u8a08\u756b\u4e3b\u6301\u8005: -Tracker.About.TranslationBy=\u7ffb\u8b6f\u8005 -Tracker.About.Translator=Fu-Kwun Hwang -TMenuBar.Menu.SaveVideoAs=\u53e6\u5b58\u5f71\u7247\u526a\u8f2f\u70ba -TActions.SaveClipAs.ProgressMonitor.Message=\u53e6\u5b58\u5f71\u7247\u526a\u8f2f -TActions.SaveClipAs.ProgressMonitor.Progress=\u5b8c\u6210 - -# Additions by Doug Brown 2008-12-07 -PlotTrackView.Checkbox.Synchronize=Sync -PlotTrackView.Checkbox.Synchronize.Tooltip=\u540c\u6b65\u5316\u5782\u76f4\u5ea7\u6a19 -RGBRegion.MenuItem.FixedRadius=\u56fa\u5b9a\u534a\u5f91 -Tracker.VideoZoom.Hint=\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u8fd1\u653e\u5927\u6aa2\u8996\uff0c\u6309\u4f4f alt \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996\uff0c\u5feb\u901f\u6309\u5169\u4e0b\u6ed1\u9f20\u4ee5\u81ea\u52d5\u8abf\u6574\u5927\u5c0f\u6aa2\u8996 -Tracker.PlotZoomIn.Hint=\u62d6\u62c9\u6ed1\u9f20\u4ee5\u62c9\u8fd1\u653e\u5927\u6aa2\u8996\uff0c\u5feb\u901f\u6309\u5169\u4e0b\u6ed1\u9f20\u4ee5\u81ea\u52d5\u8abf\u6574\u5927\u5c0f\u6aa2\u8996 -Tracker.PlotZoomOut.Hint=\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996 -Tracker.MenuItem.Hints=\u51fa\u73fe\u63d0\u793a -TapeMeasure.Label.Length=\u523b\u5ea6\u9577 -TapeMeasure.Label.TapeAngle=\u91cf\u5c3a\u89d2\u5ea6 -TapeMeasure.Label.ArcAngle=\u91cf\u89d2\u5668\u89d2\u5ea6 -TrackerIO.Dialog.NotAnImage.Title=\u4e0d\u6b63\u78ba\u7684\u6a94\u6848\u985e\u578b -TrackerIO.Dialog.NotAnImage.Message1=\u4e0d\u662f JPG \u6216 GIF \u5716\u6a94 -TrackerIO.Dialog.NotAnImage.Message2=\u60a8\u60f3\u7e7c\u7e8c\u55ce\uff1f -TToolBar.Button.Zoom.Tooltip=\u8abf\u6574\u6aa2\u8996\u5340\u5927\u5c0f\u5de5\u5177 (\u5feb\u901f\u9375: Z \u9375) -TrackChooserTView.DropDown.Tooltip=\u9078\u64c7\u4e00\u689d\u8ecc\u8de1 -TapeMeasure.Field.ArcAngle.Tooltip=\u5f9e\u91cf\u5c3a\u5230\u91cf\u89d2\u5668\u4e00\u908a\u7684\u89d2\u5ea6 @@ Angle from tape to protractor arm -TapeMeasure.Field.TapeAngle.Tooltip=\u5f9e x-\u8ef8\u6b63\u5411\u5230\u91cf\u5c3a\u7684\u89d2\u5ea6 -TapeMeasure.Field.Magnitude.Tooltip=\u91cf\u5c3a\u9577\u5ea6\u662f\u4ee5\u5ea7\u6a19\u523b\u5ea6\u55ae\u4f4d @@ Length of tape in scaled world units -TapeMeasure.Readout.Magnitude.Name=\u9577\u5ea6\u8b80\u6578 -TapeMeasure.Readout.Magnitude.Hint=\u6309\u4e00\u4e0b\u8a2d\u5b9a\u523b\u5ea6 -TapeMeasure.Readout.Angle.Name=\u89d2\u5ea6\u8b80\u6578 -TapeMeasure.Readout.Angle.Hint=\u6309\u4e00\u4e0b\u8a2d\u5b9a\u89d2\u5ea6 -TapeMeasure.Arm.Name=\u91cf\u89d2\u5668\u7684\u908a -TapeMeasure.Arm.Hint=\u62d6\u62c9\u4ee5\u6e2c\u91cf\u89d2\u5ea6\uff0c\u8b8a\u77ed\u4ee5\u95dc\u9589 -TapeMeasure.End.Name=\u672b\u7aef -TapeMeasure.End.Hint=\u62d6\u62c9\u4ee5\u6e2c\u91cf\u8ddd\u96e2\u6216\u6821\u6e96\u523b\u5ea6 -TapeMeasure.Handle.Name=\u628a\u624b -TapeMeasure.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u91cf\u5c3a -Vector.Tip.Name=\u5c16\u7aef -Vector.Tip.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u5ea7\u6a19\u5206\u91cf -Vector.Handle.Name=\u64cd\u7e31 @@ handle -Vector.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u5411\u91cf -Vector.ShortHandle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\uff0c\u6309\u4f4f alt \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u9078\u53d6\u5c16\u7aef\u9ede -PointMass.Position.Name=\u4f4d\u7f6e -PointMass.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u4f4d\u7f6e -PointMass.Velocity.Name=\u901f\u5ea6 -PointMass.Acceleration.Name=\u52a0\u901f\u5ea6 -PointMass.Vector.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5 -PointMass.Position.Locked.Hint=\u6309\u4e0b\u4ee5\u9078\u53d6--\u7121\u6cd5\u88ab\u62d6\u62c9 -CoordAxes.Handle.Name=+x-\u8ef8 -CoordAxes.Handle.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u50be\u659c\u89d2 -CoordAxes.Origin.Name=\u539f\u9ede -CoordAxes.Origin.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u4f4d\u7f6e -OffsetOrigin.Position.Name=\u4f4d\u7f6e -OffsetOrigin.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u539f\u9ede\u4f4d\u7f6e -Calibration.Point.Name=\u9ede -Calibration.Point.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u8ef8\u53ca\u523b\u5ea6 -RGBRegion.Position.Name=\u4f4d\u7f6e -RGBRegion.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u4f4d\u7f6e -LineProfile.End.Name=\u672b\u7aef -LineProfile.End.Hint=\u62d6\u62c9\u4ee5\u8abf\u6574\u7dda\u9577 -LineProfile.Handle.Name=\u64cd\u7e31 -LineProfile.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u76f4\u7dda -PointMass.Hint=\u5728\u5de5\u5177\u5217\u4e0a\u8a2d\u5b9a\u8cea\u91cf -PointMass.Unmarked.Hint=, \u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u4f4d\u7f6e -TTrack.Unselected.Hint=\u6309\u4e00\u4e0b\u4ee5\u9078\u53d6 \u548c/\u6216 \u8a2d\u5b9a\u5c6c\u6027 -Vector.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u62d6\u62c9\u6ed1\u9f20\u4ee5\u62d6\u62c9\u5411\u91cf -OffsetOrigin.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u504f\u79fb\u9ede -Calibration.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u7b2c\u4e00\u500b\u9ede -Calibration.Halfmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u7b2c\u4e8c\u500b\u9ede -CenterOfMass.Empty.Hint=\u9078\u53d6\u8cea\u91cf\u4ee5\u5b9a\u7fa9\u7cfb\u7d71 @@ select masses to define system -VectorSum.Empty.Hint=\u9078\u53d6\u5411\u91cf\u4ee5\u5b9a\u7fa9\u5176\u548c -TapeMeasure.Hint=\u8a2d\u5b9a\u9577\u5ea6\u4ee5\u8b8a\u66f4\u523b\u5ea6, \u8a2d\u5b9a\u89d2\u5ea6\u4ee5\u8b8a\u66f4 x-\u8ef8\u7684\u50be\u659c\u89d2 -CoordAxes.Hint=\u8a2d\u5b9a\u89d2\u5ea6\u4ee5\u8b8a\u66f4\u50be\u659c\u89d2 -ParticleModel.Hint=\u5728\u5de5\u5177\u5217\u4e0a\u8a2d\u5b9a\u8cea\u91cf\uff0c\u5728\u6a21\u7d44\u5efa\u69cb\u5de5\u5177\u4e2d\u8f38\u5165\u51fd\u6578\u4f5c\u6a21\u64ec -RGBRegion.Hint=\u8f38\u5165\u534a\u5f91\u4ee5\u6539\u8b8a\u5927\u5c0f -RGBRegion.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u4f4d\u7f6e -TTrack.ImportVideo.Hint=\u6e2c\u91cf RGB \u7684\u91cd\u8981\u5f71\u7247\u6216\u5716\u6a94 -TTrack.Selected.Hint=\u9078\u53d6\u7684 -LineProfile.Hint=\u8f38\u5165\u5bec\u5ea6\u4ee5\u8b8a\u66f4\u7dda\u5bec -LineProfile.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u62d6\u62c9\u6ed1\u9f20\u4ee5\u756b\u7dda -LineProfile.Menu.Orientation=\u5b9a\u4f4d -LineProfile.MenuItem.Horizontal=\u5782\u76f4 -LineProfile.MenuItem.XAxis=\u6cbf\u8457 X-\u8ef8 -Footprint.PositionVector=\u5411\u91cf -Footprint.BoldPositionVector=\u7c97\u5411\u91cf -Tracker.Startup.Hint=\u770b\u9019\u908a\u7684\u63d0\u793a(\u6216\u5728\u8aaa\u660e\u529f\u80fd\u8868\u4e2d\u53d6\u6d88\u63d0\u793a),\u6216\u6309\u4e0b F1 \u9375\u96a8\u6642\u89c0\u770b\u8aaa\u660e -TrackerPanel.NoVideo.Hint=\u958b\u555f\u6216\u8f09\u5165\u8981\u5206\u6790\u7684\u5f71\u7247\u6216\u5716\u6a94 -TrackerPanel.CalibrateVideo.Hint=\u78ba\u8a8d\u5df2\u77e5\u9577\u5ea6\u7684\u5c08\u984c\u5f71\u7247\u4e26\u4ee5\u91cf\u5c3a\u6e2c\u91cf\u8a2d\u5b9a\u523b\u5ea6 -TrackerPanel.NoTracks.Hint=\u65b0\u589e\u8ecc\u8de1\u4ee5\u6e2c\u91cf\u60a8\u6709\u8208\u8da3\u7684\u5c08\u984c\u5f71\u7247 -TrackerPanel.SetClip.Hint=\u5728\u5f71\u7247\u526a\u8f2f\u76e3\u6e2c\u5de5\u5177\u4e2d\u8a2d\u5b9a\u6216\u6aa2\u8996\u5f71\u7247\u526a\u8f2f\u8a2d\u5b9a -TrackerPanel.ShowAxes.Hint=\u8a2d\u5b9a\u539f\u9ede\u6216\u5ea7\u6a19\u8ef8\u9593\u7684\u89d2\u5ea6 -VideoPlayer.Step.Hint=\u5411\u524d (\u5feb\u6377\u9375: PageDown \u9375) -VideoPlayer.Back.Hint=\u5f8c\u9000 (\u5feb\u6377\u9375: PageUp \u9375) -TrackerPanel.DVVideo.Hint=\u904b\u7528 resize filter \u4f86\u66f4\u6b63 DV \u683c\u5f0f\u5f71\u7247\u7522\u751f\u7684\u626d\u66f2\u5f71\u50cf -TrackerIO.DataFileFilter.Description=Tracker \u6a94 -Tracker.Button.PDFHelp=\u53ef\u5217\u5370\u7684 PDF \u7248 -TToolbar.Button.TapeVisible.Tooltip=\u4ee5\u91cf\u89d2\u5668\u908a\u81c2\u4f5c\u91cf\u5c3a\u6e2c\u91cf @@ Tape Measure with Protractor Arm - -# Additions by Doug Brown 2009-03-06 -TMenuBar.MenuItem.TrackControl=\u8ecc\u8de1\u63a7\u5236\u9805 -TMenuBar.MenuItem.Description=\u8aaa\u660e -TrackPlottingPanel.RightDrag.Hint=\u6ed1\u9f20\u53f3\u9375\u62d6\u66f3\u986f\u793a\u9078\u55ae -TMenuBar.MenuItem.DeleteSelectedPoint=\u5df2\u9078\u53d6\u9ede -TFrame.InfoDialog.SaveChanges.Title=\u5132\u5b58\u8b8a\u66f4 -TFrame.InfoDialog.SaveChanges.Message=\u60a8\u60f3\u8981\u5132\u5b58\u8b8a\u66f4? - -# Additions by Doug Brown 2009-04-27 -DynamicParticle.Editor.Button.Cartesian=Cartesian -DynamicParticle.Editor.Button.Polar=Polar -DynamicParticle.Parameter.InitialR.Description=\u521d\u59cb\u534a\u5f91 -DynamicParticle.Parameter.InitialTheta.Description=\u521d\u59cb\u89d2\u5ea6 -DynamicParticle.Parameter.InitialVelocityR.Description=\u521d\u59cb\u5f91\u5411\u901f\u5ea6 -DynamicParticle.Parameter.InitialOmega.Description=\u521d\u59cb\u89d2\u901f\u5ea6 -DynamicParticle.ForceFunction.R.Description=\u4f5c\u7528\u529b\u7684\u5f91\u5411\u5206\u91cf -DynamicParticle.ForceFunction.Theta.Description=\u4f5c\u7528\u529b\u7684\u5207\u7dda\u5206\u91cf -DynamicParticlePolar.Name=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 (Polar) -DynamicTwoBody.Editor.Button.Particle1=\u8cea\u9ede 1 -DynamicTwoBody.Editor.Button.Particle2=\u8cea\u9ede 2 -DynamicTwoBody.Name=Dynamic Two-Body Model -TMenuBar.Menu.DynamicParticle=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 -TMenuBar.MenuItem.Cartesian=Cartesian -TMenuBar.MenuItem.Polar=Polar - -# Additions by Doug Brown 2009-08-24 -Autotrack.Inspector.Title=\u81ea\u52d5\u8ffd\u8e64\u8ecc\u8de1 -PointMass.MenuItem.Autotrack=\u81ea\u52d5\u8ffd\u8e64\u8ecc\u8de1 ... -Dialog.Button.Help=\u8aaa\u660e -AutoTracker.Wizard.Button.Reset=\u91cd\u8a2d -AutoTracker.Wizard.Button.Back=\u56de\u5230 -AutoTracker.Wizard.Button.Next=\u4e0b\u4e00\u500b -AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 -AutoTracker.Wizard.Button.Search=\u641c\u5c0b -AutoTracker.Wizard.Button.Start=\u958b\u59cb -AutoTracker.Wizard.Button.Pause=\u66ab\u505c -AutoTracker.Wizard.Button.Skip=\u8df3\u904e -AutoTracker.Label.Mask=\u906e\u7f69\u5f71\u50cf -AutoTracker.Label.Target=\u7269\u504f\u79fb -AutoTracker.Label.AcceptLevel=\u63a5\u53d7\u4ee5\u4e0a\u5206\u6578 -AutoTracker.TabbedPane.TabTitle.Mask=\u906e\u7f69 -AutoTracker.TabbedPane.TabTitle.Target=\u76ee\u6a19 -AutoTracker.Info.GetStarted=\u8acb\u9ede\u9078\u60a8\u60f3\u8981\u81ea\u52d5\u8ffd\u7e31\u7684\u5f71\u7247\u529f\u80fd -AutoTracker.Info.Mask1=\u6b64\u906e\u7f69\u5b9a\u7fa9\u5728\u6bcf\u4e00\u500b\u5f71\u683c\u4e2d\u6240\u5c0d\u61c9\u7684\u5f71\u50cf\uff0c\u62d6\u62c9\u906e\u7f69\u7684\u4e2d\u5fc3\u9ede\u53ef\u79fb\u52d5\u906e\u7f69\uff0c\u6216\u62d6\u62c9\u628a\u624b\u53ef\u8abf\u6574\u906e\u7f69\u5927\u5c0f\u3002 -AutoTracker.Info.Mask2=\u63d0\u793a\uff1a\u6b64\u906e\u7f69\u4e0d\u9700\u592a\u5927\u6216\u6db5\u84cb\u6574\u500b\u7269\u4ef6\uff0c\u901a\u5e38\u529f\u80fd\u7368\u7279\u4e14\u542b\u9ad8\u5c0d\u6bd4\u5ea6\u908a\u6846\u7684\u906e\u7f69\u6548\u679c\u6700\u4f73\u3002 -AutoTracker.Info.MaskLocked1=\u6b64\u906e\u7f69\u5df2\u88ab\u4f7f\u7528\u6216\u9396\u5b9a\u3002 -AutoTracker.Info.MaskLocked2=\u6309\u4e0b\u91cd\u65b0\u6574\u7406\u6309\u9215\u4ee5\u6e05\u9664\u6240\u6709\u6b65\u9a5f\uff0c\u89e3\u9664\u906e\u7f69\u9396\u5b9a\u4e26\u91cd\u65b0\u958b\u59cb\u3002 -AutoTracker.Info.Target1=\u76ee\u6a19\u662f\u65bc\u76f8\u5c0d\u906e\u7f69\u7684\u4f4d\u7f6e\u6a19\u793a\u6b65\u9a5f\uff0c\u62d6\u62c9\u76ee\u6a19\u53ef\u79fb\u52d5\u5176\u4f4d\u7f6e\u3002 -AutoTracker.Info.Target2=\u63d0\u793a\uff1a\u5373\u4f7f\u5df2\u7d93\u6a19\u793a\u6b65\u9a5f\uff0c\u60a8\u4ecd\u53ef\u62d6\u52d5\u6a19\u7684\u7269\u4f4d\u7f6e\uff0c\u6a19\u793a\u6b65\u9a5f\u6703\u81ea\u52d5\u96a8\u6a19\u7684\u7269\u800c\u79fb\u52d5\u3002 -AutoTracker.Info.TargetLocked=\u6b64\u6a19\u7684\u7269\u6b63\u88ab\u4f7f\u7528\u4e14\u88ab\u8a02\u5728\u7d66\u5b9a\u7684\u6b65\u9a5f\u4f4d\u7f6e\uff0c\u79fb\u52d5\u6b64\u6a19\u7684\u7269\u4e5f\u5c07\u79fb\u52d5\u5176\u6b65\u9a5f\u3002 -AutoTracker.Info.Settings1=\u81ea\u52d5\u6a19\u793a\u7b26\u5408\u53ef\u63a5\u53d7\u7a0b\u5ea6\u4ee5\u4e0a\u7684\u986f\u793a\u5206\u6578\u3002@@ Match scores above the acceptance level shown are marked automatically. -AutoTracker.Info.Settings2=\u63d0\u793a\uff1a\u964d\u4f4e\u53ef\u63a5\u53d7\u7a0b\u5ea6\u5c07\u53ef\u52a0\u901f\u6a19\u793a\u6b65\u9a5f\uff0c\u4f46\u4e5f\u6703\u63d0\u9ad8\u932f\u8aa4\u7684\u53ef\u80fd\u6027\u3002 -AutoTracker.Info.Search1=\u5c07\u986f\u793a\u641c\u5c0b\u7d50\u679c\u6700\u7b26\u5408\u7684\u77e9\u5f62\uff0c\u62d6\u62c9\u77e9\u5f62\u4e2d\u5fc3\u9ede\u53ef\u79fb\u52d5\u4e4b\uff0c\u6216\u62d6\u62c9\u628a\u624b\u53ef\u8abf\u6574\u77e9\u5f62\u5927\u5c0f\u3002 -AutoTracker.Info.Search2=\u63d0\u793a\uff1a\u6b64\u77e9\u5f62\u4e0d\u9700\u592a\u5927\uff0c\u641c\u5c0b\u7d50\u679c\u7684\u524d\u5169\u500b\u7b26\u5408\u77e9\u5f62\uff0c\u9810\u6e2c\u7684\u6f14\u7b97\u5f0f\u53ef\u5c07\u641c\u5c0b\u5340\u79fb\u52d5\u81f3\u9810\u6e2c\u51fa\u7684\u7b26\u5408\u4f4d\u7f6e\u3002 -AutoTracker.Info.Frame=\u5f71\u683c -AutoTracker.Info.Match=\u7b26\u5408\u8005\u5373\u5728\u76ee\u6a19\u4f4d\u7f6e\u81ea\u52d5\u88ab\u6a19\u793a\u986f\u793a\u3002 -AutoTracker.Info.Possible=\u5728\u641c\u5c0b\u5340\u986f\u793a\u767c\u73fe\u53ef\u80fd\u7684\u7b26\u5408\u8005\uff0c\u60a8\u53ef\u9078\u64c7\uff1a -AutoTracker.Info.NoMatch=\u5728\u641c\u5c0b\u5340\u986f\u793a\u672a\u767c\u73fe\u4efb\u4f55\u53ef\u80fd\u7684\u7b26\u5408\u8005\uff0c\u60a8\u53ef\u9078\u64c7\uff1a -AutoTracker.Info.Outside=\u641c\u5c0b\u5340\u8d85\u51fa\u5716\u6a94\u7684\u7bc4\u570d\uff0c\u60a8\u53ef\u9078\u64c7\uff1a -AutoTracker.Info.Accepted=\u4f7f\u7528\u8005\u63a5\u53d7\u986f\u793a\u7684\u7b26\u5408\u8005\u3002 -AutoTracker.Info.MarkedByUser=\u4f7f\u7528\u8005\u624b\u52d5\u6a19\u793a\u6b65\u9a5f\u3002 -AutoTracker.Info.NoVideo=\u81ea\u52d5\u8ffd\u8e64\u529f\u80fd\u5fc5\u9808\u8981\u6709\u5f71\u7247\u6a94\uff0c\u8acb\u8f09\u5165\u5f71\u7247\u6a94\u6216\u95dc\u9589\u81ea\u52d5\u8ffd\u8e64\u529f\u80fd\u3002 -AutoTracker.Info.Height=\u9ad8\u5ea6 -AutoTracker.Info.Width=\u5bec\u5ea6 -AutoTracker.Info.Accept=--\u63a5\u53d7\u7b26\u5408\u8005 -AutoTracker.Info.Retry=--\u79fb\u52d5\u641c\u5c0b\u5340\u4e26\u518d\u6b21\u641c\u5c0b -AutoTracker.Info.Mark=\u6309 --shift-click \u8907\u5408\u9375\u4ee5\u624b\u52d5\u6a19\u793a\u6b65\u9a5f -AutoTracker.Info.Skip=--\u8df3\u904e\u6b64\u5f71\u683c\u4e26\u7e7c\u7e8c\u8ffd\u8e64 -AutoTracker.Info.Reset=--\u91cd\u65b0\u6574\u7406\u4e26\u4ee5\u8abf\u597d\u7684\u906e\u7f69\u91cd\u65b0\u958b\u59cb -AutoTracker.Dialog.MaskLocked.Title=\u9396\u5b9a\u906e\u7f69 -PointMass.Cursor.Autotrack.Description=\u81ea\u52d5\u8ffd\u8e64\u6e38\u6a19 -VideoPlayer.StartFrame.Hint=\u62d6\u62c9\u4ee5\u8a2d\u5b9a\u8d77\u59cb\u5f71\u683c -VideoPlayer.EndFrame.Hint=\u62d6\u62c9\u4ee5\u8a2d\u5b9a\u7d50\u675f\u5f71\u683c -VideoPlayer.Slider.Hint=\u62d6\u62c9\u4ee5\u5feb\u901f\u700f\u89bd\u5f71\u7247 -FileDropHandler.Dialog.BadFile.Message=\u7121\u6cd5\u8f09\u5165\u6a94\u6848. -FileDropHandler.Dialog.BadFile.Title=\u7121\u6cd5\u8fa8\u8b58\u7684\u6a94\u6848. - -# Additions by Doug Brown 2009-10-27 -Dialog.Button.Apply=\u5957\u7528 -DynamicParticle.Dialog.Delete.Message=\u522a\u9664\u6b64\u8cea\u9ede\u5c07\u7531\u7cfb\u7d71\u4e2d\u79fb\u9664\uff0c\u662f\u5426\u4ecd\u78ba\u5b9a\u8981\u522a\u9664\uff1f -DynamicParticle.Dialog.Delete.Title=\u52d5\u614b\u7cfb\u7d71 -AutoTracker.TabbedPane.TabTitle.Settings=3. \u63a5\u53d7 -AutoTracker.TabbedPane.TabTitle.Search=4. \u641c\u5c0b -DynamicParticle.System.In=\u5728\u5176\u4e2d -DynamicSystem.Empty=\u7a7a\u7684 -DynamicSystem.Force.Name.Internal=\u5167\u90e8\u7684 -DynamicSystem.ForceFunction.R.Description=\u5167\u90e8\u4f5c\u7528\u529b\u7684\u5f91\u5411\u5206\u91cf -DynamicSystem.ForceFunction.Theta.Description=\u5167\u90e8\u4f5c\u7528\u529b\u7684\u5207\u7dda\u5206\u91cf -DynamicSystem.MenuItem.Inspector=\u9078\u53d6\u8cea\u9ede... -DynamicSystem.Name=\u52d5\u614b\u4e8c\u9ad4\u7cfb\u7d71 -DynamicSystem.New.Name=\u7cfb\u7d71 -DynamicSystem.Parameter.Of=\u7684 -DynamicSystem.Parameter.RelativeTo=\u76f8\u5c0d\u65bc -DynamicSystem.Parameter.Name.Relative=\u76f8\u5c0d -DynamicSystem.Parameter.ParticleMass.Description=\u7684\u8cea\u91cf -DynamicSystem.Parameter.Mass.Description=\u7cfb\u7d71\u7e3d\u8cea\u91cf -DynamicSystemInspector.Border.Title=\u8cea\u9ede -DynamicSystemInspector.Title=\u4e8c\u9ad4\u7cfb\u7d71 -DynamicSystemInspector.Button.Change=\u8b8a\u66f4... -DynamicSystemInspector.ParticleName.None=(none) -TMenuBar.MenuItem.Clone=\u8907\u88fd -TMenuBar.MenuItem.TwoBody=\u4e8c\u9ad4\u7cfb\u7d71 -TrackerPanel.DataBuilder.Dropdown.Tooltip=\u76ee\u524d\u9078\u64c7\u7684\u8ecc\u8de1 -TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync \u5782\u76f4\u8ef8 -TrackControl.Button.Trace.ToolTip=\u986f\u793a/\u96b1\u85cf \u8def\u5f91 -TToolBar.Button.Open.Tooltip=\u5728\u65b0\u7684\u5206\u9801\u4e2d\u958b\u555f\u5f71\u7247\u6a94\u6216\u8ecc\u8de1\u6a94 -TToolBar.Button.Save.Tooltip=\u5c07\u76ee\u524d\u7684\u5206\u9801\u5b58\u6a94 -TToolBar.Button.SelectTrack=\u9078\u53d6 -TToolBar.Button.SelectTrack.Tooltip=\u9078\u53d6\u820a\u7684\u8ecc\u8de1 -TTrack.MenuItem.ClearSteps=\u6e05\u9664\u6b65\u9a5f -PointMass.MenuItem.Position=\u4f4d\u7f6e -TMenuBar.MenuItem.Empty=(\u7a7a) -TTrackBar.Button.Memory=\u5df2\u4f7f\u7528\u8a18\u61b6\u5340: -TTrackBar.Button.Memory.Tooltip=\u76e3\u63a7\u6216\u7ba1\u7406\u8a18\u61b6\u5340 -TTrackBar.Memory.PopupItem.Launch=\u5728\u8a18\u61b6\u5340\u555f\u52d5 Tracker -TButton.Track.ToolTip=\u8a2d\u5b9a\u5c6c\u6027 -Tracker.Dialog.OutOfMemory.Message1=Tracker \u5de5\u4f5c\u8a18\u61b6\u5340\u4e0d\u8db3. -Tracker.Dialog.OutOfMemory.Message2=\u6309\u4e00\u4e0b\u8a18\u61b6\u5340\u6309\u9215\u986f\u793a\u9078\u9805. -Tracker.Dialog.OutOfMemory.Title=\u8a18\u61b6\u5340\u4e0d\u8db3. - -# Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead=\u5f80\u524d\u9810\u6e2c -AutoTracker.Label.Original=\u521d\u59cb -AutoTracker.Label.NoMask=\u7121 -AutoTracker.Label.Rate=\u8b8a\u5316\u7387: -AutoTracker.Info.Mask3=\u63d0\u793a: \u6240\u9078\u53d6\u5340\u57df\u4e0d\u9700\u8981\u5927\u65bc\u6216\u5305\u542b\u6574\u500b\u7269\u4ef6. \u82e5\u5305\u542b\u7279\u6b8a\u7684\u5716\u6848\u6216\u9bae\u660e\u7684\u5c0d\u6bd4\u6703\u6bd4\u8f03\u6709\u6548 -AutoTracker.Wizard.Checkbox.XAxis=\u9650\u65bcX-\u8ef8 -AutoTracker.Info.SearchOnAxis1=\u6703\u4ee5\u6240\u9078\u5340\u57df\u5167\u671dx-\u8ef8\u65b9\u5411\u641c\u5c0b\u6700\u7b26\u5408\u7684\u7d50\u679c. \u53ef\u85c9\u7531\u6ed1\u9f20\u62d6\u62c9\u6539\u8b8a\u641c\u5c0b\u5340\u57df\u4f4d\u7f6e\u6216\u5927\u5c0f. -AutoTracker.Info.PossibleOnAxis=\u5728\u9078\u5b9a\u5340\u57df\u5167\u5df2\u7d93\u6cbfx\u8ef8\u627e\u5230\u7b26\u5408\u7684\u6a19\u7684. \u63a5\u8457\u4f60\u7684\u9078\u64c7\u662f: -AutoTracker.Info.NoMatchOnAxis=\u5728\u9078\u5b9a\u5340\u57df\u5167\u6cbfx\u8ef8\u7121\u6cd5\u627e\u5230\u7b26\u5408\u7684\u6a19\u7684. \u63a5\u8457\u4f60\u7684\u9078\u64c7\u662f: -AutoTracker.Info.RetryOnAxis=--\u79fb\u52d5\u641c\u5c0b\u5340\u57df\u6216x\u8ef8\u4f4d\u7f6e \u7136\u5f8c\u518d\u5ea6\u641c\u5c0b -AutoTracker.Wizard.Button.Delete=\u522a\u9664\u6b64\u9ede -AutoTracker.Wizard.Button.DeleteMore=\u522a\u9664\u6b64\u9ede\u548c\u63a5\u7e8c\u7684\u6240\u6709\u9ede -Button.Define.Tooltip=\u5c0d\u76ee\u524d\u6b04\u7684\u8b8a\u6578\u5b9a\u7fa9\u5c0d\u61c9\u7684\u51fd\u6578 -Calibration.Label.Point=\u9ede -CalibrationStick.Hint=\u8a2d\u5b9a\u9577\u5ea6\u6216\u4ee5\u62d6\u62c9\u65b9\u5f0f\u6539\u8b8a\u6bd4\u4f8b, \u8a2d\u5b9a\u89d2\u5ea6\u5247\u6539\u8b8a\u50be\u659c\u7684\u4fee\u6b63 -CalibrationStick.End.Hint=\u4ee5\u62d6\u62c9\u65b9\u5f0f\u6539\u8b8a\u6bd4\u4f8b -CalibrationStick.New.Name=\u6821\u6b63\u687f -CalibrationTapeMeasure.New.Name=\u6821\u6b63\u5c3a -CalibrationTapeMeasure.Readout.Magnitude.Hint=\u6309\u5de6\u9375\u8f38\u5165\u76ee\u524d\u55ae\u4f4d\u5c0d\u61c9\u7684\u9577\u5ea6\u503c -CalibrationTapeMeasure.Hint=\u8a2d\u5b9a\u9577\u5ea6\u4ee5\u6539\u8b8a\u6bd4\u4f8b, \u8a2d\u5b9a\u89d2\u5ea6\u6539\u8b8ax\u8ef8\u50be\u659c\u89d2 -DynamicSystem.Data.Description.0=\u5169\u7c92\u5b50\u9593\u76f8\u5c0d\u8ddd\u96e2 -DynamicSystem.Data.Description.1=\u76f8\u5c0d\u89d2\u5ea6 -DynamicSystem.Data.Description.2=\u76f8\u5c0d\u5f91\u5411\u901f\u5ea6 -DynamicSystem.Data.Description.3=\u76f8\u5c0d\u89d2\u901f\u5ea6 -ExportDataDialog.Subtitle.Table=\u8cc7\u6599\u8868 -ExportDataDialog.Subtitle.Content=\u683c -ExportDataDialog.Subtitle.Format=\u6578\u5b57\u683c\u5f0f -ExportDataDialog.Subtitle.Delimiter=\u5206\u9694\u7b26\u865f -ExportDataDialog.Title=\u8f38\u51fa\u8cc7\u6599 -ExportDataDialog.Delimiter.Add=\u65b0\u589e... -ExportDataDialog.Delimiter.Remove=\u79fb\u9664... -ExportDataDialog.Content.AllCells=\u6240\u6709\u683c\u5b50 -ExportDataDialog.Content.SelectedCells=\u9078\u53d6\u7684\u683c\u5b50 -ExportDataDialog.MenuItem.RemoveDelimiter=\u79fb\u9664\u500b\u4eba\u8a2d\u5b9a\u5206\u9694\u7b26\u865f -ExportDataDialog.Chooser.SaveData.Title=\u5132\u5b58\u8cc7\u6599\u70ba -ExportVideoDialog.Button.SaveAs=\u5132\u5b58\u70ba... -ExportVideoDialog.Button.FullSize=\u5b8c\u6574\u5c3a\u5bf8 -ExportVideoDialog.Button.DrawnSize=\u5982\u5716\u6240\u793a -ExportVideoDialog.Content.VideoOnly=\u50c5\u9650\u5f71\u7247 -ExportVideoDialog.Content.VideoAndGraphics=\u5f71\u7247\u548c\u5716\u5f62 -ExportVideoDialog.Content.GraphicsOnly=\u50c5\u9650\u5716\u5f62 -ExportVideoDialog.Title=\u8f38\u51fa\u5f71\u7247 -ExportVideoDialog.Label.ClipSettings=\u5f71\u7247\u8a2d\u5b9a -ExportVideoDialog.Subtitle.Size=\u5c3a\u5bf8 -ExportVideoDialog.Subtitle.Content=\u5167\u5bb9 -ExportVideoDialog.Subtitle.View=\u986f\u793a -ExportVideoDialog.Subtitle.Format=\u683c\u5f0f -ExportVideoDialog.Complete.Message1=\u5f71\u7247\u5df2\u7d93\u5132\u5b58\u70ba -ExportVideoDialog.Complete.Message2=\u4f60\u662f\u5426\u60f3\u99ac\u4e0a\u4ee5 Tracker \u958b\u555f? -ExportVideoDialog.Complete.Title=\u5b8c\u6210\u8f38\u51fa -ExportVideoDialog.VideoSize=\u5f71\u7247\u5927\u5c0f -ExportVideoDialog.MatSize=mat \u5927\u5c0f -ExportVideo.Dialog.HiddenPlots.Message=\u5fc5\u9808\u986f\u793a\u6240\u6709\u5716\u5f62\u4ee5\u4fbf\u8f38\u51fa -ExportVideo.Dialog.HiddenPlots.Title=\u4e0d\u5b8c\u6574\u7684\u986f\u793a -Footprint.DoubleTarget=\u96d9\u4ea4\u53c9\u7dda -Footprint.BoldDoubleTarget=\u7c97\u7684\u96d9\u4ea4\u53c9\u7dda -OffsetOrigin.MenuItem.Fixed=\u56fa\u5b9a\u7684\u5ea7\u6a19\u7cfb -ParticleModel.Dialog.Offscreen.Message1=\u56e0\u70ba\u5df2\u7d93\u8d85\u51fa\u87a2\u5e55\u5340\u57df\u6709\u4e9b\u6b65\u9a5f\u88ab\u7701\u7565 -ParticleModel.Dialog.Offscreen.Message2=\u8acb\u6539\u8b8a\u6a21\u578b\u6216\u5f71\u7247\u5c3a\u5ea6\u4ee5\u9032\u884c\u4fee\u6b63 -ParticleModel.Dialog.Offscreen.Title=\u8d85\u51fa\u7bc4\u570d -PrefsDialog.Tab.Configuration.Title=\u8a2d\u5b9a -PrefsDialog.Memory.BorderTitle=\u8a18\u61b6\u9ad4\u5927\u5c0f -PrefsDialog.Tab.General.Title=\u5176\u4ed6 -PrefsDialog.RecentFiles.BorderTitle=\u958b\u555f\u6700\u8fd1\u7684\u9078\u55ae -PrefsDialog.Label.RecentSize=\u6a94\u6848\u6578 -PrefsDialog.Hints.BorderTitle=\u63d0\u793a -PrefsDialog.Button.Relaunch=\u99ac\u4e0a\u91cd\u65b0\u555f\u52d5 -PrefsDialog.Button.ClearRecent=\u6e05\u9664 -PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9810\u8a2d -PrefsDialog.Checkbox.HintsOn=\u9810\u8a2d\u986f\u793a\u63d0\u793a -PrefsDialog.Tab.Video.Title=\u5f71\u7247 -PrefsDialog.VideoPref.BorderTitle=\u5f71\u7247\u8655\u7406\u7a0b\u5f0f -PrefsDialog.Button.Xuggle=Xuggle (\u5efa\u8b70\u5b89\u88dd) -PrefsDialog.Button.QT=QuickTime -PrefsDialog.Dialog.WebStart.Message=\u7576\u4f7f\u7528Web Start\u6642\u7121\u6cd5\u4f7f\u7528\u8a18\u61b6\u9ad4\u7ba1\u7406 -PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f -PrefsDialog.LookFeel.BorderTitle=Look And Feel -PrefsDialog.Language.BorderTitle=\u8a9e\u8a00 -PrefsDialog.Upgrades.BorderTitle=\u6aa2\u67e5\u66f4\u65b0 -PrefsDialog.Tab.Runtime.Title=Runtime -PrefsDialog.Tab.Display.Title=\u986f\u793a -PrefsDialog.Language.Default=\u9810\u8a2d -PrefsDialog.Upgrades.Always=\u6bcf\u6b21 -PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 -PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 -PrefsDialog.Upgrades.Never=\u5f9e\u4e0d -PrefsDialog.Button.CheckForUpgrade=\u99ac\u4e0a\u6aa2\u67e5 -PrefsDialog.Xuggle.Speed.BorderTitle=\u64ad\u653e\u5f71\u7247 -PrefsDialog.Xuggle.Slow=\u9806\u66a2 (\u53ef\u80fd\u6703\u8b8a\u6162) -PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u51fa\u73fe\u92f8\u9f52) -PrefsDialog.CalibrationTool.BorderTitle=\u9810\u8a2d\u6821\u6b63\u5de5\u5177 -Protractor.Name=\u91cf\u89d2\u5668 -Protractor.New.Name=\u91cf\u89d2\u5668 -Protractor.Hint=\u62d6\u62c9\u5169\u687f\u4ee5\u6e2c\u91cf\u89d2\u5ea6 -Protractor.Label.Angle=\u89d2\u5ea6 -Protractor.Field.Angle.Tooltip=\u5169\u687f\u4e4b\u9593\u593e\u89d2 -Protractor.Vertex.Name=\u9802\u9ede -Protractor.Vertex.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u9802\u9ede -Protractor.End.Name=\u687f\u7aef\u9ede -Protractor.End.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u89d2\u5ea6 -Protractor.Handle.Name=\u64cd\u63a7\u9ede -Protractor.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u91cf\u89d2\u5668 -Protractor.Rotator.Name=\u8f49\u52d5\u5668 -Protractor.Rotator.Hint=\u62d6\u62c9\u4ee5\u8f49\u52d5\u91cf\u89d2\u5668 -Protractor.Readout.Name=\u8b80\u6578\u503c -Protractor.Readout.Hint=\u91cf\u89d2\u5668\u5169\u687f\u9593\u593e\u89d2 -ProtractorFootprint.Circle3=\u5c0f\u89d2\u5ea6 -ProtractorFootprint.Circle5=\u5927\u89d2\u5ea6 -ProtractorFootprint.Circle3Bold=\u7c97\u7dda\u5c0f\u5713 -ProtractorFootprint.Circle5Bold=\u7c97\u7dda\u5927\u5713 -Stick.Name=\u6821\u6b63\u687f -Stick.New.Name=\u6e2c\u91cf\u68d2 -TableTrackView.MenuItem.Unformatted=\u6700\u9ad8\u7cbe\u5bc6\u5ea6 -TableTrackView.MenuItem.Formatted=\u5982\u683c\u5f0f -TableTrackView.Menu.SetDelimiter=\u8a2d\u5b9a\u5340\u9694\u7b26\u865f -TableTrackView.MenuItem.AddDelimiter=\u65b0\u589e... -TableTrackView.MenuItem.RemoveDelimiter=\u79fb\u9664... -TableTrackView.Dialog.CustomDelimiter.Message=\u8f38\u5165\u65b0\u7684\u5340\u9694\u7b26\u865f\u5b57\u4e32: -TableTrackView.Dialog.CustomDelimiter.Title=\u65b0\u589e\u5340\u9694\u78bc -TableTrackView.Header.Tooltip=\u9ede\u5de6\u9375\u4ee5\u6392\u5e8f\u6216\u9ede\u5169\u4e0b\u4ee5\u9078\u53d6\u6b64\u6b04 -TableTrackView.MenuItem.CopySelectedData=\u8907\u88fd\u9078\u53d6\u7684\u8cc7\u6599 -TableTrackView.Dialog.RemoveDelimiter.Message=\u9078\u53d6\u8981\u79fb\u9664\u7684\u5340\u9694\u78bc: -TableTrackView.Dialog.RemoveDelimiter.Title=\u79fb\u9664\u5340\u9694\u78bc -TableTrackView.Radians.Tooltip=\u5f91\u5ea6 -TableTrackView.Degrees.Tooltip=\u89d2\u5ea6 -TableTrackView.RadiansPerSecond.Tooltip=\u5f91\u5ea6/\u79d2 -TableTrackView.DegreesPerSecond.Tooltip=\u89d2\u5ea6/\u79d2 -TableTrackView.RadiansPerSecondSquared.Tooltip=\u5f91\u5ea6/\u79d2^2 -TableTrackView.DegreesPerSecondSquared.Tooltip=\u89d2\u5ea6/\u79d2^2 -TableTrackView.MenuItem.DeleteDataFunction=\u522a\u9664\u8cc7\u6599\u51fd\u6578 -TActions.Action.SaveFrame=\u5132\u5b58\u8cc7\u6599\u70ba... -TActions.AboutVideo=\u5c6c\u6027... -TActions.Dialog.AboutVideo.Title=\u5f71\u7247\u5c6c\u6027 -TActions.Dialog.AboutVideo.Type=\u683c\u5f0f -TActions.Dialog.AboutVideo.Size=\u5c3a\u5ea6 -TActions.Dialog.AboutVideo.Length=\u9577\u5ea6 -TActions.Dialog.AboutVideo.Frames=\u5f71\u683c\u6578 -TActions.Dialog.AboutVideo.Seconds=\u79d2 -TActions.Dialog.AboutVideo.FrameRate=\u64ad\u653e\u5f71\u683c\u7387 -TActions.Dialog.AboutVideo.FramesPerSecond=fps -TActions.Dialog.AboutVideo.Path=\u8def\u5f91 -TActions.Action.ImportTRK=Tracker \u6a94\u6848... -TActions.Action.ProtractorVisible=\u986f\u793a -TapeMeasure.MenuItem.FixedLength=\u56fa\u5b9a\u9577\u5ea6 -TextTView.Label.NoTab=\u6b64\u8655\u986f\u793a\u6587\u5b57\u548c\u7db2\u9801\u5167\u5bb9 -TextTView.NewTab.Text1=\u9ede\u5169\u4e0b\u4ee5\u7de8\u8f2f\u6587\u5b57\u6216\u6a19\u984c. \u9ede\u53f3\u9375\u5448\u73fe\u66f4\u591a\u9078\u9805. -TextTView.NewTab.Text2=\u8f38\u5165url\u7db2\u5740\u5448\u73fe\u7db2\u9801\u6216\u9ede\u53f3\u9375\u958b\u65b0\u6a94\u6848 -TextTView.NewTab.Title=\u7121\u6a19\u984c -TextTView.Dialog.TabTitle.Title=\u8a2d\u5b9a\u6a19\u984c -TextTView.MenuItem.OpenHTML=\u958b\u555f\u7db2\u9801... -TextTView.MenuItem.SetTitle=\u8a2d\u5b9a\u6a19\u984c... -TextTView.Button.NewTab=\u65b0\u589e -TextTView.TextEdit.Description=\u6587\u5b57 -TFrame.Dialog.FileNotFound.Message=\u7121\u6b64\u6a94\u6848: -TFrame.Dialog.FileNotFound.Title=\u7121\u6b64\u6a94\u6848 -TFrame.View.Text=\u6587\u5b57/\u7db2\u9801 \u986f\u793a -TFrame.View.Main=\u4e3b\u8981\u986f\u793a -TMenuBar.Menu.OpenRecent=\u958b\u555f\u6700\u65b0 -TMenuBar.Menu.Import=\u8f38\u5165 -TMenuBar.Menu.Export=\u8f38\u51fa -TMenuBar.MenuItem.Video=\u5f71\u7247... -TMenuBar.MenuItem.Data=\u8cc7\u6599\u6a94... -TMenuBar.Menu.CopyObject=\u8907\u88fd\u7269\u4ef6 -TMenuBar.MenuItem.Coords=\u5ea7\u6a19\u7cfb -TMenuBar.MenuItem.VideoClip=\u5f71\u7247 -TMenuBar.Menu.MeasuringTools=\u6e2c\u91cf\u5de5\u5177 -TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u55ae\u4f4d -TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 -TMenuBar.MenuItem.Radians=\u5f91\u5ea6 -Tracker.Dialog.NoXuggle.Title=\u6c92\u6709\u5b89\u88dd Xuggle -Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddXuggle (\u8de8\u5e73\u53f0\u5f71\u7247\u8655\u7406\u7a0b\u5f0f). -Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f09 Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u95dc\u65bc Xuggle... -Tracker.Dialog.AboutXuggle.Title=\u95dc\u65bc Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \u7248\u672c -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \u9996\u9801: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle \u8def\u5f91: -Tracker.Dialog.NoVideoEngine.Message1=\u6c92\u6709\u5f71\u7247\u7a0b\u5f0f! \u96d6\u6c92\u6709 Tracker \u4ecd\u53ef\u4ee5 -Tracker.Dialog.NoVideoEngine.Message2=\u50c5\u986f\u793a\u5716\u7247, \u5716\u7247\u96c6\u6216 animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=\u6e96\u5099\u5b89\u88dd Xuggle, Tracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f -Tracker.Dialog.NoVideoEngine.Message4=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer -Tracker.Dialog.NoVideoEngine.Title=\u7f3a\u5c11\u5f71\u7247\u8655\u7406\u7a0b\u5f0f -Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddTracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f Xuggle. -Tracker.Dialog.NoXuggle.Message2=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer\u6703\u540c\u6642\u5b89\u88ddXuggle -Tracker.Dialog.NoXuggle.Title=\u7f3a\u5c11 Xuggle -Tracker.About.DefaultLocale=\u9810\u8a2d\u8a9e\u8a00 -Tracker.About.CurrentLanguage=\u8a9e\u8a00 -Tracker.Dialog.InsufficientMemory.Title=\u8a18\u61b6\u9ad4\u4e0d\u8db3 -Tracker.Dialog.InsufficientMemory.Message=\u9700\u6c42\u7684\u8a18\u61b6\u9ad4\u904e\u5927. -TrackerIO.Dialog.TabMustBeSaved.Message1=\u9801 -TrackerIO.Dialog.TabMustBeSaved.Message2=\u5fc5\u9808\u5132\u5b58\u70batracker \u683c\u5f0f\u6a94 \u4ee5\u4fbf\u518d\u5ea6\u8b80\u53d6 -TrackerIO.Dialog.TabMustBeSaved.Message3=\u662f\u5426\u6e96\u5099\u5132\u5b58? -TrackerIO.Dialog.TabMustBeSaved.Title=\u5c1a\u672a\u5132\u5b58\u9801 -TrackerIO.Dialog.NoTabs.Message=\u6c92\u6709\u9700\u8981\u5132\u5b58\u7684\u9801! -TrackerIO.Dialog.NoTabs.Title=\u6e05\u7a7a\u9801 -TrackerIO.Dialog.SaveTabset.Title=\u5132\u5b58\u6240\u6709\u9801 -TrackerIO.Dialog.SaveTab.Title=\u5132\u5b58\u6b64\u9801 -TrackerIO.Delimiter.Tab=\u9801 -TrackerIO.Delimiter.Space=\u7a7a\u683c -TrackerIO.Delimiter.Comma=\u9017\u9ede -TrackerIO.Delimiter.Semicolon=\u5206\u865f -TrackerIO.VideoAndDataFileFilter.Description=\u5f71\u7247\u548ctracker\u6a94\u6848 -TrackerPanel.Dialog.Version.Message1=\u4f60\u6b63\u958b\u555f\u4e00\u500bTracker\u683c\u5f0f\u6a94 -TrackerPanel.Dialog.Version.Message2=\u53ef\u80fd\u662f -TrackerPanel.Dialog.Version.Message3=\u4f7f\u7528\u7684\u7248\u672c\u7f3a\u5c11\u67d0\u4e9b\u529f\u80fd -TrackerPanel.Dialog.Version.Message4=\u53ef\u4e0b\u8f09\u6700\u65b0\u7248\u672c\u65bc -TrackerPanel.Dialog.Version.Title=\u7248\u672c\u683c\u5f0f\u4e0d\u7b26\u5408 -TrackerPanel.Label.ModelStart=\u958b\u59cb -TrackerPanel.Label.ModelEnd=\u7d50\u675f -TrackerPanel.Spinner.ModelStart.Tooltip=\u8a2d\u5b9a\u6a21\u578b\u7684\u8d77\u59cb\u5f71\u683c -TrackerPanel.Spinner.ModelEnd.Tooltip=\u8a2d\u5b9a\u6a21\u578b\u7684\u7d50\u675f\u5f71\u683c -TToolbar.Button.ProtractorVisible.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u91cf\u89d2\u5668 -TToolbar.Button.AxesVisible.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u5750\u6a19\u8ef8 -TToolBar.Button.TrackControl.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u63a7\u5236\u9215 -TTrack.Dialog.StepSizeWarning.Message1=\u6ce8\u610f: \u6709\u4e9b\u9ede\u6a19\u793a\u6642\u8d85\u904e\u4e00\u500b\u5f71\u683c(\u6709\u4e9b\u5f71\u683c\u88ab\u8df3\u904e) . -TTrack.Dialog.StepSizeWarning.Message2=\u6539\u8b8a\u5f71\u6642\u9593\u5340\u9593\u53ef\u80fd\u9020\u6210\u8df3\u904e\u5f71\u683c(\u7f3a\u5931\u90e8\u5206\u8cc7\u6599). -TTrack.Dialog.StepSizeWarning.Message3=\u5fc5\u9808\u7b49\u6240\u6709\u5f71\u683c\u9ede\u90fd\u6a19\u793a\u624d\u80fd\u986f\u793a\u901f\u5ea6\u6216\u52a0\u901f\u5ea6. -TTrack.Dialog.StepSizeWarning.Title=\u6ce8\u610f -TTrack.Dialog.SkippedStepWarning.Message1=\u6ce8\u610f: \u8df3\u904e\u5f71\u683c\u9ede\u6703\u9020\u6210\u90e8\u5206\u8cc7\u6599\u7f3a\u5931. -TTrack.Dialog.SkippedStepWarning.Title=\u6ce8\u610f -TTrack.Dialog.SkippedStepWarning.Checkbox=\u4e0d\u8981\u518d\u986f\u793a\u6b64\u8a0a\u606f -TTrack.Locked.Hint=\u9396\u5b9a -TTrack.AngleField.Radians.Tooltip=\u5f91\u5ea6 -TTrack.AngleField.Degrees.Tooltip=\u89d2\u5ea6 -TTrack.AngleField.Popup.Radians=\u6539\u70ba\u5f91\u5ea6 -TTrack.AngleField.Popup.Degrees=\u6539\u70ba\u89d2\u5ea6 -TTrackBar.Memory.Menu.SetSize=\u8a2d\u5b9a\u8a18\u61b6\u9ad4\u5927\u5c0f... -TTrackBar.Button.Version=\u76ee\u524d\u53ef\u66f4\u65b0\u7248\u672c: -TTrackBar.Popup.MenuItem.Upgrade=\u99ac\u4e0a\u66f4\u65b0... -TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 -XuggleVideo.MenuItem.SmoothPlay=\u7de9\u6162\u64ad\u653e (\u53ef\u80fd\u8b8a\u6162) - -# Additions by Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name=Calibration Tape -CircleFootprint.Circle=circle -CircleFootprint.FilledCircle=filled circle -CircleFootprint.Dialog.Title=Circle Footprint -CircleFootprint.Dialog.Label.Radius=Radius -CircleFootprint.Dialog.Checkbox.Bold=Bold -CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot -LineProfile.Hint.Marking=drag mouse to mark the line profile -PageTView.Button.Page=Page -PageTView.MenuItem.ClosePage=Close Page -PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step -PrefsDialog.Dialog.NewVersion.Title=Upgrades -PrefsDialog.Dialog.NewVersion.Message1=Version -PrefsDialog.Dialog.NewVersion.Message2=is now available at -PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. -RGBRegion.Hint.Marking=click mouse to mark the center of the region -TMenuBar.MenuItem.Restore=Restore Views -TrackControl.StretchVectors.None=No stretch -TViewChooser.Maximize.Tooltip=Maximize this view -TViewChooser.Restore.Tooltip=Restore views -Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step -WorldTView.Button.World=World - -# Additions by Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle=Warnings -PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors -PropertiesDialog.Title=Properties -PropertiesDialog.Label.Author=Author -PropertiesDialog.Label.Contact=Contact -TActions.Action.Properties=Properties... -TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame -TFrame.Progress.ClickToCancel=(click to cancel) -TFrame.Dialog.StalledVideo.Title=Error Loading Video -TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. -TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. -TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: -TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. -TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. -TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. -TFrame.Dialog.StalledVideo.Button.Stop=Stop -TFrame.Dialog.StalledVideo.Button.Wait=Wait -Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again -TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: -TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. -TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). -TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser - -# Additions by Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found -TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node - -# Additions by Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title=Kinematic Particle -DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) -DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) -DynamicSystem.Builder.Title=Dynamic System (Internal) -PropertiesDialog.Button.CopyFilePath=Copy File Path -PropertiesDialog.Button.CopyVideoPath=Copy Video Path -PropertiesDialog.Tab.TrackerFile=Tracker File -PropertiesDialog.Tab.Metadata=Metadata -PropertiesDialog.Header.Property=Property -PropertiesDialog.Header.Value=Value -TActions.Action.OpenURL=Open URL... -TActions.Dialog.OpenURL.Title=Open URL -TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file -TActions.Dialog.AboutVideo.Name=Name - -# Additions by Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle=Cached Web Files -PrefsDialog.Button.ClearCache=Clear - -# Additions by Doug Brown 2011-10-07 -PointMass.Remark.Hint=, shift-click to re-mark highlighted position -PointMass.Remarking.Hint=click mouse to re-mark position -PointMass.PositionSelected.Hint=drag or enter position on toolbar -PointMass.VectorSelected.Hint=drag to move -Vector.Remark.Hint=shift-click to re-mark highlighted tip -Vector.TipSelected.Hint=drag or enter components on toolbar -Vector.HandleSelected.Hint=drag to move -Vector.Remarking.Hint=click mouse to re-mark tip -AutoTracker.Label.Search=Search -AutoTracker.Label.Target=Target -AutoTracker.Label.Frame=Frame -AutoTracker.Label.Point=Point -AutoTracker.Label.Template=Template -AutoTracker.Label.Track=Track -AutoTracker.Label.Match=Match -AutoTracker.Label.NoTemplate=No Template -AutoTracker.Label.EvolutionRate=Evolution Rate -AutoTracker.Label.Automark=Automark -AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. -AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. -AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. -AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. -AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. -AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. -AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. -AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. -AutoTracker.Info.Search=The search area is scanned for the best match. -AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. -AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. -AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. -AutoTracker.Info.Target=The target is where the targeted track point is marked. -AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. -AutoTracker.Info.Title.Settings=Settings -AutoTracker.Info.Title.Tip=Tip -AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. -AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: -AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame -AutoTracker.Info.Replace=--accept the match and replace the existing point -AutoTracker.Info.Keep=--keep the existing point -AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: -AutoTracker.Wizard.Button.Accept=Accept -AutoTracker.Wizard.Button.Stop=Stop -AutoTracker.Wizard.Button.Skip=Skip -AutoTracker.Wizard.Button.Replace=Replace -AutoTracker.Wizard.Button.Keep=Keep -AutoTracker.Wizard.Button.Search=Search -AutoTracker.Wizard.Button.SearchThis=Search This -AutoTracker.Wizard.Button.SearchNext=Search Next -AutoTracker.Wizard.Button.Delete=Delete -AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame -AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame -AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead -AutoTracker.Wizard.Checkbox.XAxis=X-axis Only -AutoTracker.Wizard.Menuitem.DeleteThis=This Point -AutoTracker.Wizard.Menuitem.DeleteLater=Later Points -AutoTracker.Wizard.Menuitem.DeleteAll=All Points -TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker -MainTView.Popup.MenuItem.ZoomIn=Zoom In -MainTView.Popup.MenuItem.ZoomOut=Zoom Out -MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit -TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration -TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than -TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from -TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. -TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: -TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: -TFrame.Dialog.LibraryError.Title=Error -TFrame.Dialog.LibraryError.Message=No resource could be loaded for node - -# Additions by Doug Brown 2011-12-01 -TTrack.Label.Unmarked=shift-click to mark -PrefsDialog.Label.Path=Path -PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit -PrefsDialog.FileChooser.Title.Cache=Set Cache -PrefsDialog.FileFilter.Directories=Directories -Tracker.Action.AboutThreads=About Threads... -PrefsDialog.JRE.BorderTitle=Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE=Set Java VM -PrefsDialog.FileFilter.JRE=Directories and Java VMs -PrefsDialog.Version.BorderTitle=Tracker Version -PrefsDialog.Version.Default=default -PrefsDialog.Tab.ClearCacheOnExit=Clear on exit -PrefsDialog.Run.BorderTitle=Programs Executed at Startup -PrefsDialog.FileChooser.Title.Run=Select Executable File -PrefsDialog.Button.Save=Save -Tracker.Readme=Tracker README -Tracker.Readme.NotFound=README file not found -Popup.MenuItem.Algorithm=Algorithms... -AlgorithmDialog.Button.FiniteDifference=Finite Difference -AlgorithmDialog.Button.BounceDetect=Bounce Detection -AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: -AlgorithmDialog.Title=Algorithms -AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. -AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) -AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) -AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. -AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: -TMenuBar.Menu.Diagnostics=Diagnostics - -# Additions by Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title=Invalid XML -Tracker.Dialog.Invalid.Message=The file cannot be read. -TrackPlottingPanel.Popup.Menu.CompareWith=Compare With -TrackerPanel.DataBuilder.TrackType.Unknown=unknown -TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file -TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file -TrackerPanel.DataBuilder.Load.Title=Load Data Functions -TrackerPanel.DataBuilder.Load.Message=Select functions to load: -TrackerPanel.DataBuilder.Save.Title=Save Data Functions -TrackerPanel.DataBuilder.Save.Message=Select functions to save: -TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all -TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into -TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection -TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type -TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type -TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. -TToolbar.Button.Refresh=Refresh data and views - -# Additions by Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as -ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? -ExportTRKDialog.Complete.Title=Export Complete -ExportTRKDialog.Title=Export ZIP Resource -ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. -ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. -TMenuBar.MenuItem.TabClip=ZIP Resource -TMenuBar.Menu.CalibrationTools=Calibration Tools -TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip -TrackerIO.Dialog.DurationVaries.Start=start -TrackerIO.Dialog.DurationVaries.End=end -TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip - -# Additions by Doug Brown 2012-05-07 -AttachmentInspector.Title=Attach Ends -AttachmentInspector.Label.End=End -AttachmentInspector.Label.Vertex=Vertex -AttachmentInspector.Header.PointName=Name -AttachmentInspector.Header.AttachedTo=Attach To -ExportTRKDialog.Label.VideoFormat=Video Format -MeasuringTool.MenuItem.Attach=Attach Ends... -PerspectiveTrack.Corner=corner -PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level -Protractor.Data.Description.0=time -Protractor.Data.Description.1=protractor angle -Protractor.Data.Description.2=length of arm 1 -Protractor.Data.Description.3=length of arm 2 -Protractor.Data.Description.4=step number -Protractor.Data.Description.5=frame number -TapeMeasure.Data.Description.0=time -TapeMeasure.Data.Description.1=length -TapeMeasure.Data.Description.2=angle measured from the +x-axis -TapeMeasure.Data.Description.3=step number -TapeMeasure.Data.Description.4=frame number - -# Additions by Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched=unsearched -AutoTracker.Info.KeyFrame=Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame -AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match -AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches -PrefsDialog.Checkbox.64BitVM=64-bit - -# Additions by Doug Brown 2012-11-20 -AutoTracker.Wizard.Title=Autotracker -Dialog.Button.Add=Add -Dialog.Button.Remove=Remove -PrefsDialog.Button.ClearHost=Clear Host -PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache -PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache -TActions.Action.SaveZip=Export ZIP Resource -ThumbnailDialog.Title=Export Thumbnail Image -ThumbnailDialog.Settings.Title=Thumbnail Options -ThumbnailDialog.Label.CurrentImage=Current image -ThumbnailDialog.Label.FrameNumber=frame -ThumbnailDialog.Label.StepNumber=step -ThumbnailDialog.View.VideoOnly=Video Only -ThumbnailDialog.View.MainView=Main View -ThumbnailDialog.View.WholeFrame=Entire Frame -ThumbnailDialog.Format.PNG=PNG Image -ThumbnailDialog.Format.JPG=JPEG Image -ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail -ThumbnailDialog.Subtitle.Image=Image -TMenuBar.MenuItem.Thumbnail=Thumbnail Image -TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser -TTrack.MenuItem.DeletePoint=Delete Selected Step -ZipResourceDialog.Title=Export ZIP Resource -ZipResourceDialog.Label.Format=Format -ZipResourceDialog.Label.Title=Name -ZipResourceDialog.Label.Description=Description -ZipResourceDialog.Label.Keywords=Keywords -ZipResourceDialog.Label.Link=External Link -ZipResourceDialog.Label.HTML=HTML Source -ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as -ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? -ZipResourceDialog.Complete.Title=Success -ZipResourceDialog.Border.Title.Documentation=HTML Documentation -ZipResourceDialog.Border.Title.Video=Video -ZipResourceDialog.Border.Title.Thumbnail=Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource -ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource -ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File -ZipResourceDialog.Button.AddFiles=Add Files -ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options -ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip -ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File -ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file -ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? -ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch -ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files -ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) -ZipResourceDialog.Tooltip.Author=Authors of this resource -ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) -ZipResourceDialog.Tooltip.Description=A useful description of this resource -ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser -ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) -ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource -ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type -ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource -ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video -ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file +# This is the Traditional chinese tracker.properties file +# Translated by Fu-Kwun Hwang Dec 2009 +Calibration.Name=\u4e00\u5c0d\u6821\u6b63\u9ede +Calibration.New.Name=\u6821\u6b63 +CenterOfMass.Name=\u8cea\u5fc3 +CenterOfMass.New.Name=\u516c\u5206 +CenterOfMass.MenuItem.Inspector=\u9078\u53d6\u6240\u6709\u8cea\u9ede... +CenterOfMassInspector.Title=\u8cea\u5fc3 +CenterOfMassInspector.Border.Title=\u9078\u64c7\u9078\u53d6\u6240\u6709\u8cea\u9ede +ConfigInspector.Border.Title=\u6aa2\u67e5\u60f3\u8981\u7684\u9805\u76ee +ConfigInspector.Title=\u500b\u4eba\u559c\u597d +ConfigInspector.Button.SaveAsDefault=\u4ee5\u9810\u8a2d\u65b9\u5f0f\u5132\u5b58 +CoordAxes.Name=\u8ef8\u7dda +CoordAxes.New.Name=\u8ef8\u7dda +Dialog.Button.Cancel=\u53d6\u6d88 +Dialog.Button.OK=\u78ba\u8a8d +Dialog.Button.Close=\u7d50\u675f +Dialog.Button.All=\u6240\u6709 +Dialog.Button.None=\u7121 +Dialog.Button.Copy=\u8907\u88fd +Dialog.Button.Update=\u66f4\u65b0 +Dialog.Button.SelectAll=\u9078\u53d6\u6240\u6709 +Footprint.Diamond=\u7a1c\u5f62 +Footprint.BoldDiamond=\u7c97\u83f1\u5f62 +Footprint.SolidDiamond=\u5be6\u5fc3\u83f1\u5f62 +Footprint.Triangle=\u4e09\u89d2\u5f62 +Footprint.BoldTriangle=\u7c97\u4e09\u89d2\u5f62 +Footprint.SolidTriangle=\u5be6\u5fc3\u4e09\u89d2\u5f62 +Footprint.Circle=\u5713\u5f62 +Footprint.BoldCircle=\u7c97\u5713\u5f62 +Footprint.SolidCircle=\u5be6\u5fc3\u5713 +Footprint.VerticalLine=\u5782\u76f4\u7dda +Footprint.BoldVerticalLine=\u7c97\u5782\u76f4\u7dda +Footprint.HorizontalLine=\u6c34\u5e73\u7dda +Footprint.BoldHorizontalLine=\u7c97\u6c34\u5e73\u7dda +Footprint.Crosshair=\u4ea4\u53c9\u7dda +Footprint.BoldCrosshair=\u7c97\u4ea4\u53c9\u7dda +Footprint.SimpleAxes=\u8ef8\u7dda +Footprint.BoldSimpleAxes=\u7c97\u8ef8\u7dda +Footprint.Spot=\u9ede +Footprint.Line=\u76f4\u7dda +Footprint.BoldLine=\u7c97\u76f4\u7dda +Footprint.Outline=\u8f2a\u5ed3\u7dda +Footprint.BoldOutline=\u7c97\u8f2a\u5ed3\u7dda +Footprint.Arrow=\u7bad\u982d +Footprint.BoldArrow=\u7c97\u7bad\u982d +Footprint.DoubleArrow=\u96d9\u7bad\u982d +Footprint.BoldDoubleArrow=\u7c97\u96d9\u7bad\u982d +Footprint.2xArrow=2x \u7bad\u982d +Footprint.Bold2xArrow=\u7c97 2x \u7bad\u982d +Footprint.4xArrow=4x \u7bad\u982d +Footprint.Bold4xArrow=\u7c97 4x \u7bad\u982d +Footprint.DashArrow=dashed \u7bad\u982d +Footprint.BoldDashArrow=\u7c97\u865b\u7dda\u7bad\u982d +Footprint.BigArrow=\u5927\u7bad\u982d +Footprint.BigDashArrow=\u5927\u865b\u7dda\u7bad\u982d +LineProfile.Name=\u5f37\u5ea6\u5206\u4f48 +LineProfile.New.Name=\u63cf\u7e6a\u8a2d\u5b9a +LineProfile.Data.Brightness=\u4eae\u5ea6 +LineProfile.Data.Pixel=\u756b\u7d20 +LineProfile.Data.Red=\u7d05 +LineProfile.Data.Green=\u7da0 +LineProfile.Data.Blue=\u85cd +LineProfile.Data.Weighting=\u6bd4\u91cd +MainTView.Popup.MenuItem.QTPlayer=QuickTime \u64ad\u653e\u5668 +MainTView.Popup.MenuItem.Zoom=\u7e2e\u653e +MainTView.Popup.MenuItem.ToFit=\u81ea\u52d5\u8a2d\u5b9a +OffsetOrigin.Name=\u6b78\u96f6 +OffsetOrigin.New.Name=\u57fa\u6e96 +PlotTrackView.Button.PlotCount=\u7e6a\u5716 +PlotTrackView.Button.PlotCount.ToolTip=\u9078\u64c7\u7e6a\u5716\u7684\u6578\u76ee +PointMass.Name=\u8cea\u9ede +PointMass.New.Name=\u8cea\u91cf +PointMass.MenuItem.VectorsToPosition=\u7269\u4ef6\u4f4d\u7f6e +PointMass.MenuItem.Velocity=\u901f\u5ea6 +PointMass.MenuItem.Acceleration=\u52a0\u901f\u5ea6 +Star.Name=\u661f\u5f62 +Star.New.Name=\u661f\u5f62 +TableTrackView.Action.CopyData=\u8907\u88fd\u8cc7\u6599 +TableTrackView.Button.SelectTableData=\u8cc7\u6599 +TableTrackView.Button.SelectTableData.ToolTip=\u8907\u88fd\u8cc7\u6599\u8cc7\u6599 +TableTrackView.Popup.MenuItem.Analyze=\u5206\u6790 +TableTrackView.Dialog.Border.Title=\u986f\u793a: +TActions.Action.Description=\u8aaa\u660e +TActions.Action.ClearTracks=\u6e05\u9664 +TActions.Action.NewTab=\u65b0\u589e +TActions.Action.Copy=\u8907\u88fd +TActions.Action.Paste=\u8cbc\u4e0a +TActions.Action.Open=\u958b\u555f... +TActions.Action.Close=\u95dc\u9589 +TActions.Action.Import=\u8f09\u5165... +TActions.Action.Save=\u5132\u5b58 +TActions.Action.SaveAs=\u53e6\u5b58\u65b0\u6a94... +TActions.Action.Export=\u8f38\u51fa... +TActions.Action.CaptureVideo=\u64f7\u53d6\u5f71\u7247... +TActions.Action.Delete=\u522a\u9664 +TActions.Action.Config=\u500b\u4eba\u559c\u597d... +TActions.Action.AxesVisible=\u986f\u793a +TActions.Action.TapeVisible=\u986f\u793a +TActions.Action.Print=\u5217\u5370... +TActions.Action.ClearFilters=\u6e05\u9664 +TActions.Action.ImportVideo=\u8f09\u5165... +TActions.Action.CloseVideo=\u95dc\u9589 +TActions.Action.CloseAll=\u95dc\u9589\u6240\u6709\u8996\u7a97 +TActions.Action.Exit=\u7d50\u675f +TActions.Dialog.PrintError.Message=\u51fa\u73fe\u5217\u5370\u932f\u8aa4 +TActions.Dialog.PrintError.Title=\u5217\u5370\u932f\u8aa4 +TActions.Dialog.Description.Title=\u8aaa\u660e: +TActions.Dialog.DeleteLockedTracks.Message=\u90e8\u5206\u8ecc\u8de1\u88ab\u9396\u5b9a, \u4ecd\u7136\u8981\u522a\u9664? +TActions.Dialog.DeleteLockedTracks.Title=\u522a\u9664\u9396\u5b9a\u8ecc\u8de1? +TActions.Dialog.Description.Title=\u8aaa\u660e: +TActions.Dialog.NewPointMass.Title=\u65b0\u8cea\u9ede +TapeMeasure.Name=\u91cf\u5c3a\u6e2c\u91cf +TapeMeasure.New.Name=\u91cf\u5c3a +TapeMeasure.MenuItem.Fixed=\u56fa\u5b9a +TFrame.View.Plot=\u986f\u793a\u5716\u5f62 +TFrame.View.Table=\u986f\u793a\u8868\u683c +TFrame.View.World=\u5ea7\u6a19\u6a21\u5f0f +TFrame.View.Video=\u5f71\u7247\u6a21\u5f0f +TFrame.Dialog.Help.Title=Tracker\u8aaa\u660e +TMenuBar.Menu.File=\u6a94\u6848 +TMenuBar.Menu.Edit=\u7de8\u8f2f +TMenuBar.Menu.Video=\u5f71\u7247 +TMenuBar.Menu.Tracks=\u8ecc\u8de1 +TMenuBar.Menu.Coords=\u5ea7\u6a19 +TMenuBar.Menu.Window=\u8996\u7a97 +TMenuBar.Menu.Help=\u8aaa\u660e +TMenuBar.MenuItem.EditProperties=\u5c6c\u6027... +TMenuBar.MenuItem.VideoVisible=\u986f\u793a +TMenuBar.MenuItem.VideoFilters=\u6a94\u6848 +TMenuBar.MenuItem.NewVideoFilter=\u65b0\u589e +TMenuBar.MenuItem.NewTrack=\u65b0\u589e +TMenuBar.MenuItem.CoordsLocked=\u9396\u5b9a +TMenuBar.MenuItem.CoordsFixedOrigin=\u56fa\u5b9a\u539f\u9ede +TMenuBar.MenuItem.CoordsFixedAngle=\u56fa\u5b9a\u89d2\u5ea6 +TMenuBar.MenuItem.CoordsFixedScale=\u56fa\u5b9a\u6bd4\u4f8b +TMenuBar.MenuItem.CoordsRefFrame=\u53c3\u8003\u5ea7\u6a19 +TMenuBar.MenuItem.CoordsDefault=\u9810\u8a2d +TMenuBar.MenuItem.WindowRight=\u53f3\u908a\u986f\u793a\u4ecb\u9762 +TMenuBar.MenuItem.WindowBottom=\u4e0b\u65b9\u986f\u793a\u4ecb\u9762 +TMenuBar.MenuItem.PlayAllSteps=\u64ad\u653e\u5168\u90e8\u6b65\u9a5f +TMenuBar.MenuItem.Record=\u8f49\u9304 +TMenuBar.MenuItem.MatSize=\u5340\u57df\u5927\u5c0f +TMenuBar.MenuItem.Language=\u8a9e\u8a00 +TMenuBar.MenuItem.DeleteTrack=\u522a\u9664 +TMenuBar.MenuItem.TrackerHelp=Tracker \u8aaa\u660e... +TMenuBar.MenuItem.MessageLog=\u8a0a\u606f\u8a18\u9304... +TrackControl.Name=Track \u63a7\u5236\u9805 +TrackControl.Button.NewTrack=\u65b0\u589e +TrackControl.Button.NewTrack.ToolTip=\u65b0\u589e\u8ecc\u8de1 +TrackControl.Button.Trails.ToolTip=\u8a2d\u5b9a\u8ecc\u8de1\u9577\u5ea6 +TrackControl.Button.Labels.ToolTip=\u986f\u793a/\u96b1\u85cf \u865f\u78bc +TrackControl.Button.StretchVectors.ToolTip=\u62c9\u9577\u5411\u91cf +TrackControl.Button.Accelerations.ToolTip=\u986f\u793a/\u96b1\u85cf \u52a0\u901f\u5ea6 +TrackControl.Button.Xmass.ToolTip=\u4ee5\u8cea\u91cf\u589e\u52a0\u5411\u91cf\u500d\u6578 +TrackControl.Button.Vectors.ToolTip=\u5411\u91cf +TrackControl.Button.Velocities.ToolTip=\u986f\u793a/\u96b1\u85cf \u901f\u5ea6\u5411\u91cf +TrackControl.Button.Properties.ToolTip=\u6309\u4e00\u4e0b\u9078\u53d6 +TrackControl.Button.Positions.ToolTip=\u986f\u793a/\u96b1\u85cf \u4f4d\u7f6e +Tracker.Popup.MenuItem.Snapshot=\u87a2\u5e55\u5feb\u7167 +Tracker.Popup.MenuItem.Help=\u8aaa\u660e... +Tracker.Cursor.Crosshair.Description=\u5341\u5b57\u7dda \u6e38\u6a19 +Tracker.Action.AboutTracker=\u95dc\u65bc Tracker... +Tracker.Dialog.AboutTracker.Title=\u95dc\u65bc Tracker +Tracker.Action.AboutJava=\u95dc\u65bc Java... +Tracker.Dialog.AboutJava.Title=\u95dc\u65bc Java +Tracker.Dialog.AboutJava.UnknownVersion=\u672a\u77e5\u7684 +Tracker.Dialog.AboutJava.Message=Java \u7248\u672c +Tracker.Action.AboutQT=\u95dc\u65bc QuickTime... +Tracker.Dialog.AboutQT.Title=\u95dc\u65bc QuickTime +Tracker.Dialog.AboutQT.Message.QTVersion=QuickTime \u7248\u672c +Tracker.Dialog.AboutQT.Message.QTJavaVersion=QTJava \u7248\u672c +Tracker.Dialog.AboutQT.Message.QTJavaPath=QTJava \u8def\u5f91: +Tracker.Dialog.NoQT.Title=\u627e\u4e0d\u5230 QTJava.zip +Tracker.Dialog.NoQT.Message1=Java \u7684 QuickTime \u4f3c\u4e4e\u5c1a\u672a\u5b89\u88dd +Tracker.Dialog.NoQT.Message2=\u82e5\u60a8\u60f3\u5206\u6790 QuickTime \u7247, \u8acb\u91cd\u65b0\u5b89\u88dd QuickTime\u3002 +Tracker.Dialog.NoQT.Message3=\u8acb\u6ce8\u610f: \u5b89\u88dd QuickTime \u6642\u5fc5\u9808\u9078\u64c7 Java \u7684 QuickTime\u3002 +Tracker.Dialog.UpdateQT.Title=\u66f4\u65b0 QTJava.zip +Tracker.Dialog.UpdateQT.Message1= \u6b32\u53d6\u5f97 QTJava.zip \u7684\u66f4\u65b0\u7248\u53ef\u9023\u7d50\u81f3 +Tracker.Dialog.UpdateQT.Message2=\u60a8\u60f3\u8981\u66f4\u65b0\u9019\u4e9b\u820a\u6709\u6a94\u6848\u55ce\uff1f +Tracker.Dialog.CopyQT.Title=\u8907\u88fd QTJava.zip +Tracker.Dialog.CopyQT.Message1=QuickTime \u5df2\u7d93\u5b89\u88dd, \u4f46\u5728\u53ef\u4f7f\u7528 Tracker \u4e4b\u524d: +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip \u8907\u88fd\u5fc5\u9808\u5f9e +Tracker.Dialog.CopyQT.Message3= \u5230 +Tracker.Dialog.CopyQT.Message4= 2. Tracker \u5fc5\u9808\u91cd\u65b0\u555f\u52d5\u3002 +Tracker.Dialog.CopyQT.Message5=\u60a8\u73fe\u5728\u60f3\u8907\u88fd QTJava.zip \u55ce\uff1f +Tracker.Dialog.CopyFailed.Title=\u8907\u88fd\u5931\u6557 +Tracker.Dialog.CopyFailed.Message=\u7121\u6cd5\u8907\u88fd QTJava.zip\u3002 +Tracker.Dialog.CopiedTo.Title=\u8907\u88fd\u6210\u529f +Tracker.Dialog.CopiedTo.Message1=QTJava.zip \u5df2\u7d93\u6210\u529f\u5730\u8907\u88fd\u5230 +Tracker.Dialog.CopiedTo.Message2=Tracker \u5fc5\u9808\u91cd\u65b0\u555f\u52d5\u4e26\u4e14\u7acb\u5373\u95dc\u9589\u3002 +Tracker.Splash.Loading=\u4e0b\u8f09 +TrackerIO.Dialog.Import.Title=\u8f09\u5165 +TrackerIO.Dialog.Import.Message=\u9078\u64c7\u8f09\u5165\u9805\u76ee +TrackerIO.Dialog.ImportVideo.Title=\u8f09\u5165\u5f71\u7247 +TrackerIO.Dialog.Export.Title=\u8f38\u51fa +TrackerIO.Dialog.Export.Message=\u9078\u64c7\u8f38\u51fa\u9805\u76ee +TrackerIO.Dialog.ReplaceFile.Title=\u53d6\u4ee3\u820a\u6709\u6a94\u6848? +TrackerIO.Dialog.ReplaceFile.Message=\u5df2\u7d93\u5b58\u5728\uff0c\u60a8\u60f3\u53d6\u4ee3\u55ce\uff1f +TrackerIO.Dialog.NotTrackerXML.Title=\u4e0d\u5408\u7684 XML +TrackerIO.Dialog.NotTrackerXML.Message=\u542b\u6709\u4e0d\u540c\u7a0b\u5f0f\u7684 xml \u8cc7\u6599\u3002 +TrackerIO.Dialog.BadVideo.Message=\u5f71\u7247\u7121\u6cd5\u958b\u555f: +TrackerPanel.NewTab.Name=\u7121\u6a19\u984c\u7684 +TrackerPanel.DragToMark.Hint=\u6309\u4f4f Shift \u9375\u4e26\u62d6\u62c9\u6ed1\u9f20\u4ee5\u6a19\u793a +TrackerPanel.ClickToMark.Hint=\u6309\u4f4f Shift \u9375\u4e26\u6309\u4e00\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a +TrackerPanel.Dialog.LoadFailed.Title=\u6a94\u6848\u5c1a\u672a\u8f09\u5165 +TrackerPanel.Dialog.LoadFailed.Message=\u6a94\u6848\u7121\u6cd5\u8f09\u5165: +TrackerPanel.Dialog.SaveChanges.Title=\u5132\u5b58\u66f4\u65b0 +TrackerPanel.Dialog.SaveChanges.Message=\u66f4\u65b0\u53e6\u5b58\u65bc +TrackPlottingPanel.Popup.MenuItem.Lines=\u76f4\u7dda +TrackPlottingPanel.Popup.MenuItem.Points=\u9ede +TrackPlottingPanel.Popup.MenuItem.Scale=\u7e2e\u653e... +TrackPlottingPanel.Popup.MenuItem.Print=\u5370\u51fa... +TrackPlottingPanel.Popup.MenuItem.Measure=\u7e2e\u653e\u81f3\u5408\u9069\u6bd4\u4f8b +TrackPlottingPanel.Popup.MenuItem.Analyze=\u5206\u6790... +TrackPlottingPanel.Popup.MenuItem.ZoomIn=\u62c9\u8fd1\u653e\u5927\u6aa2\u8996 +TrackPlottingPanel.Popup.MenuItem.ZoomOut=\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996 +TrackPlottingPanel.Popup.MenuItem.ZoomToFit=\u81ea\u52d5\u7e2e\u653e +TrackPlottingPanel.Popup.MenuItem.ZoomToBox=\u7e2e\u653e\u5230\u9810\u8a2d\u9577\u5bec +TrackPlottingPanelInspector.Title=\u7e2e\u653e +TrackPlottingPanelInspector.Label.Min=\u6975\u5c0f\u503c +TrackPlottingPanelInspector.Label.Max=\u6975\u5927\u503c +TrackPlottingPanelInspector.Label.Auto=\u81ea\u52d5 +TToolBar.Button.Footprint.Tooltip=\u8a2d\u5b9a\u8db3\u8de1 +TToolBar.Dropdown.SelectedTrack.Tooltip=\u9078\u53d6\u8ecc\u8de1 +TToolBar.Dropdown.SelectedTrack.None=\u5c1a\u672a\u9078\u53d6 +TTrack.MenuItem.Delete=\u522a\u9664 +TTrack.MenuItem.Color=\u984f\u8272... +TTrack.Dialog.Color.Title=\u9078\u53d6\u8ecc\u8de1\u984f\u8272 +TTrack.MenuItem.Name=\u547d\u540d... +TTrack.MenuItem.Footprint=\u8db3\u8de1 +TTrack.MenuItem.Description=\u8aaa\u660e... +TTrack.MenuItem.Visible=\u986f\u793a\u5c0f\u503c +TrackPlottingPanelInspector.Label.Max=\u6975\u5927\u503c +TrackPlottingPanelInspector.Label.Auto=\u81ea\u52d5 +TTrack.MenuItem.TrailVisible=\u986f\u793a\u8ecc\u8de1 +TTrack.MenuItem.Autostep=\u81ea\u52d5 +TTrack.MenuItem.MarkByDefault=\u9810\u8a2d\u6a19\u793a +TTrack.MenuItem.Locked=\u9396\u5b9a +TTrack.MenuItem.Delete=\u522a\u9664 +TTrack.Name.None=\u7121\u547d\u540d +TTrack.Dialog.Description.Title=\u8aaa\u660e: +TTrack.Dialog.Name.Title=\u547d\u540d +TTrack.Dialog.Name.Label=\u547d\u540d: +TViewChooser.Button.Choose.Tooltip=\u9078\u700f\u89bd\u6a21\u5f0f +Vector.Name=\u5411\u91cf +Vector.New.Name=\u5411\u91cf +Vector.MenuItem.ToOrigin=\u5230\u539f\u9ede +Vector.MenuItem.Label=\u986f\u793a\u6a19\u7c64 +VectorSum.Name=\u5411\u91cf\u548c +VectorSum.New.Name=\u7e3d\u548c +VectorSum.MenuItem.Inspector=\u9078\u53d6\u5411\u91cf... +VectorSumInspector.Title=\u5411\u91cf\u548c +VectorSumInspector.Border.Title=\u9078\u53d6\u5411\u91cf +WorldTView.Popup.MenuItem.Projectile=\u62cb\u9ad4\u6a21\u578b + +# Additions by Doug Brown 2006-11-01 +AnalyticParticle.Name=\u8cea\u9ede\u51fd\u6578\u6a21\u5f0f +AnalyticParticle.Inspector.Title=\u8cea\u9ede\u51fd\u6578\u6a21\u5f0f +AnalyticParticle.Property.FunctionX=x +AnalyticParticle.Property.FunctionY=y +CircleFootprint.Circle_4=\u534a\u5f91 4 +CircleFootprint.Circle_6=\u534a\u5f91 6 +CircleFootprint.Circle_8=\u534a\u5f91 8 +DynamicParticle.Name=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 +DynamicParticle.Inspector.Title=\u8cea\u9ede\u52d5\u529b\u6a21\u5f0f +DynamicParticle.Property.ForceX=\u4f5c\u7528\u529b Fx +DynamicParticle.Property.ForceY=\u4f5c\u7528\u529b Fy +DynamicParticle.Property.InitialX=x +DynamicParticle.Property.InitialY=y +DynamicParticle.Property.InitialVelocityX=vx +DynamicParticle.Property.InitialVelocityY=vy +LineProfile.MenuItem.Fixed=\u56fa\u5b9a\u7684 +ParticleModel.New.Name=\u6a21\u7d44 +ParticleModel.MenuItem.InspectModel=\u6a21\u7d44\u5efa\u69cb\u5de5\u5177... +ParticleModel.Inspector.Button.Undo=\u5fa9\u539f +ParticleModel.Inspector.Button.Redo=\u53d6\u6d88\u5fa9\u539f +ParticleModel.Inspector.Button.Close=\u95dc\u9589 +ParticleModel.Inspector.Button.Help=\u8aaa\u660e + +# Additions by Doug Brown 2006-12-29 +Calibration.Axes.XOnly=\u50c5X +Calibration.Axes.YOnly=\u50c5Y +Calibration.Axes.XY=XY +Calibration.Spinner.Axes.Tooltip=\u9078\u64c7\u6821\u6b63\u8ef8 +Calibration.Label.Axes=\u8ef8 +Calibration.Dialog.InvalidCoordinates.Title=\u4e0d\u6b63\u78ba\u5ea7\u6a19\u8ef8 +Calibration.Dialog.InvalidCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540c\u5ea7\u6a19\u503c +Calibration.Dialog.InvalidXCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540cx\u5ea7\u6a19\u503c +Calibration.Dialog.InvalidYCoordinates.Message=\u4e0d\u8a72\u591a\u9ede\u6709\u76f8\u540cy\u5ea7\u6a19\u503c +SpectralLineFilter.Title=\u6c23\u9ad4\u5149\u8b5c +SpectralLineFilter.H=\u6c2b H +SpectralLineFilter.He=\u6c26 He +SpectralLineFilter.Ne=\u6c16 Ne +SpectralLineFilter.Hg=\u6c34\u9280 Hg +TFrame.View.Unknown=\u986f\u793a\u4ecb\u9762 +TMenuBar.MenuItem.Undo=\u5fa9\u539f +TMenuBar.MenuItem.Redo=\u91cd\u4f5c +TMenuBar.MenuItem.Replace=\u53d6\u4ee3... +TMenuBar.Menu.AddImage=\u8f09\u5165\u5f71\u50cf +TMenuBar.MenuItem.AddBefore=\u5728\u6b64\u5f71\u683c\u4e4b\u524d... +TMenuBar.MenuItem.AddAfter=\u5728\u6b64\u5f71\u683c\u4e4b\u5f8c... +TMenuBar.MenuItem.RemoveImage=\u79fb\u9664\u6b64\u5f71\u683c +TMenuBar.Menu.Tools=\u5de5\u5177 +TMenuBar.MenuItem.DataFunctionTool=\u6578\u503c\u8cc7\u6599\u5efa\u69cb\u5de5\u5177... +TMenuBar.MenuItem.DatasetTool=\u8cc7\u6599\u5206\u6790\u5de5\u5177... +TMenuBar.Menu.CopyImage=\u8907\u88fd\u5f71\u50cf +TMenuBar.MenuItem.CopyMainView=\u4e3b\u8981\u986f\u793a\u4ecb\u9762 +TMenuBar.MenuItem.CopyFrame=\u5f71\u683c +TMenuBar.MenuItem.PrintFrame=\u5217\u5370... +TrackerIO.Dialog.AddImage.Title=\u6dfb\u52a0\u5f71\u50cf +TTrack.Dialog.Name.BadName=\u5df2\u88ab\u4f7f\u7528! \u8acb\u9078\u7528\u5176\u4ed6\u540d\u7a31 +VectorStep.Label.Momentum=p +VectorStep.Label.Velocity=v +VectorStep.Label.NetForce=\u5408\u529b +VectorStep.Label.Acceleration=a + +# Additions by Doug Brown 2007-02-19 +PlotTView.Label.NoData=\u4ee5\u7e6a\u5716\u986f\u793a\u4ecb\u9762\u6aa2\u8996 track \u8cc7\u6599 +TableTView.Label.NoData=\u4ee5\u5716\u8868\u986f\u793a\u4ecb\u9762\u6aa2\u8996 track \u8cc7\u6599 +TrackerPanel.Message.NoData0=\u5f71\u7247\u53ca track \u4e3b\u8981\u6aa2\u8996\u5340 +TrackerPanel.Message.NoData1=\u9078\u64c7 \u6a94\u6848|\u958b\u555f \u6216 \u8ecc\u8de1|\u65b0\u589e \u555f\u52d5 +WorldTView.Label.NoData=\u4ee5\u5ea7\u6a19\u986f\u793a\u4ecb\u9762\u6aa2\u8996\u5f71\u7247\u53ca track \u8cc7\u6599 + +# Additions by Doug Brown 2007-03-03 +DynamicParticle.Label.Solver=\u6578\u503c\u5206\u6790\u65b9\u6cd5: +DynamicParticle.Solver.Euler=Euler +DynamicParticle.Solver.Verlet=Verlet +DynamicParticle.Solver.RK4=Runge-Kutta +DynamicParticle.Solver.ODEMultistep=\u81ea\u52d5\u8abf\u6574\u591a\u91cd\u6b65\u9a5f\u65b9\u6cd5 @@ Adaptive Multistep +DynamicParticle.Table.Force.Border.Title=\u4f5c\u7528\u529b\u51fd\u6578 (t, x, y, vx, vy) +AnalyticParticle.Table.Functions.Border.Title=\u4f4d\u7f6e\u51fd\u6578 (t) +ParticleModel.Table.Initial.Border.Title=\u521d\u59cb\u503c +ParticleModel.Property.InitialT=t + +# Additions by Doug Brown 2007-04-25 +TMenuBar.MenuItem.PasteImage=\u8cbc\u4e0a\u5f71\u683c +TMenuBar.MenuItem.PasteAfter=\u5728\u6b64\u5f71\u683c\u4e4b\u5f8c +TMenuBar.MenuItem.PasteBefore=\u5728\u6b64\u5f71\u683c\u4e4b\u524d +TMenuBar.MenuItem.PasteReplace=\u66f4\u65b0\u5f71\u7247 + +# Additions by Doug Brown 2007-07-01 +TMenuBar.MenuItem.GettingStarted=\u555f\u52d5... +Tracker.Splash.HelpMessage=\u65b0\u7528\u6236? \u8acb\u9078\u64c7 + +# Additions by Doug Brown 2007-08-12 +CoordAxes.Label.Angle=\u89d2\u5ea6 +LineProfile.Checkbox.Rotates=\u65cb\u8f49 +LineProfile.Label.Spread=spread +RGBRegion.Name=RGB \u5340 +RGBRegion.New.Name=\u5340 +RGBRegion.MenuItem.Fixed=\u56fa\u5b9a\u7684 +RGBRegion.Label.Radius=\u534a\u5f91 +TTrack.Label.Step=\u6b65\u9a5f + +# Additions by Doug Brown 2007-10-24 +LineProfile.Data.Description.0=position number +LineProfile.Data.Description.1= x-\u5206\u91cf\u4f4d\u7f6e +LineProfile.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e +LineProfile.Data.Description.3=\u7d05 +LineProfile.Data.Description.4=\u7387 +LineProfile.Data.Description.5=\u85cd +LineProfile.Data.Description.6=perceived brightness +LineProfile.Data.Description.7=\u7dda\u5bec +ParticleModel.MenuItem.TraceVisible=\u8ecc\u8de1\u986f\u793a +ParticleModel.MenuItem.StepsVisible=\u6b65\u9a5f\u986f\u793a +PointMass.Data.Description.0=\u6642\u9593 +PointMass.Data.Description.1=x-\u5206\u91cf\u4f4d\u7f6e +PointMass.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e +PointMass.Data.Description.3=\u4f4d\u7f6e\u5927\u5c0f +PointMass.Data.Description.4=\u4f4d\u7f6e\u89d2\u5ea6 +PointMass.Data.Description.5=x-\u5206\u91cf\u901f\u5ea6 +PointMass.Data.Description.6=y-\u5206\u91cf\u901f\u5ea6 +PointMass.Data.Description.7=\u901f\u5ea6\u5927\u5c0f +PointMass.Data.Description.8=\u901f\u5ea6\u89d2\u5ea6 +PointMass.Data.Description.9= x-\u5206\u91cf\u52a0\u901f\u5ea6 +PointMass.Data.Description.10= y-\u5206\u91cf\u52a0\u901f\u5ea6 +PointMass.Data.Description.11=\u52a0\u901f\u5ea6\u5927\u5c0f +PointMass.Data.Description.12=\u52a0\u901f\u5ea6\u89d2\u5ea6 +PointMass.Data.Description.13=\u65cb\u8f49\u89d2\u5ea6 +PointMass.Data.Description.14=\u89d2\u901f\u5ea6 +PointMass.Data.Description.15=\u89d2\u52a0\u901f\u5ea6 +PointMass.Data.Description.16=\u6b65\u9a5f\u6578 +PointMass.Data.Description.17=\u5f71\u683c\u6578 +PointMass.Data.Description.18= x-\u5206\u91cf\u52d5\u91cf +PointMass.Data.Description.19=y-\u5206\u91cf\u52d5\u91cf +PointMass.Data.Description.20=\u52d5\u91cf\u5927\u5c0f +PointMass.Data.Description.21=\u89d2\u52d5\u91cf +PointMass.Data.Description.22=\u52d5\u80fd +RGBRegion.Data.Description.0=\u6642\u9593 +RGBRegion.Data.Description.1=x-\u5206\u91cf\u4f4d\u7f6e +RGBRegion.Data.Description.2=y-\u5206\u91cf\u4f4d\u7f6e +RGBRegion.Data.Description.3=\u7d05 +RGBRegion.Data.Description.4=\u7da0 +RGBRegion.Data.Description.5=\u85cd +RGBRegion.Data.Description.6=\u6709\u611f\u4eae\u5ea6 +RGBRegion.Data.Description.7=\u756b\u7d20\u6578 +RGBRegion.Data.Description.8=\u6b65\u9a5f\u6578 +RGBRegion.Data.Description.9=\u5f71\u683c\u6578 +TView.Menuitem.Define=\u4e26\u6613... +Vector.Data.Description.0=\u6642\u9593 +Vector.Data.Description.1=x-\u5206\u91cf +Vector.Data.Description.2=y-\u5206\u91cf +Vector.Data.Description.3=\u5927\u5c0f +Vector.Data.Description.4=\u89d2 +Vector.Data.Description.5=\u8ecc\u8de1\u672b\u7aef\u7684 x-\u5206\u91cf\u4f4d\u7f6e +Vector.Data.Description.6=\u8ecc\u8de1\u672b\u7aef\u7684 y-\u5206\u91cf\u4f4d\u7f6e +Vector.Data.Description.7=\u6b65\u9a5f\u6578 +Vector.Data.Description.8=\u5f71\u683c\u6578 +# Additions by Doug Brown 2008-01-02 +ParticleModel.Parameter.Mass.Description=\u8cea\u9ede\u8cea\u91cf +ParticleModel.Parameter.InitialTime.Description=\u8d77\u59cb\u6642\u9593 +AnalyticParticle.PositionFunction.X.Description=x-\u5206\u91cf\u4f4d\u7f6e +AnalyticParticle.PositionFunction.Y.Description=y-\u5206\u91cf\u4f4d\u7f6e +DynamicParticle.ForceFunction.X.Description=x-\u5206\u91cf\u529b +DynamicParticle.ForceFunction.Y.Description=y-\u5206\u91cf\u529b +DynamicParticle.Parameter.InitialX.Description=x-\u5206\u91cf\u521d\u59cb\u4f4d\u7f6e +DynamicParticle.Parameter.InitialY.Description=y-\u5206\u91cf\u521d\u59cb\u4f4d\u7f6e +DynamicParticle.Parameter.InitialVelocityX.Description=x-\u5206\u91cf\u521d\u59cb\u5411\u91cf +DynamicParticle.Parameter.InitialVelocityY.Description=y-\u5206\u91cf\u521d\u59cb\u5411\u91cf +TrackerPanel.ModelBuilder.Title=\u6a21\u7d44\u5efa\u69cb\u5de5\u5177 +TrackerPanel.DataBuilder.Title=\u8cc7\u6599\u5efa\u69cb\u5de5\u5177 +TrackControl.TrailMenu.NoTrail=\u7121\u8ecc\u8de1 +TrackControl.TrailMenu.ShortTrail=\u77ed\u7684\u8ecc\u8de1 +TrackControl.TrailMenu.LongTrail=\u9577\u7684\u8ecc\u8de1 +TrackControl.TrailMenu.FullTrail=\u5b8c\u6574\u8ecc\u8de1 +TrackerPanel.ModelBuilder.Spinner.Tooltip=\u76ee\u524d\u9078\u53d6\u7684\u6a21\u5f0f +TrackerPanel.ModelBuilder.LineButton.Text=\u76f4\u7dda\u6a23\u5f0f +TrackerPanel.ModelBuilder.LineButton.Tooltip=\u8a2d\u5b9a\u76f4\u7dda\u6a23\u5f0f +ParticleModel.LineStyle.None=\u7121\u76f4\u7dda +ParticleModel.LineStyle.Connect=\u9023\u7d50\u6b65\u9a5f +ParticleModel.LineStyle.Smooth=\u5e73\u6ed1\u7dda +ModelFunctionPanel.Label=\u6a21\u7d44 +AnalyticFunctionPanel.FunctionEditor.Border.Title=\u4f4d\u7f6e\u51fd\u6578 +DynamicFunctionPanel.FunctionEditor.Border.Title=\u4f5c\u7528\u529b\u51fd\u6578 + +# Additions by Doug Brown 2008-11-14 +TableTView.Dialog.TableColumns.Title=\u986f\u793a\u8868\u683c\u6b04\u4f4d +Tracker.About.ProjectOf=\u8a08\u756b\u4e3b\u6301\u8005: +Tracker.About.TranslationBy=\u7ffb\u8b6f\u8005 +Tracker.About.Translator=Fu-Kwun Hwang +TMenuBar.Menu.SaveVideoAs=\u53e6\u5b58\u5f71\u7247\u526a\u8f2f\u70ba +TActions.SaveClipAs.ProgressMonitor.Message=\u53e6\u5b58\u5f71\u7247\u526a\u8f2f +TActions.SaveClipAs.ProgressMonitor.Progress=\u5b8c\u6210 + +# Additions by Doug Brown 2008-12-07 +PlotTrackView.Checkbox.Synchronize=Sync +PlotTrackView.Checkbox.Synchronize.Tooltip=\u540c\u6b65\u5316\u5782\u76f4\u5ea7\u6a19 +RGBRegion.MenuItem.FixedRadius=\u56fa\u5b9a\u534a\u5f91 +Tracker.VideoZoom.Hint=\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u8fd1\u653e\u5927\u6aa2\u8996\uff0c\u6309\u4f4f alt \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996\uff0c\u5feb\u901f\u6309\u5169\u4e0b\u6ed1\u9f20\u4ee5\u81ea\u52d5\u8abf\u6574\u5927\u5c0f\u6aa2\u8996 +Tracker.PlotZoomIn.Hint=\u62d6\u62c9\u6ed1\u9f20\u4ee5\u62c9\u8fd1\u653e\u5927\u6aa2\u8996\uff0c\u5feb\u901f\u6309\u5169\u4e0b\u6ed1\u9f20\u4ee5\u81ea\u52d5\u8abf\u6574\u5927\u5c0f\u6aa2\u8996 +Tracker.PlotZoomOut.Hint=\u6309\u4e0b\u6ed1\u9f20\u4ee5\u62c9\u9060\u7e2e\u5c0f\u6aa2\u8996 +Tracker.MenuItem.Hints=\u51fa\u73fe\u63d0\u793a +TapeMeasure.Label.Length=\u523b\u5ea6\u9577 +TapeMeasure.Label.TapeAngle=\u91cf\u5c3a\u89d2\u5ea6 +TapeMeasure.Label.ArcAngle=\u91cf\u89d2\u5668\u89d2\u5ea6 +TrackerIO.Dialog.NotAnImage.Title=\u4e0d\u6b63\u78ba\u7684\u6a94\u6848\u985e\u578b +TrackerIO.Dialog.NotAnImage.Message1=\u4e0d\u662f JPG \u6216 GIF \u5716\u6a94 +TrackerIO.Dialog.NotAnImage.Message2=\u60a8\u60f3\u7e7c\u7e8c\u55ce\uff1f +TToolBar.Button.Zoom.Tooltip=\u8abf\u6574\u6aa2\u8996\u5340\u5927\u5c0f\u5de5\u5177 (\u5feb\u901f\u9375: Z \u9375) +TrackChooserTView.DropDown.Tooltip=\u9078\u64c7\u4e00\u689d\u8ecc\u8de1 +TapeMeasure.Field.ArcAngle.Tooltip=\u5f9e\u91cf\u5c3a\u5230\u91cf\u89d2\u5668\u4e00\u908a\u7684\u89d2\u5ea6 @@ Angle from tape to protractor arm +TapeMeasure.Field.TapeAngle.Tooltip=\u5f9e x-\u8ef8\u6b63\u5411\u5230\u91cf\u5c3a\u7684\u89d2\u5ea6 +TapeMeasure.Field.Magnitude.Tooltip=\u91cf\u5c3a\u9577\u5ea6\u662f\u4ee5\u5ea7\u6a19\u523b\u5ea6\u55ae\u4f4d @@ Length of tape in scaled world units +TapeMeasure.Readout.Magnitude.Name=\u9577\u5ea6\u8b80\u6578 +TapeMeasure.Readout.Magnitude.Hint=\u6309\u4e00\u4e0b\u8a2d\u5b9a\u523b\u5ea6 +TapeMeasure.Readout.Angle.Name=\u89d2\u5ea6\u8b80\u6578 +TapeMeasure.Readout.Angle.Hint=\u6309\u4e00\u4e0b\u8a2d\u5b9a\u89d2\u5ea6 +TapeMeasure.Arm.Name=\u91cf\u89d2\u5668\u7684\u908a +TapeMeasure.Arm.Hint=\u62d6\u62c9\u4ee5\u6e2c\u91cf\u89d2\u5ea6\uff0c\u8b8a\u77ed\u4ee5\u95dc\u9589 +TapeMeasure.End.Name=\u672b\u7aef +TapeMeasure.End.Hint=\u62d6\u62c9\u4ee5\u6e2c\u91cf\u8ddd\u96e2\u6216\u6821\u6e96\u523b\u5ea6 +TapeMeasure.Handle.Name=\u628a\u624b +TapeMeasure.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u91cf\u5c3a +Vector.Tip.Name=\u5c16\u7aef +Vector.Tip.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u5ea7\u6a19\u5206\u91cf +Vector.Handle.Name=\u64cd\u7e31 @@ handle +Vector.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u5411\u91cf +Vector.ShortHandle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\uff0c\u6309\u4f4f alt \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u9078\u53d6\u5c16\u7aef\u9ede +PointMass.Position.Name=\u4f4d\u7f6e +PointMass.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u4f4d\u7f6e +PointMass.Velocity.Name=\u901f\u5ea6 +PointMass.Acceleration.Name=\u52a0\u901f\u5ea6 +PointMass.Vector.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5 +PointMass.Position.Locked.Hint=\u6309\u4e0b\u4ee5\u9078\u53d6--\u7121\u6cd5\u88ab\u62d6\u62c9 +CoordAxes.Handle.Name=+x-\u8ef8 +CoordAxes.Handle.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u50be\u659c\u89d2 +CoordAxes.Origin.Name=\u539f\u9ede +CoordAxes.Origin.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u4f4d\u7f6e +OffsetOrigin.Position.Name=\u4f4d\u7f6e +OffsetOrigin.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u539f\u9ede\u4f4d\u7f6e +Calibration.Point.Name=\u9ede +Calibration.Point.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u8ef8\u53ca\u523b\u5ea6 +RGBRegion.Position.Name=\u4f4d\u7f6e +RGBRegion.Position.Hint=\u62d6\u62c9\u6216\u8f38\u5165\u5ea7\u6a19\u503c\u4ee5\u6539\u8b8a\u4f4d\u7f6e +LineProfile.End.Name=\u672b\u7aef +LineProfile.End.Hint=\u62d6\u62c9\u4ee5\u8abf\u6574\u7dda\u9577 +LineProfile.Handle.Name=\u64cd\u7e31 +LineProfile.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u76f4\u7dda +PointMass.Hint=\u5728\u5de5\u5177\u5217\u4e0a\u8a2d\u5b9a\u8cea\u91cf +PointMass.Unmarked.Hint=, \u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u4f4d\u7f6e +TTrack.Unselected.Hint=\u6309\u4e00\u4e0b\u4ee5\u9078\u53d6 \u548c/\u6216 \u8a2d\u5b9a\u5c6c\u6027 +Vector.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u62d6\u62c9\u6ed1\u9f20\u4ee5\u62d6\u62c9\u5411\u91cf +OffsetOrigin.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u504f\u79fb\u9ede +Calibration.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u7b2c\u4e00\u500b\u9ede +Calibration.Halfmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u7b2c\u4e8c\u500b\u9ede +CenterOfMass.Empty.Hint=\u9078\u53d6\u8cea\u91cf\u4ee5\u5b9a\u7fa9\u7cfb\u7d71 @@ select masses to define system +VectorSum.Empty.Hint=\u9078\u53d6\u5411\u91cf\u4ee5\u5b9a\u7fa9\u5176\u548c +TapeMeasure.Hint=\u8a2d\u5b9a\u9577\u5ea6\u4ee5\u8b8a\u66f4\u523b\u5ea6, \u8a2d\u5b9a\u89d2\u5ea6\u4ee5\u8b8a\u66f4 x-\u8ef8\u7684\u50be\u659c\u89d2 +CoordAxes.Hint=\u8a2d\u5b9a\u89d2\u5ea6\u4ee5\u8b8a\u66f4\u50be\u659c\u89d2 +ParticleModel.Hint=\u5728\u5de5\u5177\u5217\u4e0a\u8a2d\u5b9a\u8cea\u91cf\uff0c\u5728\u6a21\u7d44\u5efa\u69cb\u5de5\u5177\u4e2d\u8f38\u5165\u51fd\u6578\u4f5c\u6a21\u64ec +RGBRegion.Hint=\u8f38\u5165\u534a\u5f91\u4ee5\u6539\u8b8a\u5927\u5c0f +RGBRegion.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u6309\u4e0b\u6ed1\u9f20\u4ee5\u6a19\u793a\u4f4d\u7f6e +TTrack.ImportVideo.Hint=\u6e2c\u91cf RGB \u7684\u91cd\u8981\u5f71\u7247\u6216\u5716\u6a94 +TTrack.Selected.Hint=\u9078\u53d6\u7684 +LineProfile.Hint=\u8f38\u5165\u5bec\u5ea6\u4ee5\u8b8a\u66f4\u7dda\u5bec +LineProfile.Unmarked.Hint=\u6309\u4f4f shift \u9375\u518d\u62d6\u62c9\u6ed1\u9f20\u4ee5\u756b\u7dda +LineProfile.Menu.Orientation=\u5b9a\u4f4d +LineProfile.MenuItem.Horizontal=\u5782\u76f4 +LineProfile.MenuItem.XAxis=\u6cbf\u8457 X-\u8ef8 +Footprint.PositionVector=\u5411\u91cf +Footprint.BoldPositionVector=\u7c97\u5411\u91cf +Tracker.Startup.Hint=\u770b\u9019\u908a\u7684\u63d0\u793a(\u6216\u5728\u8aaa\u660e\u529f\u80fd\u8868\u4e2d\u53d6\u6d88\u63d0\u793a),\u6216\u6309\u4e0b F1 \u9375\u96a8\u6642\u89c0\u770b\u8aaa\u660e +TrackerPanel.NoVideo.Hint=\u958b\u555f\u6216\u8f09\u5165\u8981\u5206\u6790\u7684\u5f71\u7247\u6216\u5716\u6a94 +TrackerPanel.CalibrateVideo.Hint=\u78ba\u8a8d\u5df2\u77e5\u9577\u5ea6\u7684\u5c08\u984c\u5f71\u7247\u4e26\u4ee5\u91cf\u5c3a\u6e2c\u91cf\u8a2d\u5b9a\u523b\u5ea6 +TrackerPanel.NoTracks.Hint=\u65b0\u589e\u8ecc\u8de1\u4ee5\u6e2c\u91cf\u60a8\u6709\u8208\u8da3\u7684\u5c08\u984c\u5f71\u7247 +TrackerPanel.SetClip.Hint=\u5728\u5f71\u7247\u526a\u8f2f\u76e3\u6e2c\u5de5\u5177\u4e2d\u8a2d\u5b9a\u6216\u6aa2\u8996\u5f71\u7247\u526a\u8f2f\u8a2d\u5b9a +TrackerPanel.ShowAxes.Hint=\u8a2d\u5b9a\u539f\u9ede\u6216\u5ea7\u6a19\u8ef8\u9593\u7684\u89d2\u5ea6 +VideoPlayer.Step.Hint=\u5411\u524d (\u5feb\u6377\u9375: PageDown \u9375) +VideoPlayer.Back.Hint=\u5f8c\u9000 (\u5feb\u6377\u9375: PageUp \u9375) +TrackerPanel.DVVideo.Hint=\u904b\u7528 resize filter \u4f86\u66f4\u6b63 DV \u683c\u5f0f\u5f71\u7247\u7522\u751f\u7684\u626d\u66f2\u5f71\u50cf +TrackerIO.DataFileFilter.Description=Tracker \u6a94 +Tracker.Button.PDFHelp=\u53ef\u5217\u5370\u7684 PDF \u7248 +TToolbar.Button.TapeVisible.Tooltip=\u4ee5\u91cf\u89d2\u5668\u908a\u81c2\u4f5c\u91cf\u5c3a\u6e2c\u91cf @@ Tape Measure with Protractor Arm + +# Additions by Doug Brown 2009-03-06 +TMenuBar.MenuItem.TrackControl=\u8ecc\u8de1\u63a7\u5236\u9805 +TMenuBar.MenuItem.Description=\u8aaa\u660e +TrackPlottingPanel.RightDrag.Hint=\u6ed1\u9f20\u53f3\u9375\u62d6\u66f3\u986f\u793a\u9078\u55ae +TMenuBar.MenuItem.DeleteSelectedPoint=\u5df2\u9078\u53d6\u9ede +TFrame.InfoDialog.SaveChanges.Title=\u5132\u5b58\u8b8a\u66f4 +TFrame.InfoDialog.SaveChanges.Message=\u60a8\u60f3\u8981\u5132\u5b58\u8b8a\u66f4? + +# Additions by Doug Brown 2009-04-27 +DynamicParticle.Editor.Button.Cartesian=Cartesian +DynamicParticle.Editor.Button.Polar=Polar +DynamicParticle.Parameter.InitialR.Description=\u521d\u59cb\u534a\u5f91 +DynamicParticle.Parameter.InitialTheta.Description=\u521d\u59cb\u89d2\u5ea6 +DynamicParticle.Parameter.InitialVelocityR.Description=\u521d\u59cb\u5f91\u5411\u901f\u5ea6 +DynamicParticle.Parameter.InitialOmega.Description=\u521d\u59cb\u89d2\u901f\u5ea6 +DynamicParticle.ForceFunction.R.Description=\u4f5c\u7528\u529b\u7684\u5f91\u5411\u5206\u91cf +DynamicParticle.ForceFunction.Theta.Description=\u4f5c\u7528\u529b\u7684\u5207\u7dda\u5206\u91cf +DynamicParticlePolar.Name=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 (Polar) +DynamicTwoBody.Editor.Button.Particle1=\u8cea\u9ede 1 +DynamicTwoBody.Editor.Button.Particle2=\u8cea\u9ede 2 +DynamicTwoBody.Name=Dynamic Two-Body Model +TMenuBar.Menu.DynamicParticle=\u52d5\u614b\u8cea\u9ede\u6a21\u7d44 +TMenuBar.MenuItem.Cartesian=Cartesian +TMenuBar.MenuItem.Polar=Polar + +# Additions by Doug Brown 2009-08-24 +Autotrack.Inspector.Title=\u81ea\u52d5\u8ffd\u8e64\u8ecc\u8de1 +PointMass.MenuItem.Autotrack=\u81ea\u52d5\u8ffd\u8e64\u8ecc\u8de1 ... +Dialog.Button.Help=\u8aaa\u660e +AutoTracker.Wizard.Button.Reset=\u91cd\u8a2d +AutoTracker.Wizard.Button.Back=\u56de\u5230 +AutoTracker.Wizard.Button.Next=\u4e0b\u4e00\u500b +AutoTracker.Wizard.Button.Accept=\u63a5\u53d7 +AutoTracker.Wizard.Button.Search=\u641c\u5c0b +AutoTracker.Wizard.Button.Start=\u958b\u59cb +AutoTracker.Wizard.Button.Pause=\u66ab\u505c +AutoTracker.Wizard.Button.Skip=\u8df3\u904e +AutoTracker.Label.Mask=\u906e\u7f69\u5f71\u50cf +AutoTracker.Label.Target=\u7269\u504f\u79fb +AutoTracker.Label.AcceptLevel=\u63a5\u53d7\u4ee5\u4e0a\u5206\u6578 +AutoTracker.TabbedPane.TabTitle.Mask=\u906e\u7f69 +AutoTracker.TabbedPane.TabTitle.Target=\u76ee\u6a19 +AutoTracker.Info.GetStarted=\u8acb\u9ede\u9078\u60a8\u60f3\u8981\u81ea\u52d5\u8ffd\u7e31\u7684\u5f71\u7247\u529f\u80fd +AutoTracker.Info.Mask1=\u6b64\u906e\u7f69\u5b9a\u7fa9\u5728\u6bcf\u4e00\u500b\u5f71\u683c\u4e2d\u6240\u5c0d\u61c9\u7684\u5f71\u50cf\uff0c\u62d6\u62c9\u906e\u7f69\u7684\u4e2d\u5fc3\u9ede\u53ef\u79fb\u52d5\u906e\u7f69\uff0c\u6216\u62d6\u62c9\u628a\u624b\u53ef\u8abf\u6574\u906e\u7f69\u5927\u5c0f\u3002 +AutoTracker.Info.Mask2=\u63d0\u793a\uff1a\u6b64\u906e\u7f69\u4e0d\u9700\u592a\u5927\u6216\u6db5\u84cb\u6574\u500b\u7269\u4ef6\uff0c\u901a\u5e38\u529f\u80fd\u7368\u7279\u4e14\u542b\u9ad8\u5c0d\u6bd4\u5ea6\u908a\u6846\u7684\u906e\u7f69\u6548\u679c\u6700\u4f73\u3002 +AutoTracker.Info.MaskLocked1=\u6b64\u906e\u7f69\u5df2\u88ab\u4f7f\u7528\u6216\u9396\u5b9a\u3002 +AutoTracker.Info.MaskLocked2=\u6309\u4e0b\u91cd\u65b0\u6574\u7406\u6309\u9215\u4ee5\u6e05\u9664\u6240\u6709\u6b65\u9a5f\uff0c\u89e3\u9664\u906e\u7f69\u9396\u5b9a\u4e26\u91cd\u65b0\u958b\u59cb\u3002 +AutoTracker.Info.Target1=\u76ee\u6a19\u662f\u65bc\u76f8\u5c0d\u906e\u7f69\u7684\u4f4d\u7f6e\u6a19\u793a\u6b65\u9a5f\uff0c\u62d6\u62c9\u76ee\u6a19\u53ef\u79fb\u52d5\u5176\u4f4d\u7f6e\u3002 +AutoTracker.Info.Target2=\u63d0\u793a\uff1a\u5373\u4f7f\u5df2\u7d93\u6a19\u793a\u6b65\u9a5f\uff0c\u60a8\u4ecd\u53ef\u62d6\u52d5\u6a19\u7684\u7269\u4f4d\u7f6e\uff0c\u6a19\u793a\u6b65\u9a5f\u6703\u81ea\u52d5\u96a8\u6a19\u7684\u7269\u800c\u79fb\u52d5\u3002 +AutoTracker.Info.TargetLocked=\u6b64\u6a19\u7684\u7269\u6b63\u88ab\u4f7f\u7528\u4e14\u88ab\u8a02\u5728\u7d66\u5b9a\u7684\u6b65\u9a5f\u4f4d\u7f6e\uff0c\u79fb\u52d5\u6b64\u6a19\u7684\u7269\u4e5f\u5c07\u79fb\u52d5\u5176\u6b65\u9a5f\u3002 +AutoTracker.Info.Settings1=\u81ea\u52d5\u6a19\u793a\u7b26\u5408\u53ef\u63a5\u53d7\u7a0b\u5ea6\u4ee5\u4e0a\u7684\u986f\u793a\u5206\u6578\u3002@@ Match scores above the acceptance level shown are marked automatically. +AutoTracker.Info.Settings2=\u63d0\u793a\uff1a\u964d\u4f4e\u53ef\u63a5\u53d7\u7a0b\u5ea6\u5c07\u53ef\u52a0\u901f\u6a19\u793a\u6b65\u9a5f\uff0c\u4f46\u4e5f\u6703\u63d0\u9ad8\u932f\u8aa4\u7684\u53ef\u80fd\u6027\u3002 +AutoTracker.Info.Search1=\u5c07\u986f\u793a\u641c\u5c0b\u7d50\u679c\u6700\u7b26\u5408\u7684\u77e9\u5f62\uff0c\u62d6\u62c9\u77e9\u5f62\u4e2d\u5fc3\u9ede\u53ef\u79fb\u52d5\u4e4b\uff0c\u6216\u62d6\u62c9\u628a\u624b\u53ef\u8abf\u6574\u77e9\u5f62\u5927\u5c0f\u3002 +AutoTracker.Info.Search2=\u63d0\u793a\uff1a\u6b64\u77e9\u5f62\u4e0d\u9700\u592a\u5927\uff0c\u641c\u5c0b\u7d50\u679c\u7684\u524d\u5169\u500b\u7b26\u5408\u77e9\u5f62\uff0c\u9810\u6e2c\u7684\u6f14\u7b97\u5f0f\u53ef\u5c07\u641c\u5c0b\u5340\u79fb\u52d5\u81f3\u9810\u6e2c\u51fa\u7684\u7b26\u5408\u4f4d\u7f6e\u3002 +AutoTracker.Info.Frame=\u5f71\u683c +AutoTracker.Info.Match=\u7b26\u5408\u8005\u5373\u5728\u76ee\u6a19\u4f4d\u7f6e\u81ea\u52d5\u88ab\u6a19\u793a\u986f\u793a\u3002 +AutoTracker.Info.Possible=\u5728\u641c\u5c0b\u5340\u986f\u793a\u767c\u73fe\u53ef\u80fd\u7684\u7b26\u5408\u8005\uff0c\u60a8\u53ef\u9078\u64c7\uff1a +AutoTracker.Info.NoMatch=\u5728\u641c\u5c0b\u5340\u986f\u793a\u672a\u767c\u73fe\u4efb\u4f55\u53ef\u80fd\u7684\u7b26\u5408\u8005\uff0c\u60a8\u53ef\u9078\u64c7\uff1a +AutoTracker.Info.Outside=\u641c\u5c0b\u5340\u8d85\u51fa\u5716\u6a94\u7684\u7bc4\u570d\uff0c\u60a8\u53ef\u9078\u64c7\uff1a +AutoTracker.Info.Accepted=\u4f7f\u7528\u8005\u63a5\u53d7\u986f\u793a\u7684\u7b26\u5408\u8005\u3002 +AutoTracker.Info.MarkedByUser=\u4f7f\u7528\u8005\u624b\u52d5\u6a19\u793a\u6b65\u9a5f\u3002 +AutoTracker.Info.NoVideo=\u81ea\u52d5\u8ffd\u8e64\u529f\u80fd\u5fc5\u9808\u8981\u6709\u5f71\u7247\u6a94\uff0c\u8acb\u8f09\u5165\u5f71\u7247\u6a94\u6216\u95dc\u9589\u81ea\u52d5\u8ffd\u8e64\u529f\u80fd\u3002 +AutoTracker.Info.Height=\u9ad8\u5ea6 +AutoTracker.Info.Width=\u5bec\u5ea6 +AutoTracker.Info.Accept=--\u63a5\u53d7\u7b26\u5408\u8005 +AutoTracker.Info.Retry=--\u79fb\u52d5\u641c\u5c0b\u5340\u4e26\u518d\u6b21\u641c\u5c0b +AutoTracker.Info.Mark=\u6309 --shift-click \u8907\u5408\u9375\u4ee5\u624b\u52d5\u6a19\u793a\u6b65\u9a5f +AutoTracker.Info.Skip=--\u8df3\u904e\u6b64\u5f71\u683c\u4e26\u7e7c\u7e8c\u8ffd\u8e64 +AutoTracker.Info.Reset=--\u91cd\u65b0\u6574\u7406\u4e26\u4ee5\u8abf\u597d\u7684\u906e\u7f69\u91cd\u65b0\u958b\u59cb +AutoTracker.Dialog.MaskLocked.Title=\u9396\u5b9a\u906e\u7f69 +PointMass.Cursor.Autotrack.Description=\u81ea\u52d5\u8ffd\u8e64\u6e38\u6a19 +VideoPlayer.StartFrame.Hint=\u62d6\u62c9\u4ee5\u8a2d\u5b9a\u8d77\u59cb\u5f71\u683c +VideoPlayer.EndFrame.Hint=\u62d6\u62c9\u4ee5\u8a2d\u5b9a\u7d50\u675f\u5f71\u683c +VideoPlayer.Slider.Hint=\u62d6\u62c9\u4ee5\u5feb\u901f\u700f\u89bd\u5f71\u7247 +FileDropHandler.Dialog.BadFile.Message=\u7121\u6cd5\u8f09\u5165\u6a94\u6848. +FileDropHandler.Dialog.BadFile.Title=\u7121\u6cd5\u8fa8\u8b58\u7684\u6a94\u6848. + +# Additions by Doug Brown 2009-10-27 +Dialog.Button.Apply=\u5957\u7528 +DynamicParticle.Dialog.Delete.Message=\u522a\u9664\u6b64\u8cea\u9ede\u5c07\u7531\u7cfb\u7d71\u4e2d\u79fb\u9664\uff0c\u662f\u5426\u4ecd\u78ba\u5b9a\u8981\u522a\u9664\uff1f +DynamicParticle.Dialog.Delete.Title=\u52d5\u614b\u7cfb\u7d71 +AutoTracker.TabbedPane.TabTitle.Settings=3. \u63a5\u53d7 +AutoTracker.TabbedPane.TabTitle.Search=4. \u641c\u5c0b +DynamicParticle.System.In=\u5728\u5176\u4e2d +DynamicSystem.Empty=\u7a7a\u7684 +DynamicSystem.Force.Name.Internal=\u5167\u90e8\u7684 +DynamicSystem.ForceFunction.R.Description=\u5167\u90e8\u4f5c\u7528\u529b\u7684\u5f91\u5411\u5206\u91cf +DynamicSystem.ForceFunction.Theta.Description=\u5167\u90e8\u4f5c\u7528\u529b\u7684\u5207\u7dda\u5206\u91cf +DynamicSystem.MenuItem.Inspector=\u9078\u53d6\u8cea\u9ede... +DynamicSystem.Name=\u52d5\u614b\u4e8c\u9ad4\u7cfb\u7d71 +DynamicSystem.New.Name=\u7cfb\u7d71 +DynamicSystem.Parameter.Of=\u7684 +DynamicSystem.Parameter.RelativeTo=\u76f8\u5c0d\u65bc +DynamicSystem.Parameter.Name.Relative=\u76f8\u5c0d +DynamicSystem.Parameter.ParticleMass.Description=\u7684\u8cea\u91cf +DynamicSystem.Parameter.Mass.Description=\u7cfb\u7d71\u7e3d\u8cea\u91cf +DynamicSystemInspector.Border.Title=\u8cea\u9ede +DynamicSystemInspector.Title=\u4e8c\u9ad4\u7cfb\u7d71 +DynamicSystemInspector.Button.Change=\u8b8a\u66f4... +DynamicSystemInspector.ParticleName.None=(none) +TMenuBar.MenuItem.Clone=\u8907\u88fd +TMenuBar.MenuItem.TwoBody=\u4e8c\u9ad4\u7cfb\u7d71 +TrackerPanel.DataBuilder.Dropdown.Tooltip=\u76ee\u524d\u9078\u64c7\u7684\u8ecc\u8de1 +TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Sync \u5782\u76f4\u8ef8 +TrackControl.Button.Trace.ToolTip=\u986f\u793a/\u96b1\u85cf \u8def\u5f91 +TToolBar.Button.Open.Tooltip=\u5728\u65b0\u7684\u5206\u9801\u4e2d\u958b\u555f\u5f71\u7247\u6a94\u6216\u8ecc\u8de1\u6a94 +TToolBar.Button.Save.Tooltip=\u5c07\u76ee\u524d\u7684\u5206\u9801\u5b58\u6a94 +TToolBar.Button.SelectTrack=\u9078\u53d6 +TToolBar.Button.SelectTrack.Tooltip=\u9078\u53d6\u820a\u7684\u8ecc\u8de1 +TTrack.MenuItem.ClearSteps=\u6e05\u9664\u6b65\u9a5f +PointMass.MenuItem.Position=\u4f4d\u7f6e +TMenuBar.MenuItem.Empty=(\u7a7a) +TTrackBar.Button.Memory=\u5df2\u4f7f\u7528\u8a18\u61b6\u5340: +TTrackBar.Button.Memory.Tooltip=\u76e3\u63a7\u6216\u7ba1\u7406\u8a18\u61b6\u5340 +TTrackBar.Memory.PopupItem.Launch=\u5728\u8a18\u61b6\u5340\u555f\u52d5 Tracker +TButton.Track.ToolTip=\u8a2d\u5b9a\u5c6c\u6027 +Tracker.Dialog.OutOfMemory.Message1=Tracker \u5de5\u4f5c\u8a18\u61b6\u5340\u4e0d\u8db3. +Tracker.Dialog.OutOfMemory.Message2=\u6309\u4e00\u4e0b\u8a18\u61b6\u5340\u6309\u9215\u986f\u793a\u9078\u9805. +Tracker.Dialog.OutOfMemory.Title=\u8a18\u61b6\u5340\u4e0d\u8db3. + +# Additions by Doug Brown 2010-12-27 +AutoTracker.Wizard.Checkbox.LookAhead=\u5f80\u524d\u9810\u6e2c +AutoTracker.Label.Original=\u521d\u59cb +AutoTracker.Label.NoMask=\u7121 +AutoTracker.Label.Rate=\u8b8a\u5316\u7387: +AutoTracker.Info.Mask3=\u63d0\u793a: \u6240\u9078\u53d6\u5340\u57df\u4e0d\u9700\u8981\u5927\u65bc\u6216\u5305\u542b\u6574\u500b\u7269\u4ef6. \u82e5\u5305\u542b\u7279\u6b8a\u7684\u5716\u6848\u6216\u9bae\u660e\u7684\u5c0d\u6bd4\u6703\u6bd4\u8f03\u6709\u6548 +AutoTracker.Wizard.Checkbox.XAxis=\u9650\u65bcX-\u8ef8 +AutoTracker.Info.SearchOnAxis1=\u6703\u4ee5\u6240\u9078\u5340\u57df\u5167\u671dx-\u8ef8\u65b9\u5411\u641c\u5c0b\u6700\u7b26\u5408\u7684\u7d50\u679c. \u53ef\u85c9\u7531\u6ed1\u9f20\u62d6\u62c9\u6539\u8b8a\u641c\u5c0b\u5340\u57df\u4f4d\u7f6e\u6216\u5927\u5c0f. +AutoTracker.Info.PossibleOnAxis=\u5728\u9078\u5b9a\u5340\u57df\u5167\u5df2\u7d93\u6cbfx\u8ef8\u627e\u5230\u7b26\u5408\u7684\u6a19\u7684. \u63a5\u8457\u4f60\u7684\u9078\u64c7\u662f: +AutoTracker.Info.NoMatchOnAxis=\u5728\u9078\u5b9a\u5340\u57df\u5167\u6cbfx\u8ef8\u7121\u6cd5\u627e\u5230\u7b26\u5408\u7684\u6a19\u7684. \u63a5\u8457\u4f60\u7684\u9078\u64c7\u662f: +AutoTracker.Info.RetryOnAxis=--\u79fb\u52d5\u641c\u5c0b\u5340\u57df\u6216x\u8ef8\u4f4d\u7f6e \u7136\u5f8c\u518d\u5ea6\u641c\u5c0b +AutoTracker.Wizard.Button.Delete=\u522a\u9664\u6b64\u9ede +AutoTracker.Wizard.Button.DeleteMore=\u522a\u9664\u6b64\u9ede\u548c\u63a5\u7e8c\u7684\u6240\u6709\u9ede +Button.Define.Tooltip=\u5c0d\u76ee\u524d\u6b04\u7684\u8b8a\u6578\u5b9a\u7fa9\u5c0d\u61c9\u7684\u51fd\u6578 +Calibration.Label.Point=\u9ede +CalibrationStick.Hint=\u8a2d\u5b9a\u9577\u5ea6\u6216\u4ee5\u62d6\u62c9\u65b9\u5f0f\u6539\u8b8a\u6bd4\u4f8b, \u8a2d\u5b9a\u89d2\u5ea6\u5247\u6539\u8b8a\u50be\u659c\u7684\u4fee\u6b63 +CalibrationStick.End.Hint=\u4ee5\u62d6\u62c9\u65b9\u5f0f\u6539\u8b8a\u6bd4\u4f8b +CalibrationStick.New.Name=\u6821\u6b63\u687f +CalibrationTapeMeasure.New.Name=\u6821\u6b63\u5c3a +CalibrationTapeMeasure.Readout.Magnitude.Hint=\u6309\u5de6\u9375\u8f38\u5165\u76ee\u524d\u55ae\u4f4d\u5c0d\u61c9\u7684\u9577\u5ea6\u503c +CalibrationTapeMeasure.Hint=\u8a2d\u5b9a\u9577\u5ea6\u4ee5\u6539\u8b8a\u6bd4\u4f8b, \u8a2d\u5b9a\u89d2\u5ea6\u6539\u8b8ax\u8ef8\u50be\u659c\u89d2 +DynamicSystem.Data.Description.0=\u5169\u7c92\u5b50\u9593\u76f8\u5c0d\u8ddd\u96e2 +DynamicSystem.Data.Description.1=\u76f8\u5c0d\u89d2\u5ea6 +DynamicSystem.Data.Description.2=\u76f8\u5c0d\u5f91\u5411\u901f\u5ea6 +DynamicSystem.Data.Description.3=\u76f8\u5c0d\u89d2\u901f\u5ea6 +ExportDataDialog.Subtitle.Table=\u8cc7\u6599\u8868 +ExportDataDialog.Subtitle.Content=\u683c +ExportDataDialog.Subtitle.Format=\u6578\u5b57\u683c\u5f0f +ExportDataDialog.Subtitle.Delimiter=\u5206\u9694\u7b26\u865f +ExportDataDialog.Title=\u8f38\u51fa\u8cc7\u6599 +ExportDataDialog.Delimiter.Add=\u65b0\u589e... +ExportDataDialog.Delimiter.Remove=\u79fb\u9664... +ExportDataDialog.Content.AllCells=\u6240\u6709\u683c\u5b50 +ExportDataDialog.Content.SelectedCells=\u9078\u53d6\u7684\u683c\u5b50 +ExportDataDialog.MenuItem.RemoveDelimiter=\u79fb\u9664\u500b\u4eba\u8a2d\u5b9a\u5206\u9694\u7b26\u865f +ExportDataDialog.Chooser.SaveData.Title=\u5132\u5b58\u8cc7\u6599\u70ba +ExportVideoDialog.Button.SaveAs=\u5132\u5b58\u70ba... +ExportVideoDialog.Button.FullSize=\u5b8c\u6574\u5c3a\u5bf8 +ExportVideoDialog.Button.DrawnSize=\u5982\u5716\u6240\u793a +ExportVideoDialog.Content.VideoOnly=\u50c5\u9650\u5f71\u7247 +ExportVideoDialog.Content.VideoAndGraphics=\u5f71\u7247\u548c\u5716\u5f62 +ExportVideoDialog.Content.GraphicsOnly=\u50c5\u9650\u5716\u5f62 +ExportVideoDialog.Title=\u8f38\u51fa\u5f71\u7247 +ExportVideoDialog.Label.ClipSettings=\u5f71\u7247\u8a2d\u5b9a +ExportVideoDialog.Subtitle.Size=\u5c3a\u5bf8 +ExportVideoDialog.Subtitle.Content=\u5167\u5bb9 +ExportVideoDialog.Subtitle.View=\u986f\u793a +ExportVideoDialog.Subtitle.Format=\u683c\u5f0f +ExportVideoDialog.Complete.Message1=\u5f71\u7247\u5df2\u7d93\u5132\u5b58\u70ba +ExportVideoDialog.Complete.Message2=\u4f60\u662f\u5426\u60f3\u99ac\u4e0a\u4ee5 Tracker \u958b\u555f? +ExportVideoDialog.Complete.Title=\u5b8c\u6210\u8f38\u51fa +ExportVideoDialog.VideoSize=\u5f71\u7247\u5927\u5c0f +ExportVideoDialog.MatSize=mat \u5927\u5c0f +ExportVideo.Dialog.HiddenPlots.Message=\u5fc5\u9808\u986f\u793a\u6240\u6709\u5716\u5f62\u4ee5\u4fbf\u8f38\u51fa +ExportVideo.Dialog.HiddenPlots.Title=\u4e0d\u5b8c\u6574\u7684\u986f\u793a +Footprint.DoubleTarget=\u96d9\u4ea4\u53c9\u7dda +Footprint.BoldDoubleTarget=\u7c97\u7684\u96d9\u4ea4\u53c9\u7dda +OffsetOrigin.MenuItem.Fixed=\u56fa\u5b9a\u7684\u5ea7\u6a19\u7cfb +ParticleModel.Dialog.Offscreen.Message1=\u56e0\u70ba\u5df2\u7d93\u8d85\u51fa\u87a2\u5e55\u5340\u57df\u6709\u4e9b\u6b65\u9a5f\u88ab\u7701\u7565 +ParticleModel.Dialog.Offscreen.Message2=\u8acb\u6539\u8b8a\u6a21\u578b\u6216\u5f71\u7247\u5c3a\u5ea6\u4ee5\u9032\u884c\u4fee\u6b63 +ParticleModel.Dialog.Offscreen.Title=\u8d85\u51fa\u7bc4\u570d +PrefsDialog.Tab.Configuration.Title=\u8a2d\u5b9a +PrefsDialog.Memory.BorderTitle=\u8a18\u61b6\u9ad4\u5927\u5c0f +PrefsDialog.Tab.General.Title=\u5176\u4ed6 +PrefsDialog.RecentFiles.BorderTitle=\u958b\u555f\u6700\u8fd1\u7684\u9078\u55ae +PrefsDialog.Label.RecentSize=\u6a94\u6848\u6578 +PrefsDialog.Hints.BorderTitle=\u63d0\u793a +PrefsDialog.Button.Relaunch=\u99ac\u4e0a\u91cd\u65b0\u555f\u52d5 +PrefsDialog.Button.ClearRecent=\u6e05\u9664 +PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9810\u8a2d +PrefsDialog.Checkbox.HintsOn=\u9810\u8a2d\u986f\u793a\u63d0\u793a +PrefsDialog.Tab.Video.Title=\u5f71\u7247 +PrefsDialog.VideoPref.BorderTitle=\u5f71\u7247\u8655\u7406\u7a0b\u5f0f +PrefsDialog.Button.Xuggle=Xuggle (\u5efa\u8b70\u5b89\u88dd) +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=\u7576\u4f7f\u7528Web Start\u6642\u7121\u6cd5\u4f7f\u7528\u8a18\u61b6\u9ad4\u7ba1\u7406 +PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f +PrefsDialog.LookFeel.BorderTitle=Look And Feel +PrefsDialog.Language.BorderTitle=\u8a9e\u8a00 +PrefsDialog.Upgrades.BorderTitle=\u6aa2\u67e5\u66f4\u65b0 +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=\u986f\u793a +PrefsDialog.Language.Default=\u9810\u8a2d +PrefsDialog.Upgrades.Always=\u6bcf\u6b21 +PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 +PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 +PrefsDialog.Upgrades.Never=\u5f9e\u4e0d +PrefsDialog.Button.CheckForUpgrade=\u99ac\u4e0a\u6aa2\u67e5 +PrefsDialog.Xuggle.Speed.BorderTitle=\u64ad\u653e\u5f71\u7247 +PrefsDialog.Xuggle.Slow=\u9806\u66a2 (\u53ef\u80fd\u6703\u8b8a\u6162) +PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u51fa\u73fe\u92f8\u9f52) +PrefsDialog.CalibrationTool.BorderTitle=\u9810\u8a2d\u6821\u6b63\u5de5\u5177 +Protractor.Name=\u91cf\u89d2\u5668 +Protractor.New.Name=\u91cf\u89d2\u5668 +Protractor.Hint=\u62d6\u62c9\u5169\u687f\u4ee5\u6e2c\u91cf\u89d2\u5ea6 +Protractor.Label.Angle=\u89d2\u5ea6 +Protractor.Field.Angle.Tooltip=\u5169\u687f\u4e4b\u9593\u593e\u89d2 +Protractor.Vertex.Name=\u9802\u9ede +Protractor.Vertex.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u9802\u9ede +Protractor.End.Name=\u687f\u7aef\u9ede +Protractor.End.Hint=\u62d6\u62c9\u4ee5\u6539\u8b8a\u89d2\u5ea6 +Protractor.Handle.Name=\u64cd\u63a7\u9ede +Protractor.Handle.Hint=\u62d6\u62c9\u4ee5\u79fb\u52d5\u91cf\u89d2\u5668 +Protractor.Rotator.Name=\u8f49\u52d5\u5668 +Protractor.Rotator.Hint=\u62d6\u62c9\u4ee5\u8f49\u52d5\u91cf\u89d2\u5668 +Protractor.Readout.Name=\u8b80\u6578\u503c +Protractor.Readout.Hint=\u91cf\u89d2\u5668\u5169\u687f\u9593\u593e\u89d2 +ProtractorFootprint.Circle3=\u5c0f\u89d2\u5ea6 +ProtractorFootprint.Circle5=\u5927\u89d2\u5ea6 +ProtractorFootprint.Circle3Bold=\u7c97\u7dda\u5c0f\u5713 +ProtractorFootprint.Circle5Bold=\u7c97\u7dda\u5927\u5713 +Stick.Name=\u6821\u6b63\u687f +Stick.New.Name=\u6e2c\u91cf\u68d2 +TableTrackView.MenuItem.Unformatted=\u6700\u9ad8\u7cbe\u5bc6\u5ea6 +TableTrackView.MenuItem.Formatted=\u5982\u683c\u5f0f +TableTrackView.Menu.SetDelimiter=\u8a2d\u5b9a\u5340\u9694\u7b26\u865f +TableTrackView.MenuItem.AddDelimiter=\u65b0\u589e... +TableTrackView.MenuItem.RemoveDelimiter=\u79fb\u9664... +TableTrackView.Dialog.CustomDelimiter.Message=\u8f38\u5165\u65b0\u7684\u5340\u9694\u7b26\u865f\u5b57\u4e32: +TableTrackView.Dialog.CustomDelimiter.Title=\u65b0\u589e\u5340\u9694\u78bc +TableTrackView.Header.Tooltip=\u9ede\u5de6\u9375\u4ee5\u6392\u5e8f\u6216\u9ede\u5169\u4e0b\u4ee5\u9078\u53d6\u6b64\u6b04 +TableTrackView.MenuItem.CopySelectedData=\u8907\u88fd\u9078\u53d6\u7684\u8cc7\u6599 +TableTrackView.Dialog.RemoveDelimiter.Message=\u9078\u53d6\u8981\u79fb\u9664\u7684\u5340\u9694\u78bc: +TableTrackView.Dialog.RemoveDelimiter.Title=\u79fb\u9664\u5340\u9694\u78bc +TableTrackView.Radians.Tooltip=\u5f91\u5ea6 +TableTrackView.Degrees.Tooltip=\u89d2\u5ea6 +TableTrackView.RadiansPerSecond.Tooltip=\u5f91\u5ea6/\u79d2 +TableTrackView.DegreesPerSecond.Tooltip=\u89d2\u5ea6/\u79d2 +TableTrackView.RadiansPerSecondSquared.Tooltip=\u5f91\u5ea6/\u79d2^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=\u89d2\u5ea6/\u79d2^2 +TableTrackView.MenuItem.DeleteDataFunction=\u522a\u9664\u8cc7\u6599\u51fd\u6578 +TActions.Action.SaveFrame=\u5132\u5b58\u8cc7\u6599\u70ba... +TActions.AboutVideo=\u5c6c\u6027... +TActions.Dialog.AboutVideo.Title=\u5f71\u7247\u5c6c\u6027 +TActions.Dialog.AboutVideo.Type=\u683c\u5f0f +TActions.Dialog.AboutVideo.Size=\u5c3a\u5ea6 +TActions.Dialog.AboutVideo.Length=\u9577\u5ea6 +TActions.Dialog.AboutVideo.Frames=\u5f71\u683c\u6578 +TActions.Dialog.AboutVideo.Seconds=\u79d2 +TActions.Dialog.AboutVideo.FrameRate=\u64ad\u653e\u5f71\u683c\u7387 +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=\u8def\u5f91 +TActions.Action.ImportTRK=Tracker \u6a94\u6848... +TActions.Action.ProtractorVisible=\u986f\u793a +TapeMeasure.MenuItem.FixedLength=\u56fa\u5b9a\u9577\u5ea6 +TextTView.Label.NoTab=\u6b64\u8655\u986f\u793a\u6587\u5b57\u548c\u7db2\u9801\u5167\u5bb9 +TextTView.NewTab.Text1=\u9ede\u5169\u4e0b\u4ee5\u7de8\u8f2f\u6587\u5b57\u6216\u6a19\u984c. \u9ede\u53f3\u9375\u5448\u73fe\u66f4\u591a\u9078\u9805. +TextTView.NewTab.Text2=\u8f38\u5165url\u7db2\u5740\u5448\u73fe\u7db2\u9801\u6216\u9ede\u53f3\u9375\u958b\u65b0\u6a94\u6848 +TextTView.NewTab.Title=\u7121\u6a19\u984c +TextTView.Dialog.TabTitle.Title=\u8a2d\u5b9a\u6a19\u984c +TextTView.MenuItem.OpenHTML=\u958b\u555f\u7db2\u9801... +TextTView.MenuItem.SetTitle=\u8a2d\u5b9a\u6a19\u984c... +TextTView.Button.NewTab=\u65b0\u589e +TextTView.TextEdit.Description=\u6587\u5b57 +TFrame.Dialog.FileNotFound.Message=\u7121\u6b64\u6a94\u6848: +TFrame.Dialog.FileNotFound.Title=\u7121\u6b64\u6a94\u6848 +TFrame.View.Text=\u6587\u5b57/\u7db2\u9801 \u986f\u793a +TFrame.View.Main=\u4e3b\u8981\u986f\u793a +TMenuBar.Menu.OpenRecent=\u958b\u555f\u6700\u65b0 +TMenuBar.Menu.Import=\u8f38\u5165 +TMenuBar.Menu.Export=\u8f38\u51fa +TMenuBar.MenuItem.Video=\u5f71\u7247... +TMenuBar.MenuItem.Data=\u8cc7\u6599\u6a94... +TMenuBar.Menu.CopyObject=\u8907\u88fd\u7269\u4ef6 +TMenuBar.MenuItem.Coords=\u5ea7\u6a19\u7cfb +TMenuBar.MenuItem.VideoClip=\u5f71\u7247 +TMenuBar.Menu.MeasuringTools=\u6e2c\u91cf\u5de5\u5177 +TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u55ae\u4f4d +TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 +TMenuBar.MenuItem.Radians=\u5f91\u5ea6 +Tracker.Dialog.NoXuggle.Title=\u6c92\u6709\u5b89\u88dd Xuggle +Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddXuggle (\u8de8\u5e73\u53f0\u5f71\u7247\u8655\u7406\u7a0b\u5f0f). +Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f09 Xuggle from http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=\u95dc\u65bc Xuggle... +Tracker.Dialog.AboutXuggle.Title=\u95dc\u65bc Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \u7248\u672c +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \u9996\u9801: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle \u8def\u5f91: +Tracker.Dialog.NoVideoEngine.Message1=\u6c92\u6709\u5f71\u7247\u7a0b\u5f0f! \u96d6\u6c92\u6709 Tracker \u4ecd\u53ef\u4ee5 +Tracker.Dialog.NoVideoEngine.Message2=\u50c5\u986f\u793a\u5716\u7247, \u5716\u7247\u96c6\u6216 animated gifs. +Tracker.Dialog.NoVideoEngine.Message3=\u6e96\u5099\u5b89\u88dd Xuggle, Tracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f +Tracker.Dialog.NoVideoEngine.Message4=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer +Tracker.Dialog.NoVideoEngine.Title=\u7f3a\u5c11\u5f71\u7247\u8655\u7406\u7a0b\u5f0f +Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddTracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f Xuggle. +Tracker.Dialog.NoXuggle.Message2=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer\u6703\u540c\u6642\u5b89\u88ddXuggle +Tracker.Dialog.NoXuggle.Title=\u7f3a\u5c11 Xuggle +Tracker.About.DefaultLocale=\u9810\u8a2d\u8a9e\u8a00 +Tracker.About.CurrentLanguage=\u8a9e\u8a00 +Tracker.Dialog.InsufficientMemory.Title=\u8a18\u61b6\u9ad4\u4e0d\u8db3 +Tracker.Dialog.InsufficientMemory.Message=\u9700\u6c42\u7684\u8a18\u61b6\u9ad4\u904e\u5927. +TrackerIO.Dialog.TabMustBeSaved.Message1=\u9801 +TrackerIO.Dialog.TabMustBeSaved.Message2=\u5fc5\u9808\u5132\u5b58\u70batracker \u683c\u5f0f\u6a94 \u4ee5\u4fbf\u518d\u5ea6\u8b80\u53d6 +TrackerIO.Dialog.TabMustBeSaved.Message3=\u662f\u5426\u6e96\u5099\u5132\u5b58? +TrackerIO.Dialog.TabMustBeSaved.Title=\u5c1a\u672a\u5132\u5b58\u9801 +TrackerIO.Dialog.NoTabs.Message=\u6c92\u6709\u9700\u8981\u5132\u5b58\u7684\u9801! +TrackerIO.Dialog.NoTabs.Title=\u6e05\u7a7a\u9801 +TrackerIO.Dialog.SaveTabset.Title=\u5132\u5b58\u6240\u6709\u9801 +TrackerIO.Dialog.SaveTab.Title=\u5132\u5b58\u6b64\u9801 +TrackerIO.Delimiter.Tab=\u9801 +TrackerIO.Delimiter.Space=\u7a7a\u683c +TrackerIO.Delimiter.Comma=\u9017\u9ede +TrackerIO.Delimiter.Semicolon=\u5206\u865f +TrackerIO.VideoAndDataFileFilter.Description=\u5f71\u7247\u548ctracker\u6a94\u6848 +TrackerPanel.Dialog.Version.Message1=\u4f60\u6b63\u958b\u555f\u4e00\u500bTracker\u683c\u5f0f\u6a94 +TrackerPanel.Dialog.Version.Message2=\u53ef\u80fd\u662f +TrackerPanel.Dialog.Version.Message3=\u4f7f\u7528\u7684\u7248\u672c\u7f3a\u5c11\u67d0\u4e9b\u529f\u80fd +TrackerPanel.Dialog.Version.Message4=\u53ef\u4e0b\u8f09\u6700\u65b0\u7248\u672c\u65bc +TrackerPanel.Dialog.Version.Title=\u7248\u672c\u683c\u5f0f\u4e0d\u7b26\u5408 +TrackerPanel.Label.ModelStart=\u958b\u59cb +TrackerPanel.Label.ModelEnd=\u7d50\u675f +TrackerPanel.Spinner.ModelStart.Tooltip=\u8a2d\u5b9a\u6a21\u578b\u7684\u8d77\u59cb\u5f71\u683c +TrackerPanel.Spinner.ModelEnd.Tooltip=\u8a2d\u5b9a\u6a21\u578b\u7684\u7d50\u675f\u5f71\u683c +TToolbar.Button.ProtractorVisible.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u91cf\u89d2\u5668 +TToolbar.Button.AxesVisible.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u5750\u6a19\u8ef8 +TToolBar.Button.TrackControl.Tooltip=\u986f\u793a\u6216\u96b1\u85cf\u63a7\u5236\u9215 +TTrack.Dialog.StepSizeWarning.Message1=\u6ce8\u610f: \u6709\u4e9b\u9ede\u6a19\u793a\u6642\u8d85\u904e\u4e00\u500b\u5f71\u683c(\u6709\u4e9b\u5f71\u683c\u88ab\u8df3\u904e) . +TTrack.Dialog.StepSizeWarning.Message2=\u6539\u8b8a\u5f71\u6642\u9593\u5340\u9593\u53ef\u80fd\u9020\u6210\u8df3\u904e\u5f71\u683c(\u7f3a\u5931\u90e8\u5206\u8cc7\u6599). +TTrack.Dialog.StepSizeWarning.Message3=\u5fc5\u9808\u7b49\u6240\u6709\u5f71\u683c\u9ede\u90fd\u6a19\u793a\u624d\u80fd\u986f\u793a\u901f\u5ea6\u6216\u52a0\u901f\u5ea6. +TTrack.Dialog.StepSizeWarning.Title=\u6ce8\u610f +TTrack.Dialog.SkippedStepWarning.Message1=\u6ce8\u610f: \u8df3\u904e\u5f71\u683c\u9ede\u6703\u9020\u6210\u90e8\u5206\u8cc7\u6599\u7f3a\u5931. +TTrack.Dialog.SkippedStepWarning.Title=\u6ce8\u610f +TTrack.Dialog.SkippedStepWarning.Checkbox=\u4e0d\u8981\u518d\u986f\u793a\u6b64\u8a0a\u606f +TTrack.Locked.Hint=\u9396\u5b9a +TTrack.AngleField.Radians.Tooltip=\u5f91\u5ea6 +TTrack.AngleField.Degrees.Tooltip=\u89d2\u5ea6 +TTrack.AngleField.Popup.Radians=\u6539\u70ba\u5f91\u5ea6 +TTrack.AngleField.Popup.Degrees=\u6539\u70ba\u89d2\u5ea6 +TTrackBar.Memory.Menu.SetSize=\u8a2d\u5b9a\u8a18\u61b6\u9ad4\u5927\u5c0f... +TTrackBar.Button.Version=\u76ee\u524d\u53ef\u66f4\u65b0\u7248\u672c: +TTrackBar.Popup.MenuItem.Upgrade=\u99ac\u4e0a\u66f4\u65b0... +TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 +XuggleVideo.MenuItem.SmoothPlay=\u7de9\u6162\u64ad\u653e (\u53ef\u80fd\u8b8a\u6162) + +# Additions by Doug Brown 2011-02-05 +CalibrationTapeMeasure.Name=Calibration Tape +CircleFootprint.Circle=circle +CircleFootprint.FilledCircle=filled circle +CircleFootprint.Dialog.Title=Circle Footprint +CircleFootprint.Dialog.Label.Radius=Radius +CircleFootprint.Dialog.Checkbox.Bold=Bold +CircleFootprint.Dialog.Checkbox.CenterSpot=Center Spot +LineProfile.Hint.Marking=drag mouse to mark the line profile +PageTView.Button.Page=Page +PageTView.MenuItem.ClosePage=Close Page +PointMass.Hint.Marking=click mouse to mark, hit Enter key to clone previous step +PrefsDialog.Dialog.NewVersion.Title=Upgrades +PrefsDialog.Dialog.NewVersion.Message1=Version +PrefsDialog.Dialog.NewVersion.Message2=is now available at +PrefsDialog.Dialog.NewVersion.None.Message=No new version is available at this time. +RGBRegion.Hint.Marking=click mouse to mark the center of the region +TMenuBar.MenuItem.Restore=Restore Views +TrackControl.StretchVectors.None=No stretch +TViewChooser.Maximize.Tooltip=Maximize this view +TViewChooser.Restore.Tooltip=Restore views +Vector.Hint.Marking=drag mouse to mark, hit Enter to clone previous step +WorldTView.Button.World=World + +# Additions by Doug Brown 2011-04-04 +PrefsDialog.NoVideoWarning.BorderTitle=Warnings +PrefsDialog.Checkbox.WarnIfNoEngine=No video engine +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PropertiesDialog.Title=Properties +PropertiesDialog.Label.Author=Author +PropertiesDialog.Label.Contact=Contact +TActions.Action.Properties=Properties... +TActions.Action.OpenBrowser=Open Library Browser... +TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.ClickToCancel=(click to cancel) +TFrame.Dialog.StalledVideo.Title=Error Loading Video +TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. +TFrame.Dialog.StalledVideo.Message1=You may choose to stop loading now or continue to wait. +TFrame.Dialog.StalledVideo.Message2=Other options for opening this video include: +TFrame.Dialog.StalledVideo.Message3=1. Use video conversion software to convert it to a different format. +TFrame.Dialog.StalledVideo.Message4=2. Select QuickTime in the file chooser or preferences dialog. +TFrame.Dialog.StalledVideo.MessageMac=2. Open Tracker in a 32-bit Java VM and open it with QuickTime. +TFrame.Dialog.StalledVideo.Button.Stop=Stop +TFrame.Dialog.StalledVideo.Button.Wait=Wait +Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again +TrackerIO.ZipFileFilter.Description=ZIP files +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser + +# Additions by Doug Brown 2011-07-20 +TFrame.Dialog.NoTRKInComPADRE.Title=File Not Found +TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node + +# Additions by Doug Brown 2011-08-08 +AnalyticParticle.Builder.Title=Kinematic Particle +DynamicParticle.Builder.Title=Dynamic Particle (Cartesian) +DynamicParticlePolar.Builder.Title=Dynamic Particle (Polar) +DynamicSystem.Builder.Title=Dynamic System (Internal) +PropertiesDialog.Button.CopyFilePath=Copy File Path +PropertiesDialog.Button.CopyVideoPath=Copy Video Path +PropertiesDialog.Tab.TrackerFile=Tracker File +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Property +PropertiesDialog.Header.Value=Value +TActions.Action.OpenURL=Open URL... +TActions.Dialog.OpenURL.Title=Open URL +TActions.Dialog.OpenURL.Message=Enter the URL of a web-based video, Tracker file or Tracker zip file +TActions.Dialog.AboutVideo.Name=Name + +# Additions by Doug Brown 2011-08-25 +PrefsDialog.CacheFiles.BorderTitle=Cached Web Files +PrefsDialog.Button.ClearCache=Clear + +# Additions by Doug Brown 2011-10-07 +PointMass.Remark.Hint=, shift-click to re-mark highlighted position +PointMass.Remarking.Hint=click mouse to re-mark position +PointMass.PositionSelected.Hint=drag or enter position on toolbar +PointMass.VectorSelected.Hint=drag to move +Vector.Remark.Hint=shift-click to re-mark highlighted tip +Vector.TipSelected.Hint=drag or enter components on toolbar +Vector.HandleSelected.Hint=drag to move +Vector.Remarking.Hint=click mouse to re-mark tip +AutoTracker.Label.Search=Search +AutoTracker.Label.Target=Target +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Point +AutoTracker.Label.Template=Template +AutoTracker.Label.Track=Track +AutoTracker.Label.Match=Match +AutoTracker.Label.NoTemplate=No Template +AutoTracker.Label.EvolutionRate=Evolution Rate +AutoTracker.Label.Automark=Automark +AutoTracker.Info.Instructions=Click a Search button to look for a match in the search area shown. +AutoTracker.Info.KeyFrame.Instructions1=This key frame defines the template and target shown. Click a Search button to look for matches to the template. +AutoTracker.Info.KeyFrame.Instructions2=You may drag the target, template or search area to move or resize it. +AutoTracker.Info.MouseOver.Instructions=Mouse over the controls above to learn more about settings and adjustments. +AutoTracker.Info.Mask1=The template is the image to be matched. It starts with a key frame and evolves to adapt to shape and color changes. +AutoTracker.Info.Mask2=The automark level is the minimum match score required for automatic marking. +AutoTracker.Info.Mask.Instructions=Move or resize the template by dragging its edge or corner handle (key frame only). Adjust the evolution rate and automark levels using the spinners. +AutoTracker.Info.Mask.Tip=Low automark levels can result in false matches--try increasing the evolution rate instead. +AutoTracker.Info.Search=The search area is scanned for the best match. +AutoTracker.Info.SearchOnAxis=The x-axis in the search area is scanned for the best match. +AutoTracker.Info.Search.Instructions=Move or resize the search area by dragging its edge or corner handle. Set the x-axis and look-ahead options by checking their boxes. +AutoTracker.Info.Search.Tip=The search area need not be large in many cases. The look-ahead option automatically moves the search area to predicted match positions. +AutoTracker.Info.Target=The target is where the targeted track point is marked. +AutoTracker.Info.Target.Instructions=Move the target by dragging it (key frame only). Choose the targeted track and point from the drop-down lists. +AutoTracker.Info.Title.Settings=Settings +AutoTracker.Info.Title.Tip=Tip +AutoTracker.Info.SelectTrack=Please select or create the track and point you wish to autotrack. +AutoTracker.Info.OutsideXAxis=The x-axis does not pass through the search area. Your options are: +AutoTracker.Info.NewKeyFrame=--step back and change the evolution rate or shift-control-click to define a new key frame +AutoTracker.Info.Replace=--accept the match and replace the existing point +AutoTracker.Info.Keep=--keep the existing point +AutoTracker.Info.PossibleReplace=A possible match was found to replace the existing point. Your options are: +AutoTracker.Wizard.Button.Accept=Accept +AutoTracker.Wizard.Button.Stop=Stop +AutoTracker.Wizard.Button.Skip=Skip +AutoTracker.Wizard.Button.Replace=Replace +AutoTracker.Wizard.Button.Keep=Keep +AutoTracker.Wizard.Button.Search=Search +AutoTracker.Wizard.Button.SearchThis=Search This +AutoTracker.Wizard.Button.SearchNext=Search Next +AutoTracker.Wizard.Button.Delete=Delete +AutoTracker.Wizard.Button.ShowKeyFrame=Show Key Frame +AutoTracker.Wizard.Button.DeleteKeyFrame=Delete Key Frame +AutoTracker.Wizard.Checkbox.LookAhead=Look Ahead +AutoTracker.Wizard.Checkbox.XAxis=X-axis Only +AutoTracker.Wizard.Menuitem.DeleteThis=This Point +AutoTracker.Wizard.Menuitem.DeleteLater=Later Points +AutoTracker.Wizard.Menuitem.DeleteAll=All Points +TToolBar.Button.AutoTracker.Tooltip=Show or hide the autotracker +MainTView.Popup.MenuItem.ZoomIn=Zoom In +MainTView.Popup.MenuItem.ZoomOut=Zoom Out +MainTView.Popup.MenuItem.ZoomToFit=Zoom To Fit +TrackerIO.Dialog.DurationVaries.Title=Variable Frame Duration +TrackerIO.Dialog.DurationVaries.Message1=This video includes frames with durations that differ from the mean by more than +TrackerIO.Dialog.DurationVaries.Message2=For accurate velocities and accelerations, you should exclude these frames from +TrackerIO.Dialog.DurationVaries.Message3=the calculations by setting the start frame and end frame of the video clip. +TrackerIO.Dialog.DurationVaries.Message4=Frames to exclude: +TrackerIO.Dialog.DurationVaries.Message5=Mean duration and frame rate if excluded: +TFrame.Dialog.LibraryError.Title=Error +TFrame.Dialog.LibraryError.Message=No resource could be loaded for node + +# Additions by Doug Brown 2011-12-01 +TTrack.Label.Unmarked=shift-click to mark +PrefsDialog.Label.Path=Path +PrefsDialog.Checkbox.ClearCacheOnExit=Clear on exit +PrefsDialog.FileChooser.Title.Cache=Set Cache +PrefsDialog.FileFilter.Directories=Directories +Tracker.Action.AboutThreads=About Threads... +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Set Java VM +PrefsDialog.FileFilter.JRE=Directories and Java VMs +PrefsDialog.Version.BorderTitle=Tracker Version +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Clear on exit +PrefsDialog.Run.BorderTitle=Programs Executed at Startup +PrefsDialog.FileChooser.Title.Run=Select Executable File +PrefsDialog.Button.Save=Save +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file not found +Popup.MenuItem.Algorithm=Algorithms... +AlgorithmDialog.Button.FiniteDifference=Finite Difference +AlgorithmDialog.Button.BounceDetect=Bounce Detection +AlgorithmDialog.TitledBorder.Choose=Select the algorithm used to calculate velocity and acceleration: +AlgorithmDialog.Title=Algorithms +AlgorithmDialog.FiniteDifference.Message1=This is the default algorithm. +AlgorithmDialog.FiniteDifference.Message2=Velocity: v[i] = (x[i+1] - x[i-1]) / (2*dt) +AlgorithmDialog.FiniteDifference.Message3=Acceleration: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) +AlgorithmDialog.BounceDetect.Message1=This algorithm smooths velocities and accelerations but also detects sudden changes in velocity. +AlgorithmDialog.BounceDetect.Message2=Caution: may produce artifacts. For more information, see: +TMenuBar.Menu.Diagnostics=Diagnostics + +# Additions by Doug Brown 2012-02-12 +Tracker.Dialog.Invalid.Title=Invalid XML +Tracker.Dialog.Invalid.Message=The file cannot be read. +TrackPlottingPanel.Popup.Menu.CompareWith=Compare With +TrackerPanel.DataBuilder.TrackType.Unknown=unknown +TrackerPanel.DataBuilder.Button.Load.Tooltip=Load data functions from an XML file +TrackerPanel.DataBuilder.Button.Save.Tooltip=Save data functions in an XML file +TrackerPanel.DataBuilder.Load.Title=Load Data Functions +TrackerPanel.DataBuilder.Load.Message=Select functions to load: +TrackerPanel.DataBuilder.Save.Title=Save Data Functions +TrackerPanel.DataBuilder.Save.Message=Select functions to save: +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Load into all +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Load only into +TrackerPanel.DataBuilder.Dialog.Load.Title=Track Selection +TrackerPanel.DataBuilder.Dialog.Load.Message=Do you wish to load the functions into all tracks of type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Incorrect Track Type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=The file defines data functions for track type +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=They cannot be loaded into type +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Incorrect Type +TrackerPanel.DataBuilder.Dialog.WrongType.Message=The file does not define data functions. +TToolbar.Button.Refresh=Refresh data and views + +# Additions by Doug Brown 2012-04-22 +ExportTRKDialog.Complete.Message1=The ZIP resource has been saved as +ExportTRKDialog.Complete.Message2=Do you wish to open it in Tracker now? +ExportTRKDialog.Complete.Title=Export Complete +ExportTRKDialog.Title=Export ZIP Resource +ExportTRKDialog.Message1=This (1) exports the video clip, (2) converts the tab data to match the exported video, and (3) saves the converted tab as a new Tracker file. +ExportTRKDialog.Message2=The Tracker and video files are saved in the same directory with the same name but different extensions. +TMenuBar.MenuItem.TabClip=ZIP Resource +TMenuBar.Menu.CalibrationTools=Calibration Tools +TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Recommended Clip +TrackerIO.Dialog.DurationVaries.Start=start +TrackerIO.Dialog.DurationVaries.End=end +TrackerIO.Dialog.DurationVaries.Recommended=Recommended Clip + +# Additions by Doug Brown 2012-05-07 +AttachmentInspector.Title=Attach Ends +AttachmentInspector.Label.End=End +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Name +AttachmentInspector.Header.AttachedTo=Attach To +ExportTRKDialog.Label.VideoFormat=Video Format +MeasuringTool.MenuItem.Attach=Attach Ends... +PerspectiveTrack.Corner=corner +PrefsDialog.LogLevel.BorderTitle=Startup Message Log Level +Protractor.Data.Description.0=time +Protractor.Data.Description.1=protractor angle +Protractor.Data.Description.2=length of arm 1 +Protractor.Data.Description.3=length of arm 2 +Protractor.Data.Description.4=step number +Protractor.Data.Description.5=frame number +TapeMeasure.Data.Description.0=time +TapeMeasure.Data.Description.1=length +TapeMeasure.Data.Description.2=angle measured from the +x-axis +TapeMeasure.Data.Description.3=step number +TapeMeasure.Data.Description.4=frame number + +# Additions by Doug Brown 2012-06-07 +AutoTracker.Info.Unsearched=unsearched +AutoTracker.Info.KeyFrame=Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=This Key Frame +AutoTracker.Wizard.Menuitem.DeleteThisMatch=This Match +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Later Matches +PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export ZIP Resource +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a ZIP resource for the OSP Digital Library Browser +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export ZIP Resource +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The ZIP resource has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export ZIP Resource +ZipResourceDialog.FileChooser.AddFile.Title=Add File to ZIP Resource +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Options +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the ZIP resource? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file From 523ca13fd2f875c2485432e6d2348ec88316970b Mon Sep 17 00:00:00 2001 From: fschuett Date: Sat, 12 Sep 2015 19:13:26 +0200 Subject: [PATCH 09/20] Merge upstream/master 12.9.15. --- .../cabrillo/tracker/AnalyticParticle.java | 11 +- .../cabrillo/tracker/ArrowFootprint.java | 37 +- .../cabrillo/tracker/AttachmentDialog.java | 12 +- .../cabrillo/tracker/AutoTracker.java | 3 +- .../cabrillo/tracker/BounceDerivatives.java | 2 +- .../cabrillo/tracker/BounceMatrix.java | 2 +- .../cabrillo/tracker/BounceModel.java | 2 +- .../cabrillo/tracker/BounceParameters.java | 2 +- .../cabrillo/tracker/Calibration.java | 2 +- .../cabrillo/tracker/CalibrationStep.java | 7 +- .../cabrillo/tracker/CenterOfMass.java | 2 +- .../tracker/CenterOfMassInspector.java | 2 +- .../cabrillo/tracker/CircleFootprint.java | 27 +- .../cabrillo/tracker/Compass.java | 836 ---------- .../cabrillo/tracker/CompassFootprint.java | 372 ----- .../cabrillo/tracker/CompassStep.java | 931 ------------ .../cabrillo/tracker/Configuration.java | 2 +- .../cabrillo/tracker/CoordAxes.java | 2 +- .../cabrillo/tracker/CoordAxesStep.java | 11 +- .../tracker/DataTrackClipControl.java | 32 +- .../tracker/DataTrackTimeControl.java | 12 +- .../cabrillo/tracker/DataTrackTool.java | 227 ++- .../cabrillo/tracker/Derivative.java | 2 +- .../tracker/DerivativeAlgorithmDialog.java | 2 +- .../tracker/DoubleArrowFootprint.java | 36 +- .../tracker/DoubleCrosshairFootprint.java | 35 +- .../cabrillo/tracker/DynamicParticle.java | 11 +- .../tracker/DynamicParticlePolar.java | 2 +- .../cabrillo/tracker/DynamicSystem.java | 14 +- .../tracker/DynamicSystemInspector.java | 8 +- .../cabrillo/tracker/ExportDataDialog.java | 2 +- .../cabrillo/tracker/ExportVideoDialog.java | 154 +- .../cabrillo/tracker/ExportZipDialog.java | 28 +- .../cabrillo/tracker/FileDropHandler.java | 5 +- .../cabrillo/tracker/FirstDerivative.java | 2 +- .../cabrillo/tracker/Footprint.java | 2 +- .../cabrillo/tracker/LineFootprint.java | 29 +- .../cabrillo/tracker/LineProfile.java | 2 +- .../cabrillo/tracker/LineProfileStep.java | 8 +- .../cabrillo/tracker/MainTView.java | 2 +- .../cabrillo/tracker/Mark.java | 2 +- .../cabrillo/tracker/ModelBuilder.java | 47 +- .../cabrillo/tracker/ModelFunctionPanel.java | 7 + .../cabrillo/tracker/OffsetOrigin.java | 2 +- .../cabrillo/tracker/OffsetOriginStep.java | 7 +- .../cabrillo/tracker/OutlineFootprint.java | 22 +- .../cabrillo/tracker/PageTView.java | 2 +- .../cabrillo/tracker/ParticleDataTrack.java | 22 +- .../ParticleDataTrackFunctionPanel.java | 37 +- .../cabrillo/tracker/ParticleModel.java | 90 +- .../cabrillo/tracker/PerspectiveStep.java | 2 +- .../cabrillo/tracker/PerspectiveTrack.java | 2 +- .../cabrillo/tracker/PlotTView.java | 2 +- .../cabrillo/tracker/PlotTrackView.java | 2 +- .../cabrillo/tracker/PointMass.java | 8 +- .../cabrillo/tracker/PointShapeFootprint.java | 42 +- .../cabrillo/tracker/PositionStep.java | 7 +- .../tracker/PositionVectorFootprint.java | 4 +- .../cabrillo/tracker/PrefsDialog.java | 503 ++++--- .../cabrillo/tracker/PropertiesDialog.java | 2 +- .../cabrillo/tracker/Protractor.java | 2 +- .../cabrillo/tracker/ProtractorFootprint.java | 100 +- .../cabrillo/tracker/ProtractorStep.java | 13 +- .../cabrillo/tracker/RGBRegion.java | 4 +- .../cabrillo/tracker/RGBStep.java | 18 +- .../cabrillo/tracker/ReferenceFrame.java | 6 +- .../cabrillo/tracker/SecondDerivative.java | 2 +- .../cabrillo/tracker/ShapeIcon.java | 2 +- .../cabrillo/tracker/Step.java | 7 +- .../cabrillo/tracker/StepSet.java | 2 +- .../cabrillo/tracker/TActions.java | 28 +- .../cabrillo/tracker/TButton.java | 60 +- .../cabrillo/tracker/TFrame.java | 83 +- .../cabrillo/tracker/TMat.java | 2 +- .../cabrillo/tracker/TMenuBar.java | 119 +- .../cabrillo/tracker/TMouseHandler.java | 2 +- .../cabrillo/tracker/TRegion.java | 2 +- .../cabrillo/tracker/TToolBar.java | 87 +- .../cabrillo/tracker/TTrack.java | 4 +- .../cabrillo/tracker/TTrackBar.java | 6 +- .../cabrillo/tracker/TView.java | 2 +- .../cabrillo/tracker/TViewChooser.java | 13 +- .../cabrillo/tracker/TableTView.java | 2 +- .../cabrillo/tracker/TableTrackView.java | 2 +- .../cabrillo/tracker/TapeMeasure.java | 2 +- .../cabrillo/tracker/TapeStep.java | 20 +- .../cabrillo/tracker/ThumbnailDialog.java | 2 +- .../cabrillo/tracker/TrackChooserTView.java | 2 +- .../cabrillo/tracker/TrackControl.java | 2 +- .../cabrillo/tracker/TrackDataBuilder.java | 38 +- .../cabrillo/tracker/TrackPlottingPanel.java | 2 +- .../cabrillo/tracker/TrackRenderer.java | 6 +- .../cabrillo/tracker/TrackView.java | 2 +- .../cabrillo/tracker/Tracker.java | 1341 +++++++++-------- .../cabrillo/tracker/TrackerIO.java | 447 +++--- .../cabrillo/tracker/TrackerPanel.java | 507 ++++--- .../cabrillo/tracker/TrackerRes.java | 2 +- .../cabrillo/tracker/Undo.java | 6 +- .../cabrillo/tracker/Vector.java | 4 +- .../cabrillo/tracker/VectorChain.java | 2 +- .../cabrillo/tracker/VectorStep.java | 8 +- .../cabrillo/tracker/VectorSum.java | 2 +- .../cabrillo/tracker/VectorSumInspector.java | 2 +- .../cabrillo/tracker/WorldGrid.java | 3 +- .../cabrillo/tracker/WorldTView.java | 3 +- .../tracker/deploy/TrackerJarFilter.java | 2 +- .../tracker/deploy/TrackerStarter.java | 961 ++++++------ .../cabrillo/tracker/deploy/WinRegistry.java | 2 +- .../tracker/resources/help/tracker_topics.xml | 664 ++++---- .../tracker/resources/help/tracks.html | 226 +-- .../tracker/resources/tracker.properties | 149 +- .../tracker/resources/tracker_ar.properties | 165 ++ .../tracker/resources/tracker_cs.properties | 169 +++ .../tracker/resources/tracker_da.properties | 232 +++ .../tracker/resources/tracker_de.properties | 100 ++ .../resources/tracker_el_GR.properties | 188 +++ .../tracker/resources/tracker_es.properties | 232 +++ .../tracker/resources/tracker_fi.properties | 161 ++ .../tracker/resources/tracker_fr.properties | 232 +++ .../tracker/resources/tracker_in.properties | 1321 +++++++++------- .../tracker/resources/tracker_it.properties | 232 +++ .../resources/tracker_iw_IL.properties | 138 ++ .../tracker/resources/tracker_ko.properties | 232 +++ .../resources/tracker_nl_NL.properties | 157 +- .../tracker/resources/tracker_pt.properties | 297 +++- .../resources/tracker_pt_BR.properties | 235 ++- .../tracker/resources/tracker_sk.properties | 138 ++ .../tracker/resources/tracker_sl.properties | 232 +++ .../tracker/resources/tracker_sv.properties | 232 +++ .../resources/tracker_th_TH.properties | 232 +++ .../resources/tracker_zh_CN.properties | 232 +++ .../resources/tracker_zh_TW.properties | 232 +++ 132 files changed, 8447 insertions(+), 5609 deletions(-) delete mode 100644 src/org/opensourcephysics/cabrillo/tracker/Compass.java delete mode 100644 src/org/opensourcephysics/cabrillo/tracker/CompassFootprint.java delete mode 100644 src/org/opensourcephysics/cabrillo/tracker/CompassStep.java diff --git a/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java b/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java index ac7ed6e9..20e27f31 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AnalyticParticle.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -132,10 +132,11 @@ else if (step==null) { getAArray(trackerPanel).setLength(0); // set position of step at firstFrameInClip ImageCoordSystem coords = trackerPanel.getCoords(); - // get underlying coords if reference frame - while (coords instanceof ReferenceFrame) { - coords = ( (ReferenceFrame) coords).getCoords(); - } + // get underlying coords if appropriate + boolean useDefault = isUseDefaultReferenceFrame(); + while (useDefault && coords instanceof ReferenceFrame) { + coords = ( (ReferenceFrame) coords).getCoords(); + } AffineTransform transform = coords.getToImageTransform(firstFrameInClip); UserFunction[] functions = getFunctionEditor().getMainFunctions(); // get time at firstFrameInClip diff --git a/src/org/opensourcephysics/cabrillo/tracker/ArrowFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/ArrowFootprint.java index aec27488..26399dfe 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ArrowFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ArrowFootprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -29,6 +29,8 @@ import javax.swing.*; +import org.opensourcephysics.tools.FontSizer; + /** * An ArrowFootprint returns an arrow shape for a Point array of length 2. * @@ -42,6 +44,7 @@ public class ArrowFootprint extends LineFootprint { protected int tipWidth = 4; boolean openHead = true; protected BasicStroke headStroke = new BasicStroke(); + protected BasicStroke tipStroke; /** * Constructs an ArrowFootprint. @@ -115,6 +118,9 @@ public void setStroke(BasicStroke stroke) { * @return the icon */ public Icon getIcon(int w, int h) { + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; double prevStretch = stretch; stretch = 1; @@ -138,23 +144,36 @@ public synchronized Shape getShape(Point[] points) { transform.setToRotation(theta, p1.x, p1.y); transform.translate(p1.x, p1.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } highlight = transform.createTransformedShape(HIGHLIGHT); transform.setToRotation(theta, p2.x, p2.y); transform.translate(p2.x, p2.y); float d = (float)(stretch * p1.distance(p2)); // length of the arrow // set arrowhead dimensions and stroke - int tipL = Math.min(tipLength, Math.round(d-4)); + int tiplen = tipLength*scale; + int tipL = Math.min(tiplen, Math.round(d-4)); tipL = Math.max(8, tipL); int tipW = Math.max(tipL/4, 2); - float f = stroke.getLineWidth(); - BasicStroke s = f < tipL/4? stroke: - new BasicStroke(Math.max(tipL/4, 0.8f), + float f = scale*baseStroke.getLineWidth(); + float lineWidth = f < tipL/4? f: Math.max(tipL/4, 0.8f); + if (stroke==null || stroke.getLineWidth()!=lineWidth) { + stroke = new BasicStroke(lineWidth, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + baseStroke.getDashArray(), + baseStroke.getDashPhase()); + headStroke = new BasicStroke(lineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, - stroke.getDashArray(), + null, stroke.getDashPhase()); + } try { // set up tip hitShape using full length path.reset(); @@ -166,7 +185,7 @@ public synchronized Shape getShape(Point[] points) { hitShapes[0] = transform.createTransformedShape(path); // for tip // shorten d to account for the width of the stroke // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 - d = d - (float)(s.getLineWidth()*1.58) + 1; + d = d - (float)(stroke.getLineWidth()*1.58) + 1; // set up shaft hitShape path.reset(); path.moveTo(0, 0); @@ -178,7 +197,7 @@ public synchronized Shape getShape(Point[] points) { path.moveTo(0, 0); path.lineTo(d-tipL+tipW, 0); Shape shaft = transform.createTransformedShape(path); - shaft = s.createStrokedShape(shaft); + shaft = stroke.createStrokedShape(shaft); Area area = new Area(shaft); path.reset(); path.moveTo(d-tipL+tipW, 0); @@ -198,7 +217,7 @@ public synchronized Shape getShape(Point[] points) { } catch (Exception e) { // occasionally throws path exception for reasons unknown! d = (float)(stretch * p1.distance(p2)); java.awt.geom.Line2D line = new java.awt.geom.Line2D.Double(0, 0, d, 0); - return s.createStrokedShape(transform.createTransformedShape(line)); + return stroke.createStrokedShape(transform.createTransformedShape(line)); } } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java index d8216752..a1a6cb22 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -33,6 +33,7 @@ import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; +import org.opensourcephysics.display.ResizableIcon; import org.opensourcephysics.media.core.TPoint; import org.opensourcephysics.media.core.VideoClip; import org.opensourcephysics.tools.FontSizer; @@ -476,7 +477,14 @@ public Component getListCellRendererComponent(JList list, Object val, int index, if (val!=null) { TTrack track = (TTrack)val; setText(track.getName()); - setIcon(track==dummyMass? dummyIcon: track.getFootprint().getIcon(21, 16)); + Icon icon = track==dummyMass? + new ResizableIcon(dummyIcon): + track.getFootprint().getIcon(21, 16); + int factor = FontSizer.getIntegerFactor(); + if (icon instanceof ResizableIcon) { + ((ResizableIcon)icon).resize(factor); + } + setIcon(icon); } return this; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java b/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java index b93bfb36..0c743288 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AutoTracker.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -2824,6 +2824,7 @@ public void run() { startButton.setText(stepping? TrackerRes.getString("AutoTracker.Wizard.Button.Stop"): //$NON-NLS-1$ TrackerRes.getString("AutoTracker.Wizard.Button.Search")); //$NON-NLS-1$ + FontSizer.setFonts(startButton, FontSizer.getLevel()); searchThisButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchThis")); //$NON-NLS-1$ searchThisButton.setEnabled(!running); searchNextButton.setText(TrackerRes.getString("AutoTracker.Wizard.Button.SearchNext")); //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java b/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java index 912efbef..2b23d13f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceDerivatives.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceMatrix.java b/src/org/opensourcephysics/cabrillo/tracker/BounceMatrix.java index 4f73a018..71b1e299 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceMatrix.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceMatrix.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java b/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java index 1f666b9b..9d3ce931 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceModel.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/BounceParameters.java b/src/org/opensourcephysics/cabrillo/tracker/BounceParameters.java index 74c91847..5fefd332 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/BounceParameters.java +++ b/src/org/opensourcephysics/cabrillo/tracker/BounceParameters.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Calibration.java b/src/org/opensourcephysics/cabrillo/tracker/Calibration.java index 53ca441c..891e94be 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Calibration.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Calibration.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CalibrationStep.java b/src/org/opensourcephysics/cabrillo/tracker/CalibrationStep.java index e78bae3e..6fd42cd0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CalibrationStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CalibrationStep.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -31,6 +31,7 @@ import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a Step for a Calibration. It is used for @@ -125,6 +126,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { Point p = points[i].getScreenPosition(trackerPanel); if (selection == points[i]) { // point is selected transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } shapes[i] = transform.createTransformedShape(selectionShape); } else { // point not selected diff --git a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java index bb4e20a4..56e9cd13 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMass.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java index f97e4418..4b99d848 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CenterOfMassInspector.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java index ccc65d56..8c844a4b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFootprint.java @@ -20,12 +20,11 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; @@ -35,6 +34,8 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; +import org.opensourcephysics.tools.FontSizer; + /** * A CircleFootprint returns a circle for a Point[] of length 1. */ @@ -55,6 +56,7 @@ public class CircleFootprint implements Footprint, Cloneable { protected Color color = new Color(255, 0, 0, 127); protected Color highlightColor = Color.red; protected Shape[] hitShapes = new Shape[1]; + protected BasicStroke baseHighlightStroke, baseOutlineStroke; protected BasicStroke highlightStroke, outlineStroke; protected boolean outlined=true, spotted; protected int alpha = 0; @@ -141,6 +143,9 @@ public int getLength() { * @return the icon */ public Icon getIcon(int w, int h) { + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; int realRadius = r; setRadius(outlined? 5: 6); Shape shape = getShape(new Point[] {new Point()}); @@ -214,8 +219,8 @@ public Shape[] getHitShapes() { * @param stroke the stroke */ public void setStroke(BasicStroke stroke) { - outlineStroke = stroke; - highlightStroke = new BasicStroke(stroke.getLineWidth()+1.0f); + baseOutlineStroke = stroke; + baseHighlightStroke = new BasicStroke(stroke.getLineWidth()+1.0f); } /** @@ -295,7 +300,7 @@ public String getProperties() { s+="outline "; //$NON-NLS-1$ if (spotted) s+="spot "; //$NON-NLS-1$ - if (outlineStroke.getLineWidth()>plainStrokeSize) + if (baseOutlineStroke.getLineWidth()>plainStrokeSize) s+="bold "; //$NON-NLS-1$ return s; } @@ -333,11 +338,11 @@ public void showProperties(TTrack track) { int y = (dim.height - dialog.getBounds().height) / 2; dialog.setLocation(x, y); } - dialog.boldCheckbox.setSelected(outlineStroke.getLineWidth()>plainStrokeSize); + dialog.boldCheckbox.setSelected(baseOutlineStroke.getLineWidth()>plainStrokeSize); dialog.spotCheckbox.setSelected(spotted); dialog.spinner.setValue(r); prevSpot = spotted; - prevStrokeSize = outlineStroke.getLineWidth(); + prevStrokeSize = baseOutlineStroke.getLineWidth(); prevRadius = r; dialog.setVisible(true); } @@ -351,7 +356,15 @@ public void showProperties(TTrack track) { public Shape getShape(Point[] points) { Point p = points[0]; transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } Shape c = transform.createTransformedShape(circle); + if (outlineStroke==null || outlineStroke.getLineWidth()!=scale*baseOutlineStroke.getLineWidth()) { + outlineStroke = new BasicStroke(scale*baseOutlineStroke.getLineWidth()); + highlightStroke = new BasicStroke(scale*baseHighlightStroke.getLineWidth()); + } highlight = highlightStroke.createStrokedShape(c); outline = outlineStroke.createStrokedShape(c); spot = transform.createTransformedShape(center); diff --git a/src/org/opensourcephysics/cabrillo/tracker/Compass.java b/src/org/opensourcephysics/cabrillo/tracker/Compass.java deleted file mode 100644 index 7a9aef91..00000000 --- a/src/org/opensourcephysics/cabrillo/tracker/Compass.java +++ /dev/null @@ -1,836 +0,0 @@ -/* - * The tracker package defines a set of video/image analysis tools - * built on the Open Source Physics framework by Wolfgang Christian. - * - * Copyright (c) 2015 Douglas Brown - * - * Tracker 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. - * - * Tracker 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 Tracker; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA - * or view the license online at - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.ArrayList; -import java.awt.*; -import java.awt.event.*; -import java.awt.geom.Point2D; -import java.beans.PropertyChangeEvent; - -import javax.swing.*; - -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; -import org.opensourcephysics.tools.FontSizer; -import org.opensourcephysics.cabrillo.tracker.CompassStep.DataPoint; -import org.opensourcephysics.cabrillo.tracker.CompassStep.Slider; -import org.opensourcephysics.controls.*; - -/** - * A Compass measures and displays circles and circular arcs. - * - * @author Douglas Brown - */ -public class Compass extends TTrack { - // pig undoable edits - - // instance fields - protected boolean fixedPosition=true, radialLineVisible=false, radialLineEnabled=false; - protected JCheckBoxMenuItem fixedItem; - protected JCheckBox radialLineCheckbox; - protected JLabel clickToMarkLabel; - protected JLabel xDataPointLabel, yDataPointLabel; - protected NumberField xDataField, yDataField; - protected Component xDataPointSeparator, yDataPointSeparator, checkboxSeparator; - - /** - * Constructs a Compass. - */ - public Compass() { - defaultColors = new Color[] {new Color(0, 140, 40)}; - // assign a default name - setName(TrackerRes.getString("Compass.New.Name")); //$NON-NLS-1$ - // set up footprint choices and color - setFootprints(new Footprint[] - {CompassFootprint.getFootprint("CompassFootprint.Circle4"), //$NON-NLS-1$ - CompassFootprint.getFootprint("CompassFootprint.Circle7"), //$NON-NLS-1$ - CompassFootprint.getFootprint("CompassFootprint.Circle4Bold"), //$NON-NLS-1$ - CompassFootprint.getFootprint("CompassFootprint.Circle7Bold")}); //$NON-NLS-1$ - defaultFootprint = getFootprint(); - setColor(defaultColors[0]); - - // assign default table variables - setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("tableVar2", "2"); //$NON-NLS-1$ //$NON-NLS-2$ - // assign default plot variables - String center = TrackerRes.getString("Compass.Data.Center"); //$NON-NLS-1$ - setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot0", "x"+center); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot1", "y"+center); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("xVarPlot2", "t"); //$NON-NLS-1$ //$NON-NLS-2$ - setProperty("yVarPlot2", "r"); //$NON-NLS-1$ //$NON-NLS-2$ - - // set initial hint - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - hint = TrackerRes.getString("Compass.Hint.Mark3"); //$NON-NLS-1$ - // initialize the autofill step array - CompassStep step = new CompassStep(this, 0); - step.setFootprint(getFootprint()); - steps = new StepArray(step); // autofills - fixedItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedItem.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - setFixed(fixedItem.isSelected()); - } - }); - - clickToMarkLabel = new JLabel(); - clickToMarkLabel.setForeground(Color.red.darker()); - - if (radialLineEnabled) { - radialLineCheckbox = new JCheckBox(); - radialLineCheckbox.setOpaque(false); - radialLineCheckbox.setBorder(BorderFactory.createEmptyBorder()); - radialLineCheckbox.setSelected(isRadialLineVisible()); - radialLineCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setRadialLineVisible(radialLineCheckbox.isSelected()); - repaint(); - dataValid = false; - firePropertyChange("data", null, null); //$NON-NLS-1$ - } - }); - checkboxSeparator = Box.createRigidArea(new Dimension(6, 4)); - } - - // create actions, listeners, labels and fields for data points - final Action dataPointAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (trackerPanel==null) return; - if (e!=null && e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; - if (e!=null && e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; - TPoint p = trackerPanel.getSelectedPoint(); - if (!(p instanceof DataPoint)) return; - double xValue = xDataField.getValue(); - double yValue = yDataField.getValue(); - int n = trackerPanel.getFrameNumber(); - ImageCoordSystem coords = trackerPanel.getCoords(); - double x = coords.worldToImageX(n, xValue, yValue); - double y = coords.worldToImageY(n, xValue, yValue); - p.setXY(x, y); - p.showCoordinates(trackerPanel); - if (e!=null && e.getSource() instanceof NumberField) { - ((NumberField)e.getSource()).requestFocusInWindow(); - } - } - }; - // focus listener - FocusListener dataFieldFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - if (e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; - if (e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; - dataPointAction.actionPerformed(null); - } - }; - xDataPointLabel = new JLabel("selected x"); //$NON-NLS-1$ - xDataPointLabel.setBorder(xLabel.getBorder()); - xDataField = new NumberField(5); - xDataField.setBorder(fieldBorder); - xDataField.addActionListener(dataPointAction); - xDataField.addFocusListener(dataFieldFocusListener); - yDataPointLabel = new JLabel("y"); //$NON-NLS-1$ - yDataPointLabel.setBorder(xLabel.getBorder()); - yDataField = new NumberField(5); - yDataField.setBorder(fieldBorder); - yDataField.addActionListener(dataPointAction); - yDataField.addFocusListener(dataFieldFocusListener); - xDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); - yDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); - - xLabel.setText("center x"); //$NON-NLS-1$ - xField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - xField.setEnabled(false); - yField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - yField.setEnabled(false); - magField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - magField.setEnabled(false); - xDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - yDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - - // set action for angle field - final Action sliderAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (angleField.getBackground()!=Color.yellow) { - return; - } - double theta = angleField.getValue(); - int n = trackerPanel.getFrameNumber(); - CompassStep step = (CompassStep)getStep(n); - step.setSliderAngle(theta); - } - }; - angleField.addActionListener(sliderAction); - FocusListener sliderFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - sliderAction.actionPerformed(null); - } - }; - angleField.addFocusListener(sliderFocusListener); - } - - /** - * Sets the fixed property. When fixed, it has the same position at all times. - * - * @param fixed true to fix - */ - public void setFixed(boolean fixed) { - if (fixedPosition == fixed) return; - XMLControl control = new XMLControlElement(this); - if (trackerPanel != null) { - trackerPanel.changed = true; - int n = trackerPanel.getFrameNumber(); - CompassStep source = (CompassStep)getStep(n); - CompassStep target = (CompassStep)getStep(0); - target.copy(source); - trackerPanel.repaint(); - } - fixedPosition = fixed; - if (fixed) { // refresh data and post undo only when fixing - keyFrames.clear(); - keyFrames.add(0); - dataValid = false; - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - Undo.postTrackEdit(this, control); - } - } - - /** - * Gets the fixed property. - * - * @return true if fixed - */ - public boolean isFixed() { - return fixedPosition; - } - - /** - * Sets the visibility of the radial line. - * - * @param vis true to draw a radial line - */ - public void setRadialLineVisible(boolean vis) { - boolean changed = vis!=radialLineVisible; - radialLineVisible = vis; - if (trackerPanel!=null) { - int n = trackerPanel.getFrameNumber(); - steps.getStep(n).repaint(); - if (changed) { - trackerPanel.changed = true; - } - } - } - - /** - * Gets the visibility of the radial line. - * - * @return true if visible - */ - public boolean isRadialLineVisible() { - return radialLineEnabled && radialLineVisible; - } - - @Override - public void propertyChange(PropertyChangeEvent e) { - String name = e.getPropertyName(); - if (trackerPanel.getSelectedTrack() == this) { - if (name.equals("stepnumber")) { //$NON-NLS-1$ - refreshFields(trackerPanel.getFrameNumber()); - } -// else if (name.equals("selectedpoint")) { //$NON-NLS-1$ -// TPoint p = trackerPanel.getSelectedPoint(); -// } - else if (name.equals("transform")) { //$NON-NLS-1$ - refreshFields(trackerPanel.getFrameNumber()); - } - }// pig does code below work or do anything? - if (name.equals("adjusting") && e.getSource() instanceof TrackerPanel) { //$NON-NLS-1$ - refreshDataLater = (Boolean)e.getNewValue(); - if (!refreshDataLater) { // stopped adjusting - support.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - } - super.propertyChange(e); - } - - @Override - public void setTrailVisible(boolean visible) {/** empty block */} - - /** - * Implements createStep but only mimics step creation since - * steps are created automatically by the autofill StepArray. - * - * @param n the frame number - * @param x the x coordinate in image space - * @param y the y coordinate in image space - * @return the step - */ - @Override - public Step createStep(int n, double x, double y) { - if (!isFixed()) { - keyFrames.add(n); - CompassStep step = (CompassStep)steps.getStep(n); - step.addDataPoint(x, y, true); - return step; - } - else { - keyFrames.add(0); - CompassStep step = (CompassStep)steps.getStep(0); - step.addDataPoint(x, y, true); - return getStep(n); - } - } - - @Override - public TPoint autoMarkAt(int n, double x, double y) { - setFixed(false); - CompassStep step = (CompassStep)steps.getStep(n); - int i = getTargetIndex(); - if (i==0) { - // pig this isn't right - step.center.setLocation(x, y); - } -// else if (i==1) { -// step.end1.setLocation(x, y); -// } -// else { -// step.end2.setLocation(x, y); -// } - keyFrames.add(n); - step.repaint(); - return getMarkedPoint(n, i); - } - - /** - * Overrides TTrack deleteStep method to prevent deletion. - * - * @param n the frame number - * @return the deleted step - */ - @Override - public Step deleteStep(int n) { - TPoint p = trackerPanel.getSelectedPoint(); - CompassStep step = (CompassStep)steps.getStep(n); - if (!isFixed()) { - step.removeDataPoint(p); - } - else { // fixed, so delete corresponding data point in step 0 - // find index of p - int index = -1; - for (int i=0; i-1) { - step = (CompassStep)steps.getStep(0); - p = step.dataPoints.get(index); - step.removeDataPoint(p); - } - } - return null; - } - - @Override - public Step getStep(int n) { - CompassStep step = (CompassStep)steps.getStep(n); - refreshStep(step); - return step; - } - - @Override - public Step getStep(TPoint point, TrackerPanel trackerPanel) { - if (point == null) return null; - Step[] stepArray = steps.array; - for (Step step: stepArray) { - if (step==null) continue; - TPoint[] points = step.getPoints(); - for (int i = 0; i < points.length; i++) { - if (points[i]==point) return step; - } - CompassStep compassStep = (CompassStep)step; - for (TPoint p: compassStep.dataPoints) { - if (p==point) return step; - } - } - return null; - } - - @Override - public int getStepLength() { - return CompassStep.getLength(); - } - - @Override - public int getFootprintLength() { - return 3; - } - - @Override - public void setFontLevel(int level) { - super.setFontLevel(level); - Object[] objectsToSize = new Object[] - {clickToMarkLabel, xDataPointLabel, yDataPointLabel}; - FontSizer.setFonts(objectsToSize, level); - if (radialLineEnabled) { - FontSizer.setFonts(radialLineCheckbox, level); - } - } - - @Override - public JMenu getMenu(TrackerPanel trackerPanel) { - JMenu menu = super.getMenu(trackerPanel); - - fixedItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ - fixedItem.setSelected(isFixed()); - fixedItem.setEnabled(attachments==null || (attachments[0]==null && attachments[1]==null && attachments[2]==null)); - - // remove end items and last separator - menu.remove(deleteTrackItem); - menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); - menu.add(fixedItem); - - menu.addSeparator(); - menu.add(deleteTrackItem); - return menu; - } - - @Override - public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { - int n = trackerPanel.getFrameNumber(); - refreshFields(n); - ArrayList list = super.getToolbarTrackComponents(trackerPanel); - list.add(stepSeparator); - CompassStep step = (CompassStep)getStep(n); - if (step.dataPoints.size()>2) { - if (radialLineEnabled) { - radialLineCheckbox.setText(TrackerRes.getString("Compass.Checkbox.RadialLine")); //$NON-NLS-1$ - radialLineCheckbox.setToolTipText(TrackerRes.getString("Compass.Checkbox.RadialLine.Tooltip")); //$NON-NLS-1$ - list.add(radialLineCheckbox); - list.add(checkboxSeparator); - } - xField.setToolTipText(TrackerRes.getString("Compass.Field.CenterX.Tooltip")); //$NON-NLS-1$ - yField.setToolTipText(TrackerRes.getString("Compass.Field.CenterY.Tooltip")); //$NON-NLS-1$ - magLabel.setText(TrackerRes.getString("Compass.Label.Radius")); //$NON-NLS-1$ - magField.setToolTipText(TrackerRes.getString("Compass.Field.Radius.Tooltip")); //$NON-NLS-1$ - list.add(magLabel); - list.add(magField); - list.add(magSeparator); - list.add(xLabel); - list.add(xField); - list.add(xSeparator); - list.add(yLabel); - list.add(yField); - list.add(ySeparator); - } - else if (trackerPanel.getSelectedPoint()==null) { - clickToMarkLabel.setText(TrackerRes.getString("Compass.Label.MarkPoint")); //$NON-NLS-1$ - list.add(clickToMarkLabel); - } - return list; - } - - @Override - public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, - TPoint point) { - ArrayList list = super.getToolbarPointComponents(trackerPanel, point); - int n = trackerPanel.getFrameNumber(); - refreshFields(n); - CompassStep step = (CompassStep)getStep(n); - if (point==step.slider) { - list.add(angleLabel); - list.add(angleField); - list.add(angleSeparator); - } - else { - list.add(xDataPointLabel); - list.add(xDataField); - list.add(xDataPointSeparator); - list.add(yDataPointLabel); - list.add(yDataField); - list.add(yDataPointSeparator); - } - if (step.dataPoints.size()<3) { - clickToMarkLabel.setText(TrackerRes.getString("Compass.Label.MarkPoint")); //$NON-NLS-1$ - list.add(clickToMarkLabel); - } - return list; - } - - @Override - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - if (!(panel instanceof TrackerPanel) || !isVisible()) - return null; - TrackerPanel trackerPanel = (TrackerPanel)panel; - int n = trackerPanel.getFrameNumber(); - CompassStep step = (CompassStep)getStep(n); - if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { - Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); - if (ia == null) { - partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (step.dataPoints.size()<3) { - hint = TrackerRes.getString("Compass.Hint.Mark3"); //$NON-NLS-1$ - } - else { - hint = TrackerRes.getString("Compass.Hint.MarkMore"); //$NON-NLS-1$ - } - return null; - } - if (ia instanceof DataPoint) { - partName = TrackerRes.getString("Compass.DataPoint.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Compass.DataPoint.Hint"); //$NON-NLS-1$ - } - else if (ia instanceof Slider) { - partName = TrackerRes.getString("Compass.Slider.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("Compass.Slider.Hint"); //$NON-NLS-1$ - } - return ia; - } - return null; - } - - @Override - public String toString() { - return TrackerRes.getString("Compass.Name"); //$NON-NLS-1$ - } - -//__________________________ protected methods ________________________ - - @Override - protected void setTrackerPanel(TrackerPanel panel) { - if (trackerPanel != null) { - trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - super.setTrackerPanel(panel); - if (trackerPanel != null) { - trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ - } - setFixed(isFixed()); - } - - @Override - protected void setAnglesInRadians(boolean radians) { - super.setAnglesInRadians(radians); - CompassStep step = (CompassStep)getStep(trackerPanel.getFrameNumber()); - step.repaint(); // refreshes angle readout - } - - @Override - protected boolean isAutoTrackable() { - return true; - } - - @Override - protected boolean isAutoTrackable(int pointIndex) { - return pointIndex<3; - } - - @Override - protected String getTargetDescription(int pointIndex) { - if (pointIndex==0) return TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ - String s = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ - return s+" "+(pointIndex); //$NON-NLS-1$ - } - - @Override - protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { - if (refreshDataLater || trackerPanel == null || data == null) return; - dataFrames.clear(); - // get the datasets: radius, x_center, y_center, step, frame - int count = 0; - Dataset angle = null; - Dataset x_center = data.getDataset(count++); - Dataset y_center = data.getDataset(count++); - Dataset r = data.getDataset(count++); - Dataset stepNum = data.getDataset(count++); - Dataset frameNum = data.getDataset(count++); - if (radialLineEnabled) { - angle = data.getDataset(count++); - } - // assign column names to the datasets - String time = "t"; //$NON-NLS-1$ - if (!x_center.getColumnName(0).equals(time)) { // not yet initialized - String center = TrackerRes.getString("Compass.Data.Center"); //$NON-NLS-1$ - x_center.setXYColumnNames(time, "x_"+center); //$NON-NLS-1$ - y_center.setXYColumnNames(time, "y_"+center); //$NON-NLS-1$ - r.setXYColumnNames(time, "r"); //$NON-NLS-1$ - stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ - frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ - if (radialLineEnabled) { - angle.setXYColumnNames(time, "$\\theta$"); //$NON-NLS-1$ - } - } - else for (int i = 0; i0 && !trackerPanel.getCoords().getKeyFrames().contains(i)) { - continue; - } - trackerPanel.getCoords().setOriginXY(i, pt.x, pt.y); - } - } - else { - trackerPanel.getCoords().setFixedOrigin(false); - Step[] stepArray = steps.array; - for (Step step: stepArray) { - if (step==null) continue; - CompassStep compassStep = (CompassStep)step; - trackerPanel.getCoords().setOriginXY(step.n, compassStep.center.x, compassStep.center.y); - } - } - trackerPanel.getAxes().setVisible(true); - // post undoable edit - Undo.postCoordsEdit(trackerPanel, control); - } - -//__________________________ static methods ___________________________ - - /** - * Returns an ObjectLoader to save and load data for this class. - * - * @return the object loader - */ - public static XML.ObjectLoader getLoader() { - return new Loader(); - } - - /** - * A class to save and load data for this class. - */ - static class Loader implements XML.ObjectLoader { - - /** - * Saves an object's data to an XMLControl. - * - * @param control the control to save to - * @param obj the object to save - */ - public void saveObject(XMLControl control, Object obj) { - Compass compass = (Compass)obj; - // save track data - XML.getLoader(TTrack.class).saveObject(control, obj); - // save fixed property - control.setValue("fixed", compass.isFixed()); //$NON-NLS-1$ - // save steps - Step[] steps = compass.getSteps(); - int count = steps.length; - if (compass.isFixed()) count = 1; - double[][] data = new double[count][]; - for (int n = 0; n < count; n++) { - // save only key frames - if (steps[n] == null || !compass.keyFrames.contains(n)) continue; - CompassStep step = (CompassStep)steps[n]; - int len = step.dataPoints.size(); - if (len==0) continue; - double[] stepData = new double[2*len+3]; - stepData[0] = n; - for (int i=0; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.geom.Arc2D; -import java.awt.geom.Area; -import java.awt.geom.Ellipse2D; -import java.awt.geom.GeneralPath; -import java.awt.geom.Line2D; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; - -import javax.swing.Icon; - -/** - * A CompassFootprint returns a circle, center point and data point marks. - * It requires a minimum Point array of length 2 {center, edge} but accommodates many data points. - * - * @author Douglas Brown - */ -public class CompassFootprint implements Footprint, Cloneable { - - // static constants - @SuppressWarnings("javadoc") - private static BasicStroke hitStroke = new BasicStroke(4); - private static final CompassFootprint CIRCLE_4, CIRCLE_7, - CIRCLE_4_BOLD, CIRCLE_7_BOLD; - protected static final int MAX_RADIUS = 100000; - - // static fields - private static Collection footprints - = new HashSet(); - private static Shape hitShape = new Ellipse2D.Double(-6, -6, 12, 12); - private static Shape emptyHitShape = new Rectangle(); - private static Line2D line = new Line2D.Double(); - private static AffineTransform transform = new AffineTransform(); - private static Arc2D.Float iconArc = new Arc2D.Float(); - - // instance fields - protected String name; - protected BasicStroke stroke; - protected Color color = Color.black; - protected ArrayList hitShapes = new ArrayList(); - protected Ellipse2D circle; - protected double radius; - protected Shape marker; - protected Shape crosshatch; - protected int markerSize; - protected Point selectedPoint; - protected boolean drawRadius; - - /** - * Constructs a CompassFootprint. - * - * @param name the name - * @param size the radius - */ - public CompassFootprint(String name, int size) { - this.name = name; - markerSize = size; - circle = new Ellipse2D.Double(); - marker = new Ellipse2D.Double(-size, -size, 2*size, 2*size); - double d = size*0.707; - GeneralPath path = new GeneralPath(); - path.moveTo(-d, -d); - path.lineTo(d, d); - path.moveTo(-d, d); - path.lineTo(d, -d); - crosshatch = path; - setStroke(new BasicStroke()); - } - - /** - * Gets the name of this footprint. - * - * @return the name - */ - public String getName() { - return name; - } - - /** - * Gets the display name of the footprint. - * - * @return the localized display name - */ - public String getDisplayName() { - return TrackerRes.getString(name); - } - - /** - * Gets the minimum point array length required by this footprint. - * - * @return the length - */ - public int getLength() { - return 3; - } - - /** - * Gets the icon. - * - * @param w width of the icon - * @param h height of the icon - * @return the icon - */ - public Icon getIcon(int w, int h) { - int r = markerSize/2; - iconArc.setArc(0, 0, 20, 20, 200, 140, Arc2D.OPEN); - Shape shape = stroke.createStrokedShape(iconArc); - Area area = new Area(shape); - circle.setFrameFromCenter(10, 20, 10+r, 20+r); - shape = stroke.createStrokedShape(circle); - area.add(new Area(shape)); - ShapeIcon icon = new ShapeIcon(area, w, h); - icon.setColor(color); - return icon; - } - - /** - * Gets the footprint mark. - * - * @param points a Point array - * @return the mark - */ - public Mark getMark(Point[] points) { - final Shape shape = getShape(points); - final Color color = this.color; - return new Mark() { - public void draw(Graphics2D g, boolean highlighted) { - Color gcolor = g.getColor(); - g.setColor(color); - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - g.fill(shape); - g.setColor(gcolor); - } - - public Rectangle getBounds(boolean highlighted) { - return shape.getBounds(); - } - }; - } - - /** - * Gets the hit shapes {vertex, end1, end2, line1, line2, rotator}. - * - * @return the hit shapes - */ - public Shape[] getHitShapes() { - return hitShapes.toArray(new Shape[hitShapes.size()]); - } - - /** - * Sets the stroke. - * - * @param stroke the desired stroke - */ - public void setStroke(BasicStroke stroke) { - if (stroke == null) return; - this.stroke = new BasicStroke(stroke.getLineWidth(), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_MITER, - 8, - stroke.getDashArray(), - stroke.getDashPhase()); - } - - /** - * Gets the stroke. - * - * @return the stroke - */ - public BasicStroke getStroke() { - return stroke; - } - - /** - * Sets the color. - * - * @param color the desired color - */ - public void setColor(Color color) { - this.color = color; - } - - /** - * Gets the color. - * - * @return the color - */ - public Color getColor() { - return color; - } - - /** - * Sets the flag to draw a line from the center to the slider. - * - * @param drawRadius true to draw a line - */ - protected void setDrawRadialLine(boolean drawRadius) { - this.drawRadius = drawRadius; - } - - /** - * Sets the radius of the circle. - * - * @param drawRadialLine true to draw a line - */ - protected void setPixelRadius(double r) { - radius = r; - } - - /** - * Sets the selected screen point. The selected point is not drawn so CompassStep - * can draw a selection shape instead. - * - * @param p the selected screen point (may be null) - */ - protected void setSelectedPoint(Point p) { - selectedPoint = p; - } - - /** - * Gets the shape of this footprint for a Point array {center, edge, slider, data1, data2, ...}. - * Also sets up hit shapes {circle, data1, data2, ...} - * - * @param points an array of Points - * @return the shape - */ - public Shape getShape(Point[] points) { - Point center = points[0]; - Point edge = points[1]; - hitShapes.clear(); - Area drawMe = new Area(); - - // draw shapes only if there are 3 or more data points (plus center, edge and slider) - if (points.length<6) { - hitShapes.add(emptyHitShape); // add empty hit shape in place of circle - } - else { - // special case: infinite or very large radius, so draw straight line thru edge - if (Double.isInfinite(radius) || radius>MAX_RADIUS) { - double x = edge.getX(); - double y = edge.getY(); - // get slope of line - double dx = points[4].getX()-points[3].getX(); - double dy = points[4].getY()-points[3].getY(); - double slope = dy/dx; - // draw long line to extend past window bounds - double len = MAX_RADIUS/10; - if (dx==0) { // vertical line - line.setLine(x, y-len, x, y+len); - } - else { - if (Math.abs(dx)>Math.abs(dy)) { - line.setLine(x-len, y-slope*len, x+len, y+slope*len); - } - else { - line.setLine(x-len/slope, y-len, x+len/slope, y+len); - } - } - drawMe.add(new Area(stroke.createStrokedShape(line))); - hitShapes.add(hitStroke.createStrokedShape(line)); - - // perpendicular line - if (drawRadius) { - Point slider = points[2]; - transform.setToRotation(Math.PI/2, slider.x, slider.y); - drawMe.add(new Area(stroke.createStrokedShape(transform.createTransformedShape(line)))); - } - } - else { - // circle - circle.setFrameFromCenter(center.x, center.y, center.x+radius, center.y+radius); - drawMe.add(new Area(stroke.createStrokedShape(circle))); - - // center - transform.setToTranslation(points[0].x, points[0].y); - Shape s = transform.createTransformedShape(marker); - drawMe.add(new Area(stroke.createStrokedShape(s))); - s = transform.createTransformedShape(crosshatch); - drawMe.add(new Area(stroke.createStrokedShape(s))); - - // radial line - Point slider = points[2]; - int dx = slider.x-center.x, dy = slider.y-center.y; - line.setLine(center.x+dx/4, center.y+dy/4, slider.x, slider.y); - hitShapes.add(hitStroke.createStrokedShape(line)); - if (drawRadius) { - line.setLine(center, slider); - drawMe.add(new Area(stroke.createStrokedShape(line))); - } - } - } - - // always draw data points - for (int i=3; i - * - * For additional Tracker information and documentation, please see - * . - */ -package org.opensourcephysics.cabrillo.tracker; - -import java.util.*; -import java.awt.*; -import java.awt.geom.*; - -import javax.swing.SwingUtilities; - -import org.opensourcephysics.controls.XML; -import org.opensourcephysics.controls.XMLControl; -import org.opensourcephysics.controls.XMLControlElement; -import org.opensourcephysics.display.*; -import org.opensourcephysics.media.core.*; - -/** - * This is a Step for a Compass. It is used for measuring and finding centers of circles. - * - * @author Douglas Brown - */ -public class CompassStep extends Step { - - protected static AffineTransform transform = new AffineTransform(); - protected static TPoint endPoint1 = new TPoint(); // used for large radius case - protected static TPoint endPoint2 = new TPoint(); // used for large radius case - - // instance fields - protected Compass compass; - protected ArrayList dataPoints = new ArrayList(); - protected TPoint center, edge; - protected Slider slider; - protected double radius; - protected Map lineHitShapes = new HashMap(); - protected ArrayList> pointHitShapes = new ArrayList>(); - protected Shape selectedShape; - - /** - * Constructs an empty CompassStep. - * - * @param track the track - * @param n the frame number - */ - public CompassStep(Compass track, int n) { - super(track, n); - compass = track; - center = new Center(0, 0); - edge = new TPoint(); - slider = new Slider(0, 0); - points = new TPoint[] {center, edge, slider}; - screenPoints = new Point[points.length]; - } - - /** - * Adds an data point to this step at the specified image coordinates. - * - * @param x the image x coordinate of the data point - * @param y the image y coordinate of the data point - * @param refresh true to refresh the circle and fire property change event - * - */ - public void addDataPoint(double x, double y, boolean refresh) { - if (!compass.isFixed()) { - compass.keyFrames.add(n); - } - dataPoints.add(new DataPoint(x, y)); - if (refresh) { - defaultIndex = dataPoints.size()-1; - refreshCircle(); - compass.dataValid = false; - compass.firePropertyChange("data", null, compass); //$NON-NLS-1$ - if (compass.trackerPanel != null) { - compass.trackerPanel.changed = true; - } - } - } - - /** - * Removes a data point. - * - * @param p the point to remove - */ - public void removeDataPoint(TPoint p) { - boolean found = false; - for (TPoint next: dataPoints) { - if (next==p) { - found = true; - break; - } - } - XMLControl control = new XMLControlElement(this); - if (found) { - if (!compass.isFixed()) { - compass.keyFrames.add(n); - } - dataPoints.remove((DataPoint)p); - if (compass.trackerPanel != null) { - compass.trackerPanel.changed = true; - } - } - refreshCircle(); - if (found) { - Undo.postStepEdit(this, control); - } - if (n==compass.trackerPanel.getFrameNumber()) { - repaint(); - compass.refreshFields(n); - } - compass.dataValid = false; - compass.firePropertyChange("data", null, null); //$NON-NLS-1$ - compass.trackerPanel.setSelectedPoint(null); - TTrackBar.getTrackbar(compass.trackerPanel).refresh(); - } - - @Override - public TPoint getDefaultPoint() { - if (dataPoints.size()>defaultIndex) { - return dataPoints.get(defaultIndex); - } - return slider; - } - - @Override - public Interactive findInteractive( - DrawingPanel panel, int xpix, int ypix) { - TrackerPanel trackerPanel = (TrackerPanel)panel; - setHitRectCenter(xpix, ypix); - Shape hitShape; - Interactive hit = null; - - for (int i=0; i map = pointHitShapes.get(i); - if (map!=null) { - hitShape = map.get(trackerPanel); - if (hitShape!=null && hitShape.intersects(hitRect)) { - hit = dataPoints.get(i); - } - } - - } - - if (hit==null && compass.isRadialLineVisible()) { - hitShape = lineHitShapes.get(trackerPanel); - if (hitShape!=null && hitShape.intersects(hitRect)) { - hit = slider; - } - } - - return hit; - } - - @Override - public void draw(DrawingPanel panel, Graphics _g) { - // draw the mark - TrackerPanel trackerPanel = (TrackerPanel)panel; - Graphics2D g = (Graphics2D)_g; - getMark(trackerPanel).draw(g, false); - } - - @Override - protected Mark getMark(TrackerPanel trackerPanel) { - Mark mark = marks.get(trackerPanel); - TPoint selection = null; - if (mark==null) { - selection = trackerPanel.getSelectedPoint(); - // assemble screen points array - if (screenPoints.length!=points.length+dataPoints.size()) { - screenPoints = new Point[points.length+dataPoints.size()]; - } - Point p = null; - for (int i = 0; i newMap = new HashMap(); - pointHitShapes.add(newMap); - } - Map map = pointHitShapes.get(i-1); - map.put(trackerPanel, shapes[i]); - } - - } - return mark; - } - - /** - * Returns the circle radius in world units. - * - * @return the radius in world units - */ - public double getWorldRadius() { - if (dataPoints.size()<3) { - return Double.NaN; - } - return radius/compass.trackerPanel.getCoords().getScaleX(n); - } - - /** - * Returns the circle center coordinates in world units. - * - * @return the center point in world units - */ - public Point2D getWorldCenter() { - if (dataPoints.size()<3 || Double.isInfinite(radius) || radius>CompassFootprint.MAX_RADIUS) { - return null; - } - return center.getWorldPosition(compass.trackerPanel); - } - - /** - * Returns the slider angle relative to the +x-axis. - * - * @return the slider angle - */ - public double getSliderAngle() { - // deal with special cases - if (dataPoints.size()<3 || Double.isNaN(radius) || radius>CompassFootprint.MAX_RADIUS) { - return Double.NaN; - } - double theta = -center.angle(slider); - if (compass.trackerPanel!=null) { - theta -= compass.trackerPanel.getCoords().getAngle(n); - } - return theta; - } - - /** - * Returns the slider angle relative to the horizontal. - * - * @return the slider angle - */ - public void setSliderAngle(double theta) { - double prev = getSliderAngle(); - if (theta==prev || Double.isNaN(prev)) return; - if (compass.trackerPanel!=null) { - theta += compass.trackerPanel.getCoords().getAngle(n); - } - double sin = -Math.sin(theta); - double cos = Math.cos(theta); - slider.setLocation(center.x+radius*cos, center.y+radius*sin); - repaint(); - compass.refreshFields(n); -// compass.dataValid = false; -// compass.firePropertyChange("data", null, null); - } - - /** - * Refreshes the circle based on the current data points. - */ - public void refreshCircle() { - double prevR = radius, prevX = center.x, prevY = center.y; - int len = dataPoints.size(); - double sin = 1, cos = 0; - if (!Double.isInfinite(radius) - && radius>0 - && radiusCompassFootprint.MAX_RADIUS) { - if (compass.trackerPanel!=null) { - p = compass.trackerPanel.getSelectedPoint(); - } - p0 = dataPoints.get(0); - p1 = dataPoints.get(1); - p2 = dataPoints.get(2); - edge.setLocation(p==p1? p1: p==p2? p2: p0); - } - else { - edge.setLocation(center.x, center.y+radius); - } - } - - boolean isVisible = compass.trackerPanel!=null && n==compass.trackerPanel.getFrameNumber(); - if (radius!=prevR || center.x!=prevX || center.y!=prevY) { - if (!Double.isInfinite(radius) - && radius>0 - && radius pts) { - // check for colinear points - double[] deltax = new double[pts.size()-1]; - double[] deltay = new double[pts.size()-1]; - double[] slope = new double[pts.size()-1]; - DataPoint prev = null; - boolean allDeltaXZero = true, allSameSlope = true; - for (int i=0; i1) { - allDeltaXZero = allDeltaXZero && deltax[i-1]==deltax[i-2]; - allSameSlope = allSameSlope && slope[i-1]==slope[i-2]; - } - } - if (allDeltaXZero || allSameSlope) { - radius = Double.POSITIVE_INFINITY; - return; - } - - // find center - double sumx=0, sumy=0, sumx2=0, sumy2=0, sumx3=0, sumy3=0, sumxy=0, sumxy2=0, sumx2y=0; - double val; - for (DataPoint p: pts) { - val = p.x; - sumx += val; - val *= p.x; - sumx2 += val; - val *= p.x; - sumx3 += val; - val = p.y; - sumy += val; - val *= p.y; - sumy2 += val; - val *= p.y; - sumy3 += val; - val = p.x*p.y; - sumxy += val; - sumxy2 += val*p.y; - sumx2y += val*p.x; - } - double n = pts.size(); - double a = n*sumx2 - sumx*sumx; - double b = n*sumxy - sumx*sumy; - double c = n*sumy2 - sumy*sumy; - double d = 0.5*(n*sumxy2 - sumx*sumy2 +n*sumx3 - sumx*sumx2); - double e = 0.5*(n*sumx2y - sumy*sumx2 +n*sumy3 - sumy*sumy2); - double denom = a*c - b*b; - double x = (d*c - b*e)/denom; // center x-coordinate - double y = (a*e - b*d)/denom; // center y-coordinate - center.setLocation(x, y); - - // find radius - double r = 0, dx, dy; - for (DataPoint p: pts) { - dx = p.x - x; - dy = p.y - y; - r += Math.sqrt(dx*dx + dy*dy); - } - radius = r/n; - } - - /** - * Clones this Step. - * - * @return a clone of this step - */ - public Object clone() { - CompassStep step = (CompassStep)super.clone(); - if (step != null) { - step.points[0] = step.center = step.new Center(center.getX(), center.getY()); - step.points[1] = step.edge = new TPoint(edge.getX(), edge.getY()); - step.points[2] = step.slider = step.new Slider(slider.getX(), slider.getY()); - step.lineHitShapes = new HashMap(); - step.pointHitShapes = new ArrayList>(); - step.dataPoints = new ArrayList(); - for (DataPoint next: dataPoints) { - step.dataPoints.add(new DataPoint(next.x, next.y)); - } - } - return step; - } - - /** - * Copies data points from another step, then refreshes the circle. - * - * @param step the step to copy - */ - public void copy(CompassStep step) { - if (dataPoints.size()!=step.dataPoints.size()) { - dataPoints.clear(); - for (int i=0; iCompassFootprint.MAX_RADIUS) { - if (dataPoints.size()<2) return; - double dx = dataPoints.get(1).getX()-dataPoints.get(0).getX(); - double dy = dataPoints.get(1).getY()-dataPoints.get(0).getY(); - double slope = dy/dx; - double len = CompassFootprint.MAX_RADIUS/100; - if (dx==0) { // vertical line - endPoint1.setLocation(edge.x, edge.y-len); - endPoint2.setLocation(edge.x, edge.y+len); - } - else { - if (Math.abs(dx)>Math.abs(dy)) { - endPoint1.setLocation(edge.x-len, edge.y-slope*len); - endPoint2.setLocation(edge.x+len, edge.y+slope*len); - } - else { - endPoint1.setLocation(edge.x-len/slope, edge.y-len); - endPoint2.setLocation(edge.x+len/slope, edge.y+len); - } - } - setPositionOnLine(xScreen, yScreen, trackerPanel, endPoint1, endPoint2); - return; - } - - // get image coordinates of the screen point - if(screenPt==null) { - screenPt = new Point(); - } - if(worldPt==null) { - worldPt = new Point2D.Double(); - } - screenPt.setLocation(xScreen, yScreen); - AffineTransform toScreen = trackerPanel.getPixelTransform(); - if(!trackerPanel.isDrawingInImageSpace()) { - int n = getFrameNumber(trackerPanel); - toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); - } - try { - toScreen.inverseTransform(screenPt, worldPt); - } catch(NoninvertibleTransformException ex) { - ex.printStackTrace(); - } - // set location to nearest point on circle - double d = center.distance(worldPt); - double dx = worldPt.getX()-center.getX(); - double dy = worldPt.getY()-center.getY(); - double r = center.distance(edge); - double x = center.getX()+r*dx/d; - double y = center.getY()+r*dy/d; - setLocation(x, y); - repaint(); - } - - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - compass.firePropertyChange("data", null, compass); //$NON-NLS-1$ - } - } - - - } - - //______________________ inner Center class ________________________ - - class Center extends TPoint { - - /** - * Constructs a Center with specified image coordinates. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public Center(double x, double y) { - super(x, y); -// setStepEditTrigger(true); - } - -// @Override -// public void setXY(double x, double y) { -// if (compass.isFixed()) { -//// CompassStep keyStep = (CompassStep)compass.steps.getStep(0); -//// keyStep.slider.setLocation(x, y); // set property of keyStep 0 -//// Point p = keyStep.slider.getScreenPosition(compass.trackerPanel); -//// keyStep.slider.setPositionOnCircle(p.x, p.y, compass.trackerPanel); -//// compass.refreshStep(CompassStep.this); // sets properties of this step -// } -// else { -// setLocation(x, y); -//// Point p = getScreenPosition(compass.trackerPanel); -// } -// repaint(); -// compass.refreshFields(n); -// compass.dataValid = false; -// if (compass.trackerPanel != null) { -// compass.trackerPanel.changed = true; -// } -// } - - @Override - public int getFrameNumber(VideoPanel vidPanel) { - return n; - } - -// /** -// * Overrides TPoint method. -// * -// * @param adjusting true if being dragged -// */ -// public void setAdjusting(boolean adjusting) { -// boolean wasAdjusting = isAdjusting(); -// super.setAdjusting(adjusting); -// if (wasAdjusting && !adjusting) { -// compass.firePropertyChange("data", null, compass); //$NON-NLS-1$ -// } -// } -// - - } - - //______________________ inner DataPoint class ________________________ - - class DataPoint extends TPoint { - - /** - * Constructs a DataPoint with specified image coordinates. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public DataPoint(double x, double y) { - super(x, y); - setStepEditTrigger(true); - } - - /** - * Overrides TPoint setXY method. - * - * @param x the x coordinate - * @param y the y coordinate - */ - public void setXY(double x, double y) { - if (track.locked) return; - if (compass.isFixed()) { - int pointIndex = 0; - for (int i=0; i0) { - // add data point(s) - for (int i=0; i * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java b/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java index c74efeca..506d3a92 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CoordAxes.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java b/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java index e4bb955e..4aad46b7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CoordAxesStep.java @@ -20,18 +20,18 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a Step for a CoordAxes. It is used for displaying the axes and for @@ -214,13 +214,20 @@ protected Mark getMark(TrackerPanel trackerPanel) { } handleShapes.put(trackerPanel, hitShape); // get selected point shape, if any + int scale = FontSizer.getIntegerFactor(); if (selection == origin) { transform.setToTranslation(p0.x, p0.y); + if (scale>1) { + transform.scale(scale, scale); + } fillShapes[1] = transform.createTransformedShape(selectionShape); } else if (selection == handle) { Point p1 = handle.getScreenPosition(trackerPanel); transform.setToTranslation(p1.x, p1.y); + if (scale>1) { + transform.scale(scale, scale); + } fillShapes[1] = transform.createTransformedShape(selectionShape); } else fillShapes[1] = null; diff --git a/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java b/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java index f6deb0de..7a4718cf 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DataTrackClipControl.java @@ -13,6 +13,7 @@ import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.Shape; +import java.awt.event.MouseListener; import java.awt.geom.GeneralPath; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; @@ -83,6 +84,7 @@ public void stateChanged(ChangeEvent e) { dataTrack.setStartFrame(in); videoInSpinner.setValue(dataTrack.getStartFrame()); repaint(); + videoInSpinner.requestFocusInWindow(); } }; videoInSpinner.addChangeListener(listener); @@ -99,6 +101,7 @@ public void stateChanged(ChangeEvent e) { dataTrack.getDataClip().setStartIndex(in); dataInSpinner.setValue(dataTrack.getDataClip().getStartIndex()); repaint(); + dataInSpinner.requestFocusInWindow(); } }; dataInSpinner.addChangeListener(listener); @@ -116,6 +119,7 @@ public void stateChanged(ChangeEvent e) { dataTrack.getDataClip().setClipLength(length); dataClipLengthSpinner.setValue(dataTrack.getDataClip().getClipLength()); repaint(); + dataClipLengthSpinner.requestFocusInWindow(); } }; dataClipLengthSpinner.addChangeListener(listener); @@ -132,6 +136,7 @@ public void stateChanged(ChangeEvent e) { dataTrack.getDataClip().setStride(n); dataStrideSpinner.setValue(dataTrack.getDataClip().getStride()); repaint(); + dataStrideSpinner.requestFocusInWindow(); } }; dataStrideSpinner.addChangeListener(listener); @@ -226,6 +231,12 @@ protected void refreshGUI() { dataInLabel.setText(TrackerRes.getString("DataTrackClipControl.Label.DataStart")); //$NON-NLS-1$ dataStrideLabel.setText(TrackerRes.getString("DataTrackClipControl.Label.Stride")); //$NON-NLS-1$ } + + protected void addMouseListenerToAll(MouseListener listener) { + this.addMouseListener(listener); + drawingPanel.addMouseListener(listener); + spinnerPanel.addMouseListener(listener); + } @Override public Dimension getMaximumSize() { @@ -234,6 +245,7 @@ public Dimension getMaximumSize() { return dim; } + @Override public void propertyChange(PropertyChangeEvent e) { refreshSpinners(); // if (e.getPropertyName().equals("dataclip")) { //$NON-NLS-1$ @@ -282,8 +294,8 @@ public void setGraphic(Interactive graphic) { class MappingGraphic implements Interactive { GeneralPath path = new GeneralPath(); - //pig convert to using TPoints & implement interactivity + @Override public void draw(DrawingPanel panel, Graphics g) { VideoPanel vidPanel = dataTrack.getVideoPanel(); if (vidPanel==null) return; @@ -479,9 +491,11 @@ public Shape[] getHitShapes() { public Mark getMark(Point[] points) { return new Mark() { + @Override public void draw(Graphics2D g, boolean highlighted) { } + @Override public Rectangle getBounds(boolean highlighted) { return null; } @@ -489,50 +503,60 @@ public Rectangle getBounds(boolean highlighted) { }; } + @Override public double getXMin() { return 0; } + @Override public double getXMax() { return 100; } + @Override public double getYMin() { return 0; } + @Override public double getYMax() { return 100; } + @Override public boolean isMeasured() { return true; } + @Override public Interactive findInteractive(DrawingPanel panel, int _xpix, int _ypix) { - // pig implement return null; } + @Override public void setEnabled(boolean enabled) {} + @Override public boolean isEnabled() { return true; } + @Override public void setXY(double x, double y) {} + @Override public void setX(double x) { - // pig implement } + @Override public void setY(double y) {} + @Override public double getX() { - // pig implement return 0; } + @Override public double getY() { return 0; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java index 47c4411a..be76a5d8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTimeControl.java @@ -14,6 +14,7 @@ import org.opensourcephysics.media.core.ClipControl; import org.opensourcephysics.media.core.DataTrack; import org.opensourcephysics.media.core.VideoPlayer; +import org.opensourcephysics.tools.FontSizer; public class DataTrackTimeControl extends JPanel implements PropertyChangeListener { @@ -67,6 +68,8 @@ protected void refreshGUI() { boolean dataSelected = ClipControl.isTimeSource(dataTrack); dataButton.setSelected(dataSelected); videoButton.setSelected(!dataSelected); + // following line needed to display titled border correctly when a DataTrack is created + FontSizer.setFonts(getBorder(), FontSizer.getLevel()); } @Override @@ -76,15 +79,8 @@ public Dimension getMaximumSize() { return dim; } + @Override public void propertyChange(PropertyChangeEvent e) { -// if (e.getPropertyName().equals("timedata")) { //$NON-NLS-1$ -// if (ClipControl.isTimeSource(dataTrack) && videoButton.isSelected()) { -// dataButton.setSelected(true); -// } -// else if (!ClipControl.isTimeSource(dataTrack) && dataButton.isSelected()) { -// videoButton.setSelected(true); -// } -// } refreshGUI(); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTool.java b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTool.java index ad111fb3..3a128d69 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DataTrackTool.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DataTrackTool.java @@ -90,42 +90,135 @@ public void send(Job job, Tool replyTo) throws RemoteException { return; } - // get the target TrackerPanel - TrackerPanel trackerPanel = frame.getTrackerPanel(frame.getSelectedTab()); - if (trackerPanel==null) { - trackerPanel = new TrackerPanel(); - frame.addTab(trackerPanel); - } + // see if a video path has been sent + String videoFullPath = control.getString("video"); //$NON-NLS-1$ - // set video properties - if (control.getPropertyNames().contains("video")) { //$NON-NLS-1$ - String path = control.getString("video"); //$NON-NLS-1$ - File videoFile = findFile(path, sourceID); - if (videoFile==null || !videoFile.exists()) { - int result = JOptionPane.showConfirmDialog(trackerPanel, - TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message1") //$NON-NLS-1$ + // extract the video if needed, before loading TRK + File videoFile = null; + if (videoFullPath!=null) { + videoFile = findFile(videoFullPath, sourceID); + } + + boolean videoLoadedByTRK = false; + + // load TRK file + if (control.getPropertyNames().contains("trk")) { //$NON-NLS-1$ + String path = control.getString("trk"); //$NON-NLS-1$ + File trkFile = findFile(path, sourceID); + if (trkFile==null || !trkFile.exists()) { + int result = JOptionPane.showConfirmDialog(frame, + TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Message1") //$NON-NLS-1$ +" \""+path+"\"" //$NON-NLS-1$ //$NON-NLS-2$ +"\n"+TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message2"), //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Title"), //$NON-NLS-1$ + TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Title"), //$NON-NLS-1$ JOptionPane.ERROR_MESSAGE); if (result==JOptionPane.YES_OPTION) { - java.io.File[] files = VideoIO.getChooserFiles("open video"); //$NON-NLS-1$ + java.io.File[] files = TrackerIO.getChooserFiles("open trk"); //$NON-NLS-1$ if (files!=null && files.length>0) { - videoFile = files[0]; + trkFile = files[0]; } } } - if (videoFile!=null) { - OSPLog.fine("importing video file "+videoFile.getAbsolutePath()); //$NON-NLS-1$ - TrackerIO.importVideo(videoFile, trackerPanel, null); + if (trkFile!=null) { + XMLControlElement trkControl = new XMLControlElement(trkFile.getAbsolutePath()); + Class type = trkControl.getObjectClass(); + if (!TrackerPanel.class.equals(type)) { + JOptionPane.showMessageDialog(frame, + TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Message") //$NON-NLS-1$ + + ": \""+ trkFile.getAbsolutePath()+"\"", //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + } + else { + OSPLog.fine("loading TRK file "+trkFile.getAbsolutePath()); //$NON-NLS-1$ + // extract video if needed + XMLControl childControl = trkControl.getChildControl("videoclip"); //$NON-NLS-1$ + if (childControl!=null) { + childControl = childControl.getChildControl("video"); //$NON-NLS-1$ + } + if (childControl!=null) { + String trkVidPath = childControl.getString("path"); //$NON-NLS-1$ + File vidFile = null; + // video path relative to EjsS base, videoPath==full path? + // check to see if the full path contains base from which TRK path is relative + if (videoFullPath!=null) { + vidFile = new File(videoFullPath); + if (vidFile.exists()) { + File parentFile = vidFile.getParentFile(); + while (parentFile!=null) { + String base = parentFile.getAbsolutePath(); + String target = XML.getResolvedPath(trkVidPath, base); + if (new File(target).exists()) { + videoLoadedByTRK = true; + ResourceLoader.addSearchPath(base); + break; + } + parentFile = parentFile.getParentFile(); + } + } + } + + if (vidFile==null) { + vidFile = findFile(trkVidPath, sourceID); + if (vidFile!=null) { + String jarPath = jarPaths.get(sourceID); + if (jarPath!=null) { + ResourceLoader.addSearchPath(XML.getDirectoryPath(jarPath)); + } + } + } + } + + // create and load new TrackerPanel + TrackerPanel trackerPanel = new TrackerPanel(); + trkControl.loadObject(trackerPanel); + trackerPanel.defaultFileName = XML.getName(path); + trackerPanel.openedFromPath = trkFile.getAbsolutePath(); + trackerPanel.setDataFile(trkFile); + frame.addTab(trackerPanel); + frame.setSelectedTab(trackerPanel); + Tracker.addRecent(trkFile.getAbsolutePath(), false); // add at beginning + } } } + + // get the target TrackerPanel + TrackerPanel trackerPanel = frame.getTrackerPanel(frame.getSelectedTab()); + if (trackerPanel==null) { + trackerPanel = new TrackerPanel(); + frame.addTab(trackerPanel); + } + + // import video only if not loaded by TRK + if (!videoLoadedByTRK && videoFullPath!=null) { + if (videoFile==null || !videoFile.exists()) { + int result = JOptionPane.showConfirmDialog(trackerPanel, + TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message1") //$NON-NLS-1$ + +" \""+videoFullPath+"\"" //$NON-NLS-1$ //$NON-NLS-2$ + +"\n"+TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message2"), //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Title"), //$NON-NLS-1$ + JOptionPane.ERROR_MESSAGE); + if (result==JOptionPane.YES_OPTION) { + java.io.File[] files = VideoIO.getChooserFiles("open video"); //$NON-NLS-1$ + if (files!=null && files.length>0) { + videoFile = files[0]; + } + } + } + if (videoFile!=null) { + OSPLog.fine("importing video file "+videoFile.getAbsolutePath()); //$NON-NLS-1$ + TrackerIO.importVideo(videoFile, trackerPanel, null); + } + } + // set video properties if (control.getPropertyNames().contains("videoStartFrame")) { //$NON-NLS-1$ int start = control.getInt("videoStartFrame"); //$NON-NLS-1$ + OSPLog.fine("setting start frame to "+start); //$NON-NLS-1$ trackerPanel.getPlayer().getVideoClip().setStartFrameNumber(start); } if (control.getPropertyNames().contains("videoEndFrame")) { //$NON-NLS-1$ int end = control.getInt("videoEndFrame"); //$NON-NLS-1$ + OSPLog.fine("setting end frame to "+end); //$NON-NLS-1$ trackerPanel.getPlayer().getVideoClip().setEndFrameNumber(end); } if (control.getPropertyNames().contains("videoStepSize")) { //$NON-NLS-1$ @@ -134,11 +227,13 @@ public void send(Job job, Tool replyTo) throws RemoteException { } if (control.getPropertyNames().contains("stepNumber")) { //$NON-NLS-1$ int step = control.getInt("stepNumber"); //$NON-NLS-1$ + OSPLog.fine("setting step size to "+step); //$NON-NLS-1$ trackerPanel.getPlayer().setStepNumber(step); } if (control.getPropertyNames().contains("frameNumber")) { //$NON-NLS-1$ int frame = control.getInt("frameNumber"); //$NON-NLS-1$ int step = trackerPanel.getPlayer().getVideoClip().frameToStep(frame); + OSPLog.fine("setting step number to "+step); //$NON-NLS-1$ trackerPanel.getPlayer().setStepNumber(step); } if (control.getPropertyNames().contains("deleteTracks")) { //$NON-NLS-1$ @@ -146,48 +241,49 @@ public void send(Job job, Tool replyTo) throws RemoteException { for (String next: trackNames) { ParticleDataTrack track = findParticleDataTrack(trackerPanel, next, -1); if (track!=null) { + OSPLog.fine("deleting track "+track.getName()); //$NON-NLS-1$ track.delete(); } } } - if (control.getPropertyNames().contains("trk")) { //$NON-NLS-1$ - String path = control.getString("trk"); //$NON-NLS-1$ - File trkFile = findFile(path, sourceID); - if (trkFile==null || !trkFile.exists()) { - int result = JOptionPane.showConfirmDialog(trackerPanel, - TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Message1") //$NON-NLS-1$ - +" \""+path+"\"" //$NON-NLS-1$ //$NON-NLS-2$ - +"\n"+TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message2"), //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Title"), //$NON-NLS-1$ - JOptionPane.ERROR_MESSAGE); - if (result==JOptionPane.YES_OPTION) { - java.io.File[] files = TrackerIO.getChooserFiles("open trk"); //$NON-NLS-1$ - if (files!=null && files.length>0) { - trkFile = files[0]; - } - } - } - if (trkFile!=null) { - XMLControlElement trkControl = new XMLControlElement(trkFile.getAbsolutePath()); - Class type = trkControl.getObjectClass(); - if (!TrackerPanel.class.equals(type)) { - JOptionPane.showMessageDialog(trackerPanel.getTFrame(), - TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Message") //$NON-NLS-1$ - + ": \""+ trkFile.getAbsolutePath()+"\"", //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Title"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); - } - else { - OSPLog.fine("loading TRK file "+trkFile.getAbsolutePath()); //$NON-NLS-1$ - trackerPanel.changed = true; - trkControl.loadObject(trackerPanel); - trackerPanel.defaultFileName = XML.getName(path); - trackerPanel.openedFromPath = trkFile.getAbsolutePath(); - trackerPanel.setDataFile(trkFile); - Tracker.addRecent(trkFile.getAbsolutePath(), false); // add at beginning - } - } - } +// if (control.getPropertyNames().contains("trk")) { //$NON-NLS-1$ +// String path = control.getString("trk"); //$NON-NLS-1$ +// File trkFile = findFile(path, sourceID); +// if (trkFile==null || !trkFile.exists()) { +// int result = JOptionPane.showConfirmDialog(trackerPanel, +// TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Message1") //$NON-NLS-1$ +// +" \""+path+"\"" //$NON-NLS-1$ //$NON-NLS-2$ +// +"\n"+TrackerRes.getString("DataTrackTool.Dialog.VideoNotFound.Message2"), //$NON-NLS-1$ //$NON-NLS-2$ +// TrackerRes.getString("DataTrackTool.Dialog.FileNotFound.Title"), //$NON-NLS-1$ +// JOptionPane.ERROR_MESSAGE); +// if (result==JOptionPane.YES_OPTION) { +// java.io.File[] files = TrackerIO.getChooserFiles("open trk"); //$NON-NLS-1$ +// if (files!=null && files.length>0) { +// trkFile = files[0]; +// } +// } +// } +// if (trkFile!=null) { +// XMLControlElement trkControl = new XMLControlElement(trkFile.getAbsolutePath()); +// Class type = trkControl.getObjectClass(); +// if (!TrackerPanel.class.equals(type)) { +// JOptionPane.showMessageDialog(trackerPanel.getTFrame(), +// TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Message") //$NON-NLS-1$ +// + ": \""+ trkFile.getAbsolutePath()+"\"", //$NON-NLS-1$ //$NON-NLS-2$ +// TrackerRes.getString("DataTrackTool.Dialog.InvalidTRK.Title"), //$NON-NLS-1$ +// JOptionPane.WARNING_MESSAGE); +// } +// else { +// OSPLog.fine("loading TRK file "+trkFile.getAbsolutePath()); //$NON-NLS-1$ +// trackerPanel.changed = true; +// trkControl.loadObject(trackerPanel); +// trackerPanel.defaultFileName = XML.getName(path); +// trackerPanel.openedFromPath = trkFile.getAbsolutePath(); +// trackerPanel.setDataFile(trkFile); +// Tracker.addRecent(trkFile.getAbsolutePath(), false); // add at beginning +// } +// } +// } // get the data, if any Data data = (Data)control.getObject("data"); //$NON-NLS-1$ @@ -308,6 +404,7 @@ private File findFile(String path, int ID) { if (file==null && res!=null && res.getFile()!=null) { file = res.getFile(); } + OSPLog.fine("file found for path \""+path+"\": "+file); //$NON-NLS-1$ //$NON-NLS-2$ return file; } @@ -355,6 +452,7 @@ private DataTrack loadData(TrackerPanel trackerPanel, Data data, boolean append) if (dataTrack!=null) { try { if (append) { + // following call throws exception if (x, y) data not found dataTrack.appendData(data); // display the last point appended VideoPlayer player = trackerPanel.getPlayer(); @@ -365,10 +463,15 @@ private DataTrack loadData(TrackerPanel trackerPanel, Data data, boolean append) player.setStepNumber(videoClip.frameToStep(dataEndFrame)); } else { + // following call throws exception if (x, y) data not found dataTrack.setData(data); } } catch (Exception e) { - // pig inform user + // inform user + JOptionPane.showMessageDialog(frame, + TrackerRes.getString("DataTrackTool.Dialog.InvalidData.Message"), //$NON-NLS-1$ + TrackerRes.getString("DataTrackTool.Dialog.InvalidData.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); } } return dataTrack; @@ -402,7 +505,13 @@ public static boolean isDataSource(String jarPath) { */ public static void launchDataSource(String jarPath, boolean requestData) { if (!isDataSource(jarPath)) { - // pig inform user + // inform user + String jarName = TrackerRes.getString("TActions.Action.DataTrack.Unsupported.JarFile") //$NON-NLS-1$ + + " \""+XML.getName(jarPath)+"\" "; //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.showMessageDialog(null, + jarName+TrackerRes.getString("TActions.Action.DataTrack.Unsupported.Message")+".", //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("TActions.Action.DataTrack.Unsupported.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); return; } // assemble the command diff --git a/src/org/opensourcephysics/cabrillo/tracker/Derivative.java b/src/org/opensourcephysics/cabrillo/tracker/Derivative.java index d5f44275..4fe92fea 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Derivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Derivative.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java b/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java index d43c5433..1d353364 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DerivativeAlgorithmDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/DoubleArrowFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/DoubleArrowFootprint.java index 9ac42847..df0fbe1f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DoubleArrowFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DoubleArrowFootprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -29,6 +29,8 @@ import javax.swing.Icon; +import org.opensourcephysics.tools.FontSizer; + /** * An DoubleArrowFootprint returns a double arrow shape * for a Point array of length 2. @@ -60,6 +62,9 @@ public DoubleArrowFootprint(String name) { * @return the icon */ public Icon getIcon(int w, int h) { + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; Shape shape = getShape(points, false); ShapeIcon icon = new ShapeIcon(shape, w, h); @@ -129,19 +134,30 @@ private Shape getShape(Point[] points, boolean bothEnds) { transform.translate(p2.x, p2.y); float d = (float) p1.distance(p2); // length of the line // set arrowhead dimensions and stroke - int tipL = tipLength; +// int tiplen = tipLength*scale; +// int tipL = Math.min(tiplen, Math.round(d-4)); + int scale = FontSizer.getIntegerFactor(); + int tipL = tipLength*scale; if (bothEnds) - tipL = Math.min(tipLength, Math.round(d/2-3)); + tipL = Math.min(tipL, Math.round(d/2-3)); tipL = Math.max(8, tipL); int tipW = Math.max(tipL/4, 3); - float f = stroke.getLineWidth(); - BasicStroke s = f < tipL/4? stroke: - new BasicStroke(Math.max(tipL/4, 0.8f), + float f = scale*baseStroke.getLineWidth(); + float lineWidth = f < tipL/4? f: Math.max(tipL/4, 0.8f); + if (stroke==null || stroke.getLineWidth()!=lineWidth) { + stroke = new BasicStroke(lineWidth, + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + baseStroke.getDashArray(), + baseStroke.getDashPhase()); + headStroke = new BasicStroke(lineWidth, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, - stroke.getDashArray(), + null, stroke.getDashPhase()); + } // set up tip hitShape using full length path.reset(); path.moveTo(d - 4, 0); @@ -167,15 +183,15 @@ private Shape getShape(Point[] points, boolean bothEnds) { hitShapes[2] = transform.createTransformedShape(path); // for shaft // shorten d to account for the width of the stroke // see Java 2D API Graphics, by VJ Hardy (Sun, 2000) page 147 - float w = (float) (s.getLineWidth() * 1.58) - 1; + float w = (float) (stroke.getLineWidth() * 1.58) - 1; d = d - w; // set up draw shape path.reset(); - path.moveTo(tipL-tipW, 0); + path.moveTo(tipL+w-tipW, 0); path.lineTo(bothEnds? d-tipL+tipW: d, 0); Shape shaft = transform.createTransformedShape(path); - shaft = s.createStrokedShape(shaft); + shaft = stroke.createStrokedShape(shaft); Area area = new Area(shaft); path.reset(); path.moveTo(w+tipL-tipW, 0); diff --git a/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java index 5e4b93e8..e0319c93 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DoubleCrosshairFootprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -30,6 +30,8 @@ import javax.swing.Icon; +import org.opensourcephysics.tools.FontSizer; + /** * A double crosshair footprint for a Point array of length 2. * @@ -84,13 +86,20 @@ public void setCrosshairSize(int out, int in) { * @return the icon */ public Icon getIcon(int w, int h) { - Shape target = stroke.createStrokedShape(targetShape); + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } + transform.setToScale(scale, scale); + Shape target = stroke.createStrokedShape(transform.createTransformedShape(targetShape)); Area area = new Area(target); - double x0 = size/2-w+2; - double y0 = h-size/2-2; + double x0 = scale*(size+2)-w; + double y0 = h-scale*(size+2); double d = Math.sqrt(x0*x0+y0*y0); - double x1 = x0*size/d; - double y1 = y0*size/d; + double x1 = x0*scale*size/d; + double y1 = y0*scale*size/d; Line2D line = new Line2D.Double(x0, y0, x1, y1); area.add(new Area(stroke.createStrokedShape(line))); ShapeIcon icon = new ShapeIcon(area, w, h); @@ -105,7 +114,7 @@ public Icon getIcon(int w, int h) { */ public void setStroke(BasicStroke stroke) { if (stroke == null) return; - this.stroke = stroke; + this.baseStroke = stroke; } /** @@ -120,16 +129,23 @@ public Shape getShape(Point[] points) { // set up end shapes transform.setToTranslation(p1.x, p1.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } Shape target1 = transform.createTransformedShape(targetShape); hitShapes[0] = transform.createTransformedShape(hitShape); // end1 transform.setToTranslation(p2.x, p2.y); + if (scale>1) { + transform.scale(scale, scale); + } Shape target2 = transform.createTransformedShape(targetShape); hitShapes[1] = transform.createTransformedShape(hitShape); // end2 // set up line shapes float d = (float)p1.distance(p2); // distance between ends float center = d/2; // center point - float l = d - 2*size-6; // line length + float l = d - scale*2*(size+3); // line length float f = 0.45f; // hit shape is 90% of line length path.reset(); path.moveTo(center - f*l, 0); @@ -144,6 +160,9 @@ public Shape getShape(Point[] points) { Shape line = transform.createTransformedShape(path); // set up drawing area + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } Area area = new Area(stroke.createStrokedShape(target1)); area.add(new Area(stroke.createStrokedShape(target2))); area.add(new Area(stroke.createStrokedShape(line))); diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java index 834ebbac..840615f9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicParticle.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -187,10 +187,11 @@ public void reset() { firstFrameInClip++; } ImageCoordSystem coords = trackerPanel.getCoords(); - // get underlying coords if reference frame - while (coords instanceof ReferenceFrame) { - coords = ( (ReferenceFrame) coords).getCoords(); - } + // get underlying coords if appropriate + boolean useDefault = isUseDefaultReferenceFrame(); + while (useDefault && coords instanceof ReferenceFrame) { + coords = ( (ReferenceFrame) coords).getCoords(); + } // step solver forward to first frame in clip int count = (firstFrameInClip-getStartFrame())*tracePtsPerStep*iterationsPerStep/clip.getStepSize(); for (int i=0; i * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java index 8c27121a..16f5cd45 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystem.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -45,6 +45,7 @@ import org.opensourcephysics.media.core.TPoint; import org.opensourcephysics.media.core.VideoClip; import org.opensourcephysics.media.core.VideoPlayer; +import org.opensourcephysics.tools.FontSizer; import org.opensourcephysics.tools.FunctionEditor; import org.opensourcephysics.tools.Parameter; import org.opensourcephysics.tools.UserFunction; @@ -505,7 +506,16 @@ else if (name.equals("name")) { //$NON-NLS-1$ refreshSystemParameters(); } } - + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + if (systemInspector!=null) { + FontSizer.setFonts(systemInspector, level); + systemInspector.updateDisplay(); + } + } + /** * Gets the system inspector. * diff --git a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java index 40ee8bd5..92df56a7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/DynamicSystemInspector.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -81,13 +81,13 @@ public DynamicSystemInspector(DynamicSystem track) { setResizable(false); createGUI(); initialize(); - updateDisplay(); } /** * Initializes this inspector. */ public void initialize() { + FontSizer.setFonts(this, FontSizer.getLevel()); updateDisplay(); } @@ -341,7 +341,7 @@ public void actionPerformed(ActionEvent e) { panel.setBorder(BorderFactory.createEmptyBorder(4, 0, 2, 0)); contentPane.add(panel, BorderLayout.NORTH); } - + /** * Updates the system to reflect the current particle selection. */ @@ -393,6 +393,7 @@ protected void updateDisplay() { Border etched = BorderFactory.createEtchedBorder(); TitledBorder title = BorderFactory.createTitledBorder(etched, TrackerRes.getString("DynamicSystemInspector.Border.Title")+" "+(i+1)); //$NON-NLS-1$ //$NON-NLS-2$ + FontSizer.setFonts(title, FontSizer.getLevel()); particlePanels[i].setBorder(title); changeButtons[i].setText( TrackerRes.getString("DynamicSystemInspector.Button.Change")); //$NON-NLS-1$ @@ -416,6 +417,7 @@ protected void updateDisplay() { labelPanels[i].setLayout(new BorderLayout()); labelPanels[i].add(particleLabels[i]); } + FontSizer.setFonts(labelPanels[i], FontSizer.getLevel()); } changeButtons[particleCount-1].setEnabled(!empty); changeButtons[0].requestFocusInWindow(); diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java index 1439d761..fba98ee9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportDataDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java index b217197c..e742c2f0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportVideoDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -108,21 +108,21 @@ public static ExportVideoDialog getDialog(TrackerPanel panel) { * Refreshes the format set. */ public static void refreshFormats() { - formats.clear(); - formatDescriptions.clear(); - // unwanted types are quicktime, ffmpeg or all depending on VideoIO engine - ArrayList unwanted = new ArrayList(); - boolean skipQT = VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) - || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); - boolean skipFFMPeg = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) - || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); - for (String ext: VideoIO.VIDEO_EXTENSIONS) { - if (skipQT) - unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_QUICKTIME, ext)); - if (skipFFMPeg) - unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_FFMPEG, ext)); - } - for (VideoType next: VideoIO.getVideoTypes()) { + formats.clear(); + formatDescriptions.clear(); + // unwanted types are quicktime, ffmpeg or both depending on VideoIO engine + ArrayList unwanted = new ArrayList(); + boolean skipQT = VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) + || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); + boolean skipFFMPeg = VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) + || VideoIO.getEngine().equals(VideoIO.ENGINE_NONE); + for (String ext: VideoIO.VIDEO_EXTENSIONS) { + if (skipQT) + unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_QUICKTIME, ext)); + if (skipFFMPeg) + unwanted.add(VideoIO.getVideoType(VideoIO.ENGINE_FFMPEG, ext)); + } + for (VideoType next: VideoIO.getVideoTypes()) { if (next.canRecord() && !unwanted.contains(next)) { formats.put(next.getDescription(), next); formatDescriptions.add(next.getDescription()); @@ -459,66 +459,66 @@ else if (view instanceof WorldTView) { s += " ("+TrackerRes.getString("ExportVideoDialog.MatSize")+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ sizeDropdown.addItem(s); - sizes.put(s, fullSize); - } - // add additional sizes if acceptable - Dimension dim = new Dimension(fullSize.width*8/10, fullSize.height*8/10); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*3/4, fullSize.height*3/4); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*6/10, fullSize.height*6/10); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); + sizes.put(s, fullSize); + } + // add additional sizes if acceptable + Dimension dim = new Dimension(fullSize.width*8/10, fullSize.height*8/10); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*3/4, fullSize.height*3/4); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*6/10, fullSize.height*6/10); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); sizes.put(s, dim); } dim = new Dimension(fullSize.width/2, fullSize.height/2); if (isAcceptedDimension(dim.width, dim.height)) { s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*4/10, fullSize.height*4/10); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*3/8, fullSize.height*3/8); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*3/10, fullSize.height*3/10); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width/4, fullSize.height/4); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - dim = new Dimension(fullSize.width*2/10, fullSize.height*2/10); - if (isAcceptedDimension(dim.width, dim.height)) { - s = dim.width+"x"+dim.height; //$NON-NLS-1$ - sizeDropdown.addItem(s); - sizes.put(s, dim); - } - } - else if (view instanceof PlotTrackView){ - PlotTrackView trackView = (PlotTrackView)view; + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*4/10, fullSize.height*4/10); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*3/8, fullSize.height*3/8); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*3/10, fullSize.height*3/10); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width/4, fullSize.height/4); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + dim = new Dimension(fullSize.width*2/10, fullSize.height*2/10); + if (isAcceptedDimension(dim.width, dim.height)) { + s = dim.width+"x"+dim.height; //$NON-NLS-1$ + sizeDropdown.addItem(s); + sizes.put(s, dim); + } + } + else if (view instanceof PlotTrackView){ + PlotTrackView trackView = (PlotTrackView)view; Dimension dim = trackView.mainView.getSize(); fullSize = getAcceptedDimension(dim.width, dim.height); s = fullSize.width+"x"+fullSize.height; //$NON-NLS-1$ @@ -610,12 +610,12 @@ private Dimension getAcceptedDimension(int w, int h) { */ private boolean isAcceptedDimension(int w, int h) { if (w<160 || h<120) return false; - if (w%4!=0 || h%4!=0) return false; - if (1.0*h/w==.75) return true; // 4:3 aspect ratio - if (1.0*w/h==1.5) return true; // 3:2 aspect ratio - if (16.0*h/w==9.0) return true; // 16:9 aspect ratio - if (w%16==0 && h%16==0) return true; // any dimensions that are mod 16 - return false; + if (w%4!=0 || h%4!=0) return false; + if (1.0*h/w==.75) return true; // 4:3 aspect ratio + if (1.0*w/h==1.5) return true; // 3:2 aspect ratio + if (16.0*h/w==9.0) return true; // 16:9 aspect ratio + if (w%16==0 && h%16==0) return true; // any dimensions that are mod 16 + return false; } /** diff --git a/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java index 01bfafed..8fcac98f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ExportZipDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -130,7 +130,6 @@ public static ExportZipDialog getDialog(TrackerPanel panel) { zipExporter.addedFilesDialog.addedFiles.clear(); zipExporter.htmlField.setText(zipExporter.htmlField.getDefaultText()); zipExporter.htmlField.setForeground(zipExporter.htmlField.getEmptyForeground()); - zipExporter.htmlField.setFont(zipExporter.htmlField.getEmptyFont()); zipExporter.htmlField.setBackground(Color.white); zipExporter.clipCheckbox.setSelected(panel.getVideo()!=null); zipExporter.titleField.requestFocusInWindow(); @@ -254,6 +253,11 @@ public void actionPerformed(ActionEvent e) { saveButton.setForeground(labelColor); saveButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { + String description = descriptionPane.getText().trim(); + if (!"".equals(description) && "".equals(trackerPanel.getDescription())) { //$NON-NLS-1$ //$NON-NLS-2$ + trackerPanel.setDescription(description); + trackerPanel.hideDescriptionWhenLoaded = true; + } // if saving clip, warn if there are particle models with start frames not included in clip if (clipCheckbox.isSelected()) { badModels = getModelsNotInClip(); @@ -375,13 +379,6 @@ public void actionPerformed(ActionEvent e) { protected String getDefaultText() { return TrackerRes.getString("ZipResourceDialog.HTMLField.DefaultText"); //$NON-NLS-1$ } - protected Font getEmptyFont() { - return getFont().deriveFont(Font.ITALIC); - } - protected Font getDefaultFont() { - return getFont().deriveFont(Font.PLAIN); - } - }; htmlField.setAlignmentY(JToolBar.TOP_ALIGNMENT); htmlField.addActionListener(new ActionListener() { @@ -676,7 +673,6 @@ private void refreshGUI() { Resource res = null; if (!path.equals(htmlField.getDefaultText()) && !path.equals("")) { //$NON-NLS-1$ res = ResourceLoader.getResource(path); - htmlField.setFont(htmlField.getDefaultFont()); htmlField.setForeground(res==null? Color.red: EntryField.defaultForeground); } htmlField.setBackground(Color.white); @@ -1362,7 +1358,7 @@ protected ArrayList defineTarget() { JFileChooser chooser = TrackerIO.getChooser(); chooser.setDialogTitle(TrackerRes.getString("ZipResourceDialog.FileChooser.SaveZip.Title")); //$NON-NLS-1$ chooser.setAcceptAllFileFilterUsed(false); -// chooser.addChoosableFileFilter(TrackerIO.zipFileFilter); + chooser.addChoosableFileFilter(TrackerIO.trzFileFilter); chooser.setFileFilter(TrackerIO.trzFileFilter); File[] files = TrackerIO.getChooserFiles("save"); //$NON-NLS-1$ chooser.resetChoosableFileFilters(); @@ -1685,14 +1681,6 @@ protected String getDefaultText() { return null; } - protected Font getEmptyFont() { - return getFont(); - } - - protected Font getDefaultFont() { - return getFont(); - } - protected Color getEmptyForeground() { return Color.gray; } @@ -1714,7 +1702,6 @@ public void focusGained(FocusEvent e) { EntryField field = (EntryField)e.getSource(); if (field.getDefaultText()!=null && field.getText().equals(field.getDefaultText())) { field.setText(null); - field.setFont(field.getDefaultFont()); field.setForeground(defaultForeground); } field.selectAll(); @@ -1726,7 +1713,6 @@ public void focusLost(FocusEvent e) { if (field.getDefaultText()!=null && "".equals(field.getText())) { //$NON-NLS-1$ field.setText(field.getDefaultText()); field.setForeground(field.getEmptyForeground()); - field.setFont(field.getEmptyFont()); } field.setBackground(Color.white); if (fire) field.fireActionPerformed(); diff --git a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java index ef2ea079..6273e500 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java +++ b/src/org/opensourcephysics/cabrillo/tracker/FileDropHandler.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -258,7 +258,8 @@ public void dragExit(DropTargetEvent dte) { dropList = null; } - public void drop(DropTargetDropEvent e) { + @Override + public void drop(DropTargetDropEvent e) { dropList = null; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java b/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java index e08821b5..062dd8a3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/FirstDerivative.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Footprint.java b/src/org/opensourcephysics/cabrillo/tracker/Footprint.java index 32835944..b32f342c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Footprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Footprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java index 82be18ce..4b18410a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/LineFootprint.java @@ -20,18 +20,19 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.geom.*; import javax.swing.*; +import org.opensourcephysics.tools.FontSizer; + /** * A LineFootprint returns a line shape for a Point array of length 2. * @@ -43,7 +44,8 @@ public class LineFootprint implements Footprint, Cloneable { protected String name; protected Shape highlight; protected AffineTransform transform = new AffineTransform(); - protected BasicStroke stroke = new BasicStroke(); + protected BasicStroke baseStroke = new BasicStroke(); + protected BasicStroke stroke; protected Color color = Color.black; protected GeneralPath path = new GeneralPath(); protected Line2D line = new Line2D.Double(); @@ -110,6 +112,9 @@ public int getLength() { * @return the icon */ public Icon getIcon(int w, int h) { + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; Shape shape = getShape(points); ShapeIcon icon = new ShapeIcon(shape, w, h); @@ -163,7 +168,7 @@ public Shape[] getHitShapes() { */ public void setStroke(BasicStroke stroke) { if (stroke == null) return; - this.stroke = new BasicStroke(stroke.getLineWidth(), + this.baseStroke = new BasicStroke(stroke.getLineWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, @@ -177,7 +182,7 @@ public void setStroke(BasicStroke stroke) { * @return the stroke */ public BasicStroke getStroke() { - return stroke; + return baseStroke; } /** @@ -186,12 +191,12 @@ public BasicStroke getStroke() { * @param dashArray the desired dash array */ public void setDashArray(float[] dashArray) { - setStroke(new BasicStroke(stroke.getLineWidth(), + setStroke(new BasicStroke(baseStroke.getLineWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, dashArray, - stroke.getDashPhase())); + baseStroke.getDashPhase())); } /** @@ -200,12 +205,12 @@ public void setDashArray(float[] dashArray) { * @param w the desired line width */ public void setLineWidth(double w) { - stroke = new BasicStroke((float)w, + baseStroke = new BasicStroke((float)w, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, - stroke.getDashArray(), - stroke.getDashPhase()); + baseStroke.getDashArray(), + baseStroke.getDashPhase()); } /** @@ -239,6 +244,10 @@ public Shape getShape(Point[] points) { hitShapes[0] = new Rectangle(p1.x-1, p1.y-1, 2, 2); // for p1 hitShapes[1] = new Rectangle(p2.x-1, p2.y-1, 2, 2); // for p2 hitShapes[2] = (Line2D.Double)line.clone(); // for line + int scale = FontSizer.getIntegerFactor(); + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } return stroke.createStrokedShape(line); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java b/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java index d9167a62..cf1ecbd3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java +++ b/src/org/opensourcephysics/cabrillo/tracker/LineProfile.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/LineProfileStep.java b/src/org/opensourcephysics/cabrillo/tracker/LineProfileStep.java index d08c0930..ae49e0dc 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/LineProfileStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/LineProfileStep.java @@ -20,18 +20,18 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.geom.*; import java.awt.image.*; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a step for a LineProfile. It is used for obtaining @@ -237,6 +237,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { mark = footprint.getMark(screenPoints); if (p != null) { transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } s = transform.createTransformedShape(selectionShape); final Color color = footprint.getColor(); final Mark stepMark = mark; diff --git a/src/org/opensourcephysics/cabrillo/tracker/MainTView.java b/src/org/opensourcephysics/cabrillo/tracker/MainTView.java index 7c4a9470..a3d5b831 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/MainTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/MainTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Mark.java b/src/org/opensourcephysics/cabrillo/tracker/Mark.java index ec16730b..da399910 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Mark.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Mark.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/ModelBuilder.java b/src/org/opensourcephysics/cabrillo/tracker/ModelBuilder.java index 33d7d23a..e94f2869 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ModelBuilder.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ModelBuilder.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -28,9 +28,6 @@ import java.util.*; import java.awt.*; import java.awt.event.*; -import java.awt.font.FontRenderContext; -import java.awt.font.TextLayout; - import javax.swing.*; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -67,23 +64,15 @@ protected ModelBuilder(TrackerPanel trackerPanel) { */ protected void createToolbarComponents() { // create start and end frame spinners - Font font = new JSpinner().getFont(); - int n = trackerPanel.getPlayer().getVideoClip().getFrameCount()-1; - FontRenderContext frc = new FontRenderContext(null, false, false); - String s = String.valueOf(Math.max(n, 200)); - TextLayout layout = new TextLayout(s, font, frc); - int w = (int)layout.getBounds().getWidth()+4; - if (n>1000) w+=3; startFrameLabel = new JLabel(); startFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 2)); endFrameLabel = new JLabel(); endFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 2)); + int n = trackerPanel.getPlayer().getVideoClip().getFrameCount()-1; SpinnerNumberModel model = new SpinnerNumberModel(0, 0, n, 1); // init, min, max, step startFrameSpinner = new ModelFrameSpinner(model); - startFrameSpinner.prefWidth = w; model = new SpinnerNumberModel(n, 0, n, 1); // init, min, max, step endFrameSpinner = new ModelFrameSpinner(model); - endFrameSpinner.prefWidth = w; // create booster label and dropdown boosterLabel = new JLabel(); @@ -134,7 +123,10 @@ public void actionPerformed(ActionEvent e) { TFrame frame = trackerPanel.getTFrame(); if (frame != null) { ModelFunctionPanel panel = (ModelFunctionPanel)getSelectedPanel(); - if (panel.model instanceof DynamicSystem) { + if (panel instanceof ParticleDataTrackFunctionPanel) { + frame.showHelp("datatrack", 0); //$NON-NLS-1$ + } + else if (panel.model instanceof DynamicSystem) { frame.showHelp("system", 0); //$NON-NLS-1$ } else { @@ -191,6 +183,7 @@ public void setFontLevel(int level) { super.setFontLevel(level); refreshBoosterDropdown(); refreshLayout(); + validate(); } /** @@ -248,15 +241,7 @@ protected void refreshSpinners() { startFrameSpinner.setValue(0); endFrameSpinner.setValue(n); } - Font font = startFrameSpinner.getFont(); - FontRenderContext frc = new FontRenderContext(null, false, false); - String s = String.valueOf(Math.max(n, 200)); - TextLayout layout = new TextLayout(s, font, frc); - int w = (int)layout.getBounds().getWidth()+1; - if (n>1000) w+=3; - startFrameSpinner.prefWidth = w; - endFrameSpinner.prefWidth = w; - + validate(); } @@ -353,8 +338,6 @@ protected void setSpinnerEndFrame(Object frameNumber) { */ class ModelFrameSpinner extends JSpinner { - protected int prefWidth; - Integer prevMax; SpinnerNumberModel spinModel; @@ -382,21 +365,9 @@ public void stateChanged(ChangeEvent e) { }); } - public Dimension getMaximumSize() { - Dimension dim = super.getMaximumSize(); - dim.width = getMinimumSize().width; - return dim; - } - public Dimension getMinimumSize() { Dimension dim = super.getMinimumSize(); - dim.width += prefWidth-getEditor().getPreferredSize().width; - return dim; - } - - public Dimension getPreferredSize() { - Dimension dim = super.getPreferredSize(); - dim.width = getMinimumSize().width; + dim.width += (int)(FontSizer.getFactor()*4); return dim; } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java b/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java index 8413dc13..97586701 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ModelFunctionPanel.java @@ -161,6 +161,13 @@ public void propertyChange(PropertyChangeEvent e) { initEditor.getTable().selectOnFocus = false; } } + + @Override + protected boolean hasInvalidExpressions() { + return functionEditor.containsInvalidExpressions() + || paramEditor.containsInvalidExpressions() + || initEditor.containsInvalidExpressions(); + } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java b/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java index 72b7fcea..ccfb07f9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java +++ b/src/org/opensourcephysics/cabrillo/tracker/OffsetOrigin.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/OffsetOriginStep.java b/src/org/opensourcephysics/cabrillo/tracker/OffsetOriginStep.java index 2a5d5389..518ea775 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/OffsetOriginStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/OffsetOriginStep.java @@ -20,13 +20,14 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.awt.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a Step for a OffsetOrigin. It is used for @@ -125,6 +126,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { Point pt = points[0].getScreenPosition(trackerPanel); if (selection == points[0]) { // point is selected transform.setToTranslation(pt.x, pt.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } shape = transform.createTransformedShape(selectionShape); } else { // point is not selected diff --git a/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java index bac955b8..91c051f8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/OutlineFootprint.java @@ -20,13 +20,16 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.awt.*; + import javax.swing.*; +import org.opensourcephysics.tools.FontSizer; + /** * An OutlineFootprint returns an outline shape for a Point array of length 2. * @@ -44,7 +47,7 @@ public class OutlineFootprint extends LineFootprint { */ public OutlineFootprint(String name) { super(name); - setStroke(stroke); + setStroke(baseStroke); } /** @@ -73,9 +76,12 @@ public int getSpread() { * @return the icon */ public Icon getIcon(int w, int h) { - Point[] points = new Point[] {new Point(), new Point(w - 2, 2 - h)}; + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; + Point[] points = new Point[] {new Point(), new Point(w - scale*2, scale*2 - h)}; int prevSpread = spread; - spread = 1; + spread = scale; Shape shape = getShape(points); ShapeIcon icon = new ShapeIcon(shape, w, h); icon.setColor(color); @@ -116,12 +122,18 @@ public Shape getShape(Point[] points) { int w = Math.min(spread + 1, 4); path.moveTo(d/2, w); path.lineTo(d/2, -w); + int scale = FontSizer.getIntegerFactor(); // centerline - if (getSpread() > 4) { + if (getSpread() > 4 +2*scale) { path.moveTo(0, 0); path.lineTo(d, 0); } Shape outline = transform.createTransformedShape(path); // outline shape + float lineWidth = Math.min(scale*baseStroke.getLineWidth(), spread+1); + lineWidth = Math.max(lineWidth, baseStroke.getLineWidth()); + if (stroke==null || stroke.getLineWidth()!=lineWidth) { + stroke = new BasicStroke(lineWidth); + } outline = stroke.createStrokedShape(outline); // ceate hitshapes path.reset(); diff --git a/src/org/opensourcephysics/cabrillo/tracker/PageTView.java b/src/org/opensourcephysics/cabrillo/tracker/PageTView.java index 7fa4c26c..fd6268c9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PageTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PageTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java b/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java index 2b2f5543..afe75534 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ParticleDataTrack.java @@ -19,7 +19,7 @@ * * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -30,6 +30,8 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; +import javax.swing.JOptionPane; + import org.opensourcephysics.controls.OSPLog; import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControl; @@ -366,10 +368,11 @@ protected void reset() { int index = dataClip.stepToIndex(0); point.setLocation(xData[index], yData[index]); ImageCoordSystem coords = trackerPanel.getCoords(); - // get underlying coords if reference frame - while (coords instanceof ReferenceFrame) { - coords = ( (ReferenceFrame) coords).getCoords(); - } + // get underlying coords if appropriate + boolean useDefault = isUseDefaultReferenceFrame(); + while (useDefault && coords instanceof ReferenceFrame) { + coords = ( (ReferenceFrame) coords).getCoords(); + } int firstFrameInClip = getStartFrame(); AffineTransform transform = coords.getToImageTransform(firstFrameInClip); @@ -398,11 +401,13 @@ protected void reset() { stepCounter = 0; } + @Override public void setData(Data data, Object source) throws Exception { setData(data); setSource(source); } + @Override public VideoPanel getVideoPanel() { return trackerPanel; } @@ -428,7 +433,12 @@ public void appendData(Data data) throws Exception { double[][] oldData = getDataArray(); int n = oldData[0].length; if (newData[0].length<=n) { - // pig inform user + // inform user that no new data was found + TFrame frame = trackerPanel!=null? trackerPanel.getTFrame(): null; + JOptionPane.showMessageDialog(frame, + TrackerRes.getString("ParticleDataTrack.Dialog.NoNewData.Message"), //$NON-NLS-1$ + TrackerRes.getString("ParticleDataTrack.Dialog.NoNewData.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); return; } for (int i=0; i * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -77,6 +77,8 @@ abstract public class ParticleModel extends PointMass { protected boolean refreshDerivsLater, refreshStepsLater; protected boolean invalidWarningShown, startFrameUndefined; protected int startFrame, endFrame=Integer.MAX_VALUE; + protected boolean useDefaultReferenceFrame; + protected JMenuItem inspectorItem, useDefaultRefFrameItem; /** * Constructs a ParticleModel. @@ -216,12 +218,19 @@ else if (name.equals("selectedtrack") //$NON-NLS-1$ inspector.setSelectedPanel(getName()); } if (name.equals("function") //$NON-NLS-1$ - || name.equals("transform") //$NON-NLS-1$ || name.equals("starttime") //$NON-NLS-1$ || name.equals("frameduration") //$NON-NLS-1$ || name.equals("startframe") //$NON-NLS-1$ || name.equals("stepsize")) { //$NON-NLS-1$ - lastValidFrame = -1; + lastValidFrame = -1; + } + if (name.equals("transform")) { //$NON-NLS-1$ + // workaround to prevent infinite loop + ImageCoordSystem coords = trackerPanel.getCoords(); + if (!(coords instanceof ReferenceFrame && + ((ReferenceFrame)coords).getOriginTrack()==this)) { + lastValidFrame = -1; + } } if (!refreshing && isModelsVisible()) { if (name.equals("function")) { //$NON-NLS-1$ @@ -237,7 +246,7 @@ else if (name.equals("adjusting")) { //$NON-NLS-1$ // workaround to prevent infinite loop ImageCoordSystem coords = trackerPanel.getCoords(); if (!(coords instanceof ReferenceFrame && - ((ReferenceFrame)coords).getOriginTrack() == this)) { + ((ReferenceFrame)coords).getOriginTrack()==this)) { refreshSteps(); } } @@ -365,24 +374,51 @@ public boolean isStepComplete(int n) { * @return a menu */ public JMenu getMenu(TrackerPanel trackerPanel) { - // create the model inspector item - JMenuItem inspectorItem = new JMenuItem( - TrackerRes.getString("ParticleModel.MenuItem.InspectModel")); //$NON-NLS-1$ - inspectorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - positionInspector(); - getInspector().setVisible(true); - } - }); + if (inspectorItem==null) { + // create the model inspector item + inspectorItem = new JMenuItem(); + inspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + positionInspector(); + getInspector().setVisible(true); + } + }); + // create the useDefaultRefFrameItem item + useDefaultRefFrameItem = new JCheckBoxMenuItem(); + useDefaultRefFrameItem.setSelected(!useDefaultReferenceFrame); + useDefaultRefFrameItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setUseDefaultReferenceFrame(!useDefaultRefFrameItem.isSelected()); + if (ParticleModel.this.trackerPanel.getCoords() instanceof ReferenceFrame) { + lastValidFrame = -1; + refreshSteps(); + } + } + }); + } + inspectorItem.setText(TrackerRes.getString("ParticleModel.MenuItem.InspectModel")); //$NON-NLS-1$ + useDefaultRefFrameItem.setText(TrackerRes.getString("ParticleModel.MenuItem.UseDefaultReferenceFrame")); //$NON-NLS-1$ // assemble the menu JMenu menu = super.getMenu(trackerPanel); // remove unwanted menu items and separators + menu.remove(autotrackItem); + menu.remove(deleteStepItem); + menu.remove(clearStepsItem); menu.remove(lockedItem); menu.remove(autoAdvanceItem); menu.remove(markByDefaultItem); menu.insert(inspectorItem, 0); if (menu.getItemCount() > 1) menu.insertSeparator(1); + +// // find visible item and insert useDefaultRefFrameItem after it +// for (int i=0; i * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/PerspectiveTrack.java b/src/org/opensourcephysics/cabrillo/tracker/PerspectiveTrack.java index 145dfe31..cb2e3056 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PerspectiveTrack.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PerspectiveTrack.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java b/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java index a34d3990..43fb985d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PlotTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/PlotTrackView.java b/src/org/opensourcephysics/cabrillo/tracker/PlotTrackView.java index ab93da00..882a262b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PlotTrackView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PlotTrackView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/PointMass.java b/src/org/opensourcephysics/cabrillo/tracker/PointMass.java index ee80dfc5..9f9bf3b7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PointMass.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PointMass.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -1945,13 +1945,11 @@ public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, boolean xMass = TToolBar.getToolbar(trackerPanel).xMassButton.isSelected(); if (isVelocity(step)) { if (xMass) { - stepValueLabel.setText("p " + n); //$NON-NLS-1$ xLabel.setText("px"); //$NON-NLS-1$ yLabel.setText("py"); //$NON-NLS-1$ magLabel.setText("p"); //$NON-NLS-1$ } else { - stepValueLabel.setText("v " + n); //$NON-NLS-1$ xLabel.setText("vx"); //$NON-NLS-1$ yLabel.setText("vy"); //$NON-NLS-1$ magLabel.setText("v"); //$NON-NLS-1$ @@ -1959,13 +1957,11 @@ public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, } else if (isAcceleration(step)) { if (xMass) { - stepValueLabel.setText("F " + n); //$NON-NLS-1$ xLabel.setText("Fx"); //$NON-NLS-1$ yLabel.setText("Fy"); //$NON-NLS-1$ magLabel.setText("F"); //$NON-NLS-1$ } else { - stepValueLabel.setText("a " + n); //$NON-NLS-1$ xLabel.setText("ax"); //$NON-NLS-1$ yLabel.setText("ay"); //$NON-NLS-1$ magLabel.setText("a"); //$NON-NLS-1$ @@ -1977,7 +1973,6 @@ else if (isAcceleration(step)) { angleField.setEnabled(false); } else { - stepValueLabel.setText("" + n); //$NON-NLS-1$ xLabel.setText("x"); //$NON-NLS-1$ yLabel.setText("y"); //$NON-NLS-1$ magLabel.setText("r"); //$NON-NLS-1$ @@ -1989,7 +1984,6 @@ else if (isAcceleration(step)) { list.add(stepLabel); list.add(stepValueLabel); - list.add(tValueLabel); list.add(tSeparator); list.add(xLabel); list.add(xField); diff --git a/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java index d1c447a7..c2424570 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PointShapeFootprint.java @@ -20,16 +20,18 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.geom.*; + import javax.swing.*; +import org.opensourcephysics.tools.FontSizer; + /** * A PointShapeFootprint returns a shape for a Point[] of length 1. */ @@ -40,7 +42,8 @@ public class PointShapeFootprint implements Footprint, Cloneable { protected Shape shape; protected Shape highlight; protected AffineTransform transform = new AffineTransform(); - protected BasicStroke stroke = new BasicStroke(); + protected BasicStroke baseStroke = new BasicStroke(); + protected BasicStroke stroke; protected Color color = Color.black; protected Shape[] hitShapes = new Shape[1]; protected double defaultWidth = 1; @@ -108,10 +111,13 @@ public int getLength() { * @return the icon */ public Icon getIcon(int w, int h) { - Shape shape = getShape(new Point[] {new Point()}); - ShapeIcon icon = new ShapeIcon(shape, w, h); - icon.setColor(color); - return icon; + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; + Shape shape = getShape(new Point[] {new Point()}); + ShapeIcon icon = new ShapeIcon(shape, w, h); + icon.setColor(color); + return icon; } /** @@ -157,7 +163,7 @@ public Shape[] getHitShapes() { * @param stroke the desired stroke */ public void setStroke(BasicStroke stroke) { - this.stroke = stroke; + baseStroke = stroke; if (stroke != null) { defaultWidth = stroke.getLineWidth(); } @@ -169,7 +175,7 @@ public void setStroke(BasicStroke stroke) { * @return the stroke */ public BasicStroke getStroke() { - return stroke; + return baseStroke; } /** @@ -178,13 +184,13 @@ public BasicStroke getStroke() { * @param w the desired line width */ public void setLineWidth(double w) { - if (stroke == null) return; - stroke = new BasicStroke((float)w, + if (baseStroke == null) return; + baseStroke = new BasicStroke((float)w, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, - stroke.getDashArray(), - stroke.getDashPhase()); + baseStroke.getDashArray(), + baseStroke.getDashPhase()); } /** @@ -214,10 +220,18 @@ public Color getColor() { public Shape getShape(Point[] points) { Point p = points[0]; transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } Shape transformedShape = transform.createTransformedShape(shape); highlight = transform.createTransformedShape(HIGHLIGHT); - if (stroke != null) + if (baseStroke != null) { + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } transformedShape = stroke.createStrokedShape(transformedShape); + } hitShapes[0] = transformedShape; return transformedShape; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/PositionStep.java b/src/org/opensourcephysics/cabrillo/tracker/PositionStep.java index 449b314b..c4ab0928 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PositionStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PositionStep.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -32,6 +32,7 @@ import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; import java.util.*; @@ -204,6 +205,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { } else { transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } final Color color = footprint.getColor(); final Shape selectedShape = transform.createTransformedShape(selectionShape); diff --git a/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java index 8788fadb..08dbf2c3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PositionVectorFootprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -52,7 +52,7 @@ public PositionVectorFootprint(TTrack track, String name, int w) { this.track = track; arrow = (LineFootprint)LineFootprint.getFootprint("Footprint.Arrow"); //$NON-NLS-1$ arrow.setLineWidth(w); - stroke = null; + baseStroke = null; } /** diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index e84f857f..12ce3459 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -77,21 +77,21 @@ public class PrefsDialog extends JDialog { protected JPanel mainButtonBar; protected JTabbedPane tabbedPane; protected JPanel configPanel, runtimePanel, videoPanel, generalPanel, - displayPanel; + displayPanel; protected TitledBorder checkPanelBorder, lfSubPanelBorder, langSubPanelBorder, hintsSubPanelBorder, - unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, - videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, - cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder; + unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, + videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, + cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder; protected IntegerField memoryField; protected JLabel memoryLabel, recentSizeLabel, lookFeelLabel, cacheLabel, - versionLabel, runLabel; + versionLabel, runLabel; protected JCheckBox defaultMemoryCheckbox, hintsCheckbox, vidWarningCheckbox, - ffmpegErrorCheckbox, variableDurationCheckBox; + ffmpegErrorCheckbox, variableDurationCheckBox; protected int memorySize = Tracker.requestedMemorySize; protected JSpinner recentSizeSpinner, runSpinner; protected JComboBox lookFeelDropdown, languageDropdown, jreDropdown, - checkForUpgradeDropdown, versionDropdown, logLevelDropdown, fontSizeDropdown; + checkForUpgradeDropdown, versionDropdown, logLevelDropdown, fontSizeDropdown; protected JRadioButton vm32Button, vm64Button; protected JRadioButton ffmpegButton, qtButton, noEngineButton; protected JRadioButton radiansButton, degreesButton; @@ -100,13 +100,15 @@ public class PrefsDialog extends JDialog { protected String recent32bitVM, recent64bitVM; protected String recentEngine; private boolean refreshing = false; + protected boolean relaunching = false; // previous values protected Set prevEnabled = new TreeSet(); protected int prevMemory, prevRecentCount, prevUpgradeInterval, prevFontLevel; protected String prevLookFeel, prevLocaleName, prevJRE, prevTrackerJar, prevEngine; protected boolean prevHints, prevRadians, prevFastVideo, - prevWarnNoVideoEngine, prevWarnFFMPegError, prevClearCacheOnExit, prevUse32BitVM, prevWarnCopyFailed; + prevWarnNoVideoEngine, prevWarnFFMPegError, + prevClearCacheOnExit, prevUse32BitVM, prevWarnCopyFailed; protected File prevCache; protected String[] prevExecutables; @@ -114,13 +116,13 @@ public class PrefsDialog extends JDialog { static { trackerJarFilter = new org.opensourcephysics.cabrillo.tracker.deploy.TrackerJarFilter(); try { - userHome = System.getProperty("user.home"); //$NON-NLS-1$ + userHome = System.getProperty("user.home"); //$NON-NLS-1$ javaHome = System.getProperty("java.home"); //$NON-NLS-1$ - URL url = TrackerStarter.class.getProtectionDomain().getCodeSource().getLocation(); -// File jarFile = new File(url.getPath()); - File jarFile = new File(url.toURI()); - codeBaseDir = jarFile.getParentFile(); - } + URL url = TrackerStarter.class.getProtectionDomain().getCodeSource().getLocation(); +// File jarFile = new File(url.getPath()); + File jarFile = new File(url.toURI()); + codeBaseDir = jarFile.getParentFile(); + } catch (Exception ex) {} } @@ -152,13 +154,13 @@ public void setVisible(boolean vis) { public void setFontLevel(int level) { FontSizer.setFonts(this, level); - Object[] borders = new Object[] { - checkPanelBorder, lfSubPanelBorder, langSubPanelBorder, hintsSubPanelBorder, - unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, - videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, - cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder}; - FontSizer.setFonts(borders, level); - JComboBox[] dropdowns = new JComboBox[] {lookFeelDropdown, languageDropdown, + Object[] borders = new Object[] { + checkPanelBorder, lfSubPanelBorder, langSubPanelBorder, hintsSubPanelBorder, + unitsSubPanelBorder, versionSubPanelBorder, jreSubPanelBorder, memorySubPanelBorder, runSubPanelBorder, + videoTypeSubPanelBorder, videoSpeedSubPanelBorder, warningsSubPanelBorder, recentSubPanelBorder, + cacheSubPanelBorder, logLevelSubPanelBorder, upgradeSubPanelBorder, fontSubPanelBorder}; + FontSizer.setFonts(borders, level); + JComboBox[] dropdowns = new JComboBox[] {lookFeelDropdown, languageDropdown, jreDropdown, checkForUpgradeDropdown, versionDropdown, logLevelDropdown}; for (JComboBox next: dropdowns) { int n = next.getSelectedIndex(); @@ -405,14 +407,18 @@ else for (Locale next: Tracker.locales) { fontSizeDropdown = new JComboBox(); String defaultLevel = TrackerRes.getString("TMenuBar.MenuItem.DefaultFontSize"); //$NON-NLS-1$ fontSizeDropdown.addItem(defaultLevel); - for (int i=1; i<4; i++) { + int preferredLevel = Tracker.preferredFontLevel + Tracker.preferredFontLevelPlus; + int maxLevel = Math.max(preferredLevel, 6); + for (int i=1; i<=maxLevel; i++) { String s = "+"+i; //$NON-NLS-1$ fontSizeDropdown.addItem(s); } - fontSizeDropdown.setSelectedIndex(Tracker.preferredFontLevel); + fontSizeDropdown.setSelectedIndex(preferredLevel); fontSizeDropdown.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { - Tracker.preferredFontLevel = fontSizeDropdown.getSelectedIndex(); + int preferredLevel = fontSizeDropdown.getSelectedIndex(); + Tracker.preferredFontLevel = Math.min(preferredLevel, 3); + Tracker.preferredFontLevelPlus = preferredLevel - Tracker.preferredFontLevel; } }); fontSubPanel.add(fontSizeDropdown); @@ -559,18 +565,18 @@ else if (OSPRuntime.isWindows()) { vm64Button.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); vm64Button.setSelected(vmBitness==64); vm64Button.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if (!vm64Button.isSelected()) return; + public void itemStateChanged(ItemEvent e) { + if (!vm64Button.isSelected()) return; - if (OSPRuntime.isMac()) { - Tracker.use32BitMode = false; - refreshJREDropdown(64); - if (ffmpegButton.isSelected() || noEngineButton.isSelected()) return; - // if no ffmpeg engine, show warning - if (!ffmpegButton.isSelected()) { - int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message2")+"\n\n"+ //$NON-NLS-1$ //$NON-NLS-2$ + if (OSPRuntime.isMac()) { + Tracker.use32BitMode = false; + refreshJREDropdown(64); + if (ffmpegButton.isSelected() || noEngineButton.isSelected()) return; + // if no ffmpeg engine, show warning + if (!ffmpegButton.isSelected()) { + int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message2")+"\n\n"+ //$NON-NLS-1$ //$NON-NLS-2$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Question"), //$NON-NLS-1$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Title"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null); @@ -579,31 +585,31 @@ public void itemStateChanged(ItemEvent e) { } else { vm32Button.setSelected(true); // revert to 32-bit VM - } - return; - } - // set engine to FFMPeg and inform user - int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchTo64.Message"), //$NON-NLS-1$ + } + return; + } + // set engine to FFMPeg and inform user + int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.SwitchTo64.Message"), //$NON-NLS-1$ TrackerRes.getString("PrefsDialog.Dialog.SwitchEngine.Title"), //$NON-NLS-1$ JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null); if(selected==JOptionPane.OK_OPTION) { - ffmpegButton.setSelected(true); + ffmpegButton.setSelected(true); } else { - Tracker.use32BitMode = true; + Tracker.use32BitMode = true; vm32Button.setSelected(true); } - } - else if (OSPRuntime.isWindows()) { - refreshJREDropdown(64); - if (ffmpegButton.isSelected()) return; - if (noEngineButton.isSelected()) return; - // if no ffmpeg engine, show warning - if (!ffmpegButton.isSelected()) { - // inform that no engine available in 64-bit VM - int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ + } + else if (OSPRuntime.isWindows()) { + refreshJREDropdown(64); + if (ffmpegButton.isSelected()) return; + if (noEngineButton.isSelected()) return; + // if no ffmpeg engine, show warning + if (!ffmpegButton.isSelected()) { + // inform that no engine available in 64-bit VM + int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message1")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Message2")+"\n\n"+ //$NON-NLS-1$ //$NON-NLS-2$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Question"), //$NON-NLS-1$ TrackerRes.getString("PrefsDialog.Dialog.NoEngineIn64bitVM.Title"), //$NON-NLS-1$ @@ -613,35 +619,35 @@ else if (OSPRuntime.isWindows()) { } else { vm32Button.setSelected(true); // revert to 32-bit VM - } - return; - } - // set engine to ffmpeg and inform user - ffmpegButton.setSelected(true); - JOptionPane.showMessageDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg.Message"), //$NON-NLS-1$ + } + return; + } + // set engine to FFMPeg and inform user + ffmpegButton.setSelected(true); + JOptionPane.showMessageDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg.Message"), //$NON-NLS-1$ TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg.Title"), //$NON-NLS-1$ JOptionPane.INFORMATION_MESSAGE); - } - } + } + } }); jreNorthPanel.add(vm64Button); jreDropdown = new JComboBox(); String pref = Tracker.preferredJRE; if (pref==null && vm64Button.isSelected()) { - pref = Tracker.preferredJRE64; + pref = Tracker.preferredJRE64; } if (pref==null && vm32Button.isSelected()) { - pref = Tracker.preferredJRE32; + pref = Tracker.preferredJRE32; } if (pref==null) { - pref = System.getProperty("java.home"); //$NON-NLS-1$ + pref = System.getProperty("java.home"); //$NON-NLS-1$ } jreDropdown.addItem(pref); jreDropdown.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - if (refreshing) return; + public void itemStateChanged(ItemEvent e) { + if (refreshing) return; Object selected = jreDropdown.getSelectedItem(); if (selected==null) return; if (vm64Button.isSelected()) { @@ -902,40 +908,68 @@ public void actionPerformed(ActionEvent e) { box.add(videoTypeSubPanel); videoTypeSubPanel.setBackground(color); videoTypeSubPanelBorder = BorderFactory.createTitledBorder( - TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ videoTypeSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoTypeSubPanelBorder)); - boolean ffmpegInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_FFMPEG); + boolean xuggleInstalled = VideoIO.isEngineInstalled(VideoIO.ENGINE_FFMPEG); ffmpegButton = new JRadioButton(); ffmpegButton.setOpaque(false); ffmpegButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); ffmpegButton.addItemListener(new ItemListener() { - public void itemStateChanged(ItemEvent e) { - videoFastButton.setEnabled(ffmpegButton.isSelected()); - videoSlowButton.setEnabled(ffmpegButton.isSelected()); - ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); - if (!ffmpegButton.isSelected()) return; - Tracker.engineKnown = true; - // OSX: if 32-bit, set preferred VM to 64-bit and inform user - if (OSPRuntime.isMac() && vm32Button.isSelected()) { - int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), - TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg64.Message"), //$NON-NLS-1$ - TrackerRes.getString("PrefsDialog.Dialog.SwitchVM.Title"), //$NON-NLS-1$ - JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null); - if(selected==JOptionPane.OK_OPTION) { - vm64Button.setSelected(true); // triggers selection of default or recent 64-bit VM - } - else { - // revert to previous engine - if (recentEngine.equals(VideoIO.ENGINE_QUICKTIME)) { - qtButton.setSelected(true); - } - else if (recentEngine.equals(VideoIO.ENGINE_NONE)) { - noEngineButton.setSelected(true); - } - } - } - } + public void itemStateChanged(ItemEvent e) { + videoFastButton.setEnabled(ffmpegButton.isSelected()); + videoSlowButton.setEnabled(ffmpegButton.isSelected()); + ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); + if (!ffmpegButton.isSelected()) return; + Tracker.engineKnown = true; + // OSX: if 32-bit, set preferred VM to 64-bit and inform user + if (OSPRuntime.isMac() && vm32Button.isSelected()) { + int selected = JOptionPane.showConfirmDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg64.Message"), //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.Dialog.SwitchVM.Title"), //$NON-NLS-1$ + JOptionPane.OK_CANCEL_OPTION, JOptionPane.INFORMATION_MESSAGE, null); + if(selected==JOptionPane.OK_OPTION) { + vm64Button.setSelected(true); // triggers selection of default or recent 64-bit VM + } + else { + // revert to previous engine + if (recentEngine.equals(VideoIO.ENGINE_QUICKTIME)) { + qtButton.setSelected(true); + } + else if (recentEngine.equals(VideoIO.ENGINE_NONE)) { + noEngineButton.setSelected(true); + } + } + } + // Windows: if ffmpeg and 64-bit, set preferred VM to 32-bit and inform user + else if (OSPRuntime.isWindows() && vm64Button.isSelected()) { + boolean has32BitVM = ExtensionsManager.getManager().getDefaultJRE(32)!=null; + if (has32BitVM) { + vm32Button.setSelected(true); + JOptionPane.showMessageDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.SwitchToFFMPeg32.Message"), //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.Dialog.SwitchVM.Title"), //$NON-NLS-1$ + JOptionPane.INFORMATION_MESSAGE); + } + else { // help user download 32-bit VM + Object[] options = new Object[] { + TrackerRes.getString("PrefsDialog.Button.ShowHelpNow"), //$NON-NLS-1$ + TrackerRes.getString("Dialog.Button.OK")}; //$NON-NLS-1$ + int response = JOptionPane.showOptionDialog(trackerPanel.getTFrame(), + TrackerRes.getString("PrefsDialog.Dialog.No32bitVMFFMPeg.Message")+"\n"+ //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("PrefsDialog.Dialog.No32bitVM.Message"), //$NON-NLS-1$ + TrackerRes.getString("PrefsDialog.Dialog.No32bitVM.Title"), //$NON-NLS-1$ + JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); + noEngineButton.setSelected(true); + if (response==0) { + trackerPanel.getTFrame().showHelp("install", 0); //$NON-NLS-1$ + } + } + } + if (xuggleButton.isSelected()) { + recentEngine = VideoIO.ENGINE_FFMPEG; + } + } }); ffmpegButton.setEnabled(ffmpegInstalled); @@ -958,12 +992,12 @@ public void itemStateChanged(ItemEvent e) { vm32Button.setSelected(true); // triggers selection of default or recent 32-bit VM } else { - // revert to previous engine - if (recentEngine.equals(VideoIO.ENGINE_FFMPEG)) { - ffmpegButton.setSelected(true); - } - else if (recentEngine.equals(VideoIO.ENGINE_NONE)) { - noEngineButton.setSelected(true); + // revert to previous engine + if (recentEngine.equals(VideoIO.ENGINE_FFMPEG)) { + ffmpegButton.setSelected(true); + } + else if (recentEngine.equals(VideoIO.ENGINE_NONE)) { + noEngineButton.setSelected(true); } } } @@ -997,7 +1031,7 @@ public void itemStateChanged(ItemEvent e) { recentEngine = VideoIO.ENGINE_NONE; VideoIO.setEngine(VideoIO.ENGINE_NONE); Tracker.engineKnown = true; - } + } }); videoTypeSubPanel.add(ffmpegButton); @@ -1009,20 +1043,20 @@ public void itemStateChanged(ItemEvent e) { box.add(videoSpeedSubPanel); videoSpeedSubPanel.setBackground(color); videoSpeedSubPanelBorder = BorderFactory.createTitledBorder( - TrackerRes.getString("PrefsDialog.Video.Speed.BorderTitle")); //$NON-NLS-1$ - if (!ffmpegInstalled) - videoSpeedSubPanelBorder.setTitleColor(new Color(153, 153, 153)); - videoSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoSpeedSubPanelBorder)); + TrackerRes.getString("PrefsDialog.FFMPeg.Speed.BorderTitle")); //$NON-NLS-1$ + if (!xuggleInstalled) + ffmpegSpeedSubPanelBorder.setTitleColor(new Color(153, 153, 153)); + ffmpegSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, ffmpegSpeedSubPanelBorder)); buttonGroup = new ButtonGroup(); videoFastButton = new JRadioButton(); videoFastButton.setOpaque(false); videoFastButton.setBorder(BorderFactory.createEmptyBorder(2, 0, 2, 10)); - videoFastButton.setSelected((ffmpegInstalled) && Tracker.isVideoFast); + videoFastButton.setSelected(ffmpegInstalled && Tracker.isVideoFast); buttonGroup.add(videoFastButton); videoSlowButton = new JRadioButton(); videoSlowButton.setOpaque(false); videoSlowButton.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 0)); - videoSlowButton.setSelected((ffmpegInstalled) && !Tracker.isVideoFast); + videoSlowButton.setSelected(ffmpegInstalled && !Tracker.isVideoFast); buttonGroup.add(videoSlowButton); videoSpeedSubPanel.add(videoFastButton); videoSpeedSubPanel.add(videoSlowButton); @@ -1033,7 +1067,7 @@ public void itemStateChanged(ItemEvent e) { vidWarningCheckbox.setSelected(Tracker.warnNoVideoEngine); vidWarningCheckbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Tracker.warnNoVideoEngine = vidWarningCheckbox.isSelected(); + Tracker.warnNoVideoEngine = vidWarningCheckbox.isSelected(); } }); ffmpegErrorCheckbox = new JCheckBox(); @@ -1041,7 +1075,7 @@ public void actionPerformed(ActionEvent e) { ffmpegErrorCheckbox.setSelected(Tracker.warnFFMPegError); ffmpegErrorCheckbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Tracker.warnFFMPegError = ffmpegErrorCheckbox.isSelected(); + Tracker.warnFFMPegError = ffmpegErrorCheckbox.isSelected(); } }); variableDurationCheckBox = new JCheckBox(); @@ -1069,19 +1103,19 @@ public void actionPerformed(ActionEvent e) { centerSouthPanel.add(warningsCenterPanel, BorderLayout.NORTH); centerSouthPanel.add(warningsSouthPanel, BorderLayout.CENTER); warningsSubPanel.add(centerSouthPanel, BorderLayout.CENTER); - + warningsNorthPanel.add(vidWarningCheckbox); warningsNorthPanel.add(variableDurationCheckBox); warningsCenterPanel.add(ffmpegErrorCheckbox); // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg buttons if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME) - && VideoIO.getVideoType("QT", null)!=null) { //$NON-NLS-1$ - qtButton.setSelected(true); + && VideoIO.getVideoType("QT", null)!=null) { //$NON-NLS-1$ + qtButton.setSelected(true); } else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) - && VideoIO.getVideoType("FFMPeg", null)!=null) { //$NON-NLS-1$ - ffmpegButton.setSelected(true); + && VideoIO.getVideoType("FFMPeg", null)!=null) { //$NON-NLS-1$ + ffmpegButton.setSelected(true); } else noEngineButton.setSelected(true); @@ -1250,7 +1284,7 @@ public void actionPerformed(ActionEvent e) { checkForUpgradeButton = new JButton(); checkForUpgradeButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { - Tracker.loadCurrentVersion(true); + Tracker.loadCurrentVersion(true, false); Tracker.lastMillisChecked = System.currentTimeMillis(); if (trackerPanel!=null) TTrackBar.getTrackbar(trackerPanel).refresh(); String message = TrackerRes.getString("PrefsDialog.Dialog.NewVersion.None.Message"); //$NON-NLS-1$ @@ -1369,17 +1403,17 @@ public void stateChanged(ChangeEvent e) { videoSlowButton.setEnabled(ffmpegButton.isSelected()); ffmpegErrorCheckbox.setEnabled(ffmpegButton.isSelected()); if (OSPRuntime.isWindows()) { - Runnable runner = new Runnable() { - public void run() { - vm32Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(32).isEmpty()); - vm64Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(64).isEmpty()); - } - }; - new Thread(runner).start(); + Runnable runner = new Runnable() { + public void run() { + vm32Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(32).isEmpty()); + vm64Button.setEnabled(!ExtensionsManager.getManager().getPublicJREs(64).isEmpty()); + } + }; + new Thread(runner).start(); } else if (OSPRuntime.isLinux()) { - int bitness = OSPRuntime.getVMBitness(); - vm32Button.setEnabled(bitness==32); + int bitness = OSPRuntime.getVMBitness(); + vm32Button.setEnabled(bitness==32); vm64Button.setEnabled(bitness==64); } refreshGUI(); @@ -1392,18 +1426,18 @@ private void savePrevious() { prevLookFeel = Tracker.lookAndFeel; prevRecentCount = Tracker.recentFilesSize; prevLocaleName = Tracker.preferredLocale; - prevFontLevel = Tracker.preferredFontLevel; - prevHints = Tracker.showHintsByDefault; - prevRadians = Tracker.isRadians; - prevFastVideo = Tracker.isVideoFast; - prevJRE = Tracker.preferredJRE; - prevTrackerJar = Tracker.preferredTrackerJar; - prevExecutables = Tracker.prelaunchExecutables; - prevWarnNoVideoEngine = Tracker.warnNoVideoEngine; - prevWarnFFMPegError = Tracker.warnFFMPegError; - prevCache = ResourceLoader.getOSPCache(); - prevUpgradeInterval = Tracker.checkForUpgradeInterval; - prevUse32BitVM = Tracker.use32BitMode; + prevFontLevel = Tracker.preferredFontLevel; + prevHints = Tracker.showHintsByDefault; + prevRadians = Tracker.isRadians; + prevFastVideo = Tracker.isVideoFast; + prevJRE = Tracker.preferredJRE; + prevTrackerJar = Tracker.preferredTrackerJar; + prevExecutables = Tracker.prelaunchExecutables; + prevWarnNoVideoEngine = Tracker.warnNoVideoEngine; + prevWarnFFMPegError = Tracker.warnFFMPegError; + prevCache = ResourceLoader.getOSPCache(); + prevUpgradeInterval = Tracker.checkForUpgradeInterval; + prevUse32BitVM = Tracker.use32BitMode; prevEngine = VideoIO.getEngine(); recentEngine = VideoIO.getEngine(); } @@ -1414,18 +1448,18 @@ private void revert() { Tracker.lookAndFeel = prevLookFeel; Tracker.recentFilesSize = prevRecentCount; Tracker.setPreferredLocale(prevLocaleName); - Tracker.preferredFontLevel = prevFontLevel; - Tracker.showHintsByDefault = prevHints; - Tracker.isRadians = prevRadians; - Tracker.isVideoFast = prevFastVideo; - Tracker.preferredJRE = prevJRE; - Tracker.preferredTrackerJar = prevTrackerJar; - Tracker.prelaunchExecutables = prevExecutables; - Tracker.warnNoVideoEngine = prevWarnNoVideoEngine; - Tracker.warnFFMPegError = prevWarnFFMPegError; - ResourceLoader.setOSPCache(prevCache); - Tracker.checkForUpgradeInterval = prevUpgradeInterval; - Tracker.use32BitMode = prevUse32BitVM; + Tracker.preferredFontLevel = prevFontLevel; + Tracker.showHintsByDefault = prevHints; + Tracker.isRadians = prevRadians; + Tracker.isVideoFast = prevFastVideo; + Tracker.preferredJRE = prevJRE; + Tracker.preferredTrackerJar = prevTrackerJar; + Tracker.prelaunchExecutables = prevExecutables; + Tracker.warnNoVideoEngine = prevWarnNoVideoEngine; + Tracker.warnFFMPegError = prevWarnFFMPegError; + ResourceLoader.setOSPCache(prevCache); + Tracker.checkForUpgradeInterval = prevUpgradeInterval; + Tracker.use32BitMode = prevUse32BitVM; // reset JRE dropdown to initial state int vmBitness = OSPRuntime.getVMBitness(); if (vmBitness==32) { @@ -1480,7 +1514,7 @@ protected void refreshGUI() { vm64Button.setText(TrackerRes.getString("PrefsDialog.Checkbox.64BitVM")); //$NON-NLS-1$ ffmpegButton.setText(TrackerRes.getString("PrefsDialog.Button.FFMPeg")); //$NON-NLS-1$ qtButton.setText(TrackerRes.getString("PrefsDialog.Button.QT")); //$NON-NLS-1$ - noEngineButton.setText(TrackerRes.getString("PrefsDialog.Button.NoEngine")); //$NON-NLS-1$ + noEngineButton.setText(TrackerRes.getString("PrefsDialog.Button.NoEngine")); //$NON-NLS-1$ radiansButton.setText(TrackerRes.getString("TMenuBar.MenuItem.Radians")); //$NON-NLS-1$ degreesButton.setText(TrackerRes.getString("TMenuBar.MenuItem.Degrees")); //$NON-NLS-1$ videoFastButton.setText(TrackerRes.getString("PrefsDialog.Video.Fast")); //$NON-NLS-1$ @@ -1501,62 +1535,69 @@ protected void refreshGUI() { private void refreshJREDropdown(final int vmBitness) { // refresh JRE dropdown in background thread - Runnable runner = new Runnable() { - public void run() { - while (!ExtensionsManager.isReady()) { - try { - Thread.sleep(200); - } catch (InterruptedException e) { - } - } - Runnable refresher = new Runnable() { - public void run() { - refreshing = true; // suppresses dropdown actions - // replace items in dropdown - jreDropdown.removeAllItems(); - ExtensionsManager manager = ExtensionsManager.getManager(); - Set availableJREs = manager.getAllJREs(vmBitness); - for (String next: availableJREs) { - jreDropdown.addItem(next); - } - - // set selected item - String selectedItem = null; - if (vmBitness==32 && recent32bitVM!=null) { - selectedItem = recent32bitVM; - } - else if (vmBitness==64 && recent64bitVM!=null) { - selectedItem = recent64bitVM; - } - if (selectedItem==null) { - selectedItem = Tracker.preferredJRE; - if (selectedItem==null || !availableJREs.contains(selectedItem)) { - selectedItem = vmBitness==32? Tracker.preferredJRE32: Tracker.preferredJRE64; - if (selectedItem==null || !availableJREs.contains(selectedItem)) { - selectedItem = manager.getDefaultJRE(vmBitness); - } - } - } - jreDropdown.setSelectedItem(selectedItem); + Runnable runner = new Runnable() { + public void run() { + while (!ExtensionsManager.isReady()) { + try { + Thread.sleep(200); + } catch (InterruptedException e) { + } + } + Runnable refresher = new Runnable() { + public void run() { + refreshing = true; // suppresses dropdown actions + // replace items in dropdown + jreDropdown.removeAllItems(); + ExtensionsManager manager = ExtensionsManager.getManager(); + Set availableJREs = manager.getAllJREs(vmBitness); + for (String next: availableJREs) { + jreDropdown.addItem(next); + } + + // set selected item + String selectedItem = null; + if (vmBitness==32 && recent32bitVM!=null) { + selectedItem = recent32bitVM; + } + else if (vmBitness==64 && recent64bitVM!=null) { + selectedItem = recent64bitVM; + } + if (selectedItem==null) { + selectedItem = Tracker.preferredJRE; + if (selectedItem==null || !availableJREs.contains(selectedItem)) { + selectedItem = vmBitness==32? Tracker.preferredJRE32: Tracker.preferredJRE64; + if (selectedItem==null || !availableJREs.contains(selectedItem)) { + selectedItem = manager.getDefaultJRE(vmBitness); + } + } + } + jreDropdown.setSelectedItem(selectedItem); - // save selected item for future refreshing - if (vmBitness==32) { - recent32bitVM = selectedItem; - } - else { - recent64bitVM = selectedItem; - } - refreshing = false; - } - }; - SwingUtilities.invokeLater(refresher); - } - }; - new Thread(runner).start(); + // save selected item for future refreshing + if (vmBitness==32) { + recent32bitVM = selectedItem; + } + else { + recent64bitVM = selectedItem; + } + refreshing = false; + if (vmBitness==32 && relaunching) { + // check that not canceled by user + if (!"cancel".equals(vm32Button.getName())) { //$NON-NLS-1$ + relaunching = false; + relaunchButton.doClick(0); + } + } + } + }; + SwingUtilities.invokeLater(refresher); + } + }; + new Thread(runner).start(); } private void refreshTextFields() { - // run field + // run field int n = (Integer)runSpinner.getValue(); if (Tracker.prelaunchExecutables.length>n && Tracker.prelaunchExecutables[n]!=null) { @@ -1620,20 +1661,20 @@ private void applyPrefs() { if (ExtensionsManager.getManager().is32BitVM(Tracker.preferredJRE)) { Tracker.preferredJRE32 = Tracker.preferredJRE; } - else Tracker.preferredJRE64 = Tracker.preferredJRE; - } - // video engine - if (ffmpegButton.isSelected() && ffmpegButton.isEnabled()) { - VideoIO.setEngine(VideoIO.ENGINE_FFMPEG); - } - else if (qtButton.isSelected() && qtButton.isEnabled()) { - VideoIO.setEngine(VideoIO.ENGINE_QUICKTIME); + else Tracker.preferredJRE64 = Tracker.preferredJRE; } - else VideoIO.setEngine(VideoIO.ENGINE_NONE); - + // video engine + if (ffmpegButton.isSelected() && ffmpegButton.isEnabled()) { + VideoIO.setEngine(VideoIO.ENGINE_FFMPEG); + } + else if (qtButton.isSelected() && qtButton.isEnabled()) { + VideoIO.setEngine(VideoIO.ENGINE_QUICKTIME); + } + else VideoIO.setEngine(VideoIO.ENGINE_NONE); + Tracker.isRadians = radiansButton.isSelected(); - Tracker.isVideoFast = videoFastButton.isSelected(); - if (frame!=null) frame.setAnglesInRadians(Tracker.isRadians); + Tracker.isVideoFast = ffmpegFastButton.isSelected(); + if (frame!=null) frame.setAnglesInRadians(Tracker.isRadians); // save the tracker and tracker_starter preferences String path = Tracker.savePreferences(); if (path!=null) @@ -1689,7 +1730,7 @@ protected void updateDisplay() { ffmpegErrorCheckbox.setSelected(Tracker.warnFFMPegError); // locale for (Locale next: Tracker.locales) { - if (next.equals(Locale.getDefault())) { + if (next.equals(Locale.getDefault())) { languageDropdown.setSelectedItem(OSPRuntime.getDisplayLanguage(next)); break; } @@ -1704,7 +1745,9 @@ protected void updateDisplay() { break; } } - versionDropdown.setSelectedIndex(selected); + if (versionDropdown.getItemCount()>selected) { + versionDropdown.setSelectedIndex(selected); + } // VM dropdown selected = 0; @@ -1715,7 +1758,9 @@ protected void updateDisplay() { break; } } - jreDropdown.setSelectedIndex(selected); + if (jreDropdown.getItemCount()>selected) { + jreDropdown.setSelectedIndex(selected); + } // log level selected = 0; @@ -1728,7 +1773,9 @@ protected void updateDisplay() { } } } - logLevelDropdown.setSelectedIndex(selected); + if (logLevelDropdown.getItemCount()>selected) { + logLevelDropdown.setSelectedIndex(selected); + } // checkForUpgrade selected = 0; @@ -1739,17 +1786,19 @@ protected void updateDisplay() { break; } } - checkForUpgradeDropdown.setSelectedIndex(selected); + if (checkForUpgradeDropdown.getItemCount()>selected) { + checkForUpgradeDropdown.setSelectedIndex(selected); + } // video if (VideoIO.getEngine().equals(VideoIO.ENGINE_QUICKTIME)) { - qtButton.setSelected(true); + qtButton.setSelected(true); } else if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG)) { - ffmpegButton.setSelected(true); + ffmpegButton.setSelected(true); } - qtButton.setEnabled(true); + qtButton.setEnabled(true); vm32Button.setEnabled(true); // // if running OSX version 10.10 or later, disable 32-bit VM and QuickTime buttons // if (OSPRuntime.isMac()) { @@ -1788,6 +1837,14 @@ private void setTabTitle(JPanel tab, String title) { } } + /** + * Relaunches after changing preferred VM to 32-bit + */ + protected void relaunch32Bit() { + relaunching = true; + vm32Button.setSelected(true); // also sets default video engine + } + /** * Gets the total size of a folder. * diff --git a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java index 610c861b..1bd28c20 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PropertiesDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Protractor.java b/src/org/opensourcephysics/cabrillo/tracker/Protractor.java index 2ed42860..96feffe5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Protractor.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Protractor.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java b/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java index 26f4bb4d..1405fa46 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ProtractorFootprint.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -36,6 +36,8 @@ import javax.swing.Icon; +import org.opensourcephysics.tools.FontSizer; + /** * A ProtractorFootprint returns a pair of lines that meet at a vertex * at one end and have a specified end shape at the other. @@ -62,17 +64,15 @@ public class ProtractorFootprint implements Footprint, Cloneable { private static AffineTransform transform = new AffineTransform(); private static Arc2D arc = new Arc2D.Double(-arcRadius, -arcRadius, 2*arcRadius, 2*arcRadius, 0, 0, Arc2D.OPEN); - private static BasicStroke arcStroke = new BasicStroke(); - // instance fields protected String name; - protected BasicStroke stroke; + protected BasicStroke baseStroke, stroke; protected Color color = Color.black; protected Shape[] hitShapes = new Shape[6]; protected Shape circle; protected int radius; - private Stroke arcAdjustStroke; + private Stroke arcStroke, arcAdjustStroke; /** * Constructs a ProtractorFootprint. @@ -122,13 +122,28 @@ public int getLength() { * @return the icon */ public Icon getIcon(int w, int h) { - Shape shape = stroke.createStrokedShape(circle); + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; + transform.setToScale(scale, scale); + Shape shape = transform.createTransformedShape(circle); + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + arcStroke = new BasicStroke(scale); + arcAdjustStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + DOTTED_LINE, + stroke.getDashPhase()); + } + shape = stroke.createStrokedShape(shape); Area area = new Area(shape); - double x0 = radius-w+2; - double y0 = h-radius-2; + double x0 = scale*(radius+2)-w; + double y0 = h-scale*(radius+2); double d = Math.sqrt(x0*x0+y0*y0); - double x1 = x0*radius/d; - double y1 = y0*radius/d; + double x1 = x0*scale*radius/d; + double y1 = y0*scale*radius/d; Line2D line = new Line2D.Double(x0, y0, x1, y1); area.add(new Area(stroke.createStrokedShape(line))); line.setLine(x0, y0, radius-2, y0); @@ -179,7 +194,7 @@ public Shape[] getHitShapes() { */ public void setStroke(BasicStroke stroke) { if (stroke == null) return; - this.stroke = new BasicStroke(stroke.getLineWidth(), + baseStroke = new BasicStroke(stroke.getLineWidth(), BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 8, @@ -199,7 +214,7 @@ public void setStroke(BasicStroke stroke) { * @return the stroke */ public BasicStroke getStroke() { - return stroke; + return baseStroke; } /** @@ -228,8 +243,12 @@ public Color getColor() { */ public Shape getCircleShape(Point p) { transform.setToTranslation(p.x, p.y); - Shape shape = stroke.createStrokedShape(circle); - shape = transform.createTransformedShape(shape); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } + Shape shape = transform.createTransformedShape(circle); + shape = stroke.createStrokedShape(shape); return shape; } @@ -243,8 +262,9 @@ public Shape getCircleShape(Point p) { */ public Shape getArcAdjustShape(Point vertex, Point rotator) { double theta = Math.toRadians(arc.getAngleStart()+arc.getAngleExtent()/2); - p.x = (int)Math.round(vertex.x + arcRadius*Math.cos(theta)); - p.y = (int)Math.round(vertex.y - arcRadius*Math.sin(theta)); + int scale = FontSizer.getIntegerFactor(); + p.x = (int)Math.round(vertex.x + scale*arcRadius*Math.cos(theta)); + p.y = (int)Math.round(vertex.y - scale*arcRadius*Math.sin(theta)); Shape circle = getCircleShape(p); Area area = new Area(circle); if (rotator!=null) { @@ -268,7 +288,8 @@ public Shape getShape(Point[] points) { Point vertex = points[0]; Point end1 = points[1]; Point end2 = points[2]; - int r = circle.getBounds().width/2; + int scale = FontSizer.getIntegerFactor(); + int r = scale*circle.getBounds().width/2; // line1 and line2 shapes line1.setLine(vertex, end1); @@ -279,10 +300,26 @@ public Shape getShape(Point[] points) { if (d2>1) adjustLineLength(line2, 1, (d2-r)/d2); // end1 & end2 shapes + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + arcStroke = new BasicStroke(scale); + arcAdjustStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + DOTTED_LINE, + stroke.getDashPhase()); + } transform.setToTranslation(end1.x, end1.y); + if (scale>1) { + transform.scale(scale, scale); + } Shape end1Shape = transform.createTransformedShape(circle); end1Shape = stroke.createStrokedShape(end1Shape); transform.setToTranslation(end2.x, end2.y); + if (scale>1) { + transform.scale(scale, scale); + } Shape end2Shape = transform.createTransformedShape(circle); end2Shape = stroke.createStrokedShape(end2Shape); @@ -295,18 +332,24 @@ public Shape getShape(Point[] points) { if (degrees < -180) degrees += 360; arc.setAngleExtent(degrees); transform.setToTranslation(vertex.x, vertex.y); + if (scale>1) { + transform.scale(scale, scale); + } Shape arcShape = transform.createTransformedShape(arc); // arrowhead where arc hits line2 Shape dotShape = null; if (Math.abs(degrees)>10) { - double xDot = vertex.getX() + arcRadius*(end2.getX()-vertex.getX())/d2; - double yDot = vertex.getY() + arcRadius*(end2.getY()-vertex.getY())/d2; + double xDot = vertex.getX() + scale*arcRadius*(end2.getX()-vertex.getX())/d2; + double yDot = vertex.getY() + scale*arcRadius*(end2.getY()-vertex.getY())/d2; double angle = -theta2-Math.PI/2; if (degrees<0) angle += Math.PI; transform.setToRotation(angle, xDot, yDot); transform.translate(xDot, yDot); + if (scale>1) { + transform.scale(scale, scale); + } dotShape = transform.createTransformedShape(arrowhead); } @@ -319,16 +362,25 @@ public Shape getShape(Point[] points) { // hit shapes transform.setToTranslation(vertex.x, vertex.y); + if (scale>1) { + transform.scale(scale, scale); + } hitShapes[0] = transform.createTransformedShape(hitShape); // vertex transform.setToTranslation(end1.x, end1.y); + if (scale>1) { + transform.scale(scale, scale); + } hitShapes[1] = transform.createTransformedShape(hitShape); // end1 transform.setToTranslation(end2.x, end2.y); + if (scale>1) { + transform.scale(scale, scale); + } hitShapes[2] = transform.createTransformedShape(hitShape); // end2 - if (d1>1) adjustLineLength(line1, (d1-arcRadius-8)/d1, (d1-8)/d1); - if (d2>1) adjustLineLength(line2, (d2-arcRadius-8)/d2, (d2-8)/d2); - hitShapes[3] = stroke.createStrokedShape(line1); - hitShapes[4] = stroke.createStrokedShape(line2); - hitShapes[5] = stroke.createStrokedShape(arcShape); + if (d1>1) adjustLineLength(line1, (d1-scale*arcRadius-8)/d1, (d1-8)/d1); + if (d2>1) adjustLineLength(line2, (d2-scale*arcRadius-8)/d2, (d2-8)/d2); + hitShapes[3] = baseStroke.createStrokedShape(line1); + hitShapes[4] = baseStroke.createStrokedShape(line2); + hitShapes[5] = baseStroke.createStrokedShape(arcShape); return drawMe; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/ProtractorStep.java b/src/org/opensourcephysics/cabrillo/tracker/ProtractorStep.java index 0e4ad764..b6e4a13a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ProtractorStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ProtractorStep.java @@ -20,18 +20,18 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; import org.opensourcephysics.controls.*; /** @@ -307,6 +307,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { final Color color = footprint.getColor(); final Mark stepMark = mark; transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } selectedShape = transform.createTransformedShape(selectionShape); mark = new Mark() { public void draw(Graphics2D g, boolean highlighted) { @@ -521,6 +525,7 @@ public static int getLength() { */ private Point getLayoutPosition(TrackerPanel trackerPanel, TextLayout layout, TPoint end) { + int scale = FontSizer.getIntegerFactor(); if (end==vertex) { Point p = vertex.getScreenPosition(trackerPanel); Rectangle2D bounds = layout.getBounds(); @@ -531,7 +536,7 @@ private Point getLayoutPosition(TrackerPanel trackerPanel, angle += Math.PI; double sin = -Math.sin(angle); double cos = -Math.cos(angle); - double d = 24; + double d = scale*24; p.setLocation((int)(p.x + d*cos - w/2), (int)(p.y - d*sin + h/2)); return p; } @@ -552,7 +557,7 @@ private Point getLayoutPosition(TrackerPanel trackerPanel, } double cos = endPoint2.cos(endPoint1); double sin = endPoint2.sin(endPoint1); - double d = 6 + Math.abs(w*sin/2) + Math.abs(h*cos/2); + double d = scale*6 + Math.abs(w*sin/2) + Math.abs(h*cos/2); if (cos >= 0) { // first/fourth quadrants p.setLocation((int)(p.x - d*sin - w/2), (int)(p.y - d*cos + h/2)); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java b/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java index f43d5cd9..9dffde67 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java +++ b/src/org/opensourcephysics/cabrillo/tracker/RGBRegion.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -634,13 +634,11 @@ public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, if (step == null) return list; int n = step.getFrameNumber(); n = trackerPanel.getPlayer().getVideoClip().frameToStep(n); - stepValueLabel.setText("" + n); //$NON-NLS-1$ xField.setEnabled(!isLocked()); yField.setEnabled(!isLocked()); list.add(stepSeparator); list.add(stepLabel); list.add(stepValueLabel); - list.add(tValueLabel); list.add(tSeparator); list.add(xLabel); list.add(xField); diff --git a/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java b/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java index 5516ab68..2b88a433 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/RGBStep.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -34,6 +34,7 @@ import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a step for RGB tracks. It is used for obtaining @@ -53,6 +54,7 @@ public class RGBStep extends Step { protected Map hitShapes = new HashMap(); protected double[] rgbData = new double[5]; protected boolean dataValid = false; + protected BasicStroke stroke; static { crosshair = new GeneralPath(); @@ -130,6 +132,13 @@ public void draw(DrawingPanel panel, Graphics _g) { * @return the mark */ protected Mark getMark(TrackerPanel trackerPanel) { + BasicStroke baseStroke = footprint.getStroke(); + int scale = FontSizer.getIntegerFactor(); + float lineWidth = Math.min(scale*baseStroke.getLineWidth(), radius/3); + lineWidth = Math.max(lineWidth, baseStroke.getLineWidth()); + if (stroke==null || stroke.getLineWidth()!=lineWidth) { + stroke = new BasicStroke(lineWidth); + } Mark mark = marks.get(trackerPanel); if (mark == null) { transform = trackerPanel.getPixelTransform(); @@ -144,18 +153,21 @@ protected Mark getMark(TrackerPanel trackerPanel) { // center of circle is crosshair or selectionShape Point p = position.getScreenPosition(trackerPanel); transform.setToTranslation(p.x, p.y); + final Shape cross = transform.createTransformedShape(crosshair); + if (scale>1) { + transform.scale(scale, scale); + } final Shape square = position == trackerPanel.getSelectedPoint()? transform.createTransformedShape(selectionShape): null; - final Shape cross = transform.createTransformedShape(crosshair); mark = new Mark() { public void draw(Graphics2D g, boolean highlighted) { Paint gpaint = g.getPaint(); g.setPaint(footprint.getColor()); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g.setStroke(stroke); if (square != null) g.fill(square); else g.draw(cross); - g.setStroke(footprint.getStroke()); g.draw(rgn); g.setPaint(gpaint); } diff --git a/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java b/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java index 9acc65b3..bd953a22 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ReferenceFrame.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -52,14 +52,14 @@ public class ReferenceFrame extends ImageCoordSystem */ public ReferenceFrame(ImageCoordSystem coords, PointMass originTrack) { super(coords.getLength()); + this.originTrack = originTrack; + this.coords = coords; setFixedOrigin(false); setFixedAngle(coords.isFixedAngle()); setFixedScale(coords.isFixedScale()); coords.addPropertyChangeListener("transform", this); //$NON-NLS-1$ originTrack.addPropertyChangeListener("step", this); //$NON-NLS-1$ originTrack.addPropertyChangeListener("steps", this); //$NON-NLS-1$ - this.coords = coords; - this.originTrack = originTrack; for (int n = 0; n < coords.getLength(); n++) { setScaleXY(n, coords.getScaleX(n), coords.getScaleY(n)); setCosineSine(n, coords.getCosine(n), coords.getSine(n)); diff --git a/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java b/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java index c4619f0f..5c41b558 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java +++ b/src/org/opensourcephysics/cabrillo/tracker/SecondDerivative.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/ShapeIcon.java b/src/org/opensourcephysics/cabrillo/tracker/ShapeIcon.java index 2f530c57..8f36cf99 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ShapeIcon.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ShapeIcon.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Step.java b/src/org/opensourcephysics/cabrillo/tracker/Step.java index 66c14402..0e0ab142 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Step.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Step.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -34,6 +34,7 @@ import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * A Step is associated with a single frame of a TTrack. @@ -302,6 +303,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { mark = footprint.getMark(screenPoints); if (p != null) { // point is selected, so draw selection shape transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } final Color color = footprint.getColor(); final Mark stepMark = mark; final Shape selectedShape diff --git a/src/org/opensourcephysics/cabrillo/tracker/StepSet.java b/src/org/opensourcephysics/cabrillo/tracker/StepSet.java index b955eaa5..bbe14373 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/StepSet.java +++ b/src/org/opensourcephysics/cabrillo/tracker/StepSet.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TActions.java b/src/org/opensourcephysics/cabrillo/tracker/TActions.java index 2640d77b..54867c46 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TActions.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TActions.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -35,6 +35,7 @@ import javax.swing.*; import org.opensourcephysics.controls.*; +import org.opensourcephysics.display.ResizableIcon; import org.opensourcephysics.media.core.*; import org.opensourcephysics.tools.DataTool; import org.opensourcephysics.tools.FontSizer; @@ -144,7 +145,7 @@ public void actionPerformed(ActionEvent e) { }; actions.put("paste", pasteAction); //$NON-NLS-1$ // open - Icon icon = new ImageIcon(Tracker.class.getResource("resources/images/open.gif")); //$NON-NLS-1$ + Icon icon = new ResizableIcon(Tracker.class.getResource("resources/images/open.gif")); //$NON-NLS-1$ final AbstractAction openAction = new AbstractAction(TrackerRes.getString("TActions.Action.Open"), icon) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { trackerPanel.setSelectedPoint(null); @@ -191,7 +192,7 @@ public void actionPerformed(ActionEvent e) { }; actions.put("openURL", openURLAction); //$NON-NLS-1$ // openBrowser - icon = new ImageIcon(Tracker.class.getResource("resources/images/open_catalog.gif")); //$NON-NLS-1$ + icon = new ResizableIcon(Tracker.class.getResource("resources/images/open_catalog.gif")); //$NON-NLS-1$ final AbstractAction openBrowserAction = new AbstractAction(TrackerRes.getString("TActions.Action.OpenBrowser"), icon) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { TFrame frame = trackerPanel.getTFrame(); @@ -246,7 +247,7 @@ public void actionPerformed(ActionEvent e) { }; actions.put("importData", importDataAction); //$NON-NLS-1$ // save current tab - icon = new ImageIcon(Tracker.class.getResource("resources/images/save.gif")); //$NON-NLS-1$ + icon = new ResizableIcon(Tracker.class.getResource("resources/images/save.gif")); //$NON-NLS-1$ AbstractAction saveAction = new AbstractAction(TrackerRes.getString("TActions.Action.Save"), icon) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { TrackerIO.save(trackerPanel.getDataFile(), trackerPanel); @@ -263,7 +264,7 @@ public void actionPerformed(ActionEvent e) { }; actions.put("saveAs", saveAsAction); //$NON-NLS-1$ // save zip resource - icon = new ImageIcon(Tracker.class.getResource("resources/images/save_zip.gif")); //$NON-NLS-1$ + icon = new ResizableIcon(Tracker.class.getResource("resources/images/save_zip.gif")); //$NON-NLS-1$ AbstractAction saveZipAction = new AbstractAction(TrackerRes.getString("TActions.Action.SaveZip")+"...", icon) { //$NON-NLS-1$ //$NON-NLS-2$ public void actionPerformed(ActionEvent e) { ExportZipDialog zipDialog = ExportZipDialog.getDialog(trackerPanel); @@ -310,7 +311,7 @@ public void actionPerformed(ActionEvent e) { }; actions.put("config", configAction); //$NON-NLS-1$ // axesVisible - icon = new ImageIcon(Tracker.class.getResource("resources/images/axes.gif")); //$NON-NLS-1$ + icon = new ResizableIcon(Tracker.class.getResource("resources/images/axes.gif")); //$NON-NLS-1$ AbstractAction axesVisibleAction = new AbstractAction(TrackerRes.getString("TActions.Action.AxesVisible"), icon) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { CoordAxes axes = trackerPanel.getAxes(); @@ -636,17 +637,18 @@ public void actionPerformed(ActionEvent e) { } }; actions.put("protractor", protractorAction); //$NON-NLS-1$ - // new compass - AbstractAction compassAction = new AbstractAction(TrackerRes.getString("Compass.Name"), null) { //$NON-NLS-1$ + // new circle track + AbstractAction circleFitterAction = new AbstractAction(TrackerRes.getString("CircleFitter.Name"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { - Compass compass = new Compass(); - compass.setDefaultNameAndColor(trackerPanel, " "); //$NON-NLS-1$ - trackerPanel.addTrack(compass); + CircleFitter track = new CircleFitter(); + track.setDefaultNameAndColor(trackerPanel, " "); //$NON-NLS-1$ + trackerPanel.addTrack(track); trackerPanel.setSelectedPoint(null); - trackerPanel.setSelectedTrack(compass); + trackerPanel.setSelectedTrack(track); + track.getInspector().setVisible(true); } }; - actions.put("compass", compassAction); //$NON-NLS-1$ + actions.put("circleFitter", circleFitterAction); //$NON-NLS-1$ // clone track action AbstractAction cloneTrackAction = new AbstractAction() { public void actionPerformed(ActionEvent e) { diff --git a/src/org/opensourcephysics/cabrillo/tracker/TButton.java b/src/org/opensourcephysics/cabrillo/tracker/TButton.java index 990fdc3a..d700fdc7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TButton.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TButton.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -40,7 +40,7 @@ public class TButton extends JButton { protected TTrack track; private boolean hidePopup = false; private JPopupMenu popup; - private Icon onIcon, offIcon; +// private Icon onIcon, offIcon; /** * Constructs a TButton. @@ -137,16 +137,16 @@ public TButton(Icon off, Icon on) { setIcons(off, on); } - /** - * Sets the icon. Overrides JButton method. - * - * @param icon the icon - */ - public void setIcon(Icon icon) { - super.setIcon(icon); - setSelectedIcon(icon); -// setRolloverSelectedIcon(icon); - } +// /** +// * Sets the icon. Overrides JButton method. +// * +// * @param icon the icon +// */ +// public void setIcon(Icon icon) { +// super.setIcon(icon); +//// setSelectedIcon(icon); +//// setRolloverSelectedIcon(icon); +// } /** * Sets the icons for selected and unselected states. @@ -155,25 +155,26 @@ public void setIcon(Icon icon) { * @param on the selected state icon */ public void setIcons(Icon off, Icon on) { - onIcon = on; - offIcon = off; - setIcon(off); +// onIcon = on; +// offIcon = off; + super.setIcon(off); + setSelectedIcon(on); } - /** - * Sets the selected state. Overrides JButton method. - * - * @param selected true to select - */ - public void setSelected(boolean selected) { - super.setSelected(selected); - if (selected && onIcon !=null) { - setIcon(onIcon); - } - else if (!selected && offIcon !=null) { - setIcon(offIcon); - } - } +// /** +// * Sets the selected state. Overrides JButton method. +// * +// * @param selected true to select +// */ +// public void setSelected(boolean selected) { +// super.setSelected(selected); +// if (selected && onIcon !=null) { +// setIcon(onIcon); +// } +// else if (!selected && offIcon !=null) { +// setIcon(offIcon); +// } +// } /** * Sets the track associated with this button. @@ -187,6 +188,7 @@ public void setTrack(TTrack track) { setText(track.getName()); setToolTipText(TrackerRes.getString("TButton.Track.ToolTip") //$NON-NLS-1$ +" "+track.getName()); //$NON-NLS-1$ + FontSizer.setFonts(this, FontSizer.getLevel()); } else { setIcon(null); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java index 15622591..65359f59 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -53,7 +53,7 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { // static fields protected static String helpPath = "/org/opensourcephysics/cabrillo/tracker/resources/help/"; //$NON-NLS-1$ - protected static String helpPathWeb = "http://www.cabrillo.edu/~dbrown/tracker/help/"; //$NON-NLS-1$ + protected static String helpPathWeb = "http://physlets.org/tracker/help/"; //$NON-NLS-1$ static Color yellow = new Color(255, 255, 105); // instance fields @@ -67,8 +67,8 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { protected JTabbedPane tabbedPane; protected JTextPane notesTextPane; protected Action saveNotesAction; - protected JButton cancelNotesDialogButton; - protected JButton closeNotesDialogButton; + protected JButton cancelNotesDialogButton, closeNotesDialogButton; + protected JCheckBox displayWhenLoadedCheckbox; protected JDialog notesDialog; protected JDialog helpDialog; protected LibraryBrowser libraryBrowser; @@ -83,7 +83,7 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { protected ArrayList loadedFiles = new ArrayList(); protected boolean anglesInRadians = Tracker.isRadians; protected File tabsetFile; // used when saving tabsets - protected int framesLoaded, prevFramesLoaded; // used when loading ffmpeg videos + protected int framesLoaded, prevFramesLoaded; // used when loading xuggle videos // protected JProgressBar monitor; protected PrefsDialog prefsDialog; @@ -288,6 +288,7 @@ public void removeTab(TrackerPanel trackerPanel) { int tab = getTab(trackerPanel); if (tab == -1) return; // tab doesn't exist if (!trackerPanel.save()) return; // user cancelled + // hide the info dialog notesDialog.setVisible(false); if (trackerPanel.dataBuilder != null) trackerPanel.dataBuilder.dispose(); @@ -675,10 +676,10 @@ public MainTView getMainView(TrackerPanel trackerPanel) { */ public void propertyChange(PropertyChangeEvent e) { String name = e.getPropertyName(); - if (name.equals("progress")) { // from currently loading (ffmpeg) video //$NON-NLS-1$ - Object val = e.getNewValue(); - String vidName = XML.forwardSlash((String)e.getOldValue()); - try { + if (name.equals("progress")) { // from currently loading (xuggle) video //$NON-NLS-1$ + Object val = e.getNewValue(); + String vidName = XML.forwardSlash((String)e.getOldValue()); + try { framesLoaded = Integer.parseInt(val.toString()); } catch (Exception ex) { } @@ -691,13 +692,13 @@ public void propertyChange(PropertyChangeEvent e) { } next.setProgress(progress); break; - } - } + } + } } else if (name.equals("stalled")) { // from stalled ffmpeg video //$NON-NLS-1$ - String fileName = XML.getName((String)e.getNewValue()); - String s = TrackerRes.getString("TFrame.Dialog.StalledVideo.Message0") //$NON-NLS-1$ - +"\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message1") //$NON-NLS-1$ //$NON-NLS-2$ + String fileName = XML.getName((String)e.getNewValue()); + String s = TrackerRes.getString("TFrame.Dialog.StalledVideo.Message0") //$NON-NLS-1$ + +"\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message1") //$NON-NLS-1$ //$NON-NLS-2$ +"\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message2") //$NON-NLS-1$ //$NON-NLS-2$ +"\n\n"+TrackerRes.getString("TFrame.Dialog.StalledVideo.Message3"); //$NON-NLS-1$ //$NON-NLS-2$ if (VideoIO.getVideoType(VideoIO.ENGINE_QUICKTIME, null)!=null) { @@ -807,7 +808,8 @@ else if (name.equals("locale")) { // from TrackerRes //$NON-NLS-1$ } // refresh info dialog cancelNotesDialogButton.setText(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ - closeNotesDialogButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + closeNotesDialogButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + displayWhenLoadedCheckbox.setText(TrackerRes.getString("TFrame.NotesDialog.Checkbox.ShowByDefault")); //$NON-NLS-1$ } // refresh memory button TTrackBar.refreshMemoryButton(); @@ -851,11 +853,11 @@ public PrefsDialog getPrefsDialog() { if (prefsDialog.trackerPanel!=trackerPanel) { prefsDialog.trackerPanel = trackerPanel; prefsDialog.refreshGUI(); - } - } - else { + } + } + else { // create PrefsDialog - prefsDialog = new PrefsDialog(trackerPanel, TFrame.this); + prefsDialog = new PrefsDialog(trackerPanel, TFrame.this); // center on screen Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int x = (dim.width - prefsDialog.getBounds().width) / 2; @@ -1228,13 +1230,13 @@ public void setFontLevel(int level) { } if (prefsDialog!=null) { - prefsDialog.refreshGUI(); - } - if (libraryBrowser!=null) { - libraryBrowser.setFontLevel(level); - } - if (helpLauncher!=null) { - FontSizer.setFonts(helpLauncher, level); + prefsDialog.refreshGUI(); + } + if (libraryBrowser!=null) { + libraryBrowser.setFontLevel(level); + } + if (helpLauncher!=null) { + FontSizer.setFonts(helpLauncher, level); } FontSizer.setFonts(notesDialog, level); FontSizer.setFonts(OSPLog.getOSPLog(), level); @@ -1331,10 +1333,10 @@ public void propertyChange(PropertyChangeEvent e) { LibraryBrowser.fireHelpEvent = true; libraryBrowser.addPropertyChangeListener("help", new PropertyChangeListener() { //$NON-NLS-1$ public void propertyChange(PropertyChangeEvent e) { - showHelp("library", 0); //$NON-NLS-1$ - } - }); - libraryBrowser.setFontLevel(FontSizer.getLevel()); + showHelp("library", 0); //$NON-NLS-1$ + } + }); + libraryBrowser.setFontLevel(FontSizer.getLevel()); Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); int x = (dim.width - dialog.getBounds().width) / 2; int y = (dim.height - dialog.getBounds().height) / 2; @@ -1468,10 +1470,11 @@ protected void showNotes(final TrackerPanel panel) { Runnable runner = new Runnable() { public void run() { TTrack track = panel.getSelectedTrack(); - if ((track != null && track.getDescription()!= null && + if (!panel.hideDescriptionWhenLoaded && + ((track != null && track.getDescription()!= null && !track.getDescription().trim().equals("")) || //$NON-NLS-1$ (track == null && panel.getDescription() != null && - !panel.getDescription().trim().equals(""))) { //$NON-NLS-1$ + !panel.getDescription().trim().equals("")))) { //$NON-NLS-1$ if (!button.isSelected()) button.doClick(); } else if (button.isSelected()) button.doClick(); @@ -1583,11 +1586,13 @@ public void actionPerformed(ActionEvent e) { } else if (!desc.equals(trackerPanel.getDescription())) { trackerPanel.setDescription(desc); + trackerPanel.hideDescriptionWhenLoaded = !displayWhenLoadedCheckbox.isSelected(); } } notesTextPane.setBackground(Color.WHITE); cancelNotesDialogButton.setEnabled(false); closeNotesDialogButton.setEnabled(true); + closeNotesDialogButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ } }; notesDialog = new JDialog(this, false) { @@ -1619,6 +1624,7 @@ public void keyPressed(KeyEvent e) { if (!trackerPanel.isEnabled("notes.edit")) //$NON-NLS-1$ return; notesTextPane.setBackground(yellow); + closeNotesDialogButton.setText(TrackerRes.getString("PrefsDialog.Button.Save")); //$NON-NLS-1$ cancelNotesDialogButton.setEnabled(true); } }); @@ -1632,6 +1638,17 @@ public void focusLost(FocusEvent e) { infoContentPane.add(textScroller, BorderLayout.CENTER); JPanel buttonbar = new JPanel(new FlowLayout()); infoContentPane.add(buttonbar, BorderLayout.SOUTH); + displayWhenLoadedCheckbox = new JCheckBox(TrackerRes.getString("TFrame.NotesDialog.Checkbox.ShowByDefault")); //$NON-NLS-1$ + displayWhenLoadedCheckbox.addActionListener(new AbstractAction() { + public void actionPerformed(ActionEvent e) { + TrackerPanel trackerPanel = getTrackerPanel(getSelectedTab()); + if (trackerPanel!=null) { + trackerPanel.hideDescriptionWhenLoaded = !displayWhenLoadedCheckbox.isSelected(); + } + } + }); + buttonbar.add(displayWhenLoadedCheckbox); + buttonbar.add(Box.createHorizontalStrut(50)); cancelNotesDialogButton = new JButton(TrackerRes.getString("Dialog.Button.Cancel")); //$NON-NLS-1$ cancelNotesDialogButton.addActionListener(new AbstractAction() { public void actionPerformed(ActionEvent e) { @@ -1646,7 +1663,7 @@ public void actionPerformed(ActionEvent e) { notesDialog.setVisible(false); } }); - buttonbar.add(closeNotesDialogButton); + buttonbar.add(closeNotesDialogButton); notesDialog.pack(); // create the tabbed pane tabbedPane = new JTabbedPane(SwingConstants.BOTTOM); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMat.java b/src/org/opensourcephysics/cabrillo/tracker/TMat.java index 57f3d440..daa13c14 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMat.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMat.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java index 6c114236..703a1c55 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -145,7 +145,7 @@ public class TMenuBar extends JMenuBar implements PropertyChangeListener { protected JMenuItem newRGBRegionItem; protected JMenuItem newProtractorItem; protected JMenuItem newTapeItem; - protected JMenuItem newCompassItem; + protected JMenuItem newCircleFitterItem; protected JCheckBoxMenuItem axesVisibleItem; protected JMenuItem newAnalyticParticleItem; protected JMenu newDynamicParticleMenu; @@ -368,54 +368,54 @@ public void mousePressed(MouseEvent e) { deleteSelectedPointItem.setEnabled(!cantDeleteSteps && step!=null); // enable and refresh paste item if clipboard contains xml string data String paste = actions.get("paste").getValue(Action.NAME).toString(); //$NON-NLS-1$ - pasteItem.setText(paste); - pasteItem.setEnabled(false); + pasteItem.setText(paste); + pasteItem.setEnabled(false); Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); Transferable data = clipboard.getContents(null); if (data != null && data.isDataFlavorSupported(DataFlavor.stringFlavor)) { try { - String s = (String)data.getTransferData(DataFlavor.stringFlavor); + String s = (String)data.getTransferData(DataFlavor.stringFlavor); control.readXML(s); Class type = control.getObjectClass(); if (control.failedToRead()) { - // see if s is importable dataString - DatasetManager manager = DataTool.parseData(s, null); - if (manager!=null) { - double[] xImport = null, yImport = null; + // see if s is importable dataString + DatasetManager manager = DataTool.parseData(s, null); + if (manager!=null) { + double[] xImport = null, yImport = null; for (Dataset next: manager.getDatasets()) { - if (next.getYColumnName().equals("x")) { //$NON-NLS-1$ - xImport = next.getYPoints(); - } - else if (next.getYColumnName().equals("y")) { //$NON-NLS-1$ - yImport = next.getYPoints(); - } + if (next.getYColumnName().equals("x")) { //$NON-NLS-1$ + xImport = next.getYPoints(); + } + else if (next.getYColumnName().equals("y")) { //$NON-NLS-1$ + yImport = next.getYPoints(); + } } if (xImport!=null && yImport!=null) { - String name = manager.getName(); - if (name==null || name.trim().equals("")) { //$NON-NLS-1$ - name = TrackerRes.getString("ParticleDataTrack.New.Name"); //$NON-NLS-1$ - } - name = name.replaceAll("_", " "); //$NON-NLS-1$ //$NON-NLS-2$ - pasteItem.setEnabled(true); - pasteItem.setText(paste+" "+name); //$NON-NLS-1$ + String name = manager.getName(); + if (name==null || name.trim().equals("")) { //$NON-NLS-1$ + name = TrackerRes.getString("ParticleDataTrack.New.Name"); //$NON-NLS-1$ + } + name = name.replaceAll("_", " "); //$NON-NLS-1$ //$NON-NLS-2$ + pasteItem.setEnabled(true); + pasteItem.setText(paste+" "+name); //$NON-NLS-1$ } - } + } } else if (TTrack.class.isAssignableFrom(type)) { pasteItem.setEnabled(true); - String name = control.getString("name"); //$NON-NLS-1$ - pasteItem.setText(paste+" "+name); //$NON-NLS-1$ + String name = control.getString("name"); //$NON-NLS-1$ + pasteItem.setText(paste+" "+name); //$NON-NLS-1$ } else if (ImageCoordSystem.class.isAssignableFrom(type)) { pasteItem.setEnabled(true); - pasteItem.setText(paste+" "+TrackerRes.getString("TMenuBar.MenuItem.Coords")); //$NON-NLS-1$ //$NON-NLS-2$ + pasteItem.setText(paste+" "+TrackerRes.getString("TMenuBar.MenuItem.Coords")); //$NON-NLS-1$ //$NON-NLS-2$ } else if (VideoClip.class.isAssignableFrom(type)) { pasteItem.setEnabled(true); - pasteItem.setText(paste+" "+TrackerRes.getString("TMenuBar.MenuItem.VideoClip")); //$NON-NLS-1$ //$NON-NLS-2$ + pasteItem.setText(paste+" "+TrackerRes.getString("TMenuBar.MenuItem.VideoClip")); //$NON-NLS-1$ //$NON-NLS-2$ } } - catch (Exception ex) { + catch (Exception ex) { } } // refresh copyData menu @@ -499,7 +499,7 @@ public void actionPerformed(ActionEvent e) { redoItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Undo.redo(trackerPanel); - trackerPanel.setSelectedPoint(null); + trackerPanel.setSelectedPoint(null); } }); // paste items @@ -689,7 +689,7 @@ public void actionPerformed(ActionEvent e) { } }; - for(int i = 0; i<4; i++) { + for(int i = 0; i<6; i++) { String s = i==0? TrackerRes.getString("TMenuBar.MenuItem.DefaultFontSize"): "+"+i; //$NON-NLS-1$ //$NON-NLS-2$ JMenuItem item = new JRadioButtonMenuItem(s); item.addActionListener(fontSizeAction); @@ -760,7 +760,7 @@ public void actionPerformed(ActionEvent e) { newRGBRegionItem = new JMenuItem(actions.get("rgbRegion")); //$NON-NLS-1$ newProtractorItem = new JMenuItem(actions.get("protractor")); //$NON-NLS-1$ newTapeItem = new JMenuItem(actions.get("tape")); //$NON-NLS-1$ - newCompassItem = new JMenuItem(actions.get("compass")); //$NON-NLS-1$ + newCircleFitterItem = new JMenuItem(actions.get("circleFitter")); //$NON-NLS-1$ // clone track menu cloneMenu = new JMenu(TrackerRes.getString("TMenuBar.MenuItem.Clone")); //$NON-NLS-1$ // measuring tools menu @@ -899,20 +899,17 @@ public void itemStateChanged(ItemEvent e) { playVideoSmoothlyItem.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { Video video = trackerPanel.getVideo(); - if (video==null) return; - boolean ffmpegVideo = video.getClass().getName().equals("org.opensourcephysics.media.ffmpeg.FFMPegVideo"); - if(!ffmpegVideo) return; + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + if (video==null || !(video.getClass().getName().equals(ffmpegName))) return; if (e.getStateChange() == ItemEvent.SELECTED || e.getStateChange() == ItemEvent.DESELECTED) { - boolean smooth = playVideoSmoothlyItem.isSelected(); - if(ffmpegVideo) { - try { - Class ffmpegClass = Class.forName("org.opensourcephysics.media.ffmpeg.FFMPegVideo"); - Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } - } + boolean smooth = playFFMPegSmoothlyItem.isSelected(); + try { + Class ffmpegClass = Class.forName(ffmpegName); + Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } } } }); @@ -1442,18 +1439,16 @@ public synchronized void run() { videoMenu.add(playAllStepsItem); // smooth play item for ffmpeg videos VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - if (videoType!=null) { - if(videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { - String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ - try { - Class ffmpegClass = Class.forName(ffmpegName); - Method method = ffmpegClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ - Boolean smooth = (Boolean)method.invoke(video, (Object[])null); - playVideoSmoothlyItem.setSelected(smooth); - videoMenu.add(playVideoSmoothlyItem); - } catch (Exception ex) { - } - } + if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + try { + Class ffmpegClass = Class.forName(ffmpegName); + Method method = xuggleClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ + Boolean smooth = (Boolean)method.invoke(video, (Object[])null); + playVideoSmoothlyItem.setSelected(smooth); + videoMenu.add(playVideoSmoothlyItem); + } catch (Exception ex) { + } } // video filters menu if (trackerPanel.isEnabled("video.filters")) { //$NON-NLS-1$ @@ -1593,7 +1588,7 @@ public synchronized void run() { if (trackerPanel.isEnabled("file.saveAs")) { //$NON-NLS-1$ fileMenu.add(saveAsItem); if (trackerPanel.getVideo()!=null) { - fileMenu.add(saveVideoAsItem); + fileMenu.add(saveVideoAsItem); } fileMenu.add(saveTabsetAsItem); } @@ -1754,10 +1749,10 @@ else if ("clip".equals(s)) { //$NON-NLS-1$ || trackerPanel.isEnabled("new.dynamicTwoBody")) { //$NON-NLS-1$ if (createMenu.getItemCount() > 0) createMenu.addSeparator(); if (trackerPanel.isEnabled("new.analyticParticle")) //$NON-NLS-1$ - createMenu.add(newAnalyticParticleItem); + createMenu.add(newAnalyticParticleItem); if (trackerPanel.isEnabled("new.dynamicParticle") //$NON-NLS-1$ - || trackerPanel.isEnabled("new.dynamicTwoBody")) { //$NON-NLS-1$ - createMenu.add(newDynamicParticleMenu); + || trackerPanel.isEnabled("new.dynamicTwoBody")) { //$NON-NLS-1$ + createMenu.add(newDynamicParticleMenu); newDynamicParticleMenu.removeAll(); if (trackerPanel.isEnabled("new.dynamicParticle")) { //$NON-NLS-1$ newDynamicParticleMenu.add(newDynamicParticleCartesianItem); @@ -1768,14 +1763,14 @@ else if ("clip".equals(s)) { //$NON-NLS-1$ } } if (trackerPanel.isEnabled("new.tapeMeasure") || //$NON-NLS-1$ - trackerPanel.isEnabled("new.protractor")) { //$NON-NLS-1$ + trackerPanel.isEnabled("new.protractor") || //$NON-NLS-1$ + trackerPanel.isEnabled("new.circleFitter")) { //$NON-NLS-1$ if (createMenu.getItemCount() > 0) createMenu.addSeparator(); createMenu.add(measuringToolsMenu); measuringToolsMenu.removeAll(); if (trackerPanel.isEnabled("new.tapeMeasure")) measuringToolsMenu.add(newTapeItem); //$NON-NLS-1$ if (trackerPanel.isEnabled("new.protractor")) measuringToolsMenu.add(newProtractorItem); //$NON-NLS-1$ - boolean pig = true; -// if (pig || trackerPanel.isEnabled("new.compass")) measuringToolsMenu.add(newCompassItem); //$NON-NLS-1$ + if (trackerPanel.isEnabled("new.circleFitter")) measuringToolsMenu.add(newCircleFitterItem); //$NON-NLS-1$ } // calibration tools menu if (trackerPanel.isEnabled("calibration.stick") //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMouseHandler.java b/src/org/opensourcephysics/cabrillo/tracker/TMouseHandler.java index d36a0954..4b446504 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMouseHandler.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMouseHandler.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TRegion.java b/src/org/opensourcephysics/cabrillo/tracker/TRegion.java index e1f8f71d..18542d73 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TRegion.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TRegion.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java b/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java index ea94e5da..c7a80da9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -36,6 +36,7 @@ import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.desktop.OSPDesktop; +import org.opensourcephysics.display.ResizableIcon; import org.opensourcephysics.media.core.ClipControl; import org.opensourcephysics.media.core.ClipInspector; import org.opensourcephysics.media.core.MediaRes; @@ -105,46 +106,47 @@ public class TToolBar extends JToolBar implements PropertyChangeListener { protected ArrayList pageViewTabs = new ArrayList(); static { - newTrackIcon = new ImageIcon(Tracker.class.getResource("resources/images/poof.gif")); //$NON-NLS-1$ - trackControlIcon = new ImageIcon(Tracker.class.getResource("resources/images/track_control.gif")); //$NON-NLS-1$ - trackControlOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/track_control_on.gif")); //$NON-NLS-1$ - zoomIcon = new ImageIcon(Tracker.class.getResource("resources/images/zoom.gif")); //$NON-NLS-1$ - clipOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/clip_off.gif")); //$NON-NLS-1$ - clipOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/clip_on.gif")); //$NON-NLS-1$ - axesOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/axes.gif")); //$NON-NLS-1$ - axesOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/axes_on.gif")); //$NON-NLS-1$ - tapeOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/tape.gif")); //$NON-NLS-1$ - tapeOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/tape_on.gif")); //$NON-NLS-1$ - tapeOffRolloverIcon = new ImageIcon(Tracker.class.getResource("resources/images/tape_rollover.gif")); //$NON-NLS-1$ - tapeOnRolloverIcon = new ImageIcon(Tracker.class.getResource("resources/images/tape_on_rollover.gif")); //$NON-NLS-1$ - stickOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/stick.gif")); //$NON-NLS-1$ - stickOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/stick_on.gif")); //$NON-NLS-1$ - stickOffRolloverIcon = new ImageIcon(Tracker.class.getResource("resources/images/stick_rollover.gif")); //$NON-NLS-1$ - stickOnRolloverIcon = new ImageIcon(Tracker.class.getResource("resources/images/stick_on_rollover.gif")); //$NON-NLS-1$ - pointsOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/positions.gif")); //$NON-NLS-1$ - pointsOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/positions_on.gif")); //$NON-NLS-1$ - velocOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/velocities.gif")); //$NON-NLS-1$ - velocOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/velocities_on.gif")); //$NON-NLS-1$ - accelOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/accel.gif")); //$NON-NLS-1$ - accelOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/accel_on.gif")); //$NON-NLS-1$ - traceOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/trace.gif")); //$NON-NLS-1$ - traceOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/trace_on.gif")); //$NON-NLS-1$ - labelsOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/labels.gif")); //$NON-NLS-1$ - labelsOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/labels_on.gif")); //$NON-NLS-1$ - stretchOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/stretch.gif")); //$NON-NLS-1$ - stretchOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/stretch_on.gif")); //$NON-NLS-1$ - xmassOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/x_mass.gif")); //$NON-NLS-1$ - xmassOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/x_mass_on.gif")); //$NON-NLS-1$ - autotrackerOffIcon = new ImageIcon(Tracker.class.getResource("resources/images/autotrack_off.gif")); //$NON-NLS-1$ - autotrackerOnIcon = new ImageIcon(Tracker.class.getResource("resources/images/autotrack_on.gif")); //$NON-NLS-1$ - infoIcon = new ImageIcon(Tracker.class.getResource("resources/images/info.gif")); //$NON-NLS-1$ - refreshIcon = new ImageIcon(Tracker.class.getResource("resources/images/refresh.gif")); //$NON-NLS-1$ - htmlIcon = new ImageIcon(Tracker.class.getResource("resources/images/html.gif")); //$NON-NLS-1$ - trailIcons[0] = new ImageIcon(Tracker.class.getResource("resources/images/trails_off.gif")); //$NON-NLS-1$ - trailIcons[1] = new ImageIcon(Tracker.class.getResource("resources/images/trails_1.gif")); //$NON-NLS-1$ - trailIcons[2] = new ImageIcon(Tracker.class.getResource("resources/images/trails_2.gif")); //$NON-NLS-1$ - trailIcons[3] = new ImageIcon(Tracker.class.getResource("resources/images/trails_on.gif")); //$NON-NLS-1$ - separatorIcon = new ImageIcon(Tracker.class.getResource("resources/images/separator.gif")); //$NON-NLS-1$ + newTrackIcon = new ResizableIcon(Tracker.class.getResource("resources/images/poof.gif")); //$NON-NLS-1$ + trackControlIcon = new ResizableIcon(Tracker.class.getResource("resources/images/track_control.gif")); //$NON-NLS-1$ + trackControlOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/track_control_on.gif")); //$NON-NLS-1$ + zoomIcon = new ResizableIcon(Tracker.class.getResource("resources/images/zoom.gif")); //$NON-NLS-1$ + clipOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/clip_off.gif")); //$NON-NLS-1$ + clipOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/clip_on.gif")); //$NON-NLS-1$ + axesOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/axes.gif")); //$NON-NLS-1$ + axesOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/axes_on.gif")); //$NON-NLS-1$ + tapeOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/tape.gif")); //$NON-NLS-1$ + tapeOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/tape_on.gif")); //$NON-NLS-1$ + tapeOffRolloverIcon = new ResizableIcon(Tracker.class.getResource("resources/images/tape_rollover.gif")); //$NON-NLS-1$ + tapeOnRolloverIcon = new ResizableIcon(Tracker.class.getResource("resources/images/tape_on_rollover.gif")); //$NON-NLS-1$ + stickOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stick.gif")); //$NON-NLS-1$ + stickOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stick_on.gif")); //$NON-NLS-1$ + stickOffRolloverIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stick_rollover.gif")); //$NON-NLS-1$ + stickOnRolloverIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stick_on_rollover.gif")); //$NON-NLS-1$ + pointsOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/positions.gif")); //$NON-NLS-1$ + pointsOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/positions_on.gif")); //$NON-NLS-1$ + velocOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/velocities.gif")); //$NON-NLS-1$ + velocOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/velocities_on.gif")); //$NON-NLS-1$ + accelOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/accel.gif")); //$NON-NLS-1$ + accelOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/accel_on.gif")); //$NON-NLS-1$ + traceOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/trace.gif")); //$NON-NLS-1$ + traceOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/trace_on.gif")); //$NON-NLS-1$ + labelsOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/labels.gif")); //$NON-NLS-1$ + labelsOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/labels_on.gif")); //$NON-NLS-1$ + stretchOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stretch.gif")); //$NON-NLS-1$ + stretchOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/stretch_on.gif")); //$NON-NLS-1$ + xmassOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/x_mass.gif")); //$NON-NLS-1$ + xmassOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/x_mass_on.gif")); //$NON-NLS-1$ + autotrackerOffIcon = new ResizableIcon(Tracker.class.getResource("resources/images/autotrack_off.gif")); //$NON-NLS-1$ + autotrackerOnIcon = new ResizableIcon(Tracker.class.getResource("resources/images/autotrack_on.gif")); //$NON-NLS-1$ + infoIcon = new ResizableIcon(Tracker.class.getResource("resources/images/info.gif")); //$NON-NLS-1$ + refreshIcon = new ResizableIcon(Tracker.class.getResource("resources/images/refresh.gif")); //$NON-NLS-1$ + refreshIcon = new ResizableIcon(Tracker.class.getResource("resources/images/refresh.gif")); //$NON-NLS-1$ + htmlIcon = new ResizableIcon(Tracker.class.getResource("resources/images/html.gif")); //$NON-NLS-1$ + trailIcons[0] = new ResizableIcon(Tracker.class.getResource("resources/images/trails_off.gif")); //$NON-NLS-1$ + trailIcons[1] = new ResizableIcon(Tracker.class.getResource("resources/images/trails_1.gif")); //$NON-NLS-1$ + trailIcons[2] = new ResizableIcon(Tracker.class.getResource("resources/images/trails_2.gif")); //$NON-NLS-1$ + trailIcons[3] = new ResizableIcon(Tracker.class.getResource("resources/images/trails_on.gif")); //$NON-NLS-1$ + separatorIcon = new ResizableIcon(Tracker.class.getResource("resources/images/separator.gif")); //$NON-NLS-1$ zoomFormat.setMaximumFractionDigits(0); } @@ -762,7 +764,8 @@ else if (track instanceof Vector) { for (int i = 0; i < trailLengths.length; i++) { if (trailLength == trailLengths[i]) { trailButton.setIcon(trailIcons[i]); - trailButton.setSelectedIcon(trailIcons[i]); +// trailButton.setSelectedIcon(trailIcons[i]); + FontSizer.setFonts(trailButton, FontSizer.getLevel()); } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TTrack.java b/src/org/opensourcephysics/cabrillo/tracker/TTrack.java index 79241737..712cff6e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TTrack.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TTrack.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -1599,7 +1599,7 @@ public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, VideoClip clip = trackerPanel.getPlayer().getVideoClip(); if (step != null && clip.includesFrame(step.getFrameNumber())) { int n = clip.frameToStep(step.getFrameNumber()); - stepValueLabel.setText("" + n); //$NON-NLS-1$ + stepValueLabel.setText(n+": "); //$NON-NLS-1$ double t = trackerPanel.getPlayer().getStepTime(n) / 1000; if (t >= 0) { tField.setValue(t); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java b/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java index 94a8831f..54c41f56 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TTrackBar.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -77,10 +77,6 @@ public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) { // test action goes here -// String path = "http://www.cabrillo.edu/~dbrown/tracker/counter/counter.html?page=test"; -// String result = ResourceLoader.getString(path); -// System.out.println("pig "+result); - if (!testTimer.isRepeats()) { testTimer.stop(); testTimer=null; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TView.java b/src/org/opensourcephysics/cabrillo/tracker/TView.java index b0dda22f..3d1cd795 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java b/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java index 8b77f900..9e35c6cc 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TViewChooser.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -34,6 +34,7 @@ import org.opensourcephysics.controls.*; import org.opensourcephysics.display.OSPRuntime; +import org.opensourcephysics.display.ResizableIcon; import org.opensourcephysics.tools.FontSizer; /** @@ -44,12 +45,12 @@ public class TViewChooser extends JPanel implements PropertyChangeListener { // static fields - protected static Icon minIcon, maxIcon, restoreIcon; + protected static Icon maxIcon, restoreIcon; static { - maxIcon = new ImageIcon( + maxIcon = new ResizableIcon( Tracker.class.getResource("resources/images/maximize.gif")); //$NON-NLS-1$ - restoreIcon = new ImageIcon( + restoreIcon = new ResizableIcon( Tracker.class.getResource("resources/images/restore.gif")); //$NON-NLS-1$ } @@ -137,7 +138,7 @@ public void actionPerformed(ActionEvent e) { while (it.hasNext()) { TView view = it.next(); String name = view.getViewName(); - item = new JMenuItem(name, view.getViewIcon()); + item = new JMenuItem(name, new ResizableIcon(view.getViewIcon())); item.setActionCommand(name); item.addActionListener(listener); popup.add(item); @@ -313,7 +314,7 @@ public void setSelectedView(TView view) { } selectedView.refresh(); // put icon in button - chooserButton.setIcon(selectedView.getViewIcon()); + chooserButton.setIcon(new ResizableIcon(selectedView.getViewIcon())); // show the view on the viewPanel CardLayout cl = (CardLayout) (viewPanel.getLayout()); cl.show(viewPanel, selectedView.getViewName()); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TableTView.java b/src/org/opensourcephysics/cabrillo/tracker/TableTView.java index 55d54646..b8f0a710 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TableTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TableTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java b/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java index 0977cda1..42ce9ea9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TableTrackView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java b/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java index eef60783..732e8709 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TapeMeasure.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TapeStep.java b/src/org/opensourcephysics/cabrillo/tracker/TapeStep.java index 90c8e0a8..a9077b05 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TapeStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TapeStep.java @@ -20,18 +20,18 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.util.*; - import java.awt.*; import java.awt.font.*; import java.awt.geom.*; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; import org.opensourcephysics.controls.*; /** @@ -57,6 +57,7 @@ public class TapeStep extends Step { protected double xAxisToTapeAngle, tapeAngle; protected boolean endsEnabled = true; protected boolean drawLayoutBounds; + protected boolean adjustingTips; protected Map end1Shapes = new HashMap(); protected Map end2Shapes = new HashMap(); protected Map shaftShapes = new HashMap(); @@ -258,6 +259,10 @@ protected Mark getMark(TrackerPanel trackerPanel) { final Color color = footprint.getColor(); final Mark stepMark = mark; transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } final Shape selectedShape = transform.createTransformedShape(selectionShape); mark = new Mark() { @@ -478,6 +483,8 @@ public static int getLength() { * Moves the tips of the tape to display current worldLength. */ protected void adjustTipsToLength() { + if (adjustingTips) return; + adjustingTips = true; double sin = end1.sin(end2); double cos = end1.cos(end2); double d = end1.distance(end2); @@ -513,6 +520,9 @@ else if (end2.isAttached()) } } else if (p==handle) { + // be sure handle is on line between ends + Point screenPt = handle.getScreenPosition(tape.trackerPanel); + handle.setPositionOnLine(screenPt.x, screenPt.y, tape.trackerPanel); // keep handle fixed d = handle.distance(end1); if (d==0) d = 0.5; // special case @@ -535,12 +545,15 @@ else if (p==handle) { end1.setLocation(x1, y1); end2.setLocation(x2, y2); } + adjustingTips = false; } /** * Moves the tips of the tape to display current xAxisToTapeAngle. */ protected void adjustTipsToAngle() { + if (adjustingTips) return; + adjustingTips = true; double axisTiltAngle = tape.trackerPanel.getCoords().getAngle(n); tapeAngle = xAxisToTapeAngle + axisTiltAngle; double sin = Math.sin(tapeAngle); @@ -588,6 +601,7 @@ else if (p==handle) { end1.setLocation(x1, y1); end2.setLocation(x2, y2); } + adjustingTips = false; } /** @@ -708,7 +722,7 @@ class Tip extends TPoint { public Tip(double x, double y) { super(x, y); } - + /** * Overrides TPoint setXY method. * diff --git a/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java b/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java index cdf64bec..87fcabd6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/ThumbnailDialog.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackChooserTView.java b/src/org/opensourcephysics/cabrillo/tracker/TrackChooserTView.java index 34934e37..846ff8d6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackChooserTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackChooserTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java b/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java index d0d3caf9..9a3a0514 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackControl.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackDataBuilder.java b/src/org/opensourcephysics/cabrillo/tracker/TrackDataBuilder.java index 3f1bd58c..a59596c1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackDataBuilder.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackDataBuilder.java @@ -13,6 +13,7 @@ import java.util.Iterator; import java.util.Map; import java.util.TreeMap; + import javax.swing.Box; import javax.swing.Icon; import javax.swing.JButton; @@ -348,6 +349,7 @@ protected void refreshGUI() { autoloadButton.setText(TrackerRes.getString("TrackerPanel.DataBuilder.Button.Autoload")+"..."); //$NON-NLS-1$ //$NON-NLS-2$ autoloadButton.setToolTipText(TrackerRes.getString("TrackerPanel.DataBuilder.Button.Autoload.Tooltip")); //$NON-NLS-1$ } + setFontLevel(FontSizer.getLevel()); if (autoloadManager!=null) { autoloadManager.refreshGUI(); } @@ -404,6 +406,33 @@ public void propertyChange(PropertyChangeEvent e) { } return panel; } + + @Override + public void setFontLevel(int level) { + if (autoloadButton==null) return; + level = Math.max(0, level); + Object[] toSize = new Object[] {loadButton, saveButton, autoloadButton}; + FontSizer.setFonts(toSize, level); + for (String name: panels.keySet()) { + TTrack track = trackerPanel.getTrack(name); + FunctionPanel panel = panels.get(name); + if (track==null || panel==null) continue; + // get new footprint icon, automatically resized to current level + panel.setIcon(track.getFootprint().getIcon(21, 16)); + } + + super.setFontLevel(level); + validate(); + autoloadButton.revalidate(); + } + + @Override + public void setVisible(boolean vis) { + if (vis) { + setFontLevel(FontSizer.getLevel()); + } + super.setVisible(vis); + } /** * Adds a FunctionPanel. @@ -728,9 +757,10 @@ protected AutoloadManager getAutoloadManager() { autoloadManager.setLocation(x, y); if (!Tracker.dataFunctionControlStrings.isEmpty()) { - // pig convert and save in user platform-dependent default directory? or let user decide? - final String userhome = System.getProperty("user.home"); //$NON-NLS-1$ - if (userhome!=null) { + // convert and save in user platform-dependent default search directory + ArrayList searchPaths = OSPRuntime.getDefaultSearchPaths(); + final String directory = searchPaths.size()>0? searchPaths.get(0): null; + if (directory!=null) { Runnable runner = new Runnable() { public void run() { int response = JOptionPane.showConfirmDialog(TrackDataBuilder.this, @@ -749,7 +779,7 @@ public void run() { builder.addPanelWithoutAutoloading("panel"+i, panel); //$NON-NLS-1$ i++; } - File file = new File(userhome, "TrackerConvertedAutoloadFunctions.xml"); //$NON-NLS-1$ + File file = new File(directory, "TrackerConvertedAutoloadFunctions.xml"); //$NON-NLS-1$ XMLControl control = new XMLControlElement(builder); control.write(file.getAbsolutePath()); Tracker.dataFunctionControlStrings.clear(); diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackPlottingPanel.java b/src/org/opensourcephysics/cabrillo/tracker/TrackPlottingPanel.java index 8a56f15a..fbfe1b8d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackPlottingPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackPlottingPanel.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java b/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java index 3e1ed6ee..6c09f23e 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackRenderer.java @@ -20,13 +20,16 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.awt.*; + import javax.swing.*; +import org.opensourcephysics.tools.FontSizer; + /** * A custom renderer to show track name and icon in dropdown list items * @@ -57,6 +60,7 @@ public Component getListCellRendererComponent(JList list, Object[] array = (Object[])value; setText((String)array[1]); setIcon((Icon)array[0]); + FontSizer.setFonts(this, FontSizer.getLevel()); } return this; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackView.java b/src/org/opensourcephysics/cabrillo/tracker/TrackView.java index 18373209..e762d1c7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 25df585e..d2949740 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -40,6 +40,7 @@ import java.awt.event.*; import javax.swing.*; +import javax.swing.Timer; import javax.swing.border.BevelBorder; import javax.swing.event.MouseInputAdapter; @@ -63,17 +64,18 @@ public class Tracker { // define static constants /** tracker version */ - public static final String VERSION = "4.88"; //$NON-NLS-1$ + public static final String VERSION = "4.90"; //$NON-NLS-1$ /** the tracker icon */ public static final ImageIcon TRACKER_ICON = new ImageIcon( Tracker.class.getResource("resources/images/tracker_icon_32.png")); //$NON-NLS-1$ /** a larger tracker icon */ public static final ImageIcon TRACKER_ICON_256 = new ImageIcon( Tracker.class.getResource("resources/images/tracker_icon_256.png")); //$NON-NLS-1$ - static final String THETA = TeXParser.parseTeX("$\\theta"); //$NON-NLS-1$ - static final String OMEGA = TeXParser.parseTeX("$\\omega"); //$NON-NLS-1$ - static final String ALPHA = TeXParser.parseTeX("$\\alpha"); //$NON-NLS-1$ - static final String DEGREES = "�"; //$NON-NLS-1$ + + static final String THETA = TeXParser.parseTeX("$\\theta"); //$NON-NLS-1$ + static final String OMEGA = TeXParser.parseTeX("$\\omega"); //$NON-NLS-1$ + static final String ALPHA = TeXParser.parseTeX("$\\alpha"); //$NON-NLS-1$ + static final String DEGREES = "º"; //$NON-NLS-1$ static final Level DEFAULT_LOG_LEVEL = ConsoleLevel.OUT_CONSOLE; // for testing @@ -83,8 +85,8 @@ public class Tracker { // define static fields static String trackerHome; static String[] fullConfig = - {"file.new", "file.open", "file.close", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "file.import", "file.export", "file.save", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + {"file.new", "file.open", "file.close", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "file.import", "file.export", "file.save", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "file.saveAs", "file.print", "file.library", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "edit.copyObject", "edit.copyData", "edit.copyImage", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "edit.paste", "edit.matSize", //$NON-NLS-1$ //$NON-NLS-2$ @@ -92,13 +94,13 @@ public class Tracker { "video.close", "video.visible", "video.filters", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "pageView.edit", "notes.edit", "new.pointMass", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "new.cm", "new.vector", "new.vectorSum", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "new.lineProfile", "new.RGBRegion", //$NON-NLS-1$ //$NON-NLS-2$ - "new.analyticParticle", "new.clone", //$NON-NLS-1$ //$NON-NLS-2$ - "new.dynamicParticle", "new.dynamicTwoBody", //$NON-NLS-1$ //$NON-NLS-2$ - "new.dataTrack", "new.tapeMeasure", "new.protractor", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "calibration.stick", "calibration.tape", //$NON-NLS-1$ //$NON-NLS-2$ - "calibration.points", "calibration.offsetOrigin", //$NON-NLS-1$ //$NON-NLS-2$ - "track.name", "track.description", //$NON-NLS-1$ //$NON-NLS-2$ + "new.lineProfile", "new.RGBRegion", //$NON-NLS-1$ //$NON-NLS-2$ + "new.analyticParticle", "new.clone", "new.circleFitter", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "new.dynamicParticle", "new.dynamicTwoBody", //$NON-NLS-1$ //$NON-NLS-2$ + "new.dataTrack", "new.tapeMeasure", "new.protractor", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "calibration.stick", "calibration.tape", //$NON-NLS-1$ //$NON-NLS-2$ + "calibration.points", "calibration.offsetOrigin", //$NON-NLS-1$ //$NON-NLS-2$ + "track.name", "track.description", //$NON-NLS-1$ //$NON-NLS-2$ "track.color", "track.footprint", //$NON-NLS-1$ //$NON-NLS-2$ "track.visible", "track.locked", //$NON-NLS-1$ //$NON-NLS-2$ "track.delete", "track.autoAdvance", //$NON-NLS-1$ //$NON-NLS-2$ @@ -107,8 +109,8 @@ public class Tracker { "coords.scale", "coords.refFrame", "button.x", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "button.v", "button.a", "button.trails", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ "button.labels", "button.stretch", "button.clipSettings", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "button.xMass", "button.axes", "button.path", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - "config.saveWithData", "data.builder", "data.tool"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "button.xMass", "button.axes", "button.path", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + "config.saveWithData", "data.builder", "data.tool"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ static Set defaultConfig; static boolean ffmpegCopied; static String[] mainArgs; @@ -116,9 +118,10 @@ public class Tracker { static Icon trackerLogoIcon, ospLogoIcon; static JLabel tipOfTheDayLabel; static JProgressBar progressBar; + static String counterPath = "http://physlets.org/tracker/counter/counter.php?"; //$NON-NLS-1$ static String newerVersion; // new version available if non-null static String copyright = "Copyright (c) 2015 Douglas Brown"; //$NON-NLS-1$ - static String trackerWebsite = "www.cabrillo.edu/~dbrown/tracker"; //$NON-NLS-1$ + static String trackerWebsite = "physlets.org/tracker"; //$NON-NLS-1$ static String author = "Douglas Brown"; //$NON-NLS-1$ static String osp = "Open Source Physics"; //$NON-NLS-1$ static AbstractAction aboutQTAction, aboutFFMPegAction, aboutThreadsAction; @@ -130,7 +133,7 @@ public class Tracker { static JTextArea trackerPrefsTextArea; static String prefsPath; @SuppressWarnings("javadoc") - public static String rootXMLPath = ""; // path to root directory of trk files //$NON-NLS-1$ + public static String rootXMLPath = ""; // path to root directory of trk files //$NON-NLS-1$ static Cursor zoomInCursor, zoomOutCursor, grabCursor, grabbedCursor; static boolean showHints = true; static boolean startupHintShown; @@ -152,6 +155,7 @@ public class Tracker { static boolean qtLoading, qtLoaded; static Registry registry; // used for RMI communication with EJS static DataTrackTool dataTrackTool; // used for RMI communication with EJS + static boolean toolRegistered, toolNotFound; // user-settable preferences saved/loaded by Preferences class static Level preferredLogLevel = DEFAULT_LOG_LEVEL; @@ -162,7 +166,7 @@ public class Tracker { static String preferredJRE, preferredJRE32, preferredJRE64; static String preferredTrackerJar; static int checkForUpgradeInterval = 0; - static int preferredFontLevel = 0; + static int preferredFontLevel = 0, preferredFontLevelPlus = 0; static boolean isRadians, isVideoFast, engineKnown=true; static boolean warnFFMPegError=true, warnNoVideoEngine=true, use32BitMode=false; static boolean warnVariableDuration=true; @@ -223,9 +227,25 @@ public class Tracker { new Locale("sv"), // swedish //$NON-NLS-1$ Locale.TAIWAN, // traditional chinese Locale.CHINA}; // simplified chinese - setDefaultConfig(getFullConfig()); - loadPreferences(); - loadCurrentVersion(false); + setDefaultConfig(getFullConfig()); + loadPreferences(); + // load current version after a delay to allow video engines to load + Timer timer = new Timer(10000, new ActionListener() { + public void actionPerformed(ActionEvent e) { + Runnable runner = new Runnable() { + public void run() { + loadCurrentVersion(false, true); + } + }; + Thread opener = new Thread(runner); + opener.setPriority(Thread.NORM_PRIORITY); + opener.setDaemon(true); + opener.start(); + } + }); + timer.setRepeats(false); + timer.start(); + xmlFilter = new java.io.FileFilter() { // accept only *.xml files. public boolean accept(File f) { @@ -236,8 +256,8 @@ public boolean accept(File f) { } }; autoloadDataFunctions(); - - // check for upgrade intervals + + // check for upgrade intervals checkForUpgradeChoices = new ArrayList(); checkForUpgradeIntervals = new HashMap(); String s = "PrefsDialog.Upgrades.Always"; //$NON-NLS-1$ @@ -317,7 +337,7 @@ public void mouseDragged(MouseEvent e) { // version south String vers = author+" "+osp+" Ver "+VERSION; //$NON-NLS-1$ //$NON-NLS-2$ - if (VERSION.length()>5 || testOn) vers += " BETA"; //$NON-NLS-1$ + if (VERSION.length()>5 || testOn) vers += " BETA"; //$NON-NLS-1$ JLabel versionLabel = new JLabel(vers); versionLabel.setForeground(darkblue); font = font.deriveFont(Font.BOLD).deriveFont(10f); @@ -338,22 +358,22 @@ public void mouseDragged(MouseEvent e) { int y = 3*dim.height/5; // below center splash.setLocation(x-size.width/2, y-size.height/2); - // set up videos extensions to extract from jars - // this list should agree with ffmpeg video types below - for (String ext: VideoIO.VIDEO_EXTENSIONS) { // {"mov", "avi", "mp4"} + // set up videos extensions to extract from jars + // this list should agree with ffmpeg video types below + for (String ext: VideoIO.VIDEO_EXTENSIONS) { // {"mov", "avi", "mp4"} ResourceLoader.addExtractExtension(ext); - } + } - is64BitVM = OSPRuntime.getVMBitness()==64; - - // add FFMPeg video types, if available using reflection - try { - String ffmpegIOName = "org.opensourcephysics.media.ffmpeg.FFMPegIO"; //$NON-NLS-1$ - Class ffmpegIOClass = Class.forName(ffmpegIOName); - Method method = ffmpegIOClass.getMethod("registerWithVideoIO", (Class[]) null); //$NON-NLS-1$ - method.invoke(null, (Object[]) null); - } catch (Exception ex) { - } + is64BitVM = OSPRuntime.getVMBitness()==64; + + // add FFMPeg video types, if available, using reflection + try { + String ffmpegIOName = "org.opensourcephysics.media.ffmpeg.FFMPegIO"; //$NON-NLS-1$ + Class ffmpegIOClass = Class.forName(ffmpegIOName); + Method method = ffmpegIOClass.getMethod("registerWithVideoIO", (Class[]) null); //$NON-NLS-1$ + method.invoke(null, (Object[]) null); + } catch (Exception ex) { + } // add QT video types, if available, using reflection if (!OSPRuntime.isLinux()) { @@ -367,9 +387,9 @@ public void run() { // VideoFileFilter filter = new VideoFileFilter(ext, new String[] {ext}); // qtType = new QTVideoType(filter); // VideoIO.addVideoType(qtType); -// } - qtLoading = true; - String qtTypeName = "org.opensourcephysics.media.quicktime.QTVideoType"; //$NON-NLS-1$ +// } + qtLoading = true; + String qtTypeName = "org.opensourcephysics.media.quicktime.QTVideoType"; //$NON-NLS-1$ Class qtClass = Class.forName(qtTypeName); Constructor[] constructors = qtClass.getDeclaredConstructors(); Constructor cNoArgs = null, cFilterArg = null; @@ -388,23 +408,23 @@ else if (argTypes.length==1 && argTypes[0].equals(VideoFileFilter.class)) { VideoIO.addVideoEngine(qtType); if (cFilterArg==null) { - qtLoaded = true; - return; + qtLoaded = true; + return; } - for (String ext: VideoIO.VIDEO_EXTENSIONS) { // {"mov", "avi", "mp4"} - VideoFileFilter filter = new VideoFileFilter(ext, new String[] {ext}); + for (String ext: VideoIO.VIDEO_EXTENSIONS) { // {"mov", "avi", "mp4"} + VideoFileFilter filter = new VideoFileFilter(ext, new String[] {ext}); qtType = (VideoType)cFilterArg.newInstance(filter); VideoIO.addVideoType(qtType); - } - qtLoaded = true; + } + qtLoaded = true; } catch (Exception ex) { // QT for Java not working - OSPLog.config("QuickTime exception: "+ex.toString()); //$NON-NLS-1$ - qtLoading = false; + OSPLog.config("QuickTime exception: "+ex.toString()); //$NON-NLS-1$ + qtLoading = false; } catch (Error er) { // QT for Java not working - OSPLog.config("QuickTime error: "+er.toString()); //$NON-NLS-1$ - qtLoading = false; + OSPLog.config("QuickTime error: "+er.toString()); //$NON-NLS-1$ + qtLoading = false; } } }; @@ -413,7 +433,7 @@ else if (argTypes.length==1 && argTypes[0].equals(VideoFileFilter.class)) { opener.setDaemon(true); opener.start(); } - + VideoIO.setDefaultXMLExtension("trk"); //$NON-NLS-1$ // create pdf help button @@ -444,7 +464,7 @@ public void run() { */ public static Tracker getTracker() { if (tracker == null) { - OSPLog.fine("creating shared Tracker"); //$NON-NLS-1$ + OSPLog.fine("creating shared Tracker"); //$NON-NLS-1$ tracker = new Tracker(null, false, false); } return tracker; @@ -524,35 +544,35 @@ private void createFrame() { // create actions createActions(); Tracker.setProgress(5); - OSPRuntime.setLookAndFeel(true, lookAndFeel); + OSPRuntime.setLookAndFeel(true, lookAndFeel); frame = new TFrame(); Diagnostics.setDialogOwner(frame); - DiagnosticsForFFMPeg.setDialogOwner(frame); + DiagnosticsForXuggle.setDialogOwner(frame); // set up the Java VM exit mechanism when used as application if ( org.opensourcephysics.display.OSPRuntime.applet == null) { frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { - // save preferences, but first clean up autoloadMap - ArrayList dirs = new ArrayList(); - if (preferredAutoloadSearchPaths!=null) { - for (String path: preferredAutoloadSearchPaths) dirs.add(path); - } - else dirs.addAll(getDefaultAutoloadSearchPaths()); - - for (Iterator it = autoloadMap.keySet().iterator(); it.hasNext();) { - String filePath = it.next(); - String parentPath = XML.getDirectoryPath(filePath); - boolean keep = false; - for (String dir: dirs) { - keep = keep || parentPath.equals(dir); - } - if (!keep || !new File(filePath).exists()) { - it.remove(); - } - } - savePreferences(); - if (frame.libraryBrowser!=null) { - boolean canceled = !frame.libraryBrowser.exit(); + // save preferences, but first clean up autoloadMap + ArrayList dirs = new ArrayList(); + if (preferredAutoloadSearchPaths!=null) { + for (String path: preferredAutoloadSearchPaths) dirs.add(path); + } + else dirs.addAll(getDefaultAutoloadSearchPaths()); + + for (Iterator it = autoloadMap.keySet().iterator(); it.hasNext();) { + String filePath = it.next(); + String parentPath = XML.getDirectoryPath(filePath); + boolean keep = false; + for (String dir: dirs) { + keep = keep || parentPath.equals(dir); + } + if (!keep || !new File(filePath).exists()) { + it.remove(); + } + } + savePreferences(); + if (frame.libraryBrowser!=null) { + boolean canceled = !frame.libraryBrowser.exit(); if (canceled) { // exiting is canceled so temporarily change close operation // to DO_NOTHING and return @@ -589,20 +609,20 @@ public void run() { return; } frame.removeTab(frame.getTrackerPanel(i)); - } catch (Exception ex) { - } + } catch (Exception ex) { + } } // hide the frame frame.setVisible(false); - + // unregister the DataTrackTool and inform RMI clients - dataTrackTool.trackerExiting(); - unregisterRemoteTool(dataTrackTool); + dataTrackTool.trackerExiting(); + unregisterRemoteTool(dataTrackTool); // exit the system if frame wishes to exit if (frame.wishesToExit() && - frame.getDefaultCloseOperation() == WindowConstants.DISPOSE_ON_CLOSE) { + frame.getDefaultCloseOperation() == WindowConstants.DISPOSE_ON_CLOSE) { System.exit(0); } } @@ -625,11 +645,11 @@ public static Image getOSXDockImage() { * Shows the About Tracker dialog. */ public static void showAboutTracker() { - String newline = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ - String vers = Tracker.VERSION; - if (vers.length()>5 || testOn) vers += " BETA"; //$NON-NLS-1$ - String date = OSPRuntime.getLaunchJarBuildDate(); - if (date!=null) + String newline = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + String vers = Tracker.VERSION; + if (vers.length()>5 || testOn) vers += " BETA"; //$NON-NLS-1$ + String date = OSPRuntime.getLaunchJarBuildDate(); + if (date!=null) vers = vers+" "+date; //$NON-NLS-1$ String aboutString = "Tracker " //$NON-NLS-1$ + vers + newline @@ -649,70 +669,70 @@ public static void showAboutTracker() { JOptionPane.INFORMATION_MESSAGE); } - /** - * Finds data functions in all DataBuilder XMLControl files found in a specified directory. - * This returns a map for which the keys are names of DataBuilder xml files and the values - * are lists of data functions as String[] {function name, expression, tracktype} - * - * @param dirPath the directory path - * @return map of file name to list of data functions - */ - public static Map> findDataFunctions(String dirPath) { - Map> results = new TreeMap>(); - if (dirPath==null) return results; - - File dir = new File(dirPath); - if (!dir.exists()) return results; - - File[] files = dir.listFiles(xmlFilter); - if (files!=null) { - for (File file: files) { - XMLControl control = new XMLControlElement(file.getPath()); - if (control.failedToRead()) { - continue; - } + /** + * Finds data functions in all DataBuilder XMLControl files found in a specified directory. + * This returns a map for which the keys are names of DataBuilder xml files and the values + * are lists of data functions as String[] {function name, expression, tracktype} + * + * @param dirPath the directory path + * @return map of file name to list of data functions + */ + public static Map> findDataFunctions(String dirPath) { + Map> results = new TreeMap>(); + if (dirPath==null) return results; + + File dir = new File(dirPath); + if (!dir.exists()) return results; + + File[] files = dir.listFiles(xmlFilter); + if (files!=null) { + for (File file: files) { + XMLControl control = new XMLControlElement(file.getPath()); + if (control.failedToRead()) { + continue; + } - Class type = control.getObjectClass(); - if (type!=null && TrackDataBuilder.class.isAssignableFrom(type)) { - ArrayList expandedFunctions = new ArrayList(); + Class type = control.getObjectClass(); + if (type!=null && TrackDataBuilder.class.isAssignableFrom(type)) { + ArrayList expandedFunctions = new ArrayList(); - // look through XMLControl for data functions - for (Object next: control.getPropertyContent()) { - if (next instanceof XMLProperty - && ((XMLProperty)next).getPropertyName().equals("functions")) { //$NON-NLS-1$ - // found DataFunctionPanels - XMLControl[] panels = ((XMLProperty)next).getChildControls(); - inner: for (XMLControl panelControl: panels) { - String trackType = panelControl.getString("description"); //$NON-NLS-1$ - @SuppressWarnings("unchecked") - ArrayList functions = (ArrayList)panelControl.getObject("functions"); //$NON-NLS-1$ - if (trackType==null || functions==null || functions.isEmpty()) continue inner; - - // add localized trackType name to function arrays - for (String[] f: functions) { - String[] data = new String[3]; - System.arraycopy(f, 0, data, 0, 2); - // use XML.getExtension method to get short name of track type - String trackName = XML.getExtension(trackType); - String localized = TrackerRes.getString(trackName+".Name"); //$NON-NLS-1$ - if (!localized.startsWith("!")) //$NON-NLS-1$ - trackName = localized; - data[2] = trackName; - expandedFunctions.add(data); - } - } // end inner loop - } - } // end outer loop - - // add entry to the results map - results.put(file.getName(), expandedFunctions); - } - - } - } - return results; - } - + // look through XMLControl for data functions + for (Object next: control.getPropertyContent()) { + if (next instanceof XMLProperty + && ((XMLProperty)next).getPropertyName().equals("functions")) { //$NON-NLS-1$ + // found DataFunctionPanels + XMLControl[] panels = ((XMLProperty)next).getChildControls(); + inner: for (XMLControl panelControl: panels) { + String trackType = panelControl.getString("description"); //$NON-NLS-1$ + @SuppressWarnings("unchecked") + ArrayList functions = (ArrayList)panelControl.getObject("functions"); //$NON-NLS-1$ + if (trackType==null || functions==null || functions.isEmpty()) continue inner; + + // add localized trackType name to function arrays + for (String[] f: functions) { + String[] data = new String[3]; + System.arraycopy(f, 0, data, 0, 2); + // use XML.getExtension method to get short name of track type + String trackName = XML.getExtension(trackType); + String localized = TrackerRes.getString(trackName+".Name"); //$NON-NLS-1$ + if (!localized.startsWith("!")) //$NON-NLS-1$ + trackName = localized; + data[2] = trackName; + expandedFunctions.add(data); + } + } // end inner loop + } + } // end outer loop + + // add entry to the results map + results.put(file.getName(), expandedFunctions); + } + + } + } + return results; + } + /** * Creates the actions. */ @@ -852,12 +872,12 @@ public void actionPerformed(ActionEvent e) { }; aboutQTAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutQT"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { - Diagnostics.aboutQTJava("Tracker"); //$NON-NLS-1$ + Diagnostics.aboutQTJava("Tracker"); //$NON-NLS-1$ } }; aboutFFMPegAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutFFMPeg"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { - DiagnosticsForFFMPeg.aboutFFMPeg("Tracker"); //$NON-NLS-1$ + DiagnosticsForFFMPeg.aboutXuggle("Tracker"); //$NON-NLS-1$ } }; aboutThreadsAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutThreads"), null) { //$NON-NLS-1$ @@ -1024,64 +1044,64 @@ protected static void setDefaultConfig(Set config) { defaultConfig.add(next); } } - + /** * Autoloads data functions found in the user home and code base directories. * This loads DataFunctionPanel XMLControls into a static collection that is * accessed when need by DataBuilder. */ protected static void autoloadDataFunctions() { - dataFunctionControls.clear(); - for (String dirPath: getInitialSearchPaths()) { - if (dirPath==null) continue; - - File dir = new File(dirPath); - if (!dir.exists()) continue; - - File[] files = dir.listFiles(xmlFilter); - if (files!=null) { - for (File file: files) { - XMLControl control = new XMLControlElement(file.getPath()); - if (control.failedToRead()) { - continue; - } - - Class type = control.getObjectClass(); - if (type!=null && TrackDataBuilder.class.isAssignableFrom(type)) { - for (Object next: control.getPropertyContent()) { - if (next instanceof XMLProperty - && ((XMLProperty)next).getPropertyName().equals("functions")) { //$NON-NLS-1$ - // found DataFunctionPanels - ArrayList controls = new ArrayList(); - XMLControl[] panels = ((XMLProperty)next).getChildControls(); - inner: for (XMLControl panelControl: panels) { - String trackType = panelControl.getString("description"); //$NON-NLS-1$ - @SuppressWarnings("unchecked") - ArrayList functions = (ArrayList)panelControl.getObject("functions"); //$NON-NLS-1$ - if (trackType==null || functions==null || functions.isEmpty()) - continue inner; - - // add panel to dataFunctionControls - controls.add(panelControl); - } // end inner loop - - String filePath = XML.forwardSlash(file.getAbsolutePath()); - dataFunctionControls.put(filePath, controls); - } - } // end next loop - } - } // end file loop - } - } // end dirPath loop + dataFunctionControls.clear(); + for (String dirPath: getInitialSearchPaths()) { + if (dirPath==null) continue; + + File dir = new File(dirPath); + if (!dir.exists()) continue; + + File[] files = dir.listFiles(xmlFilter); + if (files!=null) { + for (File file: files) { + XMLControl control = new XMLControlElement(file.getPath()); + if (control.failedToRead()) { + continue; + } + + Class type = control.getObjectClass(); + if (type!=null && TrackDataBuilder.class.isAssignableFrom(type)) { + for (Object next: control.getPropertyContent()) { + if (next instanceof XMLProperty + && ((XMLProperty)next).getPropertyName().equals("functions")) { //$NON-NLS-1$ + // found DataFunctionPanels + ArrayList controls = new ArrayList(); + XMLControl[] panels = ((XMLProperty)next).getChildControls(); + inner: for (XMLControl panelControl: panels) { + String trackType = panelControl.getString("description"); //$NON-NLS-1$ + @SuppressWarnings("unchecked") + ArrayList functions = (ArrayList)panelControl.getObject("functions"); //$NON-NLS-1$ + if (trackType==null || functions==null || functions.isEmpty()) + continue inner; + + // add panel to dataFunctionControls + controls.add(panelControl); + } // end inner loop + + String filePath = XML.forwardSlash(file.getAbsolutePath()); + dataFunctionControls.put(filePath, controls); + } + } // end next loop + } + } // end file loop + } + } // end dirPath loop } - /** - * Gets the default autoload search paths. - * - * @return the default search paths - */ + /** + * Gets the default autoload search paths. + * + * @return the default search paths + */ public static Collection getDefaultAutoloadSearchPaths() { - return OSPRuntime.getDefaultSearchPaths(); + return OSPRuntime.getDefaultSearchPaths(); } // /** @@ -1096,52 +1116,52 @@ public static Collection getDefaultAutoloadSearchPaths() { // * @return the DataTrack with the Data (may return null) // */ // public static DataTrack importData(Data data, Object source) { -// // get shared Tracker -// Tracker tracker = getTracker(); -// TFrame frame = tracker.getFrame(); -// frame.setVisible(true); -// -// // look for matching DataTrack in selected TrackerPanel? -// DataTrack model = null; -// TrackerPanel trackerPanel = frame.getTrackerPanel(frame.getSelectedTab()); -// if (trackerPanel!=null) { -// model = trackerPanel.importData(data, source); -// } -// -// // create new tab -// if (model==null) { -// trackerPanel = new TrackerPanel(); -// frame.addTab(trackerPanel); -// -// // pass the data and source to the TrackerPanel and get the DataTrack it creates -// model = trackerPanel.importData(data, source); -// } -// if (model==null) { -// frame.setVisible(false); -// return null; -// } -// return model; +// // get shared Tracker +// Tracker tracker = getTracker(); +// TFrame frame = tracker.getFrame(); +// frame.setVisible(true); +// +// // look for matching DataTrack in selected TrackerPanel? +// DataTrack model = null; +// TrackerPanel trackerPanel = frame.getTrackerPanel(frame.getSelectedTab()); +// if (trackerPanel!=null) { +// model = trackerPanel.importData(data, source); +// } +// +// // create new tab +// if (model==null) { +// trackerPanel = new TrackerPanel(); +// frame.addTab(trackerPanel); +// +// // pass the data and source to the TrackerPanel and get the DataTrack it creates +// model = trackerPanel.importData(data, source); +// } +// if (model==null) { +// frame.setVisible(false); +// return null; +// } +// return model; // } // - /** - * Gets the starting autoload search paths. Search paths may be later modified by the user. - * - * @return the search paths - */ + /** + * Gets the starting autoload search paths. Search paths may be later modified by the user. + * + * @return the search paths + */ protected static Collection getInitialSearchPaths() { - if (initialAutoloadSearchPaths.isEmpty()) { - if (preferredAutoloadSearchPaths!=null) { - for (String next: preferredAutoloadSearchPaths) { - initialAutoloadSearchPaths.add(next); - } - } - else { - for (String next: getDefaultAutoloadSearchPaths()) { - initialAutoloadSearchPaths.add(next); - } - } - } - return initialAutoloadSearchPaths; + if (initialAutoloadSearchPaths.isEmpty()) { + if (preferredAutoloadSearchPaths!=null) { + for (String next: preferredAutoloadSearchPaths) { + initialAutoloadSearchPaths.add(next); + } + } + else { + for (String next: getDefaultAutoloadSearchPaths()) { + initialAutoloadSearchPaths.add(next); + } + } + } + return initialAutoloadSearchPaths; } /** @@ -1150,16 +1170,16 @@ protected static Collection getInitialSearchPaths() { * @param localeName the name of the locale */ protected static void setPreferredLocale(String localeName) { - if (localeName==null) { - Locale.setDefault(defaultLocale); - preferredLocale = null; - } - else for (Locale locale: locales) { - if (locale.toString().equals(localeName)) { - Locale.setDefault(locale); - preferredLocale = localeName; - break; - } + if (localeName==null) { + Locale.setDefault(defaultLocale); + preferredLocale = null; + } + else for (Locale locale: locales) { + if (locale.toString().equals(localeName)) { + Locale.setDefault(locale); + preferredLocale = localeName; + break; + } } } @@ -1179,14 +1199,14 @@ protected static void setCache(String cachePath) { * @return true if any resources were updated */ protected static boolean updateResources() { - boolean updated = false; - // copy ffmpeg files to Tracker home, if needed - try { - File trackerDir = new File(TrackerStarter.findTrackerHome(false)); - updated = ExtensionsManager.getManager().copyFFMPegJarsTo(trackerDir); - } catch (Exception e) { - } - // OSX doesn't need QTJava updating + boolean updated = false; + // copy ffmpeg files to Tracker home, if needed + try { + File trackerDir = new File(TrackerStarter.findTrackerHome(false)); + updated = ExtensionsManager.getManager().copyFFMPegJarsTo(trackerDir); + } catch (Exception e) { + } + // OSX doesn't need QTJava updating if (OSPRuntime.isMac()) return updated; // copy newer QTJava, if found, to current Java extensions @@ -1215,66 +1235,124 @@ protected static boolean areEqual(Set set1, Set set2) { return true; } - protected static void loadCurrentVersion(boolean ignoreInterval) { + /** + * Loads the current (latest) Tracker version and compares it with this version. + * + * @param ignoreInterval true to load/compare immediately + * @param logToFile true to log in to the PHP counter + */ + protected static void loadCurrentVersion(boolean ignoreInterval, final boolean logToFile) { + if (!ResourceLoader.isURLAvailable("http://www.opensourcephysics.org")) { //$NON-NLS-1$ + return; + } if (!ignoreInterval) { // check to see if upgrade interval has passed long millis = System.currentTimeMillis(); long days = (millis-lastMillisChecked)/86400000; - if (days0) { // typical version: "4.00" or "4.61111227" - try { - // convert version string to double and compare with this version - double current = Double.parseDouble(s); - if (current>vers) { - newerVersion = s; - } - s = null; - } catch (Exception e) { // parse failed, so discard first character - s = s.substring(1); - } - } - } catch (Exception e) { // url connection failed - } - } - }; - Thread opener = new Thread(runner); - opener.setPriority(Thread.NORM_PRIORITY); - opener.setDaemon(true); - opener.start(); + // interval has passed, so check for upgrades and save current time + double vers = Double.parseDouble(VERSION); + // send runtime and version data as page name to get latest version from PHP script + String pageName = getPHPPageName(logToFile); + String latestVersion = loginGetLatestVersion(pageName); + try { + while (latestVersion != null && latestVersion.length()>0) { // typical version: "4.90" or "4.61111227" + try { + // convert version string to double and compare with this version + double current = Double.parseDouble(latestVersion); + if (current>vers) { + newerVersion = latestVersion; + } + latestVersion = null; + } catch (Exception e) { // parse failed, so discard first character + latestVersion = latestVersion.substring(1); + } + } + } catch (Exception e) { // url connection failed + } + } + + /** + * Gets the "page name" to send to the PHP counter. + * + * @param logToFile true to assemble a page name that will be counted/logged + * @return the page name + */ + private static String getPHPPageName(boolean logToFile) { + String page = "version"; //$NON-NLS-1$ + if (logToFile) { + // assemble "page" to send to counter + Locale locale = Locale.getDefault(); + String language = locale.getLanguage(); + String country = locale.getCountry(); + String engine = VideoIO.getEngine(); + String os = "unknownOS"; //$NON-NLS-1$ + try { // system properties may not be readable in some environments + os = System.getProperty("os.name", "unknownOS").toLowerCase(); //$NON-NLS-1$ //$NON-NLS-2$ + } catch(SecurityException ex) {} + os = os.replace(" ", ""); //$NON-NLS-1$ //$NON-NLS-2$ + page = "log_"+VERSION+"_"+os+"_"+engine; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + if (!"".equals(language)) { //$NON-NLS-1$ + if (!"".equals(country)) { //$NON-NLS-1$ + language += "-"+country; //$NON-NLS-1$ + } + page += "_"+language; //$NON-NLS-1$ + } + } + return page; } + /** + * Logs a specified page and returns the latest version of Tracker. + * + * @param page a page name + * @return the latest available version as a string + */ + private static String loginGetLatestVersion(String page) { + String path = counterPath+"page="+page; //$NON-NLS-1$ + try { + URL url = new URL(path); + Resource res = new Resource(url); + String version = res.getString(); + OSPLog.finer(path+": "+version); //$NON-NLS-1$ + return version; + } catch (Exception e) { + } + return VERSION; + } + + /** * Loads preferences from a preferences file, if any. */ protected static void loadPreferences() { - - XMLControl prefsControl = TrackerStarter.findPreferences(); - if (prefsControl!=null) { - prefsPath = prefsControl.getString("prefsPath"); //$NON-NLS-1$ - OSPLog.getOSPLog(); - OSPLog.info("loading preferences from "+XML.getAbsolutePath(new File(prefsPath))); //$NON-NLS-1$ - prefsControl.loadObject(null); // the loader itself reads the values - return; - } - -// // code below this point is legacy and should never be reached + + XMLControl prefsControl = TrackerStarter.findPreferences(); + if (prefsControl!=null) { + prefsPath = prefsControl.getString("prefsPath"); //$NON-NLS-1$ + if (prefsPath!=null) { + OSPLog.getOSPLog(); + OSPLog.info("loading preferences from "+XML.getAbsolutePath(new File(prefsPath))); //$NON-NLS-1$ + } + prefsControl.loadObject(null); // the loader itself reads the values + return; + } + +// // code below this point is legacy and should never be reached // // if not loaded, look in (1) user home, (2) TRACKER_HOME, (3) current directory // // check user home // XMLControl control = null; -// String loadedPath = null; +// String loadedPath = null; // String userhome = System.getProperty("user.home"); //$NON-NLS-1$ // if (userhome!=null) { // prefsPath = userhome+"/"+prefsFileName; //$NON-NLS-1$ @@ -1284,11 +1362,11 @@ protected static void loadPreferences() { // // if not loaded, check TRACKER_HOME // if (loadedPath==null) { // if (trackerHome!=null) { -// String path = trackerHome+"/"+prefsFileName; //$NON-NLS-1$ -// control = new XMLControlElement(path); -// if (!control.failedToRead()) loadedPath = path; -// if (prefsPath==null) -// prefsPath = path; +// String path = trackerHome+"/"+prefsFileName; //$NON-NLS-1$ +// control = new XMLControlElement(path); +// if (!control.failedToRead()) loadedPath = path; +// if (prefsPath==null) +// prefsPath = path; // } // } // // if not loaded, check launch jar directory @@ -1297,9 +1375,9 @@ protected static void loadPreferences() { // if (dir!=null) { // String path = dir+"/"+prefsFileName; //$NON-NLS-1$ // control = new XMLControlElement(path); -// if (!control.failedToRead()) loadedPath = path; +// if (!control.failedToRead()) loadedPath = path; // if (prefsPath==null && loadedPath!=null) -// prefsPath = path; +// prefsPath = path; // } // } // // check current directory @@ -1308,15 +1386,15 @@ protected static void loadPreferences() { // if (file.exists()) { // String path = file.getAbsolutePath(); // control = new XMLControlElement(path); -// if (!control.failedToRead()) loadedPath = path; +// if (!control.failedToRead()) loadedPath = path; // if (prefsPath==null && loadedPath!=null) -// prefsPath = path; +// prefsPath = path; // } // } // if (loadedPath!=null) { -// OSPLog.getOSPLog(); -// OSPLog.info("loading preferences from "+XML.getAbsolutePath(new File(loadedPath))); //$NON-NLS-1$ -// control.loadObject(null); // the loader itself sets the values +// OSPLog.getOSPLog(); +// OSPLog.info("loading preferences from "+XML.getAbsolutePath(new File(loadedPath))); //$NON-NLS-1$ +// control.loadObject(null); // the loader itself sets the values // } // // end legacy code } @@ -1329,25 +1407,25 @@ protected static void loadPreferences() { protected static String savePreferences() { // save prefs file in current preferences path XMLControl control = new XMLControlElement(new Preferences()); - control.write(prefsPath); - - // also write prefs to current directory if it already exists and is writable + control.write(prefsPath); + + // also write prefs to current directory if it already exists and is writable File file = new File(".tracker.prefs"); //$NON-NLS-1$ if (file.exists() && file.canWrite()) { - control.write(file.getAbsolutePath()); + control.write(file.getAbsolutePath()); } // save current trackerHome and ffmpegHome in OSP preferences if (trackerHome!=null) { - OSPRuntime.setPreference("TRACKER_HOME", trackerHome); //$NON-NLS-1$ + OSPRuntime.setPreference("TRACKER_HOME", trackerHome); //$NON-NLS-1$ } - String ffmpegHome = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ + String ffmpegHome = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ if (ffmpegHome!=null) { - OSPRuntime.setPreference("FFMPEG_HOME", ffmpegHome); //$NON-NLS-1$ + OSPRuntime.setPreference("FFMPEG_HOME", ffmpegHome); //$NON-NLS-1$ } OSPRuntime.savePreferences(); - return prefsPath; + return prefsPath; } /** @@ -1388,10 +1466,10 @@ protected static Cursor getZoomOutCursor() { * @param args array of tracker or video file names */ public static void main(String[] args) { -// String[] vars = {"TRACKER_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ -// for (String next: vars) { -// OSPLog.warning("Environment variable "+next+": "+System.getenv(next)); //$NON-NLS-1$ //$NON-NLS-2$ -// } +// String[] vars = {"TRACKER_HOME", "FFMPEG_HOME", "DYLD_LIBRARY_PATH"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ +// for (String next: vars) { +// OSPLog.warning("Environment variable "+next+": "+System.getenv(next)); //$NON-NLS-1$ //$NON-NLS-2$ +// } // determine if this is tracker.jar (Tracker main class) boolean isTracker = false; @@ -1412,18 +1490,18 @@ public static void main(String[] args) { else { // versions 4.87+ use environment variable to indicate relaunch String s = System.getenv(TrackerStarter.TRACKER_RELAUNCH); - isRelaunch = "true".equals(s); //$NON-NLS-1$ + isRelaunch = "true".equals(s); //$NON-NLS-1$ } // get memory size requested in environment, if any String memoryEnvironment = System.getenv("MEMORY_SIZE"); //$NON-NLS-1$ // get current memory (maximum heap) size - java.lang.management.MemoryMXBean memory - = java.lang.management.ManagementFactory.getMemoryMXBean(); + java.lang.management.MemoryMXBean memory + = java.lang.management.ManagementFactory.getMemoryMXBean(); long currentMemory = memory.getHeapMemoryUsage().getMax()/(1024*1024); - if (!isRelaunch) { - String javaCommand = System.getProperty("java.home"); //$NON-NLS-1$ + if (!isRelaunch) { + String javaCommand = System.getProperty("java.home"); //$NON-NLS-1$ javaCommand = XML.forwardSlash(javaCommand)+"/bin/java"; //$NON-NLS-1$ String javaPath = preferredJRE; if (javaPath!=null) { @@ -1436,42 +1514,42 @@ public static void main(String[] args) { boolean needsJavaVM = javaPath!=null && !javaCommand.equals(javaPath); // update resources like QuickTime - boolean updated = updateResources(); - - // compare memory with requested size(s) - if (memoryEnvironment!=null) { - originalMemoryRequest = requestedMemorySize; - requestedMemorySize = Integer.parseInt(memoryEnvironment); - } + boolean updated = updateResources(); + + // compare memory with requested size(s) + if (memoryEnvironment!=null) { + originalMemoryRequest = requestedMemorySize; + requestedMemorySize = Integer.parseInt(memoryEnvironment); + } - boolean needsMemory = requestedMemorySize>10 && - (currentMemory<9*requestedMemorySize/10 || currentMemory>11*requestedMemorySize/10); - - // check environment - boolean needsEnvironment = false; + boolean needsMemory = requestedMemorySize>10 && + (currentMemory<9*requestedMemorySize/10 || currentMemory>11*requestedMemorySize/10); + + // check environment + boolean needsEnvironment = false; try { String trackerDir = TrackerStarter.findTrackerHome(false); String trackerEnv = System.getenv("TRACKER_HOME"); //$NON-NLS-1$ if (trackerDir!=null && !trackerDir.equals(trackerEnv)) { - needsEnvironment = true; - } - else { - String ffmpegDir = TrackerStarter.findFFMPegHome(trackerDir, false); - String ffmpegEnv = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ - if (ffmpegDir!=null && !ffmpegDir.equals(ffmpegEnv)) { - needsEnvironment = true; - } - else { - if (ffmpegDir!=null && !OSPRuntime.isLinux()) { // not needed in Linux - String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ - String ffmpegPath = ffmpegDir+File.separator+subdir; - String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ - OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ - String pathEnv = System.getenv(pathName); - if (pathEnv==null || !pathEnv.contains(ffmpegPath)) { - needsEnvironment = true; - } - } + needsEnvironment = true; + } + else { + String ffmpegDir = TrackerStarter.findFFMPegHome(trackerDir, false); + String ffmpegEnv = System.getenv("FFMPEG_HOME"); //$NON-NLS-1$ + if (ffmpegDir!=null && !ffmpegDir.equals(ffmpegEnv)) { + needsEnvironment = true; + } + else { + if (ffmpegDir!=null) { + String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ + String ffmpegPath = ffmpegDir+File.separator+subdir; + String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ + OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ + String pathEnv = System.getenv(pathName); + if (pathEnv==null || !pathEnv.contains(xugglePath)) { + needsEnvironment = true; + } + } } } @@ -1479,22 +1557,22 @@ public static void main(String[] args) { } - // attempt to relaunch if needed - if (isTracker && (needsJavaVM || needsMemory || needsEnvironment || updated)) { - mainArgs = args; - if (requestedMemorySize<=10) { - requestedMemorySize = TrackerStarter.DEFAULT_MEMORY_SIZE; - } - System.setProperty(TrackerStarter.PREFERRED_MEMORY_SIZE, String.valueOf(requestedMemorySize)); - System.setProperty(TrackerStarter.PREFERRED_TRACKER_JAR, OSPRuntime.getLaunchJarPath()); + // attempt to relaunch if needed + if (isTracker && (needsJavaVM || needsMemory || needsEnvironment || updated)) { + mainArgs = args; + if (requestedMemorySize<=10) { + requestedMemorySize = TrackerStarter.DEFAULT_MEMORY_SIZE; + } + System.setProperty(TrackerStarter.PREFERRED_MEMORY_SIZE, String.valueOf(requestedMemorySize)); + System.setProperty(TrackerStarter.PREFERRED_TRACKER_JAR, OSPRuntime.getLaunchJarPath()); TrackerStarter.relaunch(mainArgs, true); return; } - } + } preferredMemorySize = requestedMemorySize; if (requestedMemorySize<0) - requestedMemorySize = (int)(currentMemory+2); + requestedMemorySize = (int)(currentMemory+2); start(args); } @@ -1508,33 +1586,33 @@ private static void start(String[] args) { if (args == null || args.length == 0) tracker = new Tracker(); else tracker = new Tracker(args, true, true); - if (OSPRuntime.isMac()) { - // instantiate the OSXServices class by reflection - String className = "org.opensourcephysics.cabrillo.tracker.deploy.OSXServices"; //$NON-NLS-1$ - try { + if (OSPRuntime.isMac()) { + // instantiate the OSXServices class by reflection + String className = "org.opensourcephysics.cabrillo.tracker.deploy.OSXServices"; //$NON-NLS-1$ + try { Class OSXClass = Class.forName(className); Constructor constructor = OSXClass.getConstructor(Tracker.class); constructor.newInstance(tracker); } catch (Exception ex) { } - } + } - FontSizer.setLevel(preferredFontLevel); - final TFrame frame = tracker.getFrame(); + FontSizer.setLevel(preferredFontLevel); + final TFrame frame = tracker.getFrame(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // create and register DataTrackTool - Runnable runner = new Runnable() { - public void run() { - try { - dataTrackTool = new DataTrackTool(frame); - registerRemoteTool(dataTrackTool); - } catch (RemoteException e) { - } - } - }; - new Thread(runner).start(); + Runnable runner = new Runnable() { + public void run() { + try { + dataTrackTool = new DataTrackTool(frame); + registerRemoteTool(dataTrackTool); + } catch (RemoteException e) { + } + } + }; + new Thread(runner).start(); LaunchNode node = Launcher.activeNode; if (node != null) { @@ -1554,18 +1632,19 @@ public void run() { // warnNoVideoEngine = false; // for PLATO - if (warnNoVideoEngine && VideoIO.getDefaultEngine().equals(VideoIO.ENGINE_NONE)) { - boolean ffmpegInstalled = ExtensionsManager.getManager().getFFMPegJar()!=null; - boolean qtInstalled = ExtensionsManager.getManager().getQTJavaZip()!=null; - - ArrayList message = new ArrayList(); - boolean showRelaunchDialog = false; - - // no engine installed - if (!ffmpegInstalled && !qtInstalled) { - message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message1")); //$NON-NLS-1$ - message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message2")); //$NON-NLS-1$ - message.add(" "); //$NON-NLS-1$ + if (warnNoVideoEngine && VideoIO.getDefaultEngine().equals(VideoIO.ENGINE_NONE)) { + // warn user that there is no working video engine + boolean ffmpegInstalled = ExtensionsManager.getManager().getFFMPegJar()!=null; + boolean qtInstalled = ExtensionsManager.getManager().getQTJavaZip()!=null; + + ArrayList message = new ArrayList(); + boolean showRelaunchDialog = false; + + // no engine installed + if (!ffmpegInstalled && !qtInstalled) { + message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message1")); //$NON-NLS-1$ + message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message2")); //$NON-NLS-1$ + message.add(" "); //$NON-NLS-1$ message.add(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Message3")); //$NON-NLS-1$ } @@ -1610,25 +1689,27 @@ public void actionPerformed(ActionEvent e) { box.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); if (showRelaunchDialog) { - // provide immediate way to change to 32-bit VM and relaunch - Object[] options = new Object[] { - TrackerRes.getString("Tracker.Dialog.Button.RelaunchNow"), //$NON-NLS-1$ + // provide immediate way to change to 32-bit VM and relaunch + Object[] options = new Object[] { + TrackerRes.getString("Tracker.Dialog.Button.RelaunchNow"), //$NON-NLS-1$ TrackerRes.getString("Tracker.Dialog.Button.ContinueWithoutEngine")}; //$NON-NLS-1$ - int response = JOptionPane.showOptionDialog(frame, box, + int response = JOptionPane.showOptionDialog(frame, box, TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Title"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE, null, options, options[0]); if (response==0) { // use prefs dialog to switch to 32-bit VM/default engine and relaunch - PrefsDialog prefs = frame.getPrefsDialog(); - prefs.vm32Button.setSelected(true); // also sets default video engine - // check that not canceled by user - if (!"cancel".equals(prefs.vm32Button.getName())) { //$NON-NLS-1$ - prefs.relaunchButton.doClick(0); - } - } - } - else { - JOptionPane.showMessageDialog(frame, box, + Runnable launcher = new Runnable() { + public void run() { + PrefsDialog prefs = frame.getPrefsDialog(); + prefs.relaunch32Bit(); + } + }; + SwingUtilities.invokeLater(launcher); + + } + } + else { + JOptionPane.showMessageDialog(frame, box, TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Title"), //$NON-NLS-1$ JOptionPane.INFORMATION_MESSAGE); } @@ -1652,8 +1733,8 @@ public void actionPerformed(ActionEvent e) { JOptionPane.showMessageDialog(null, box, TrackerRes.getString("Tracker.Dialog.StarterWarning.Title"), //$NON-NLS-1$ - JOptionPane.WARNING_MESSAGE); - } + JOptionPane.WARNING_MESSAGE); + } } @@ -1685,7 +1766,7 @@ protected static void logTime(String message) { OSPLog.info(sdf.format(cal.getTime())+": "+message); //$NON-NLS-1$ } } - + /** * Registers a Remote tool with the RMI registry. * @@ -1693,20 +1774,58 @@ protected static void logTime(String message) { * @return true if successfully registered */ protected static boolean registerRemoteTool(Remote remoteTool) { - // register tool - try { - // create registry if needed - if (registry==null) { - registry = java.rmi.registry.LocateRegistry.createRegistry(DataTrackSupport.PORT); - } - String name = remoteTool.getClass().getSimpleName(); - registry.rebind(name, remoteTool); - OSPLog.fine(name+" successfully registered"); //$NON-NLS-1$ - return true; - } catch (Exception ex) { - OSPLog.warning(ex.getMessage()); - } - return false; + final String toolname = remoteTool.getClass().getSimpleName(); + +// // create thread to see if registry is running and tool registered +// Thread registryThread = new Thread() { +// public void run() { +// toolRegistered = false; +// toolNotFound = false; +// try { +// registry = java.rmi.registry.LocateRegistry.getRegistry(DataTrackSupport.PORT); +// registry.lookup(toolname); +// toolRegistered = true; +// } +// catch (Exception exc) { +// toolNotFound = true; +// } +// } +// }; +// +// // start thread and check every half-second to see if completed +// registryThread.setPriority(Thread.NORM_PRIORITY); +// registryThread.start(); +// int attempts = 0; +// int maxAttempts = 8; +// while (attempts<=maxAttempts) { +// attempts++; +// if (toolRegistered || toolNotFound) { +// break; +// } +// try { Thread.sleep(500); } +// catch(Exception exc) {} +// } +// if (toolRegistered) { +// OSPLog.finest("Registry thread found registered tool "+toolname); //$NON-NLS-1$ +// return true; +// } +// +// OSPLog.finest("Killing registry thread and registering tool "+toolname); //$NON-NLS-1$ +// registryThread.interrupt(); + + // register tool + try { + // create registry if needed + if (registry==null) { + registry = java.rmi.registry.LocateRegistry.createRegistry(DataTrackSupport.PORT); + } + registry.rebind(toolname, remoteTool); + OSPLog.fine(toolname+" successfully registered"); //$NON-NLS-1$ + return true; + } catch (Exception ex) { + OSPLog.warning(ex.getMessage()); + } + return false; } /** @@ -1716,16 +1835,16 @@ protected static boolean registerRemoteTool(Remote remoteTool) { * @return true if successfully unregistered */ protected static boolean unregisterRemoteTool(Remote remoteTool) { - if (registry==null || remoteTool==null) return false; - try { - String name = remoteTool.getClass().getSimpleName(); - registry.unbind(name); - OSPLog.fine(name+" successfully unregistered"); //$NON-NLS-1$ - return true; - } catch (Exception ex) { - ex.printStackTrace(); - } - return false; + if (registry==null || remoteTool==null) return false; + try { + String name = remoteTool.getClass().getSimpleName(); + registry.unbind(name); + OSPLog.fine(name+" successfully unregistered"); //$NON-NLS-1$ + return true; + } catch (Exception ex) { + ex.printStackTrace(); + } + return false; } /** @@ -1765,52 +1884,52 @@ protected static void setRecentSize(int max) { // * Loads preferences from the deprecated tracker_starter prefs file. // */ // protected static void loadStarterPrefs() { -// // look for starter prefs file in user home -// File starterPrefsFile = null; -// String userHome = System.getProperty("user.home"); //$NON-NLS-1$ -// if (userHome!=null) { -// starterPrefsFile = new File(userHome, ".tracker_starter.prefs"); //$NON-NLS-1$ -// } -// // if not found, check trackerHome -// if (trackerHome!=null && (starterPrefsFile==null || !starterPrefsFile.exists())) { -// starterPrefsFile = new File(trackerHome, ".tracker_starter.prefs"); //$NON-NLS-1$ -// } +// // look for starter prefs file in user home +// File starterPrefsFile = null; +// String userHome = System.getProperty("user.home"); //$NON-NLS-1$ +// if (userHome!=null) { +// starterPrefsFile = new File(userHome, ".tracker_starter.prefs"); //$NON-NLS-1$ +// } +// // if not found, check trackerHome +// if (trackerHome!=null && (starterPrefsFile==null || !starterPrefsFile.exists())) { +// starterPrefsFile = new File(trackerHome, ".tracker_starter.prefs"); //$NON-NLS-1$ +// } // -// if (starterPrefsFile.exists()) try { -// String encoding = "UTF-8"; //$NON-NLS-1$ -// java.nio.charset.Charset charset = java.nio.charset.Charset.forName(encoding); -// InputStream stream = new FileInputStream(starterPrefsFile); -// BufferedReader in = new BufferedReader(new InputStreamReader(stream, charset)); +// if (starterPrefsFile.exists()) try { +// String encoding = "UTF-8"; //$NON-NLS-1$ +// java.nio.charset.Charset charset = java.nio.charset.Charset.forName(encoding); +// InputStream stream = new FileInputStream(starterPrefsFile); +// BufferedReader in = new BufferedReader(new InputStreamReader(stream, charset)); // String line = in.readLine(); // ArrayList runPaths = new ArrayList(); // while(line!=null) { -// if (line.startsWith("jre ")) { //$NON-NLS-1$ -// File javaFile = new File(line.substring(4).trim()); -// String jre = OSPRuntime.getJREPath(javaFile); -// Tracker.preferredJRE = "".equals(jre)? null: jre; //$NON-NLS-1$ -// } -// else if (line.startsWith("run ")) { //$NON-NLS-1$ -// String app = line.substring(4).trim(); -// if (!"".equals(app)) runPaths.add(app); //$NON-NLS-1$ -// } -// else if (line.startsWith("version ")) { //$NON-NLS-1$ -// String ver = line.substring(8).trim(); -// try { -// Double.parseDouble(ver); -// Tracker.preferredTrackerJar = "tracker-"+ver+".jar"; //$NON-NLS-1$ //$NON-NLS-2$ -// } catch (Exception ex) {} -// } +// if (line.startsWith("jre ")) { //$NON-NLS-1$ +// File javaFile = new File(line.substring(4).trim()); +// String jre = OSPRuntime.getJREPath(javaFile); +// Tracker.preferredJRE = "".equals(jre)? null: jre; //$NON-NLS-1$ +// } +// else if (line.startsWith("run ")) { //$NON-NLS-1$ +// String app = line.substring(4).trim(); +// if (!"".equals(app)) runPaths.add(app); //$NON-NLS-1$ +// } +// else if (line.startsWith("version ")) { //$NON-NLS-1$ +// String ver = line.substring(8).trim(); +// try { +// Double.parseDouble(ver); +// Tracker.preferredTrackerJar = "tracker-"+ver+".jar"; //$NON-NLS-1$ //$NON-NLS-2$ +// } catch (Exception ex) {} +// } // line = in.readLine(); // } // in.close(); // Tracker.prelaunchExecutables = runPaths.toArray(new String[0]); // } -// catch (Exception ex) {} +// catch (Exception ex) {} // } // -// static class TrackerOSXHandler implements com.apple.eawt.AboutHandler, -// com.apple.eawt.QuitHandler, com.apple.eawt.PreferencesHandler { -// Tracker tracker; +// static class TrackerOSXHandler implements com.apple.eawt.AboutHandler, +// com.apple.eawt.QuitHandler, com.apple.eawt.PreferencesHandler { +// Tracker tracker; // // TrackerOSXHandler(Tracker app) { // tracker = app; @@ -1888,20 +2007,20 @@ public void saveObject(XMLControl control, Object obj) { if (!Tracker.preferredLogLevel.equals(Tracker.DEFAULT_LOG_LEVEL)) // true by default control.setValue("log_level", Tracker.preferredLogLevel.getName()); //$NON-NLS-1$ if (!Tracker.showHintsByDefault) // true by default - control.setValue("show_hints", Tracker.showHintsByDefault); //$NON-NLS-1$ - if (Tracker.isRadians) // false by default - control.setValue("radians", Tracker.isRadians); //$NON-NLS-1$ - if (Tracker.isVideoFast) // false by default - control.setValue("video_fast", Tracker.isVideoFast); //$NON-NLS-1$ - if (!Tracker.warnNoVideoEngine) // true by default - control.setValue("warn_no_engine", Tracker.warnNoVideoEngine); //$NON-NLS-1$ - if (!Tracker.warnVariableDuration) // true by default - control.setValue("warn_variable_frame_duration", Tracker.warnVariableDuration); //$NON-NLS-1$ - if (!Tracker.warnFFMPegError) // true by default - control.setValue("warn_ffmpeg_error", Tracker.warnFFMPegError); //$NON-NLS-1$ - // always save preferred tracker.jar - String jar = Tracker.preferredTrackerJar==null? - "tracker.jar": Tracker.preferredTrackerJar; //$NON-NLS-1$ + control.setValue("show_hints", Tracker.showHintsByDefault); //$NON-NLS-1$ + if (Tracker.isRadians) // false by default + control.setValue("radians", Tracker.isRadians); //$NON-NLS-1$ + if (Tracker.isVideoFast) // false by default + control.setValue("video_fast", Tracker.isVideoFast); //$NON-NLS-1$ + if (!Tracker.warnNoVideoEngine) // true by default + control.setValue("warn_no_engine", Tracker.warnNoVideoEngine); //$NON-NLS-1$ + if (!Tracker.warnVariableDuration) // true by default + control.setValue("warn_variable_frame_duration", Tracker.warnVariableDuration); //$NON-NLS-1$ + if (!Tracker.warnFFMPegError) // true by default + control.setValue("warn_ffmpeg_error", Tracker.warnFFMPegError); //$NON-NLS-1$ + // always save preferred tracker.jar + String jar = Tracker.preferredTrackerJar==null? + "tracker.jar": Tracker.preferredTrackerJar; //$NON-NLS-1$ control.setValue("tracker_jar", jar); //$NON-NLS-1$ if (Tracker.preferredJRE!=null) control.setValue("java_vm", Tracker.preferredJRE); //$NON-NLS-1$ @@ -1919,17 +2038,17 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("run", Tracker.prelaunchExecutables); //$NON-NLS-1$ if (Tracker.preferredLocale!=null) control.setValue("locale", Tracker.preferredLocale); //$NON-NLS-1$ - if (Tracker.preferredFontLevel>0) + if (Tracker.preferredFontLevel>0) { control.setValue("font_size", Tracker.preferredFontLevel); //$NON-NLS-1$ + control.setValue("font_size_plus", Tracker.preferredFontLevelPlus); //$NON-NLS-1$ + } if (ResourceLoader.getOSPCache()!=null) { File cache = ResourceLoader.getOSPCache(); control.setValue("cache", cache.getPath()); //$NON-NLS-1$ } - if (Tracker.checkForUpgradeInterval>0) { - control.setValue("upgrade_interval", Tracker.checkForUpgradeInterval); //$NON-NLS-1$ - int lastChecked = (int)(Tracker.lastMillisChecked/1000L); - control.setValue("last_checked", lastChecked); //$NON-NLS-1$ - } + control.setValue("upgrade_interval", Tracker.checkForUpgradeInterval); //$NON-NLS-1$ + int lastChecked = (int)(Tracker.lastMillisChecked/1000L); + control.setValue("last_checked", lastChecked); //$NON-NLS-1$ JFileChooser chooser = VideoIO.getChooser(); File file = chooser.getCurrentDirectory(); String userDir = System.getProperty("user.dir"); //$NON-NLS-1$ @@ -1949,33 +2068,33 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("zip_export_extension", ExportZipDialog.preferredExtension); //$NON-NLS-1$ if (Tracker.recentFilesSize!=6) // 6 items by default - control.setValue("max_recent", Tracker.recentFilesSize); //$NON-NLS-1$ - if (!Tracker.recentFiles.isEmpty()) // empty by default - control.setValue("recent_files", Tracker.recentFiles); //$NON-NLS-1$ - if (Tracker.preferredAutoloadSearchPaths!=null) { - // added Dec 2104 - control.setValue("autoload_search_paths", preferredAutoloadSearchPaths); //$NON-NLS-1$ - } - if (!Tracker.autoloadMap.isEmpty()) { - // added Dec 2104 - String[][] autoloadData = new String[Tracker.autoloadMap.size()][]; - int i = 0; - for (String filePath: Tracker.autoloadMap.keySet()) { - String[] functions = Tracker.autoloadMap.get(filePath); - String[] fileAndFunctions = new String[functions.length+1]; - fileAndFunctions[0] = filePath; - System.arraycopy(functions, 0, fileAndFunctions, 1, functions.length); - autoloadData[i] = fileAndFunctions; - i++; - } - control.setValue("autoload_exclusions", autoloadData); //$NON-NLS-1$ - } - if (!Tracker.dataFunctionControlStrings.isEmpty()) { - // deprecated Dec 2014: this is for legacy preferences - control.setValue("data_functions", Tracker.dataFunctionControlStrings); //$NON-NLS-1$ - } - if (defaultConfig!=null && !areEqual(defaultConfig, getFullConfig())) { // defaultConfig by default - Configuration config = new Configuration(defaultConfig); + control.setValue("max_recent", Tracker.recentFilesSize); //$NON-NLS-1$ + if (!Tracker.recentFiles.isEmpty()) // empty by default + control.setValue("recent_files", Tracker.recentFiles); //$NON-NLS-1$ + if (Tracker.preferredAutoloadSearchPaths!=null) { + // added Dec 2104 + control.setValue("autoload_search_paths", preferredAutoloadSearchPaths); //$NON-NLS-1$ + } + if (!Tracker.autoloadMap.isEmpty()) { + // added Dec 2104 + String[][] autoloadData = new String[Tracker.autoloadMap.size()][]; + int i = 0; + for (String filePath: Tracker.autoloadMap.keySet()) { + String[] functions = Tracker.autoloadMap.get(filePath); + String[] fileAndFunctions = new String[functions.length+1]; + fileAndFunctions[0] = filePath; + System.arraycopy(functions, 0, fileAndFunctions, 1, functions.length); + autoloadData[i] = fileAndFunctions; + i++; + } + control.setValue("autoload_exclusions", autoloadData); //$NON-NLS-1$ + } + if (!Tracker.dataFunctionControlStrings.isEmpty()) { + // deprecated Dec 2014: this is for legacy preferences + control.setValue("data_functions", Tracker.dataFunctionControlStrings); //$NON-NLS-1$ + } + if (defaultConfig!=null && !areEqual(defaultConfig, getFullConfig())) { // defaultConfig by default + Configuration config = new Configuration(defaultConfig); control.setValue("configuration", config); //$NON-NLS-1$ } } @@ -1998,55 +2117,63 @@ public Object createObject(XMLControl control){ * @return the loaded object */ @SuppressWarnings("unchecked") - public Object loadObject(XMLControl control, Object obj) { + public Object loadObject(XMLControl control, Object obj) { Level logLevel = OSPLog.parseLevel(control.getString("log_level")); //$NON-NLS-1$ if(logLevel!=null) { - preferredLogLevel = logLevel; - OSPLog.setLevel(logLevel); - } - Tracker.isRadians = control.getBoolean("radians"); //$NON-NLS-1$ - Tracker.isVideoFast = control.getBoolean("video_fast"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_no_engine")) //$NON-NLS-1$ - Tracker.warnNoVideoEngine = control.getBoolean("warn_no_engine"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_ffmpeg_error")) //$NON-NLS-1$ - Tracker.warnFFMPegError = control.getBoolean("warn_ffmpeg_error"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("warn_variable_frame_duration")) //$NON-NLS-1$ - warnVariableDuration = control.getBoolean("warn_variable_frame_duration"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("show_hints")) { //$NON-NLS-1$ - showHintsByDefault = control.getBoolean("show_hints"); //$NON-NLS-1$ - showHints = Tracker.showHintsByDefault; - startupHintShown = !Tracker.showHints; - } - if (control.getPropertyNames().contains("java_vm")) //$NON-NLS-1$ - preferredJRE = control.getString("java_vm"); //$NON-NLS-1$ - preferredJRE32 = control.getString("java_vm_32"); //$NON-NLS-1$ - preferredJRE64 = control.getString("java_vm_64"); //$NON-NLS-1$ - use32BitMode = control.getBoolean("32-bit"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("memory_size")) //$NON-NLS-1$ - requestedMemorySize = control.getInt("memory_size"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("look_feel")) //$NON-NLS-1$ - lookAndFeel = control.getString("look_feel"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("run")) //$NON-NLS-1$ - prelaunchExecutables = (String[])control.getObject("run"); //$NON-NLS-1$ - if (control.getPropertyNames().contains("locale")) //$NON-NLS-1$ - setPreferredLocale(control.getString("locale")); //$NON-NLS-1$ - if (control.getPropertyNames().contains("font_size")) //$NON-NLS-1$ - preferredFontLevel = control.getInt("font_size"); //$NON-NLS-1$ - // set cache only if it has not yet been set - if (ResourceLoader.getOSPCache()==null) { - setCache(control.getString("cache")); //$NON-NLS-1$ - } - if (control.getPropertyNames().contains("upgrade_interval")) { //$NON-NLS-1$ - checkForUpgradeInterval = control.getInt("upgrade_interval"); //$NON-NLS-1$ - lastMillisChecked = control.getInt("last_checked")*1000L; //$NON-NLS-1$ + preferredLogLevel = logLevel; + OSPLog.setLevel(logLevel); + if (logLevel==Level.ALL) { + OSPLog.showLogInvokeLater(); + } } - if (control.getPropertyNames().contains("file_chooser_directory")) //$NON-NLS-1$ - OSPRuntime.chooserDir = control.getString("file_chooser_directory"); //$NON-NLS-1$ - - // preferred video engine - VideoIO.setEngine(control.getString("video_engine")); //$NON-NLS-1$ - VideoIO.setPreferredExportExtension(control.getString("export_extension")); //$NON-NLS-1$ - if (control.getPropertyNames().contains("zip_export_extension")) //$NON-NLS-1$ + isRadians = control.getBoolean("radians"); //$NON-NLS-1$ + isVideoFast = control.getBoolean("ffmpeg_fast"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("warn_no_engine")) //$NON-NLS-1$ + warnNoVideoEngine = control.getBoolean("warn_no_engine"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("warn_ffmpeg_error")) //$NON-NLS-1$ + warnFFMPegError = control.getBoolean("warn_ffmpeg_error"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("warn_variable_frame_duration")) //$NON-NLS-1$ + warnVariableDuration = control.getBoolean("warn_variable_frame_duration"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("show_hints")) { //$NON-NLS-1$ + showHintsByDefault = control.getBoolean("show_hints"); //$NON-NLS-1$ + showHints = Tracker.showHintsByDefault; + startupHintShown = !Tracker.showHints; + } + if (control.getPropertyNames().contains("java_vm")) //$NON-NLS-1$ + preferredJRE = control.getString("java_vm"); //$NON-NLS-1$ + preferredJRE32 = control.getString("java_vm_32"); //$NON-NLS-1$ + preferredJRE64 = control.getString("java_vm_64"); //$NON-NLS-1$ + use32BitMode = control.getBoolean("32-bit"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("memory_size")) //$NON-NLS-1$ + requestedMemorySize = control.getInt("memory_size"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("look_feel")) //$NON-NLS-1$ + lookAndFeel = control.getString("look_feel"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("run")) //$NON-NLS-1$ + prelaunchExecutables = (String[])control.getObject("run"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("locale")) //$NON-NLS-1$ + setPreferredLocale(control.getString("locale")); //$NON-NLS-1$ + if (control.getPropertyNames().contains("font_size")) { //$NON-NLS-1$ + preferredFontLevel = control.getInt("font_size"); //$NON-NLS-1$ + preferredFontLevelPlus = control.getInt("font_size_plus"); //$NON-NLS-1$ + if (preferredFontLevelPlus==Integer.MIN_VALUE) { + preferredFontLevelPlus = 0; + } + } + // set cache only if it has not yet been set + if (ResourceLoader.getOSPCache()==null) { + setCache(control.getString("cache")); //$NON-NLS-1$ + } + if (control.getPropertyNames().contains("upgrade_interval")) { //$NON-NLS-1$ + checkForUpgradeInterval = control.getInt("upgrade_interval"); //$NON-NLS-1$ + lastMillisChecked = control.getInt("last_checked")*1000L; //$NON-NLS-1$ + } + if (control.getPropertyNames().contains("file_chooser_directory")) //$NON-NLS-1$ + OSPRuntime.chooserDir = control.getString("file_chooser_directory"); //$NON-NLS-1$ + + // preferred video engine + VideoIO.setEngine(control.getString("video_engine")); //$NON-NLS-1$ + VideoIO.setPreferredExportExtension(control.getString("export_extension")); //$NON-NLS-1$ + if (control.getPropertyNames().contains("zip_export_extension")) //$NON-NLS-1$ ExportZipDialog.preferredExtension = control.getString("zip_export_extension"); //$NON-NLS-1$ if (control.getPropertyNames().contains("max_recent")) //$NON-NLS-1$ @@ -2054,40 +2181,40 @@ public Object loadObject(XMLControl control, Object obj) { if (control.getPropertyNames().contains("recent_files")) { //$NON-NLS-1$ ArrayList recent = ArrayList.class.cast(control.getObject("recent_files")); //$NON-NLS-1$ for (Object next: recent) { - addRecent(next.toString(), true); // add at end - } - } - // added Dec 2104 - Tracker.preferredAutoloadSearchPaths = (String[])control.getObject("autoload_search_paths"); //$NON-NLS-1$ - // load autoload_exclusions: added Dec 2014 - if (control.getPropertyNames().contains("autoload_exclusions")) { //$NON-NLS-1$ - String[][] autoloadData = (String[][])control.getObject("autoload_exclusions"); //$NON-NLS-1$ - for (String[] next: autoloadData) { - String filePath = XML.forwardSlash(next[0]); - String[] functions = new String[next.length-1]; - System.arraycopy(next, 1, functions, 0, functions.length); - autoloadMap.put(filePath, functions); - } - } - - // load autoloadable data function strings (deprecated Dec 2014: this is for legacy files) - if (control.getPropertyNames().contains("data_functions")) { //$NON-NLS-1$ - Collection autoloads = (Collection)control.getObject("data_functions"); //$NON-NLS-1$ - dataFunctionControlStrings.addAll(autoloads); - } + addRecent(next.toString(), true); // add at end + } + } + // added Dec 2014 + Tracker.preferredAutoloadSearchPaths = (String[])control.getObject("autoload_search_paths"); //$NON-NLS-1$ + // load autoload_exclusions: added Dec 2014 + if (control.getPropertyNames().contains("autoload_exclusions")) { //$NON-NLS-1$ + String[][] autoloadData = (String[][])control.getObject("autoload_exclusions"); //$NON-NLS-1$ + for (String[] next: autoloadData) { + String filePath = XML.forwardSlash(next[0]); + String[] functions = new String[next.length-1]; + System.arraycopy(next, 1, functions, 0, functions.length); + autoloadMap.put(filePath, functions); + } + } + + // load autoloadable data function strings (deprecated Dec 2014: this is for legacy files) + if (control.getPropertyNames().contains("data_functions")) { //$NON-NLS-1$ + Collection autoloads = (Collection)control.getObject("data_functions"); //$NON-NLS-1$ + dataFunctionControlStrings.addAll(autoloads); + } - XMLControl child = control.getChildControl("configuration"); //$NON-NLS-1$ - if (child!=null) { - Configuration config = (Configuration)child.loadObject(null); - setDefaultConfig(config.enabled); - } - // always load "tracker_jar" - preferredTrackerJar = control.getString("tracker_jar"); //$NON-NLS-1$ -// if (preferredTrackerJar==null) -// loadStarterPrefs(); - return obj; + XMLControl child = control.getChildControl("configuration"); //$NON-NLS-1$ + if (child!=null) { + Configuration config = (Configuration)child.loadObject(null); + setDefaultConfig(config.enabled); + } + // always load "tracker_jar" + preferredTrackerJar = control.getString("tracker_jar"); //$NON-NLS-1$ +// if (preferredTrackerJar==null) +// loadStarterPrefs(); + return obj; } - } + } } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java index 01a5bc92..91cfc081 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -59,8 +59,8 @@ */ public class TrackerIO extends VideoIO { - protected static final String TAB="\t", SPACE=" ", //$NON-NLS-1$ //$NON-NLS-2$ - COMMA=",", SEMICOLON=";"; //$NON-NLS-1$ //$NON-NLS-2$ + protected static final String TAB="\t", SPACE=" ", //$NON-NLS-1$ //$NON-NLS-2$ + COMMA=",", SEMICOLON=";"; //$NON-NLS-1$ //$NON-NLS-2$ protected static FileFilter zipFileFilter, trkFileFilter, trzFileFilter; protected static FileFilter videoAndTrkFileFilter, txtFileFilter, jarFileFilter; protected static String defaultDelimiter = TAB; // tab delimiter by default @@ -77,23 +77,23 @@ public class TrackerIO extends VideoIO { static { ffmpegListener = new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { - if (e.getPropertyName().equals("ffmpeg_error")) { //$NON-NLS-1$ - if (!isffmpegError) { // first error thrown - isffmpegError = true; - if (!Tracker.warnFFMPegError) { - if (e.getNewValue()!=null) { - String s = e.getNewValue().toString(); - int n = s.indexOf("]"); //$NON-NLS-1$ + if (e.getPropertyName().equals("ffmpeg_error")) { //$NON-NLS-1$ + if (!isffmpegError) { // first error thrown + isffmpegError = true; + if (!Tracker.warnFFMPegError) { + if (e.getNewValue()!=null) { + String s = e.getNewValue().toString(); + int n = s.indexOf("]"); //$NON-NLS-1$ if (n>-1) s = s.substring(n+1); s += TrackerRes.getString("TrackerIO.ErrorFFMPEG.LogMessage"); //$NON-NLS-1$ OSPLog.warning(s); - } - return; - } - // warn user that a FFMPeg error has occurred - Box box = Box.createVerticalBox(); - box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorFFMPEG.Message1"))); //$NON-NLS-1$ - String error = e.getNewValue().toString(); + } + return; + } + // warn user that a FFMPeg error has occurred + Box box = Box.createVerticalBox(); + box.add(new JLabel(TrackerRes.getString("TrackerIO.Dialog.ErrorFFMPEG.Message1"))); //$NON-NLS-1$ + String error = e.getNewValue().toString(); int n = error.lastIndexOf("]"); //$NON-NLS-1$ if (n>-1) { error = error.substring(n+1).trim(); @@ -120,13 +120,13 @@ public void actionPerformed(ActionEvent e) { } }); JButton dontShowAgainButton = new JButton(TrackerRes.getString("Tracker.Dialog.NoVideoEngine.Checkbox")); //$NON-NLS-1$ - dontShowAgainButton.setForeground(new Color(0, 0, 102)); - dontShowAgainButton.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - Tracker.warnFFMPegError = false; - dialog.setVisible(false); - } - }); + dontShowAgainButton.setForeground(new Color(0, 0, 102)); + dontShowAgainButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Tracker.warnFFMPegError = false; + dialog.setVisible(false); + } + }); JPanel buttonbar = new JPanel(); buttonbar.add(dontShowAgainButton); buttonbar.add(closeButton); @@ -192,7 +192,7 @@ public boolean accept(File f) { return false; } public String getDescription() { - return TrackerRes.getString("TrackerIO.VideoAndDataFileFilter.Description"); //$NON-NLS-1$ + return TrackerRes.getString("TrackerIO.VideoAndDataFileFilter.Description"); //$NON-NLS-1$ } }; txtFileFilter = new FileFilter() { @@ -204,7 +204,7 @@ public boolean accept(File f) { return false; } public String getDescription() { - return TrackerRes.getString("TrackerIO.TextFileFilter.Description"); //$NON-NLS-1$ + return TrackerRes.getString("TrackerIO.TextFileFilter.Description"); //$NON-NLS-1$ } }; jarFileFilter = new FileFilter() { @@ -216,7 +216,7 @@ public boolean accept(File f) { return false; } public String getDescription() { - return TrackerRes.getString("TrackerIO.JarFileFilter.Description"); //$NON-NLS-1$ + return TrackerRes.getString("TrackerIO.JarFileFilter.Description"); //$NON-NLS-1$ } }; delimiters.put(TrackerRes.getString("TrackerIO.Delimiter.Tab"), TAB); //$NON-NLS-1$ @@ -338,54 +338,55 @@ else if(selected!=JOptionPane.YES_OPTION) { * Displays a file chooser and returns the chosen files. * * @param type may be open, open video, save, insert image, export file, - * import file, save tabset, open data, open trk + * import file, save tabset, open data, open trk * @return the files, or null if no files chosen */ public static File[] getChooserFiles(String type) { JFileChooser chooser = getChooser(); int result = JFileChooser.CANCEL_OPTION; - chooser.resetChoosableFileFilters(); // open tracker or video file - if (type.toLowerCase().equals("open")) { //$NON-NLS-1$ - chooser.setMultiSelectionEnabled(false); + if (type.toLowerCase().equals("open")) { //$NON-NLS-1$ + chooser.setMultiSelectionEnabled(false); chooser.setAccessory(videoEnginePanel); - videoEnginePanel.reset(); - chooser.setAcceptAllFileFilterUsed(true); - chooser.addChoosableFileFilter(videoAndTrkFileFilter); - chooser.setFileFilter(videoAndTrkFileFilter); + videoEnginePanel.reset(); + chooser.setAcceptAllFileFilterUsed(true); + chooser.addChoosableFileFilter(videoAndTrkFileFilter); + chooser.setFileFilter(videoAndTrkFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Open.Title")); //$NON-NLS-1$ - result = chooser.showOpenDialog(null); - File file = chooser.getSelectedFile(); + result = chooser.showOpenDialog(null); + File file = chooser.getSelectedFile(); chooser.removeChoosableFileFilter(videoAndTrkFileFilter); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ + chooser.resetChoosableFileFilters(); if(result==JFileChooser.APPROVE_OPTION) { return new File[] {file}; - } - return null; - } + } + return null; + } // open tracker file - if (type.toLowerCase().equals("open trk")) { //$NON-NLS-1$ - chooser.setMultiSelectionEnabled(false); - chooser.setAccessory(null); - chooser.setAcceptAllFileFilterUsed(true); - chooser.addChoosableFileFilter(trkFileFilter); - chooser.setFileFilter(trkFileFilter); + if (type.toLowerCase().equals("open trk")) { //$NON-NLS-1$ + chooser.setMultiSelectionEnabled(false); + chooser.setAccessory(null); + chooser.setAcceptAllFileFilterUsed(true); + chooser.addChoosableFileFilter(trkFileFilter); + chooser.setFileFilter(trkFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Open.Title")); //$NON-NLS-1$ - result = chooser.showOpenDialog(null); - File file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(trkFileFilter); + result = chooser.showOpenDialog(null); + File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ - if(result==JFileChooser.APPROVE_OPTION) { - return new File[] {file}; - } - return null; - } + if(result==JFileChooser.APPROVE_OPTION) { + return new File[] {file}; + } + return null; + } // open any file - if (type.toLowerCase().equals("open any")) { //$NON-NLS-1$ - chooser.setMultiSelectionEnabled(false); + if (type.toLowerCase().equals("open any")) { //$NON-NLS-1$ + chooser.setMultiSelectionEnabled(false); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Open.Title")); //$NON-NLS-1$ result = chooser.showOpenDialog(null); File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if(result==JFileChooser.APPROVE_OPTION) { return new File[] {file}; @@ -395,19 +396,19 @@ public static File[] getChooserFiles(String type) { if(type.toLowerCase().equals("open video")) { // open video //$NON-NLS-1$ chooser.setMultiSelectionEnabled(false); chooser.setAccessory(videoEnginePanel); - videoEnginePanel.reset(); + videoEnginePanel.reset(); chooser.setAcceptAllFileFilterUsed(true); chooser.addChoosableFileFilter(videoFileFilter); - chooser.setFileFilter(videoFileFilter); + chooser.setFileFilter(videoFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Open.Title")); //$NON-NLS-1$ result = chooser.showOpenDialog(null); - File file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(videoFileFilter); + File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if(result==JFileChooser.APPROVE_OPTION) { return new File[] {file}; - } - return null; + } + return null; } if (type.toLowerCase().equals("open data")) { // open data //$NON-NLS-1$ chooser.setMultiSelectionEnabled(false); @@ -417,21 +418,21 @@ public static File[] getChooserFiles(String type) { chooser.setFileFilter(chooser.getAcceptAllFileFilter()); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.OpenData.Title")); //$NON-NLS-1$ result = chooser.showOpenDialog(null); - File file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(txtFileFilter); - chooser.removeChoosableFileFilter(jarFileFilter); + File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ - if(result==JFileChooser.APPROVE_OPTION) { - return new File[] {file}; - } - return null; + if(result==JFileChooser.APPROVE_OPTION) { + return new File[] {file}; + } + return null; } if (type.toLowerCase().equals("save")) { // save a file //$NON-NLS-1$ - chooser.setAccessory(null); - // note this sets no file filters nor title + chooser.setAccessory(null); + // note this sets no file filters nor title chooser.setMultiSelectionEnabled(false); result = chooser.showSaveDialog(null); File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if(result==JFileChooser.APPROVE_OPTION && canWrite(file)) { return new File[] {file}; @@ -441,41 +442,41 @@ public static File[] getChooserFiles(String type) { // import elements from a tracker file if (type.toLowerCase().equals("import file")) { //$NON-NLS-1$ chooser.setAccessory(null); - chooser.setMultiSelectionEnabled(false); - chooser.setAcceptAllFileFilterUsed(true); - chooser.addChoosableFileFilter(trkFileFilter); - chooser.setFileFilter(trkFileFilter); + chooser.setMultiSelectionEnabled(false); + chooser.setAcceptAllFileFilterUsed(true); + chooser.addChoosableFileFilter(trkFileFilter); + chooser.setFileFilter(trkFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Import.Title")); //$NON-NLS-1$ - result = chooser.showOpenDialog(null); - File file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(trkFileFilter); + result = chooser.showOpenDialog(null); + File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if(result==JFileChooser.APPROVE_OPTION) { return new File[] {file}; - } - return null; - } - // export elements to a tracker file - if (type.toLowerCase().equals("export file")) { //$NON-NLS-1$ - chooser.setAccessory(null); - chooser.setMultiSelectionEnabled(false); - chooser.setAcceptAllFileFilterUsed(true); - chooser.addChoosableFileFilter(trkFileFilter); - chooser.setFileFilter(trkFileFilter); + } + return null; + } + // export elements to a tracker file + if (type.toLowerCase().equals("export file")) { //$NON-NLS-1$ + chooser.setAccessory(null); + chooser.setMultiSelectionEnabled(false); + chooser.setAcceptAllFileFilterUsed(true); + chooser.addChoosableFileFilter(trkFileFilter); + chooser.setFileFilter(trkFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.Export.Title")); //$NON-NLS-1$ - result = chooser.showSaveDialog(null); - File file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(trkFileFilter); + result = chooser.showSaveDialog(null); + File file = chooser.getSelectedFile(); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ - if(result==JFileChooser.APPROVE_OPTION) { - return new File[] {file}; - } - return null; - } - // save a tabset file - if (type.toLowerCase().equals("save tabset")) { //$NON-NLS-1$ - chooser.setAccessory(null); - chooser.setAcceptAllFileFilterUsed(false); + if(result==JFileChooser.APPROVE_OPTION) { + return new File[] {file}; + } + return null; + } + // save a tabset file + if (type.toLowerCase().equals("save tabset")) { //$NON-NLS-1$ + chooser.setAccessory(null); + chooser.setAcceptAllFileFilterUsed(false); chooser.addChoosableFileFilter(trkFileFilter); chooser.setDialogTitle(TrackerRes.getString("TrackerIO.Dialog.SaveTabset.Title")); //$NON-NLS-1$ String filename = ""; //$NON-NLS-1$ @@ -488,7 +489,7 @@ public static File[] getChooserFiles(String type) { chooser.setSelectedFile(file); result = chooser.showSaveDialog(null); file = chooser.getSelectedFile(); - chooser.removeChoosableFileFilter(trkFileFilter); + chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if(result==JFileChooser.APPROVE_OPTION) { if(!defaultXMLExt.equals(getExtension(file))) { @@ -510,48 +511,48 @@ public static File[] getChooserFiles(String type) { * @return the file, or null if no file chosen */ public static File getChooserFileForExtension(String extension) { - if (extension!=null && !extension.trim().equals("")) { //$NON-NLS-1$ - extension = extension.trim().toLowerCase(); - } - else { - extension = null; - } - final String ext = extension; + if (extension!=null && !extension.trim().equals("")) { //$NON-NLS-1$ + extension = extension.trim().toLowerCase(); + } + else { + extension = null; + } + final String ext = extension; chooser.setDialogTitle(MediaRes.getString("VideoIO.Dialog.SaveVideoAs.Title")); //$NON-NLS-1$ chooser.resetChoosableFileFilters(); chooser.setAccessory(null); chooser.setMultiSelectionEnabled(false); chooser.setAcceptAllFileFilterUsed(ext!=null); if (ext!=null) { - FileFilter fileFilter = new FileFilter() { - public boolean accept(File f) { - if (f == null) return false; - if (f.isDirectory()) return true; - String extension = VideoIO.getExtension(f); - if (ext.equals(extension)) return true; - return false; - } - public String getDescription() { - String file = TrackerRes.getString("TMenuBar.Menu.File").toLowerCase(); //$NON-NLS-1$ - return ext.toUpperCase()+" "+file+" (."+ext+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - } - }; - chooser.addChoosableFileFilter(fileFilter); - chooser.setFileFilter(fileFilter); + FileFilter fileFilter = new FileFilter() { + public boolean accept(File f) { + if (f == null) return false; + if (f.isDirectory()) return true; + String extension = VideoIO.getExtension(f); + if (ext.equals(extension)) return true; + return false; + } + public String getDescription() { + String file = TrackerRes.getString("TMenuBar.Menu.File").toLowerCase(); //$NON-NLS-1$ + return ext.toUpperCase()+" "+file+" (."+ext+")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + } + }; + chooser.addChoosableFileFilter(fileFilter); + chooser.setFileFilter(fileFilter); } int result = chooser.showSaveDialog(null); - File file = chooser.getSelectedFile(); + File file = chooser.getSelectedFile(); chooser.resetChoosableFileFilters(); chooser.setSelectedFile(new File("")); //$NON-NLS-1$ if (file==null) return null; if(result==JFileChooser.APPROVE_OPTION) { if (ext!=null && !ext.equals(XML.getExtension(file.getName()))) { - String path = file.getAbsolutePath(); - path = XML.stripExtension(path)+"."+ext; //$NON-NLS-1$ - file = new File(path); + String path = file.getAbsolutePath(); + path = XML.stripExtension(path)+"."+ext; //$NON-NLS-1$ + file = new File(path); } if (!canWrite(file)) { - return null; + return null; } return file; } @@ -596,11 +597,11 @@ public static boolean canWrite(File file) { * @return the video */ public static Video getVideo(String path, VideoType vidType) { - boolean logConsole = OSPLog.isConsoleMessagesLogged(); - if (!Tracker.warnFFMPegError) - OSPLog.setConsoleMessagesLogged(false); - if (path.startsWith("file:")) //$NON-NLS-1$ - path = ResourceLoader.getNonURIPath(path); + boolean logConsole = OSPLog.isConsoleMessagesLogged(); + if (!Tracker.warnFFMPegError) + OSPLog.setConsoleMessagesLogged(false); + if (path.startsWith("file:")) //$NON-NLS-1$ + path = ResourceLoader.getNonURIPath(path); Video video = VideoIO.getVideo(path, vidType); OSPLog.setConsoleMessagesLogged(logConsole); return video; @@ -668,13 +669,13 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, ArrayList otherEngines = new ArrayList(); String engine = VideoIO.getEngine(); if (requestedType==null) { - String ext = XML.getExtension(path); - if (!engine.equals(VideoIO.ENGINE_FFMPEG)) { - VideoType ffmpegType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ - if (ffmpegType!=null) otherEngines.add(ffmpegType); - } - if (!engine.equals(VideoIO.ENGINE_QUICKTIME)) { - VideoType qtType = VideoIO.getVideoType("QT", ext); //$NON-NLS-1$ + String ext = XML.getExtension(path); + if (!engine.equals(VideoIO.ENGINE_FFMPEG)) { + VideoType ffmpetType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ + if (ffmpegType!=null) otherEngines.add(ffmpegType); + } + if (!engine.equals(VideoIO.ENGINE_QUICKTIME)) { + VideoType qtType = VideoIO.getVideoType("QT", ext); //$NON-NLS-1$ if (qtType!=null) otherEngines.add(qtType); } } @@ -688,13 +689,13 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, else { // provide immediate way to open with other engines JCheckBox setAsDefaultBox = new JCheckBox(MediaRes.getString("VideoIO.Dialog.TryDifferentEngine.Checkbox")); //$NON-NLS-1$ - video = VideoIO.getVideo(path, otherEngines, setAsDefaultBox, frame); - if (video!=null && setAsDefaultBox.isSelected()) { - String typeName = video.getClass().getSimpleName(); - String newEngine = typeName.indexOf("FFMPeg")>-1? VideoIO.ENGINE_FFMPEG: //$NON-NLS-1$ - typeName.indexOf("QT")>-1? VideoIO.ENGINE_QUICKTIME: //$NON-NLS-1$ - VideoIO.ENGINE_NONE; - VideoIO.setEngine(newEngine); + video = VideoIO.getVideo(path, otherEngines, setAsDefaultBox, frame); + if (video!=null && setAsDefaultBox.isSelected()) { + String typeName = video.getClass().getSimpleName(); + String newEngine = typeName.indexOf("FFMPeg")>-1? VideoIO.ENGINE_FFMPEG: //$NON-NLS-1$ + typeName.indexOf("QT")>-1? VideoIO.ENGINE_QUICKTIME: //$NON-NLS-1$ + VideoIO.ENGINE_NONE; + VideoIO.setEngine(newEngine); PrefsDialog prefs = frame.getPrefsDialog(); prefs.tabbedPane.setSelectedComponent(prefs.videoPanel); frame.showPrefsDialog(); @@ -887,8 +888,8 @@ public void run() { } - // pig the line below needs to finish (in SwingWorker?) before continuing? - control.loadObject(trackerPanel); + // should the line below finish (in SwingWorker?) before continuing? + control.loadObject(trackerPanel); trackerPanel.frame = frame; trackerPanel.defaultFileName = XML.getName(path); @@ -1103,7 +1104,7 @@ public static File importFile(TrackerPanel trackerPanel) { TTrackBar.refreshMemoryButton(); return file; } - + /** * Saves a video to a file by copying the original. If the file is null, * a fileChooser is used to pick one. @@ -1112,26 +1113,26 @@ public static File importFile(TrackerPanel trackerPanel) { * @return the saved file, or null if not saved */ public static File saveVideo(File file, TrackerPanel trackerPanel) { - Video video = trackerPanel.getVideo(); - if (video==null) return null; + Video video = trackerPanel.getVideo(); + if (video==null) return null; if(video instanceof ImageVideo) { boolean saved = ((ImageVideo) video).saveInvalidImages(); if (!saved) return null; } - String source = (String)video.getProperty("absolutePath"); //$NON-NLS-1$ - String extension = XML.getExtension(source); - if (file==null) { - File target = TrackerIO.getChooserFileForExtension(extension); - if (target==null) return null; - return saveVideo(target, trackerPanel); - } - boolean success = ResourceLoader.copyAllFiles(new File(source), file); - if (success) { - Tracker.addRecent(XML.getAbsolutePath(file), false); // add at beginning - TMenuBar.getMenuBar(trackerPanel).refresh(); - return file; - } - return null; + String source = (String)video.getProperty("absolutePath"); //$NON-NLS-1$ + String extension = XML.getExtension(source); + if (file==null) { + File target = TrackerIO.getChooserFileForExtension(extension); + if (target==null) return null; + return saveVideo(target, trackerPanel); + } + boolean success = ResourceLoader.copyAllFiles(new File(source), file); + if (success) { + Tracker.addRecent(XML.getAbsolutePath(file), false); // add at beginning + TMenuBar.getMenuBar(trackerPanel).refresh(); + return file; + } + return null; } /** @@ -1172,15 +1173,15 @@ public void run() { * @param vidType the preferred video type */ public static void importVideo(File file, TrackerPanel trackerPanel, VideoType vidType) { - while (Tracker.qtLoading && !Tracker.qtLoaded) { - try { - Thread.sleep(100); - } catch (InterruptedException e) { - } - } - String path = XML.getAbsolutePath(file); - OSPLog.finest("importing file: "+path); //$NON-NLS-1$ - TFrame frame = trackerPanel.getTFrame(); + while (Tracker.qtLoading && !Tracker.qtLoaded) { + try { + Thread.sleep(100); + } catch (InterruptedException e) { + } + } + String path = XML.getAbsolutePath(file); + OSPLog.finest("importing file: "+path); //$NON-NLS-1$ + TFrame frame = trackerPanel.getTFrame(); frame.loadedFiles.clear(); open(path, trackerPanel, frame, vidType, null); } @@ -1413,18 +1414,18 @@ public static boolean choose(XMLControl control, ListChooser dialog) { for (int i = 0; i < children.length; i++) { String name = children[i].getPropertyName(); if (name.equals("coords")) { //$NON-NLS-1$ - name = TrackerRes.getString("TMenuBar.MenuItem.Coords"); //$NON-NLS-1$ + name = TrackerRes.getString("TMenuBar.MenuItem.Coords"); //$NON-NLS-1$ } else if (name.equals("videoclip")) { //$NON-NLS-1$ - name = TrackerRes.getString("TMenuBar.MenuItem.VideoClip"); //$NON-NLS-1$ -// vidControl = children[i].getChildControl("video"); //$NON-NLS-1$ -// if (vidControl!=null) { -// vidClipControl = children[i]; -// originals.add(vidControl); -// choices.add(vidControl); -// names.add(name+" "+TrackerRes.getString("TrackerIO.Export.Option.WithoutVideo")); //$NON-NLS-1$//$NON-NLS-2$ -// name = name+" "+TrackerRes.getString("TrackerIO.Export.Option.WithVideo"); //$NON-NLS-1$ //$NON-NLS-2$ -// } + name = TrackerRes.getString("TMenuBar.MenuItem.VideoClip"); //$NON-NLS-1$ +// vidControl = children[i].getChildControl("video"); //$NON-NLS-1$ +// if (vidControl!=null) { +// vidClipControl = children[i]; +// originals.add(vidControl); +// choices.add(vidControl); +// names.add(name+" "+TrackerRes.getString("TrackerIO.Export.Option.WithoutVideo")); //$NON-NLS-1$//$NON-NLS-2$ +// name = name+" "+TrackerRes.getString("TrackerIO.Export.Option.WithVideo"); //$NON-NLS-1$ //$NON-NLS-2$ +// } } originals.add(children[i]); if (name.equals("clipcontrol")) continue; //$NON-NLS-1$ @@ -1453,33 +1454,33 @@ else if (!prop.getPropertyType().equals("object")) { //$NON-NLS-1$ // remove primitives from control for (XMLProperty prop: primitives) { control.setValue(prop.getPropertyName(), null); - } + } control.getPropertyContent().removeAll(primitives); // compare choices with originals and remove unwanted object content boolean removeVideo = false; for (XMLControl next: originals) { - if (next==vidControl) { - removeVideo = choices.contains(next); - continue; - } - else if (next==vidClipControl) { - if (!choices.contains(next)) { - if (removeVideo) { - // remove video from clip property - XMLProperty prop = vidControl.getParentProperty(); - vidClipControl.setValue("video", null); //$NON-NLS-1$ - vidClipControl.getPropertyContent().remove(prop); - } - else { - // remove video clip property entirely - XMLProperty prop = next.getParentProperty(); - control.setValue(prop.getPropertyName(), null); - control.getPropertyContent().remove(prop); - } - } - continue; - } - else if (!choices.contains(next)) { + if (next==vidControl) { + removeVideo = choices.contains(next); + continue; + } + else if (next==vidClipControl) { + if (!choices.contains(next)) { + if (removeVideo) { + // remove video from clip property +// XMLProperty prop = vidControl.getParentProperty(); +// vidClipControl.setValue("video", null); //$NON-NLS-1$ +// vidClipControl.getPropertyContent().remove(prop); + } + else { + // remove video clip property entirely + XMLProperty prop = next.getParentProperty(); + control.setValue(prop.getPropertyName(), null); + control.getPropertyContent().remove(prop); + } + } + continue; + } + else if (!choices.contains(next)) { XMLProperty prop = next.getParentProperty(); XMLProperty parent = prop.getParentProperty(); if (parent == control) { @@ -1491,14 +1492,14 @@ else if (!choices.contains(next)) { // if no tracks are selected, eliminate tracks property boolean deleteTracks = true; for (Object next: control.getPropertyContent()) { - XMLProperty prop = (XMLProperty)next; + XMLProperty prop = (XMLProperty)next; if ("tracks".indexOf(prop.getPropertyName())>-1) { //$NON-NLS-1$ deleteTracks = prop.getChildControls().length==0; } } - if (deleteTracks) { - control.setValue("tracks", null); //$NON-NLS-1$ - } + if (deleteTracks) { + control.setValue("tracks", null); //$NON-NLS-1$ + } return true; } return false; @@ -1531,29 +1532,29 @@ public static boolean pasteXML(TrackerPanel trackerPanel) { control.readXML((String)data.getTransferData(DataFlavor.stringFlavor)); Class type = control.getObjectClass(); if (control.failedToRead() || type==null) { - return false; + return false; } if (TTrack.class.isAssignableFrom(type)) { - TTrack track = (TTrack)control.loadObject(null); - if (track != null) { + TTrack track = (TTrack)control.loadObject(null); + if (track != null) { trackerPanel.addTrack(track); trackerPanel.setSelectedTrack(track); return true; - } + } } else if (VideoClip.class.isAssignableFrom(type)) { - VideoClip clip = (VideoClip)control.loadObject(null); - if (clip != null) { + VideoClip clip = (VideoClip)control.loadObject(null); + if (clip != null) { VideoClip prev = trackerPanel.getPlayer().getVideoClip(); - XMLControl state = new XMLControlElement(prev); + XMLControl state = new XMLControlElement(prev); trackerPanel.getPlayer().setVideoClip(clip); - Undo.postVideoReplace(trackerPanel, state); - return true; - } + Undo.postVideoReplace(trackerPanel, state); + return true; + } } else if (ImageCoordSystem.class.isAssignableFrom(type)) { XMLControl state = new XMLControlElement(trackerPanel.getCoords()); - control.loadObject(trackerPanel.getCoords()); + control.loadObject(trackerPanel.getCoords()); Undo.postCoordsEdit(trackerPanel, state); return true; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java index b30b92a8..9d80ea51 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerPanel.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -108,10 +108,11 @@ public class TrackerPanel extends VideoPanel implements Scrollable { protected DerivativeAlgorithmDialog algorithmDialog; protected AttachmentDialog attachmentDialog; protected boolean isAutoRefresh = true; - protected TreeSet supplementalFilePaths = new TreeSet(); // HTML/PDF URI paths - protected Map pageViewFilePaths = new HashMap(); + protected TreeSet supplementalFilePaths = new TreeSet(); // HTML/PDF URI paths + protected Map pageViewFilePaths = new HashMap(); protected StepSet selectedSteps = new StepSet(this); protected ActionListener worldDataRefresher; + protected boolean hideDescriptionWhenLoaded; /** * Constructs a blank TrackerPanel with a player. @@ -159,6 +160,7 @@ public void setVisible(boolean vis) { player.addPropertyChangeListener("outframe", this); //$NON-NLS-1$ player.addPropertyChangeListener("slider", this); //$NON-NLS-1$ player.addPropertyChangeListener("playing", this); //$NON-NLS-1$ + configure(); } @@ -255,62 +257,62 @@ public void setDescription(String desc) { * @return the model builder */ public ModelBuilder getModelBuilder() { - if (modelBuilder == null) { -// // create start and end frame spinners -// Font font = new JSpinner().getFont(); -// int n = getPlayer().getVideoClip().getFrameCount()-1; -// FontRenderContext frc = new FontRenderContext(null, false, false); -// String s = String.valueOf(Math.max(n, 200)); -// TextLayout layout = new TextLayout(s, font, frc); -// int w = (int)layout.getBounds().getWidth()+4; -// if (n>1000) w+=3; -// startFrameLabel = new JLabel(); -// startFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 2)); -// endFrameLabel = new JLabel(); -// endFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 2)); -// SpinnerNumberModel model = new SpinnerNumberModel(0, 0, n, 1); // init, min, max, step -// startFrameSpinner = new ModelFrameSpinner(model); -// startFrameSpinner.prefWidth = w; -// model = new SpinnerNumberModel(n, 0, n, 1); // init, min, max, step -// endFrameSpinner = new ModelFrameSpinner(model); -// endFrameSpinner.prefWidth = w; -// -// // create booster label and dropdown + if (modelBuilder == null) { +// // create start and end frame spinners +// Font font = new JSpinner().getFont(); +// int n = getPlayer().getVideoClip().getFrameCount()-1; +// FontRenderContext frc = new FontRenderContext(null, false, false); +// String s = String.valueOf(Math.max(n, 200)); +// TextLayout layout = new TextLayout(s, font, frc); +// int w = (int)layout.getBounds().getWidth()+4; +// if (n>1000) w+=3; +// startFrameLabel = new JLabel(); +// startFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 4, 0, 2)); +// endFrameLabel = new JLabel(); +// endFrameLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 2)); +// SpinnerNumberModel model = new SpinnerNumberModel(0, 0, n, 1); // init, min, max, step +// startFrameSpinner = new ModelFrameSpinner(model); +// startFrameSpinner.prefWidth = w; +// model = new SpinnerNumberModel(n, 0, n, 1); // init, min, max, step +// endFrameSpinner = new ModelFrameSpinner(model); +// endFrameSpinner.prefWidth = w; +// +// // create booster label and dropdown // boosterLabel = new JLabel(); // boosterLabel.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 2)); // boosterDropdown = new JComboBox(); // boosterDropdown.setBorder(BorderFactory.createEmptyBorder(0, 0, 1, 0)); // boosterDropdown.addActionListener(new ActionListener() { // public void actionPerformed(ActionEvent e) { -// if (!boosterDropdown.isEnabled()) return; -// FunctionPanel panel = modelBuilder.getSelectedPanel(); -// if (panel!=null) { -// ParticleModel part = ((ModelFunctionPanel)panel).model; -// if (!(part instanceof DynamicParticle)) return; -// DynamicParticle model = (DynamicParticle)part; -// -// Object item = boosterDropdown.getSelectedItem(); -// if(item!=null) { -// Object[] array = (Object[])item; -// PointMass target = (PointMass)array[1]; // null if "none" selected -// model.setBooster(target); -// if (target!=null) { -// Step step = getSelectedStep(); -// if (step!=null && step instanceof PositionStep) { -// PointMass pm = (PointMass)((PositionStep)step).track; -// if (pm==target) { -// model.setStartFrame(step.getFrameNumber()); -// } -// } -// } -// } -// } +// if (!boosterDropdown.isEnabled()) return; +// FunctionPanel panel = modelBuilder.getSelectedPanel(); +// if (panel!=null) { +// ParticleModel part = ((ModelFunctionPanel)panel).model; +// if (!(part instanceof DynamicParticle)) return; +// DynamicParticle model = (DynamicParticle)part; +// +// Object item = boosterDropdown.getSelectedItem(); +// if(item!=null) { +// Object[] array = (Object[])item; +// PointMass target = (PointMass)array[1]; // null if "none" selected +// model.setBooster(target); +// if (target!=null) { +// Step step = getSelectedStep(); +// if (step!=null && step instanceof PositionStep) { +// PointMass pm = (PointMass)((PositionStep)step).track; +// if (pm==target) { +// model.setStartFrame(step.getFrameNumber()); +// } +// } +// } +// } +// } // } // }); // - // create and size model builder - modelBuilder = new ModelBuilder(this); - modelBuilder.setFontLevel(FontSizer.getLevel()); + // create and size model builder + modelBuilder = new ModelBuilder(this); + modelBuilder.setFontLevel(FontSizer.getLevel()); modelBuilder.refreshLayout(); modelBuilder.addPropertyChangeListener("panel", this); //$NON-NLS-1$ // show model builder @@ -445,7 +447,7 @@ else if (track instanceof OffsetOrigin else { // set track name--prevents duplicate names setTrackName(track, track.getName(), false); - super.addDrawable(track); + super.addDrawable(track); } addPropertyChangeListener(track); // track listens for all properties track.addPropertyChangeListener("step", this); //$NON-NLS-1$ @@ -457,10 +459,10 @@ else if (track instanceof OffsetOrigin track.addPropertyChangeListener("model_end", this); //$NON-NLS-1$ // update track control and dataTool if (trackControl!=null && trackControl.isVisible()) trackControl.refresh(); - if (getDataBuilder() != null && !getSystemDrawables().contains(track)) { - FunctionPanel panel = createFunctionPanel(track); - dataBuilder.addPanel(track.getName(), panel); - dataBuilder.setSelectedPanel(track.getName()); + if (getDataBuilder() != null && !getSystemDrawables().contains(track)) { + FunctionPanel panel = createFunctionPanel(track); + dataBuilder.addPanel(track.getName(), panel); + dataBuilder.setSelectedPanel(track.getName()); } // set length of coord system before firing property change (speeds loading up of very long tracks) int len = track.getSteps().length; @@ -484,11 +486,11 @@ else if (track instanceof OffsetOrigin } private FunctionPanel createFunctionPanel(TTrack track) { - DatasetManager data = track.getData(this); + DatasetManager data = track.getData(this); FunctionPanel panel = new DataFunctionPanel(data); - panel.setIcon(track.getFootprint().getIcon(21, 16)); - Class type = track.getClass(); - if (PointMass.class.isAssignableFrom(type)) + panel.setIcon(track.getFootprint().getIcon(21, 16)); + Class type = track.getClass(); + if (PointMass.class.isAssignableFrom(type)) panel.setDescription(PointMass.class.getName()); else if (Vector.class.isAssignableFrom(type)) panel.setDescription(Vector.class.getName()); @@ -826,10 +828,17 @@ public void setReferenceFrame(String trackName) { } if (pm != null) { ImageCoordSystem coords = getCoords(); - if (coords instanceof ReferenceFrame) { + boolean wasRefFrame = coords instanceof ReferenceFrame; + while (coords instanceof ReferenceFrame) { coords = ( (ReferenceFrame) coords).getCoords(); } setCoords(new ReferenceFrame(coords, pm)); + // special case: if pm is a particle model and wasRefFrame is true, + // refresh steps of pm after setting new ReferenceFrame + if (pm instanceof ParticleModel && wasRefFrame) { + ((ParticleModel)pm).lastValidFrame = -1; + ((ParticleModel)pm).refreshSteps(); + } setSelectedPoint(null); repaint(); } @@ -1225,7 +1234,7 @@ public boolean isShowCoordinates() { public void setMessage(String msg) { if (!OSPRuntime.isMac()) super.setMessage(msg); } - + /** * Imports Data from a data string (delimited fields) into a DataTrack. * The data string must be parsable by DataTool. If the string is a path, @@ -1238,20 +1247,23 @@ public void setMessage(String msg) { * @return the DataTrack with the Data (may return null) */ protected DataTrack importData(String dataString, Object source) { - if (dataString==null) { - // pig inform user? - return null; - } - // if dataString is parsable data (eg pasted), find - // corresponding data model and set the data - DatasetManager data = DataTool.parseData(dataString, null); - if (data!=null) { + if (dataString==null) { + // inform user + JOptionPane.showMessageDialog(frame, + TrackerRes.getString("TrackerPanel.Dialog.NoData.Message"), //$NON-NLS-1$ + TrackerRes.getString("TrackerPanel.Dialog.NoData.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + return null; + } + // if dataString is parsable data, parse and import it + DatasetManager data = DataTool.parseData(dataString, null); + if (data!=null) { return importData(data, source); } - - // if dataString is a resource path, read the resource and call this again - String path = dataString; - return importData(ResourceLoader.getString(path), path); + + // assume dataString is a resource path, read the resource and call this again + String path = dataString; + return importData(ResourceLoader.getString(path), path); } /** @@ -1267,58 +1279,62 @@ protected DataTrack importData(String dataString, Object source) { */ @Override public DataTrack importData(Data data, Object source) { - if (data==null) return null; - - // find DataTrack with matching name - String name = data.getName(); - if (name==null || name.trim().equals("")) { //$NON-NLS-1$ - name = TrackerRes.getString("ParticleDataTrack.New.Name"); //$NON-NLS-1$ - } - name = name.replaceAll("_", " "); //$NON-NLS-1$ //$NON-NLS-2$ - TTrack track = getTrack(name); - - // if not found by name, check for matching ID - if (track==null || track.getClass()!=ParticleDataTrack.class) { - int id = data.getID(); - for (ParticleDataTrack model: getDrawables(ParticleDataTrack.class)) { - Data existingData = model.getData(); - if (existingData!=null && id==existingData.getID()) { - track = model; - break; - } - } - } - - // load data into DataTrack - try { - // create a new DataTrack if none exists - if (track==null || track.getClass()!=ParticleDataTrack.class) { - track = new ParticleDataTrack(data, source); - ParticleDataTrack dataTrack = (ParticleDataTrack)track; - int i = getDrawables(PointMass.class).size(); - dataTrack.setColorToDefault(i); - dataTrack.setName(name); - addTrack(dataTrack); - setSelectedPoint(null); - setSelectedTrack(dataTrack); - dataTrack.getDataClip().setClipLength(-1); // sets clip length to data length - VideoClip videoClip = getPlayer().getVideoClip(); - dataTrack.setStartFrame(videoClip.getStartFrameNumber()); - dataTrack.getInspector().setVisible(true); - dataTrack.firePropertyChange("data", null, null); //$NON-NLS-1$ - } - else { - // set data for existing DataTrack - ParticleDataTrack dataTrack = (ParticleDataTrack)track; - dataTrack.setData(data); - } - } catch (Exception e) { - // pig inform user - OSPLog.warning(e.getClass().getSimpleName()+": "+e.getMessage()); //$NON-NLS-1$ - e.printStackTrace(); - track = null; - } - return (DataTrack)track; + if (data==null) return null; + + // find DataTrack with matching name + String name = data.getName(); + if (name==null || name.trim().equals("")) { //$NON-NLS-1$ + name = TrackerRes.getString("ParticleDataTrack.New.Name"); //$NON-NLS-1$ + } + name = name.replaceAll("_", " "); //$NON-NLS-1$ //$NON-NLS-2$ + TTrack track = getTrack(name); + + // if not found by name, check for matching ID + if (track==null || track.getClass()!=ParticleDataTrack.class) { + int id = data.getID(); + for (ParticleDataTrack model: getDrawables(ParticleDataTrack.class)) { + Data existingData = model.getData(); + if (existingData!=null && id==existingData.getID()) { + track = model; + break; + } + } + } + + // load data into DataTrack + try { + // create a new DataTrack if none exists + if (track==null || track.getClass()!=ParticleDataTrack.class) { + track = new ParticleDataTrack(data, source); + ParticleDataTrack dataTrack = (ParticleDataTrack)track; + int i = getDrawables(PointMass.class).size(); + dataTrack.setColorToDefault(i); + dataTrack.setName(name); + addTrack(dataTrack); + setSelectedPoint(null); + setSelectedTrack(dataTrack); + dataTrack.getDataClip().setClipLength(-1); // sets clip length to data length + VideoClip videoClip = getPlayer().getVideoClip(); + dataTrack.setStartFrame(videoClip.getStartFrameNumber()); + dataTrack.getInspector().setVisible(true); + dataTrack.firePropertyChange("data", null, null); //$NON-NLS-1$ + } + else { + // set data for existing DataTrack + ParticleDataTrack dataTrack = (ParticleDataTrack)track; + dataTrack.setData(data); + } + } catch (Exception e) { + // inform user + JOptionPane.showMessageDialog(frame, + TrackerRes.getString("TrackerPanel.Dialog.Exception.Message")+":" //$NON-NLS-1$ //$NON-NLS-2$ + +e.getClass().getSimpleName()+": "+e.getMessage(), //$NON-NLS-1$ + TrackerRes.getString("TrackerPanel.Dialog.Exception.Title"), //$NON-NLS-1$ + JOptionPane.WARNING_MESSAGE); + OSPLog.warning(e.getClass().getSimpleName()+": "+e.getMessage()); //$NON-NLS-1$ + track = null; + } + return (DataTrack)track; } /** @@ -1378,11 +1394,11 @@ public AttachmentDialog getAttachmentDialog(TTrack track) { * @return the data builder */ protected FunctionTool getDataBuilder() { - if (dataBuilder == null) { // create new tool if none exists - dataBuilder = new TrackDataBuilder(this); - dataBuilder.setHelpPath("data_builder_help.html"); //$NON-NLS-1$ - dataBuilder.addPropertyChangeListener("panel", this); //$NON-NLS-1$ - dataBuilder.addPropertyChangeListener("function", this); //$NON-NLS-1$ + if (dataBuilder == null) { // create new tool if none exists + dataBuilder = new TrackDataBuilder(this); + dataBuilder.setHelpPath("data_builder_help.html"); //$NON-NLS-1$ + dataBuilder.addPropertyChangeListener("panel", this); //$NON-NLS-1$ + dataBuilder.addPropertyChangeListener("function", this); //$NON-NLS-1$ dataBuilder.addPropertyChangeListener("visible", this); //$NON-NLS-1$ dataBuilder.setFontLevel(FontSizer.getLevel()); } @@ -1426,6 +1442,11 @@ protected void refreshNotesDialog() { frame.notesTextPane.setBackground(Color.WHITE); frame.cancelNotesDialogButton.setEnabled(false); frame.closeNotesDialogButton.setEnabled(true); + TrackerPanel panel = frame.getTrackerPanel(frame.getSelectedTab()); + frame.displayWhenLoadedCheckbox.setEnabled(panel!=null); + if (panel!=null) { + frame.displayWhenLoadedCheckbox.setSelected(!panel.hideDescriptionWhenLoaded); + } frame.notesTextPane.setEditable(isEnabled("notes.edit")); //$NON-NLS-1$ } @@ -1518,18 +1539,18 @@ else if (selectedTrack.getClass()==Vector.class) { double dy = tip.y-tail.y; clone = vector.createStep(n, tail.x, tail.y, dx, dy); } - if (clone != null && selectedTrack.isAutoAdvance()) { + if (clone!=null && selectedTrack.isAutoAdvance()) { getPlayer().step(); hideMouseBox(); - } - else { - setMouseCursor(Cursor.getDefaultCursor()); - if (clone!=null) { - setSelectedPoint(clone.getDefaultPoint()); - selectedTrack.repaint(clone); - } - } - } + } + else { + setMouseCursor(Cursor.getDefaultCursor()); + if (clone!=null) { + setSelectedPoint(clone.getDefaultPoint()); + selectedTrack.repaint(clone); + } + } + } } else handleKeyPress(e); } @@ -1824,11 +1845,12 @@ public boolean isCreateTracksEnabled() { || isEnabled("new.lineProfile") //$NON-NLS-1$ || isEnabled("new.RGBRegion") //$NON-NLS-1$ || isEnabled("new.tapeMeasure") //$NON-NLS-1$ - || isEnabled("new.protractor") //$NON-NLS-1$ - || isEnabled("new.analyticParticle") //$NON-NLS-1$ - || isEnabled("new.dynamicParticle") //$NON-NLS-1$ - || isEnabled("new.dynamicTwoBody") //$NON-NLS-1$ - || isEnabled("new.dataTrack"); //$NON-NLS-1$ + || isEnabled("new.protractor") //$NON-NLS-1$ + || isEnabled("new.circleFitter") //$NON-NLS-1$ + || isEnabled("new.analyticParticle") //$NON-NLS-1$ + || isEnabled("new.dynamicParticle") //$NON-NLS-1$ + || isEnabled("new.dynamicTwoBody") //$NON-NLS-1$ + || isEnabled("new.dataTrack"); //$NON-NLS-1$ } /** @@ -1853,6 +1875,9 @@ public void propertyChange(PropertyChangeEvent e) { p.showCoordinates(this); } repaint(); + if (name.equals("steps")) { //$NON-NLS-1$ + TTrackBar.getTrackbar(this).refresh(); + } } else if (name.equals("mass")) { // from point masses //$NON-NLS-1$ firePropertyChange("mass", null, null); // to motion control //$NON-NLS-1$ @@ -1880,15 +1905,15 @@ else if (name.equals("videoclip")) { // from videoPlayer //$NON-NL getVideo().setProperty("measure", null); //$NON-NLS-1$ // if ffmpeg video, set smooth play per preferences VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ - if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { - boolean smooth = !Tracker.isVideoFast; - try { - String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ - Class ffmpegClass = Class.forName(ffmpegName); - Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ - method.invoke(video, new Object[] {smooth}); - } catch (Exception ex) { - } + if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { + boolean smooth = !Tracker.isVideoFast; + try { + String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ + Class ffmpegClass = Class.forName(ffmpegName); + Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ + method.invoke(video, new Object[] {smooth}); + } catch (Exception ex) { + } } } changed = true; @@ -1997,18 +2022,18 @@ else if (name.equals("panel") && e.getSource() == modelBuilder) { //$NON-NLS-1$ FunctionPanel panel = (FunctionPanel)e.getNewValue(); if (panel != null) { // new particle model panel added TTrack track = getTrack(panel.getName()); - if (track != null) { -// setSelectedTrack(track); - ParticleModel model = (ParticleModel)track; - modelBuilder.setSpinnerStartFrame(model.getStartFrame()); - int end = model.getEndFrame(); - if (end==Integer.MAX_VALUE) { - end = getPlayer().getVideoClip().getFrameCount()-1; - } - modelBuilder.setSpinnerEndFrame(end); - } - } - modelBuilder.refreshSpinners(); + if (track != null) { +// setSelectedTrack(track); + ParticleModel model = (ParticleModel)track; + modelBuilder.setSpinnerStartFrame(model.getStartFrame()); + int end = model.getEndFrame(); + if (end==Integer.MAX_VALUE) { + end = getPlayer().getVideoClip().getFrameCount()-1; + } + modelBuilder.setSpinnerEndFrame(end); + } + } + modelBuilder.refreshSpinners(); String title = TrackerRes.getString("TrackerPanel.ModelBuilder.Title"); //$NON-NLS-1$ panel = modelBuilder.getSelectedPanel(); if (panel!=null) { @@ -2021,20 +2046,20 @@ else if (name.equals("panel") && e.getSource() == modelBuilder) { //$NON-NLS-1$ modelBuilder.setTitle(title); } else if (name.equals("model_start")) { //$NON-NLS-1$ - ParticleModel model = (ParticleModel)e.getSource(); - if (model.getName().equals(getModelBuilder().getSelectedName())) { - modelBuilder.setSpinnerStartFrame(e.getNewValue()); - } + ParticleModel model = (ParticleModel)e.getSource(); + if (model.getName().equals(getModelBuilder().getSelectedName())) { + modelBuilder.setSpinnerStartFrame(e.getNewValue()); + } } else if (name.equals("model_end")) { //$NON-NLS-1$ ParticleModel model = (ParticleModel)e.getSource(); if (model.getName().equals(getModelBuilder().getSelectedName())) { int end = (Integer)e.getNewValue(); - if (end==Integer.MAX_VALUE) { - end = getPlayer().getVideoClip().getFrameCount()-1; - } - modelBuilder.setSpinnerEndFrame(end); - } + if (end==Integer.MAX_VALUE) { + end = getPlayer().getVideoClip().getFrameCount()-1; + } + modelBuilder.setSpinnerEndFrame(end); + } } else if (name.equals("radian_angles")) { // angle format has changed //$NON-NLS-1$ firePropertyChange("radian_angles", null, e.getNewValue()); // to tracks //$NON-NLS-1$ @@ -2479,9 +2504,9 @@ protected AutoTracker getAutoTracker() { * @param postEdit true to post an undoable edit */ protected void setTrackName(TTrack track, String newName, boolean postEdit) { - for (Drawable next: getDrawables()) { - if (next == track) continue; - if (next instanceof TTrack) { + for (Drawable next: getDrawables()) { + if (next == track) continue; + if (next instanceof TTrack) { String nextName = ((TTrack)next).getName(); if (newName.equals(nextName)) { Toolkit.getDefaultToolkit().beep(); @@ -2490,19 +2515,19 @@ protected void setTrackName(TTrack track, String newName, boolean postEdit) { track.nameDialog.getContentPane().add(badNameLabel, BorderLayout.SOUTH); track.nameAction.actionPerformed(null); return; - } - } - } - XMLControl control = new XMLControlElement(new TrackProperties(track)); - track.setName(newName); + } + } + } + XMLControl control = new XMLControlElement(new TrackProperties(track)); + track.setName(newName); if (postEdit) - Undo.postTrackDisplayEdit(track, control); - track.nameDialog.setVisible(false); - track.nameDialog.getContentPane().remove(badNameLabel); - TMenuBar.getMenuBar(this).refresh(); + Undo.postTrackDisplayEdit(track, control); + track.nameDialog.setVisible(false); + track.nameDialog.getContentPane().remove(badNameLabel); + TMenuBar.getMenuBar(this).refresh(); } - /** + /** * This inner class extends IADMouseController to set the cursor * and show selected point coordinates. */ @@ -2581,7 +2606,7 @@ public void saveObject(XMLControl control, Object obj) { // turn off XML writing of null final array elements boolean writeNullFinalArrayElements = XMLPropertyElement.defaultWriteNullFinalArrayElements; XMLPropertyElement.defaultWriteNullFinalArrayElements = false; - + TrackerPanel trackerPanel = (TrackerPanel)obj; // save the version control.setValue("version", Tracker.VERSION); //$NON-NLS-1$ @@ -2599,6 +2624,9 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("center_y", (int)rect.getCenterY()); //$NON-NLS-1$ } // save the description, if any + if (trackerPanel.hideDescriptionWhenLoaded) { + control.setValue("hide_description", true); //$NON-NLS-1$ + } if (!trackerPanel.description.trim().equals("")) { //$NON-NLS-1$ control.setValue("description", trackerPanel.description); //$NON-NLS-1$ } @@ -2728,60 +2756,63 @@ public Object createObject(XMLControl control){ public Object loadObject(XMLControl control, Object obj) { final TrackerPanel trackerPanel = (TrackerPanel)obj; // load and check the Tracker version that created this file - String ver = control.getString("version"); //$NON-NLS-1$ - if (ver!=null) { - double xmlVersion = Double.parseDouble(ver); - double version = Double.parseDouble(Tracker.VERSION); - if (xmlVersion-version>0.2) { - JOptionPane.showMessageDialog(trackerPanel, - TrackerRes.getString("TrackerPanel.Dialog.Version.Message1") //$NON-NLS-1$ - + " "+ver+" " //$NON-NLS-1$ //$NON-NLS-2$ - + TrackerRes.getString("TrackerPanel.Dialog.Version.Message2") //$NON-NLS-1$ - + "\n"+TrackerRes.getString("TrackerPanel.Dialog.Version.Message3") //$NON-NLS-1$ //$NON-NLS-2$ - + " ("+Tracker.VERSION+")." //$NON-NLS-1$ //$NON-NLS-2$ - + "\n\n"+TrackerRes.getString("TrackerPanel.Dialog.Version.Message4") //$NON-NLS-1$ //$NON-NLS-2$ - +" "+Tracker.trackerWebsite+".", //$NON-NLS-1$ //$NON-NLS-2$ - TrackerRes.getString("TrackerPanel.Dialog.Version.Title"), //$NON-NLS-1$ + String ver = control.getString("version"); //$NON-NLS-1$ + if (ver!=null) { + double xmlVersion = Double.parseDouble(ver); + double version = Double.parseDouble(Tracker.VERSION); + if (xmlVersion-version>0.2) { + JOptionPane.showMessageDialog(trackerPanel, + TrackerRes.getString("TrackerPanel.Dialog.Version.Message1") //$NON-NLS-1$ + + " "+ver+" " //$NON-NLS-1$ //$NON-NLS-2$ + + TrackerRes.getString("TrackerPanel.Dialog.Version.Message2") //$NON-NLS-1$ + + "\n"+TrackerRes.getString("TrackerPanel.Dialog.Version.Message3") //$NON-NLS-1$ //$NON-NLS-2$ + + " ("+Tracker.VERSION+")." //$NON-NLS-1$ //$NON-NLS-2$ + + "\n\n"+TrackerRes.getString("TrackerPanel.Dialog.Version.Message4") //$NON-NLS-1$ //$NON-NLS-2$ + +" "+Tracker.trackerWebsite+".", //$NON-NLS-1$ //$NON-NLS-2$ + TrackerRes.getString("TrackerPanel.Dialog.Version.Title"), //$NON-NLS-1$ JOptionPane.INFORMATION_MESSAGE); } } // load the description + trackerPanel.hideDescriptionWhenLoaded = control.getBoolean("hide_description"); //$NON-NLS-1$ String desc = control.getString("description"); //$NON-NLS-1$ - if (desc != null) trackerPanel.setDescription(desc); + if (desc != null) { + trackerPanel.setDescription(desc); + } // load the metadata trackerPanel.author = control.getString("author"); //$NON-NLS-1$ trackerPanel.contact = control.getString("contact"); //$NON-NLS-1$ // load the video clip XMLControl child = control.getChildControl("videoclip"); //$NON-NLS-1$ if (child != null) { -// Video existingVideo = trackerPanel.getVideo(); +// Video existingVideo = trackerPanel.getVideo(); VideoClip clip = (VideoClip) control.getObject("videoclip"); //$NON-NLS-1$ - // if newly loaded clip has no video use existing video, if any + // if newly loaded clip has no video use existing video, if any // if (clip.getVideo()==null && existingVideo!=null) { -// VideoClip existingClip = trackerPanel.getPlayer().getVideoClip(); -// existingClip.setStartFrameNumber(clip.getStartFrameNumber()); -// existingClip.setStepSize(clip.getStepSize()); -// existingClip.setStepCount(clip.getStepCount()); +// VideoClip existingClip = trackerPanel.getPlayer().getVideoClip(); +// existingClip.setStartFrameNumber(clip.getStartFrameNumber()); +// existingClip.setStepSize(clip.getStepSize()); +// existingClip.setStepCount(clip.getStepCount()); // } // else { - trackerPanel.getPlayer().setVideoClip(clip); - Video vid = clip.getVideo(); - if (vid != null) { - FilterStack stack = vid.getFilterStack(); - Iterator it = stack.getFilters().iterator(); - while (it.hasNext()) { - Filter filter = it.next(); - filter.setVideoPanel(trackerPanel); - if (filter.inspectorX != Integer.MIN_VALUE) { - filter.inspectorVisible = true; - if (trackerPanel.visibleFilters == null) { - trackerPanel.visibleFilters = new HashMap(); - } - Point p = new Point(filter.inspectorX, filter.inspectorY); - trackerPanel.visibleFilters.put(filter, p); - } - } - } + trackerPanel.getPlayer().setVideoClip(clip); + Video vid = clip.getVideo(); + if (vid != null) { + FilterStack stack = vid.getFilterStack(); + Iterator it = stack.getFilters().iterator(); + while (it.hasNext()) { + Filter filter = it.next(); + filter.setVideoPanel(trackerPanel); + if (filter.inspectorX != Integer.MIN_VALUE) { + filter.inspectorVisible = true; + if (trackerPanel.visibleFilters == null) { + trackerPanel.visibleFilters = new HashMap(); + } + Point p = new Point(filter.inspectorX, filter.inspectorY); + trackerPanel.visibleFilters.put(filter, p); + } + } + } // } } // load the clip control @@ -2804,21 +2835,21 @@ public Object loadObject(XMLControl control, Object obj) { int n = trackerPanel.getFrameNumber(); trackerPanel.getSnapPoint().setXY(coords.getOriginX(n), coords.getOriginY(n)); } - // pig kludge to prevent a freeze (deadlock?) when loading QT videos and DataTracks + // kludge to prevent a freeze (deadlock?) when loading QT videos and DataTracks Video vid = trackerPanel.getVideo(); - if (vid!=null && vid.getClass().getSimpleName().contains("QT") //$NON-NLS-1$ - && control.toXML().contains("ParticleDataTrack")) try { //$NON-NLS-1$ - Thread.sleep(100); - } catch (InterruptedException ex) { - ex.printStackTrace(); - } + if (vid!=null && vid.getClass().getSimpleName().contains("QT") //$NON-NLS-1$ + && control.toXML().contains("ParticleDataTrack")) try { //$NON-NLS-1$ + Thread.sleep(100); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } // load the tracks ArrayList tracks = ArrayList.class.cast(control.getObject("tracks")); //$NON-NLS-1$ if (tracks != null) { - for (Object next: tracks) { - TTrack track = (TTrack)next; + for (Object next: tracks) { + TTrack track = (TTrack)next; trackerPanel.addTrack(track); - } + } } // load the reference frame String rfName = control.getString("referenceframe"); //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerRes.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerRes.java index 09453c30..e8b57132 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerRes.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerRes.java @@ -19,7 +19,7 @@ * * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/Undo.java b/src/org/opensourcephysics/cabrillo/tracker/Undo.java index 746ed7e1..24ab90df 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Undo.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Undo.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -362,6 +362,7 @@ protected void load(String xml) { XMLControl control = new XMLControlElement(xml); control.loadObject(step); step.erase(); + TTrackBar.getTrackbar(panel).refresh(); } } @@ -787,6 +788,7 @@ public static XML.ObjectLoader getLoader() { */ static class Loader implements XML.ObjectLoader { + @Override public void saveObject(XMLControl control, Object obj) { TrackProperties props = (TrackProperties)obj; control.setValue("name", props.name); //$NON-NLS-1$ @@ -794,6 +796,7 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("color", props.color); //$NON-NLS-1$ } + @Override public Object createObject(XMLControl control) { String name = control.getString("name"); //$NON-NLS-1$ String footprint = control.getString("footprint"); //$NON-NLS-1$ @@ -801,6 +804,7 @@ public Object createObject(XMLControl control) { return new TrackProperties(name, footprint, color); } + @Override public Object loadObject(XMLControl control, Object obj) { return obj; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/Vector.java b/src/org/opensourcephysics/cabrillo/tracker/Vector.java index 9c314922..4152008a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Vector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Vector.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -526,9 +526,9 @@ public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, TPoint point) { ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + list.add(stepSeparator); list.add(stepLabel); list.add(stepValueLabel); - list.add(tValueLabel); list.add(tSeparator); list.add(xLabel); list.add(xField); diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java b/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java index 85e6ee33..eb4ad408 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorChain.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorStep.java b/src/org/opensourcephysics/cabrillo/tracker/VectorStep.java index 54af12b9..60d595f5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorStep.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorStep.java @@ -20,13 +20,12 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; import java.beans.*; import java.util.*; - import java.awt.*; import java.awt.font.*; import java.awt.geom.*; @@ -35,6 +34,7 @@ import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; /** * This is a Step that represents a vector. It is used when tracking @@ -532,6 +532,10 @@ else if (m.isAcceleration(this)) { // if selected, draw selection shape on top of basic mark if (p != null) { transform.setToTranslation(p.x, p.y); + int scale = FontSizer.getIntegerFactor(); + if (scale>1) { + transform.scale(scale, scale); + } final Color color = footprint.getColor(); final Mark stepMark = mark; final Shape selectedShape diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java b/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java index f54d3a68..66d4cd5a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorSum.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java b/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java index 75a6f73a..4a08b429 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java +++ b/src/org/opensourcephysics/cabrillo/tracker/VectorSumInspector.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; diff --git a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java index 1fab4f1f..ff6e263b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java +++ b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -73,6 +73,7 @@ public WorldGrid() { dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); } + @Override public void draw(DrawingPanel panel, Graphics g) { if (!visible || (!showMajorX && !showMajorY)) return; Graphics2D g2 = (Graphics2D)g; diff --git a/src/org/opensourcephysics/cabrillo/tracker/WorldTView.java b/src/org/opensourcephysics/cabrillo/tracker/WorldTView.java index c861ee45..233712c4 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/WorldTView.java +++ b/src/org/opensourcephysics/cabrillo/tracker/WorldTView.java @@ -20,7 +20,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker; @@ -38,7 +38,6 @@ import java.rmi.RemoteException; -import org.opensourcephysics.controls.OSPLog; import org.opensourcephysics.controls.XML; import org.opensourcephysics.controls.XMLControl; diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerJarFilter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerJarFilter.java index ce32a759..7ec68758 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerJarFilter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerJarFilter.java @@ -19,7 +19,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker.deploy; diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java index 095feaf7..9aa36ff9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java @@ -19,7 +19,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker.deploy; @@ -48,7 +48,7 @@ import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.controls.XMLControlElement; import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.tools.DiagnosticsForFFMPeg; +import org.opensourcephysics.tools.DiagnosticsForXuggle; import org.opensourcephysics.tools.ExtensionsManager; /** @@ -59,40 +59,39 @@ */ public class TrackerStarter { - public static final String PREFERRED_TRACKER_JAR = "PREFERRED_TRACKER_JAR"; //$NON-NLS-1$ - public static final String PREFERRED_MEMORY_SIZE = "PREFERRED_MEMORY_SIZE"; //$NON-NLS-1$ -// public static final String PREFERRED_JAVA_VM = "PREFERRED_JAVA_VM"; //$NON-NLS-1$ -// public static final String PREFERRED_VM_BITNESS = "PREFERRED_VM_BITNESS"; //$NON-NLS-1$ -// public static final String PREFERRED_TRACKER_PREFS = "PREFERRED_TRACKER_PREFS"; //$NON-NLS-1$ - public static final String TRACKER_RELAUNCH = "TRACKER_RELAUNCH"; //$NON-NLS-1$ - public static final String LOG_FILE_NAME = "tracker_start.log"; //$NON-NLS-1$ + public static final String PREFERRED_TRACKER_JAR = "PREFERRED_TRACKER_JAR"; //$NON-NLS-1$ + public static final String PREFERRED_MEMORY_SIZE = "PREFERRED_MEMORY_SIZE"; //$NON-NLS-1$ +// public static final String PREFERRED_JAVA_VM = "PREFERRED_JAVA_VM"; //$NON-NLS-1$ +// public static final String PREFERRED_VM_BITNESS = "PREFERRED_VM_BITNESS"; //$NON-NLS-1$ +// public static final String PREFERRED_TRACKER_PREFS = "PREFERRED_TRACKER_PREFS"; //$NON-NLS-1$ + public static final String TRACKER_RELAUNCH = "TRACKER_RELAUNCH"; //$NON-NLS-1$ + public static final String LOG_FILE_NAME = "tracker_start.log"; //$NON-NLS-1$ public static final int DEFAULT_MEMORY_SIZE = 256; - static String prefsFileName = ".tracker.prefs"; //$NON-NLS-1$ - static String starterPrefsFileName = ".tracker_starter.prefs"; //$NON-NLS-1$ - static String newline = "\n"; //$NON-NLS-1$ - static String encoding = "UTF-8"; //$NON-NLS-1$ - static String exceptions = ""; //$NON-NLS-1$ - static String qtJavaWarning, ffmpegWarning, starterWarning; - static String trackerHome, userHome, javaHome, ffmpegHome, userDocuments; - static String startLogPath; - static FilenameFilter trackerJarFilter = new TrackerJarFilter(); - static File codeBaseDir, starterJarFile; + static String prefsFileName = ".tracker.prefs"; //$NON-NLS-1$ + static String newline = "\n"; //$NON-NLS-1$ + static String encoding = "UTF-8"; //$NON-NLS-1$ + static String exceptions = ""; //$NON-NLS-1$ + static String qtJavaWarning, xuggleWarning, starterWarning; + static String trackerHome, userHome, javaHome, xuggleHome, userDocuments; + static String startLogPath; + static FilenameFilter trackerJarFilter = new TrackerJarFilter(); + static File codeBaseDir, starterJarFile; static double launchVersionNumber; static String launchVersionString; static String trackerJarPath; static int memorySize, preferredMemorySize; static String[] executables; static String logText = ""; //$NON-NLS-1$ - static String javaCommand = "java"; //$NON-NLS-1$ - static String preferredVM; - static String snapshot = "-snapshot"; //$NON-NLS-1$ - static boolean debug = false; - static boolean log = true; - static boolean use32BitMode = false; - static boolean relaunching = false; - static int port = 12321; - static Timer timer; + static String javaCommand = "java"; //$NON-NLS-1$ + static String preferredVM; + static String snapshot = "-snapshot"; //$NON-NLS-1$ + static boolean debug = false; + static boolean log = true; + static boolean use32BitMode = false; + static boolean relaunching = false; + static int port = 12321; + static Timer timer; static { // identify codeBaseDir @@ -132,12 +131,12 @@ public class TrackerStarter { * Main entry point when used as executable * @param args array of filenames */ - public static void main(String[] args) { - relaunching = false; - logText = ""; //$NON-NLS-1$ - logMessage("launch initiated by user"); //$NON-NLS-1$ - launchTracker(args); - } + public static void main(String[] args) { + relaunching = false; + logText = ""; //$NON-NLS-1$ + logMessage("launch initiated by user"); //$NON-NLS-1$ + launchTracker(args); + } /** * Launches a new instance of Tracker. @@ -149,13 +148,13 @@ public static void launchTracker(String[] args) { if (args != null && args.length > 0) { argString = ""; //$NON-NLS-1$ for (String next : args) { - argString += "\"" + next + "\" "; //$NON-NLS-1$ //$NON-NLS-2$ - } - } - logMessage("launching with main arguments: " + argString); //$NON-NLS-1$ - String jarPath = null; + argString += "\"" + next + "\" "; //$NON-NLS-1$ //$NON-NLS-2$ + } + } + logMessage("launching with main arguments: " + argString); //$NON-NLS-1$ + String jarPath = null; - // find Tracker home + // find Tracker home try { trackerHome = findTrackerHome(true); } catch (Exception ex) { @@ -217,105 +216,106 @@ public static void launchTracker(String[] args) { */ public static void relaunch(final String[] args, boolean secondTry) { relaunching = secondTry; - Runnable runner = new Runnable() { - public void run() { - logText = ""; //$NON-NLS-1$ - logMessage("relaunch initiated by Tracker"); //$NON-NLS-1$ - launchTracker(args); - } - }; + Runnable runner = new Runnable() { + public void run() { + logText = ""; //$NON-NLS-1$ + logMessage("relaunch initiated by Tracker"); //$NON-NLS-1$ + launchTracker(args); + } + }; new Thread(runner).start(); } /** * Finds the Tracker home directory and sets/returns the static variable trackerHome. * - * @param writeToLog true to write the results to the start log - */ - public static String findTrackerHome(boolean writeToLog) throws Exception { - // first determine if code base directory is trackerHome - if (codeBaseDir != null) { - if (writeToLog) logMessage("code base: " + codeBaseDir.getPath()); //$NON-NLS-1$ - // accept if the directory has any tracker jars in it - try { - String[] fileNames = codeBaseDir.list(trackerJarFilter); - if (fileNames != null && fileNames.length > 0) { - trackerHome = codeBaseDir.getPath(); - if (writeToLog) logMessage("code base accepted as trackerhome based on contents"); //$NON-NLS-1$ - } - } catch (Exception ex) { - exceptions += ex.getClass().getSimpleName() - + ": " + ex.getMessage() + newline; //$NON-NLS-1$ - } - } - - // if needed, try another way to see if current directory has tracker.jar - if (trackerHome == null) { - File file = new File((String) null, "tracker.jar"); //$NON-NLS-1$ - String dir = file.getAbsoluteFile().getParent(); - if (fileExists(file.getAbsolutePath())) { - trackerHome = dir; - if (writeToLog) logMessage("parent directory accepted as trackerhome based on contents"); //$NON-NLS-1$ - } - } + * @param writeToLog true to write the results to the start log + */ + public static String findTrackerHome(boolean writeToLog) throws Exception { + // first determine if code base directory is trackerHome + if (codeBaseDir != null) { + if (writeToLog) logMessage("code base: " + codeBaseDir.getPath()); //$NON-NLS-1$ + // accept if the directory has any tracker jars in it + try { + String[] fileNames = codeBaseDir.list(trackerJarFilter); + if (fileNames != null && fileNames.length > 0) { + trackerHome = codeBaseDir.getPath(); + if (writeToLog) logMessage("code base accepted as trackerhome based on contents"); //$NON-NLS-1$ + } + } catch (Exception ex) { + exceptions += ex.getClass().getSimpleName() + + ": " + ex.getMessage() + newline; //$NON-NLS-1$ + } + } - // if not found locally, look for (legacy) environment variable - if (trackerHome == null) { - try { - trackerHome = System.getenv("TRACKER_HOME"); //$NON-NLS-1$ - } catch (Exception ex) { - exceptions += ex.getClass().getSimpleName() - + ": " + ex.getMessage() + newline; //$NON-NLS-1$ - } - if (writeToLog) logMessage("environment variable TRACKER_HOME: " + trackerHome); //$NON-NLS-1$ - if (trackerHome != null && !fileExists(trackerHome)) { - trackerHome = null; - if (writeToLog) logMessage("TRACKER_HOME directory no longer exists"); //$NON-NLS-1$ - } - } + // if needed, try another way to see if current directory has tracker.jar + if (trackerHome == null) { + File file = new File((String) null, "tracker.jar"); //$NON-NLS-1$ + String dir = file.getAbsoluteFile().getParent(); + if (fileExists(file.getAbsolutePath())) { + trackerHome = dir; + if (writeToLog) logMessage("parent directory accepted as trackerhome based on contents"); //$NON-NLS-1$ + } + } - if (trackerHome == null) - throw new NullPointerException("trackerhome not found"); //$NON-NLS-1$ - if (writeToLog) logMessage("using trackerhome: " + trackerHome); //$NON-NLS-1$ - - return trackerHome; - } + // if not found locally, look for (legacy) environment variable + if (trackerHome == null) { + try { + trackerHome = System.getenv("TRACKER_HOME"); //$NON-NLS-1$ + } catch (Exception ex) { + exceptions += ex.getClass().getSimpleName() + + ": " + ex.getMessage() + newline; //$NON-NLS-1$ + } + if (writeToLog) logMessage("environment variable TRACKER_HOME: " + trackerHome); //$NON-NLS-1$ + if (trackerHome != null && !fileExists(trackerHome)) { + trackerHome = null; + if (writeToLog) logMessage("TRACKER_HOME directory no longer exists"); //$NON-NLS-1$ + } + } - /** - * Finds and loads the preferences file into an XMLControl. - * - * @return the loaded XMLControl, or null if no preferences file found - */ - public static XMLControl findPreferences() { - // look for prefs file in OSPRuntime.getDefaultSearchPaths() + if (trackerHome == null) + throw new NullPointerException("trackerhome not found"); //$NON-NLS-1$ + if (writeToLog) logMessage("using trackerhome: " + trackerHome); //$NON-NLS-1$ + + return trackerHome; + } + + /** + * Finds and loads the preferences file into an XMLControl. + * + * @return the loaded XMLControl, or null if no preferences file found + */ + public static XMLControl findPreferences() { + // look for prefs file in OSPRuntime.getDefaultSearchPaths() XMLControl control = null; - String loadedPath = null; - outer: for (String path: OSPRuntime.getDefaultSearchPaths()) { - for (int i=0; i<2; i++) { - String fileName = prefsFileName; - if (i==1) { - // if not found with leading dot in fileName, try without - fileName = fileName.substring(1); - } - String prefsPath = new File(path, fileName).getAbsolutePath(); - control = new XMLControlElement(prefsPath); - if (!control.failedToRead() && control.getObjectClassName().endsWith("Preferences")) { //$NON-NLS-1$ - loadedPath = prefsPath; - break outer; - } - } - } - if (loadedPath!=null) { - control.setValue("prefsPath", loadedPath); //$NON-NLS-1$ - } - return control; - } + String loadedPath = null; + outer: for (String path: OSPRuntime.getDefaultSearchPaths()) { + for (int i=0; i<2; i++) { + String fileName = prefsFileName; + if (i==1) { + // if not found with leading dot in fileName, try without + fileName = fileName.substring(1); + } + String prefsPath = new File(path, fileName).getAbsolutePath(); + control = new XMLControlElement(prefsPath); + if (!control.failedToRead() && control.getObjectClassName().endsWith("Preferences")) { //$NON-NLS-1$ + loadedPath = prefsPath; + break outer; + } + } + } + if (loadedPath!=null) { + control.setValue("prefsPath", loadedPath); //$NON-NLS-1$ + return control; + } + return null; + } - /** - * Finds the FFMPeg home directory and sets/returns the static variable xuggleHome. - * - * @param trackerHome the Tracker home directory (may be null) - * @param writeToLog true to write results to the start log + /** + * Finds the FFMPeg home directory and sets/returns the static variable xuggleHome. + * + * @param trackerHome the Tracker home directory (may be null) + * @param writeToLog true to write results to the start log */ public static String findFFMPegHome(String trackerHome, boolean writeToLog) throws Exception { // first see if ffmpegHome is child or sibling of trackerHome @@ -330,7 +330,7 @@ public static String findFFMPegHome(String trackerHome, boolean writeToLog) thro } if (f.exists() && f.isDirectory()) { ffmpegHome = f.getPath(); - if (writeToLog) logMessage("ffmpegHome found relative to TrackerHome: "+ffmpegHome); //$NON-NLS-1$ + if (writeToLog) logMessage("ffmpegHome found relative to trackerhome: "+ffmpegHome); //$NON-NLS-1$ } } @@ -389,13 +389,13 @@ private static void exitGracefully(String jarPath) { + jarPath + "." + newline + newline //$NON-NLS-1$ + startLogLine - + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ - + "please see www.cabrillo.edu/~dbrown/tracker/." + newline + newline //$NON-NLS-1$ - + "Problems:" + newline + exceptions, //$NON-NLS-1$ - "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.ERROR_MESSAGE); - } else { - if (trackerHome == null) { + + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ + + "please see http://physlets.org/tracker/." + newline + newline //$NON-NLS-1$ + + "Problems:" + newline + exceptions, //$NON-NLS-1$ + "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.ERROR_MESSAGE); + } else { + if (trackerHome == null) { if (codeBaseDir != null) { JOptionPane .showMessageDialog( @@ -407,26 +407,26 @@ private static void exitGracefully(String jarPath) { + newline + newline + startLogLine - + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ - + "please see www.cabrillo.edu/~dbrown/tracker/." + newline + newline //$NON-NLS-1$ - + "Problems:" + newline + exceptions, //$NON-NLS-1$ - "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.ERROR_MESSAGE); - } else { - JOptionPane + + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ + + "please see http://physlets.org/tracker/." + newline + newline //$NON-NLS-1$ + + "Problems:" + newline + exceptions, //$NON-NLS-1$ + "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.ERROR_MESSAGE); + } else { + JOptionPane .showMessageDialog( null, "It appears you have an incomplete Tracker installation, since" + newline //$NON-NLS-1$ + "no directory named \"Tracker\" could be found and " + newline //$NON-NLS-1$ + "no tracker.jar or tracker-x.xx.jar file exists in the current directory." + newline + newline //$NON-NLS-1$ + startLogLine - + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ - + "please see www.cabrillo.edu/~dbrown/tracker/." + newline + newline //$NON-NLS-1$ - + "Problems:" + newline + exceptions, //$NON-NLS-1$ - "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.ERROR_MESSAGE); - } - } else { + + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ + + "please see http://physlets.org/tracker/." + newline + newline //$NON-NLS-1$ + + "Problems:" + newline + exceptions, //$NON-NLS-1$ + "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.ERROR_MESSAGE); + } + } else { String jarHome = OSPRuntime.isMac() ? codeBaseDir.getAbsolutePath() : trackerHome; JOptionPane @@ -437,53 +437,57 @@ private static void exitGracefully(String jarPath) { + newline + newline + startLogLine - + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ - + "please see www.cabrillo.edu/~dbrown/tracker/." + newline + newline //$NON-NLS-1$ - + "Problems:" + newline + exceptions, //$NON-NLS-1$ - "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ - JOptionPane.ERROR_MESSAGE); - } + + "For trouble-shooting or to download the latest installer," + newline //$NON-NLS-1$ + + "please see http://physlets.org/tracker/." + newline + newline //$NON-NLS-1$ + + "Problems:" + newline + exceptions, //$NON-NLS-1$ + "TrackerStarter Vers " + Tracker.VERSION + ": Error Starting Tracker", //$NON-NLS-1$ //$NON-NLS-2$ + JOptionPane.ERROR_MESSAGE); + } - } - writeUserLog(); - writeCodeBaseLog(); - System.exit(0); - } + } + writeUserLog(); + writeCodeBaseLog(); + System.exit(0); + } /** * Loads preferences from a preferences file. - */ - private static void loadPreferences() { - trackerJarPath = null; - boolean loaded = false; - - XMLControl prefsXMLControl = findPreferences(); - String prefsPath = prefsXMLControl.getString("prefsPath"); //$NON-NLS-1$ - - // now read the preferences from the prefsXMLControl - // but also check environment preferences which trump prefs file - if (!prefsXMLControl.failedToRead()) { - logMessage("loading starter preferences from: " + prefsPath); //$NON-NLS-1$ - - // preferred vm bitness -// String systemProperty = System.getProperty(PREFERRED_VM_BITNESS); -// if (systemProperty!=null) { -// use32BitMode = "32".equals(systemProperty); //$NON-NLS-1$ -// logMessage("system property "+PREFERRED_VM_BITNESS+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ -// } - use32BitMode = prefsXMLControl.getBoolean("32-bit"); //$NON-NLS-1$ - - // preferred tracker jar - String jar = null; - String systemProperty = System.getProperty(PREFERRED_TRACKER_JAR); - if (systemProperty!=null) { - loaded = true; - trackerJarPath = systemProperty; - jar = XML.getName(trackerJarPath); - logMessage("system property "+PREFERRED_TRACKER_JAR+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ - } - else if (prefsXMLControl.getPropertyNames().contains("tracker_jar")) { //$NON-NLS-1$ - loaded = true; + */ + private static void loadPreferences() { + trackerJarPath = null; + boolean loaded = false; + + XMLControl prefsXMLControl = findPreferences(); + if (prefsXMLControl==null) { + logMessage("no preferences file found"); //$NON-NLS-1$ + return; + } + String prefsPath = prefsXMLControl.getString("prefsPath"); //$NON-NLS-1$ + + // now read the preferences from the prefsXMLControl + // but also check environment preferences which trump prefs file + if (!prefsXMLControl.failedToRead()) { + logMessage("loading starter preferences from: " + prefsPath); //$NON-NLS-1$ + + // preferred vm bitness +// String systemProperty = System.getProperty(PREFERRED_VM_BITNESS); +// if (systemProperty!=null) { +// use32BitMode = "32".equals(systemProperty); //$NON-NLS-1$ +// logMessage("system property "+PREFERRED_VM_BITNESS+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ +// } + use32BitMode = prefsXMLControl.getBoolean("32-bit"); //$NON-NLS-1$ + + // preferred tracker jar + String jar = null; + String systemProperty = System.getProperty(PREFERRED_TRACKER_JAR); + if (systemProperty!=null) { + loaded = true; + trackerJarPath = systemProperty; + jar = XML.getName(trackerJarPath); + logMessage("system property "+PREFERRED_TRACKER_JAR+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ + } + else if (prefsXMLControl.getPropertyNames().contains("tracker_jar")) { //$NON-NLS-1$ + loaded = true; jar = prefsXMLControl.getString("tracker_jar"); //$NON-NLS-1$ } if (jar!=null && !jar.equals("tracker.jar")) { //$NON-NLS-1$ @@ -494,37 +498,37 @@ else if (prefsXMLControl.getPropertyNames().contains("tracker_jar")) { //$NON-NL if (n>-1) { ver = ver.substring(0, n); } - try { - launchVersionNumber = Double.parseDouble(ver); - launchVersionString = versionStr; - logMessage("preferred version: " + launchVersionString); //$NON-NLS-1$ - } catch (Exception ex) { - logMessage("version number could not be parsed: " + ver); //$NON-NLS-1$ - } - } + try { + launchVersionNumber = Double.parseDouble(ver); + launchVersionString = versionStr; + logMessage("preferred version: " + launchVersionString); //$NON-NLS-1$ + } catch (Exception ex) { + logMessage("version number could not be parsed: " + ver); //$NON-NLS-1$ + } + } - // preferred java vm - preferredVM = null; -// systemProperty = System.getProperty(PREFERRED_JAVA_VM); -// if (systemProperty!=null) { -// loaded = true; -// preferredVM = systemProperty; -// logMessage("system property "+PREFERRED_JAVA_VM+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ -// } - if (prefsXMLControl.getPropertyNames().contains("java_vm")) { //$NON-NLS-1$ - loaded = true; - preferredVM = prefsXMLControl.getString("java_vm"); //$NON-NLS-1$ - } + // preferred java vm + preferredVM = null; +// systemProperty = System.getProperty(PREFERRED_JAVA_VM); +// if (systemProperty!=null) { +// loaded = true; +// preferredVM = systemProperty; +// logMessage("system property "+PREFERRED_JAVA_VM+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ +// } + if (prefsXMLControl.getPropertyNames().contains("java_vm")) { //$NON-NLS-1$ + loaded = true; + preferredVM = prefsXMLControl.getString("java_vm"); //$NON-NLS-1$ + } if (preferredVM!=null) { - File javaFile = OSPRuntime.getJavaFile(preferredVM); - if (javaFile != null && javaFile.exists()) { - javaCommand = XML.stripExtension(javaFile.getPath()); - logMessage("preferred java VM: " + javaCommand); //$NON-NLS-1$ - } else { - logMessage("preferred java VM invalid--using default instead"); //$NON-NLS-1$ - preferredVM = null; - javaCommand = "java"; //$NON-NLS-1$ - } + File javaFile = OSPRuntime.getJavaFile(preferredVM); + if (javaFile != null && javaFile.exists()) { + javaCommand = XML.stripExtension(javaFile.getPath()); + logMessage("preferred java VM: " + javaCommand); //$NON-NLS-1$ + } else { + logMessage("preferred java VM invalid--using default instead"); //$NON-NLS-1$ + preferredVM = null; + javaCommand = "java"; //$NON-NLS-1$ + } } @@ -538,51 +542,51 @@ else if (prefsXMLControl.getPropertyNames().contains("tracker_jar")) { //$NON-NL continue; File runFile = new File(trackerHome, app); // app is relative address if (!runFile.exists()) { - runFile = new File(app); // app is absolute address - if (!runFile.exists()) { - runFile = null; - logMessage("executable file not found: " + app); //$NON-NLS-1$ - } - } - if (runFile != null) - try { - logMessage("executing " + runFile.getAbsolutePath()); //$NON-NLS-1$ - ProcessBuilder pb = new ProcessBuilder(runFile.getAbsolutePath()); - pb.directory(new File(trackerHome)); - Process p = pb.start(); - p.waitFor(); - } catch (Exception ex) { - logMessage("execution failed: " + ex.getClass().getSimpleName() + " " + ex.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - } + runFile = new File(app); // app is absolute address + if (!runFile.exists()) { + runFile = null; + logMessage("executable file not found: " + app); //$NON-NLS-1$ + } + } + if (runFile != null) + try { + logMessage("executing " + runFile.getAbsolutePath()); //$NON-NLS-1$ + ProcessBuilder pb = new ProcessBuilder(runFile.getAbsolutePath()); + pb.directory(new File(trackerHome)); + Process p = pb.start(); + p.waitFor(); + } catch (Exception ex) { + logMessage("execution failed: " + ex.getClass().getSimpleName() + " " + ex.getMessage()); //$NON-NLS-1$ //$NON-NLS-2$ + } + } + } // preferred memory size preferredMemorySize = 0; // default systemProperty = System.getProperty(PREFERRED_MEMORY_SIZE); if (systemProperty!=null) { - loaded = true; - try { - preferredMemorySize = Integer.parseInt(systemProperty); - logMessage("system property "+PREFERRED_MEMORY_SIZE+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ - } catch (NumberFormatException e) { - } - } + loaded = true; + try { + preferredMemorySize = Integer.parseInt(systemProperty); + logMessage("system property "+PREFERRED_MEMORY_SIZE+" = " + systemProperty); //$NON-NLS-1$ //$NON-NLS-2$ + } catch (NumberFormatException e) { + } + } else if (prefsXMLControl.getPropertyNames().contains("memory_size")) { //$NON-NLS-1$ - preferredMemorySize = prefsXMLControl.getInt("memory_size"); //$NON-NLS-1$ - } - if (preferredMemorySize>0) { - logMessage("preferred memory size: " + preferredMemorySize + " MB"); //$NON-NLS-1$ //$NON-NLS-2$ - } - else { - preferredMemorySize = DEFAULT_MEMORY_SIZE; - logMessage("using default memory size: " + preferredMemorySize + " MB"); //$NON-NLS-1$ //$NON-NLS-2$ - } - - if (!loaded) - logMessage("no starter preferences found in " + prefsPath); //$NON-NLS-1$ - } - } + preferredMemorySize = prefsXMLControl.getInt("memory_size"); //$NON-NLS-1$ + } + if (preferredMemorySize>0) { + logMessage("preferred memory size: " + preferredMemorySize + " MB"); //$NON-NLS-1$ //$NON-NLS-2$ + } + else { + preferredMemorySize = DEFAULT_MEMORY_SIZE; + logMessage("using default memory size: " + preferredMemorySize + " MB"); //$NON-NLS-1$ //$NON-NLS-2$ + } + + if (!loaded) + logMessage("no starter preferences found in " + prefsPath); //$NON-NLS-1$ + } + } /** * Gets the preferred tracker jar path @@ -594,27 +598,27 @@ private static String getTrackerJarPath() throws Exception { return trackerJarPath; } String jarPath = null; - String jarHome = OSPRuntime.isMac() ? codeBaseDir.getAbsolutePath() - : trackerHome; - if (OSPRuntime.isMac()) { - logMessage("Mac OSX: looking for tracker jars in " + jarHome); //$NON-NLS-1$ - } else if (OSPRuntime.isWindows()) { - logMessage("Windows: looking for tracker jars in " + jarHome); //$NON-NLS-1$ - } else { - logMessage("Linux: looking for tracker jars in " + jarHome); //$NON-NLS-1$ - } - try { - File dir = new File(jarHome); + String jarHome = OSPRuntime.isMac() ? codeBaseDir.getAbsolutePath() + : trackerHome; + if (OSPRuntime.isMac()) { + logMessage("Mac OSX: looking for tracker jars in " + jarHome); //$NON-NLS-1$ + } else if (OSPRuntime.isWindows()) { + logMessage("Windows: looking for tracker jars in " + jarHome); //$NON-NLS-1$ + } else { + logMessage("Linux: looking for tracker jars in " + jarHome); //$NON-NLS-1$ + } + try { + File dir = new File(jarHome); String[] fileNames = dir.list(trackerJarFilter); if (fileNames != null && fileNames.length > 0) { String s = "tracker jars found: "; //$NON-NLS-1$ - for (String next : fileNames) { - s += next + ", "; //$NON-NLS-1$ - } - logMessage(s.substring(0, s.length() - 2)); - String defaultJar = null; - String numberedJar = null; - double version = 0; + for (String next : fileNames) { + s += next + ", "; //$NON-NLS-1$ + } + logMessage(s.substring(0, s.length() - 2)); + String defaultJar = null; + String numberedJar = null; + double version = 0; for (int i = 0; i < fileNames.length; i++) { if ("tracker.jar".equals(fileNames[i].toLowerCase())) {//$NON-NLS-1$ defaultJar = fileNames[i]; @@ -628,13 +632,13 @@ private static String getTrackerJarPath() throws Exception { vers = vers.substring(0, n); } - double nextVersion = Double.parseDouble(vers); - if (nextVersion == launchVersionNumber && versionStr.equals(launchVersionString)) { - File file = new File(jarHome, fileNames[i]); - logMessage("using tracker jar: " + file.getAbsolutePath()); //$NON-NLS-1$ - return file.getAbsolutePath(); - } - if (nextVersion > version) { // look for latest numbered version + double nextVersion = Double.parseDouble(vers); + if (nextVersion == launchVersionNumber && versionStr.equals(launchVersionString)) { + File file = new File(jarHome, fileNames[i]); + logMessage("using tracker jar: " + file.getAbsolutePath()); //$NON-NLS-1$ + return file.getAbsolutePath(); + } + if (nextVersion > version) { // look for latest numbered version version = nextVersion; numberedJar = fileNames[i]; } @@ -643,20 +647,20 @@ private static String getTrackerJarPath() throws Exception { } jarPath = defaultJar != null ? defaultJar : numberedJar; } - } catch (Exception ex) { // if file access fails, try unnumbered tracker.jar - exceptions += ex.getClass().getSimpleName() - + ": " + ex.getMessage() + newline; //$NON-NLS-1$ - logMessage(ex.toString()); - jarPath = "tracker.jar"; //$NON-NLS-1$ - } - if (jarPath != null) { - // look in jarHome - File file = new File(jarHome, jarPath); - if (file.exists()) { - logMessage("using tracker jar: " + file.getAbsolutePath()); //$NON-NLS-1$ - return file.getAbsolutePath(); - } - } + } catch (Exception ex) { // if file access fails, try unnumbered tracker.jar + exceptions += ex.getClass().getSimpleName() + + ": " + ex.getMessage() + newline; //$NON-NLS-1$ + logMessage(ex.toString()); + jarPath = "tracker.jar"; //$NON-NLS-1$ + } + if (jarPath != null) { + // look in jarHome + File file = new File(jarHome, jarPath); + if (file.exists()) { + logMessage("using tracker jar: " + file.getAbsolutePath()); //$NON-NLS-1$ + return file.getAbsolutePath(); + } + } throw new NullPointerException("No Tracker jar files found in " + jarHome); //$NON-NLS-1$ } @@ -682,14 +686,14 @@ private static void startTracker(String jarPath, String[] args) } if (OSPRuntime.isMac()) { cmd.add(use32BitMode ? "-d32" : "-d64"); //$NON-NLS-1$ //$NON-NLS-2$ - cmd.add("-Xdock:name=Tracker"); //$NON-NLS-1$ - } - - cmd.add("-jar"); //$NON-NLS-1$ - cmd.add(jarPath); - if (args != null && args.length > 0) - for (String next : args) { - if (next != null) + cmd.add("-Xdock:name=Tracker"); //$NON-NLS-1$ + } + + cmd.add("-jar"); //$NON-NLS-1$ + cmd.add(jarPath); + if (args != null && args.length > 0) + for (String next : args) { + if (next != null) cmd.add(next); } @@ -701,13 +705,13 @@ private static void startTracker(String jarPath, String[] args) // String portVar = "TRACKER_PORT"; //$NON-NLS-1$ // env.put(portVar, String.valueOf(port)); // if (logText.indexOf(portVar)==-1) { -// logMessage("setting environment variable "+portVar+" = " + String.valueOf(port)); //$NON-NLS-1$ //$NON-NLS-2$ -// } - if (memorySize-1) { //$NON-NLS-1$ + e.printStackTrace(); + } + + logMessage("failed to start with memory size "+memorySize+"MB due to the following errors:"+errors); //$NON-NLS-1$ //$NON-NLS-2$ + + // if process failed due to excessive memory size, reduce size and try again + if (errors.indexOf("heap")>-1) { //$NON-NLS-1$ memorySize *= 0.95; if (memorySize<64) { - exceptions += errors + newline; - exitGracefully(jarPath); - } - logMessage("try to start with smaller memory size "+memorySize+"MB"); //$NON-NLS-1$ //$NON-NLS-2$ - startTracker(jarPath, args); - } - // if process failed due to unsupported 32-bit VM, change bitness and try again - else if (errors.indexOf("32-bit")>-1) { //$NON-NLS-1$ - use32BitMode = false; - logMessage("try to start in 64-bit mode"); //$NON-NLS-1$ - - // assemble warning to pass to Tracker as an environment variable - starterWarning = "The Java VM was started in 64-bit mode (32-bit not support)."; //$NON-NLS-1$ + exceptions += errors + newline; + exitGracefully(jarPath); + } + logMessage("try to start with smaller memory size "+memorySize+"MB"); //$NON-NLS-1$ //$NON-NLS-2$ + startTracker(jarPath, args); + } + // if process failed due to unsupported 32-bit VM, change bitness and try again + else if (errors.indexOf("32-bit")>-1) { //$NON-NLS-1$ + use32BitMode = false; + logMessage("try to start in 64-bit mode"); //$NON-NLS-1$ + + // assemble warning to pass to Tracker as an environment variable + starterWarning = "The Java VM was started in 64-bit mode (32-bit not support)."; //$NON-NLS-1$ - startTracker(jarPath, args); - } + startTracker(jarPath, args); + } else { exceptions += errors + newline; exitGracefully(jarPath); @@ -842,13 +845,13 @@ else if (errors.indexOf("32-bit")>-1) { //$NON-NLS-1$ // should never get here--exits via timer System.exit(0); } - } + } - private static String writeUserLog() { - if ("".equals(logText) || trackerHome==null) //$NON-NLS-1$ - return null; + private static String writeUserLog() { + if ("".equals(logText) || trackerHome==null) //$NON-NLS-1$ + return null; - File file = null; + File file = null; if (new File(trackerHome).canWrite()) file = new File(trackerHome, LOG_FILE_NAME); if (userDocuments != null && new File(userDocuments).canWrite()) { @@ -860,13 +863,13 @@ private static String writeUserLog() { } } - if (file==null) return null; - - addLogHeader(); - logMessage("writing start log to "+file.getAbsolutePath()); //$NON-NLS-1$ + if (file==null) return null; + + addLogHeader(); + logMessage("writing start log to "+file.getAbsolutePath()); //$NON-NLS-1$ - try { - FileOutputStream stream = new FileOutputStream(file); + try { + FileOutputStream stream = new FileOutputStream(file); Charset charset = Charset.forName(encoding); OutputStreamWriter out = new OutputStreamWriter(stream, charset); BufferedWriter writer = new BufferedWriter(out); @@ -880,23 +883,23 @@ private static String writeUserLog() { } private static void addLogHeader() { - if (!logText.startsWith("TrackerStarter")) { //$NON-NLS-1$ - SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss MMM dd yyyy"); //$NON-NLS-1$ - Calendar cal = Calendar.getInstance(); - logText = "TrackerStarter version " + Tracker.VERSION + " " //$NON-NLS-1$ //$NON-NLS-2$ - + sdf.format(cal.getTime()) + newline + newline + logText; - } - } + if (!logText.startsWith("TrackerStarter")) { //$NON-NLS-1$ + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss MMM dd yyyy"); //$NON-NLS-1$ + Calendar cal = Calendar.getInstance(); + logText = "TrackerStarter version " + Tracker.VERSION + " " //$NON-NLS-1$ //$NON-NLS-2$ + + sdf.format(cal.getTime()) + newline + newline + logText; + } + } private static void writeCodeBaseLog() { // writes log file to codeBaseDir - if (codeBaseDir!=null && codeBaseDir.canWrite()) { - addLogHeader(); - File file = new File(codeBaseDir, LOG_FILE_NAME); - logMessage("writing start log to "+file.getAbsolutePath()); //$NON-NLS-1$ - try { - FileOutputStream stream = new FileOutputStream(file); - Charset charset = Charset.forName(encoding); + if (codeBaseDir!=null && codeBaseDir.canWrite()) { + addLogHeader(); + File file = new File(codeBaseDir, LOG_FILE_NAME); + logMessage("writing start log to "+file.getAbsolutePath()); //$NON-NLS-1$ + try { + FileOutputStream stream = new FileOutputStream(file); + Charset charset = Charset.forName(encoding); OutputStreamWriter out = new OutputStreamWriter(stream, charset); BufferedWriter writer = new BufferedWriter(out); writer.write(logText); @@ -904,57 +907,57 @@ private static void writeCodeBaseLog() { writer.close(); } catch (IOException ex) { } - } - } + } + } -// /** -// * Writes starter preferences. -// */ -// private static void writeStarterPrefs() { -// File starterPrefsFile = new File(userHome, starterPrefsFileName); -// if (starterPrefsFile.exists() && !starterPrefsFile.canWrite()) { -// return; -// } -// StringBuffer buf = new StringBuffer(); -// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss MMM dd yyyy"); //$NON-NLS-1$ -// Calendar cal = Calendar.getInstance(); -// buf.append("TrackerStarter version " + version + " " //$NON-NLS-1$ //$NON-NLS-2$ -// + sdf.format(cal.getTime())); -// // add notice of deprecation -// buf.append("\nNote: .tracker_starter.prefs is deprecated as of version 4.62."); //$NON-NLS-1$ -// buf.append("\nThis file is for backward compatibility only."); //$NON-NLS-1$ -// // add jre path -// if (!"java".equals(javaCommand)) { //$NON-NLS-1$ -// buf.append("\n\njre " + javaCommand); //$NON-NLS-1$ -// } -// // add tracker version -// if (launchVersionNumber > 2.5) { -// buf.append("\nversion " + launchVersionString); //$NON-NLS-1$ -// } -// // add executable paths -// if (executables != null) { -// for (String path : executables) { -// if (path == null || "".equals(path))continue; //$NON-NLS-1$ -// buf.append("\nrun " + path); //$NON-NLS-1$ -// } -// } -// if (buf.length() > 0) -// try { -// FileOutputStream stream = new FileOutputStream(starterPrefsFile); -// Charset charset = Charset.forName(encoding); -// Writer out = new OutputStreamWriter(stream, charset); -// BufferedWriter output = new BufferedWriter(out); -// output.write(buf.toString()); -// output.flush(); -// output.close(); -// logMessage("writing backup starter preferences to " + starterPrefsFile.getPath()); //$NON-NLS-1$ -// } catch (IOException ex) { -// } -// } +// /** +// * Writes starter preferences. +// */ +// private static void writeStarterPrefs() { +// File starterPrefsFile = new File(userHome, starterPrefsFileName); +// if (starterPrefsFile.exists() && !starterPrefsFile.canWrite()) { +// return; +// } +// StringBuffer buf = new StringBuffer(); +// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss MMM dd yyyy"); //$NON-NLS-1$ +// Calendar cal = Calendar.getInstance(); +// buf.append("TrackerStarter version " + version + " " //$NON-NLS-1$ //$NON-NLS-2$ +// + sdf.format(cal.getTime())); +// // add notice of deprecation +// buf.append("\nNote: .tracker_starter.prefs is deprecated as of version 4.62."); //$NON-NLS-1$ +// buf.append("\nThis file is for backward compatibility only."); //$NON-NLS-1$ +// // add jre path +// if (!"java".equals(javaCommand)) { //$NON-NLS-1$ +// buf.append("\n\njre " + javaCommand); //$NON-NLS-1$ +// } +// // add tracker version +// if (launchVersionNumber > 2.5) { +// buf.append("\nversion " + launchVersionString); //$NON-NLS-1$ +// } +// // add executable paths +// if (executables != null) { +// for (String path : executables) { +// if (path == null || "".equals(path))continue; //$NON-NLS-1$ +// buf.append("\nrun " + path); //$NON-NLS-1$ +// } +// } +// if (buf.length() > 0) +// try { +// FileOutputStream stream = new FileOutputStream(starterPrefsFile); +// Charset charset = Charset.forName(encoding); +// Writer out = new OutputStreamWriter(stream, charset); +// BufferedWriter output = new BufferedWriter(out); +// output.write(buf.toString()); +// output.flush(); +// output.close(); +// showDebugMessage("writing backup starter preferences to " + starterPrefsFile.getPath()); //$NON-NLS-1$ +// } catch (IOException ex) { +// } +// } // - private static boolean fileExists(String path) { - File file = new File(path); - try { + private static boolean fileExists(String path) { + File file = new File(path); + try { if (file.exists()) { return true; } @@ -965,20 +968,20 @@ private static boolean fileExists(String path) { exceptions += er.getClass().getSimpleName() + ": " + er.getMessage() + newline; //$NON-NLS-1$ } - return false; - } + return false; + } - private static void logMessage(String message) { - if (log) { - logText += " - " + message + newline; //$NON-NLS-1$ - } - if (debug) { - System.out.println(message); - } - } + private static void logMessage(String message) { + if (log) { + logText += " - " + message + newline; //$NON-NLS-1$ + } + if (debug) { + System.out.println(message); + } + } /** - * Copies ffmpeg jars and QTJava.zip to target VM extensions directory. + * Copies FFMPeg jars and QTJava.zip to target VM extensions directory. * Deprecated--no longer require extensions as of Oct 2014 */ @SuppressWarnings("unused") @@ -1012,7 +1015,7 @@ private static void refreshVideoEngines() throws Exception { else { // failed to copy ffmpeg jars to ext directory--permissions problem? String ffmpegSourceDir = new File(ffmpegHome).getAbsolutePath(); //$NON-NLS-1$ - logMessage("unable to copy ffmpeg jars from "+ffmpegSourceDir+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ + logMessage("unable to copy ffmpeg jars from "+ffmpegSourceDir+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ // assemble ffmpegWarning to pass to Tracker as an environment variable ffmpegWarning = "Some video engine files could not be copied automatically."; //$NON-NLS-1$ @@ -1028,33 +1031,33 @@ private static void refreshVideoEngines() throws Exception { } } - - // QuickTime - if (manager.copyQTJavaTo(extDir)) { - logMessage("copied QTJava.zip to " + extDir.getAbsolutePath()); //$NON-NLS-1$ - } - else { - File extFile = new File(extDir, "QTJava.zip"); //$NON-NLS-1$ - if (extFile.exists()) { - logMessage("QTJava.zip found in " + extDir.getAbsolutePath()); //$NON-NLS-1$ - } - else { - File qtSource = manager.getQTJavaZip(); // file to be copied - if (qtSource==null) { - logMessage("QTJava.zip not found"); //$NON-NLS-1$ - } - else { - // Windows Vista special case--fails to launch Tracker if qtJavaWarning code is executed... - if (System.getProperty("os.name", "").toLowerCase().contains("vista")) return; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - - // failed to copy QTJava to ext directory--permissions problem? - logMessage("unable to copy "+qtSource.getAbsolutePath()+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ - - // assemble qtJavaWarning to pass to Tracker as an environment variable - // assemble ffmpegWarning to pass to Tracker as an environment variable - qtJavaWarning = "Some video engine files could not be copied automatically."; //$NON-NLS-1$ - qtJavaWarning += "\nThe video engine may not work unless they are copied manually."; //$NON-NLS-1$ - qtJavaWarning += "\n\nFiles to copy: QTJava.zip"; //$NON-NLS-1$ + + // QuickTime + if (manager.copyQTJavaTo(extDir)) { + logMessage("copied QTJava.zip to " + extDir.getAbsolutePath()); //$NON-NLS-1$ + } + else { + File extFile = new File(extDir, "QTJava.zip"); //$NON-NLS-1$ + if (extFile.exists()) { + logMessage("QTJava.zip found in " + extDir.getAbsolutePath()); //$NON-NLS-1$ + } + else { + File qtSource = manager.getQTJavaZip(); // file to be copied + if (qtSource==null) { + logMessage("QTJava.zip not found"); //$NON-NLS-1$ + } + else { + // Windows Vista special case--fails to launch Tracker if qtJavaWarning code is executed... + if (System.getProperty("os.name", "").toLowerCase().contains("vista")) return; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + + // failed to copy QTJava to ext directory--permissions problem? + logMessage("unable to copy "+qtSource.getAbsolutePath()+" to "+extDir.getAbsolutePath()); //$NON-NLS-1$ //$NON-NLS-2$ + + // assemble qtJavaWarning to pass to Tracker as an environment variable + // assemble xuggleWarning to pass to Tracker as an environment variable + qtJavaWarning = "Some video engine files could not be copied automatically."; //$NON-NLS-1$ + qtJavaWarning += "\nThe video engine may not work unless they are copied manually."; //$NON-NLS-1$ + qtJavaWarning += "\n\nFiles to copy: QTJava.zip"; //$NON-NLS-1$ qtJavaWarning += "\nCopy from: "+qtSource.getParent(); //$NON-NLS-1$ qtJavaWarning += "\nCopy to: "+extDir; //$NON-NLS-1$ } diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java index a56d384c..b11406f7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/WinRegistry.java @@ -19,7 +19,7 @@ * or view the license online at * * For additional Tracker information and documentation, please see - * . + * . */ package org.opensourcephysics.cabrillo.tracker.deploy; diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracker_topics.xml b/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracker_topics.xml index 38d33cc4..d24cda3a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracker_topics.xml +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracker_topics.xml @@ -1,322 +1,344 @@ - - - Tracker Help - Tracker Help - - - - /org/opensourcephysics/cabrillo/tracker/resources/help/intro.html - - - help - - - - Getting Started - - - /org/opensourcephysics/cabrillo/tracker/resources/help/gettingstarted.html - - - gettingstarted - - - - - Installation - - - /org/opensourcephysics/cabrillo/tracker/resources/help/install.html - - - install - - - - - User Interface - - - /org/opensourcephysics/cabrillo/tracker/resources/help/interface.html - - - GUI - - - - - Videos - - - /org/opensourcephysics/cabrillo/tracker/resources/help/videos.html - - - video - - - - - Video Filters - - - /org/opensourcephysics/cabrillo/tracker/resources/help/video_filters.html - - - filters - - - - - Tracks - - - /org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html - - - tracks - - - - - Coordinate System - - - /org/opensourcephysics/cabrillo/tracker/resources/help/coords.html - - - coords - - - - - Axes - - - /org/opensourcephysics/cabrillo/tracker/resources/help/axes.html - - - axes - - - - - Calibration Stick - - - /org/opensourcephysics/cabrillo/tracker/resources/help/stick.html - - - stick - - - - - Offset Origin - - - /org/opensourcephysics/cabrillo/tracker/resources/help/offset_origin.html - - - offset - - - - - Calibration Points - - - /org/opensourcephysics/cabrillo/tracker/resources/help/calibration.html - - - calibration - - - - - Point Mass - - - /org/opensourcephysics/cabrillo/tracker/resources/help/pointmass.html - - - pointmass - - - - - Autotracker - - - /org/opensourcephysics/cabrillo/tracker/resources/help/autotracker.html - - - autotracker - - - - - Center of Mass - - - /org/opensourcephysics/cabrillo/tracker/resources/help/cm.html - - - cm - - - - - Vector - - - /org/opensourcephysics/cabrillo/tracker/resources/help/vector.html - - - vector - - - - - Vector Sum - - - /org/opensourcephysics/cabrillo/tracker/resources/help/vectorsum.html - - - vectorsum - - - - - Line Profile - - - /org/opensourcephysics/cabrillo/tracker/resources/help/lineprofile.html - - - profile - - - - - RGB Region - - - /org/opensourcephysics/cabrillo/tracker/resources/help/rgbregion.html - - - rgbregion - - - - - Particle Models - - - /org/opensourcephysics/cabrillo/tracker/resources/help/particles.html - - - particle - - - - - Two-Body System - - - /org/opensourcephysics/cabrillo/tracker/resources/help/systems.html - - - system - - - - - Tape Measure - - - /org/opensourcephysics/cabrillo/tracker/resources/help/tape.html - - - tape - - - - - Protractor - - - /org/opensourcephysics/cabrillo/tracker/resources/help/protractor.html - - - protractor - - - - - Plot View - - - /org/opensourcephysics/cabrillo/tracker/resources/help/plotview.html - - - plot - - - - - Datatable View - - - /org/opensourcephysics/cabrillo/tracker/resources/help/tableview.html - - - datatable - - - - - Page View - - - /org/opensourcephysics/cabrillo/tracker/resources/help/pageview.html - - - pageview - - - - - Tracker Files - - - /org/opensourcephysics/cabrillo/tracker/resources/help/datafile.html - - - xml - - - - - Tracker ZIP Files - - - /org/opensourcephysics/cabrillo/tracker/resources/help/zip_resource.html - - - zip - - - - - Digital Library Browser - - - /org/opensourcephysics/cabrillo/tracker/resources/help/library_browser.html - - - library - - - + + + Tracker Help + Tracker Help + + + + /org/opensourcephysics/cabrillo/tracker/resources/help/intro.html + + + help + + + + Getting Started + + + /org/opensourcephysics/cabrillo/tracker/resources/help/gettingstarted.html + + + gettingstarted + + + + + Installation + + + /org/opensourcephysics/cabrillo/tracker/resources/help/install.html + + + install + + + + + User Interface + + + /org/opensourcephysics/cabrillo/tracker/resources/help/interface.html + + + GUI + + + + + Videos + + + /org/opensourcephysics/cabrillo/tracker/resources/help/videos.html + + + video + + + + + Video Filters + + + /org/opensourcephysics/cabrillo/tracker/resources/help/video_filters.html + + + filters + + + + + Tracks + + + /org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html + + + tracks + + + + + Coordinate System + + + /org/opensourcephysics/cabrillo/tracker/resources/help/coords.html + + + coords + + + + + Axes + + + /org/opensourcephysics/cabrillo/tracker/resources/help/axes.html + + + axes + + + + + Calibration Stick + + + /org/opensourcephysics/cabrillo/tracker/resources/help/stick.html + + + stick + + + + + Offset Origin + + + /org/opensourcephysics/cabrillo/tracker/resources/help/offset_origin.html + + + offset + + + + + Calibration Points + + + /org/opensourcephysics/cabrillo/tracker/resources/help/calibration.html + + + calibration + + + + + Point Mass + + + /org/opensourcephysics/cabrillo/tracker/resources/help/pointmass.html + + + pointmass + + + + + Autotracker + + + /org/opensourcephysics/cabrillo/tracker/resources/help/autotracker.html + + + autotracker + + + + + Center of Mass + + + /org/opensourcephysics/cabrillo/tracker/resources/help/cm.html + + + cm + + + + + Vector + + + /org/opensourcephysics/cabrillo/tracker/resources/help/vector.html + + + vector + + + + + Vector Sum + + + /org/opensourcephysics/cabrillo/tracker/resources/help/vectorsum.html + + + vectorsum + + + + + Line Profile + + + /org/opensourcephysics/cabrillo/tracker/resources/help/lineprofile.html + + + profile + + + + + RGB Region + + + /org/opensourcephysics/cabrillo/tracker/resources/help/rgbregion.html + + + rgbregion + + + + + Particle Models + + + /org/opensourcephysics/cabrillo/tracker/resources/help/particles.html + + + particle + + + + + Two-Body System + + + /org/opensourcephysics/cabrillo/tracker/resources/help/systems.html + + + system + + + + + Data Track + + + /org/opensourcephysics/cabrillo/tracker/resources/help/datatrack.html + + + datatrack + + + + + Tape Measure + + + /org/opensourcephysics/cabrillo/tracker/resources/help/tape.html + + + tape + + + + + Protractor + + + /org/opensourcephysics/cabrillo/tracker/resources/help/protractor.html + + + protractor + + + + + Circle Fitter + + + /org/opensourcephysics/cabrillo/tracker/resources/help/circlefitter.html + + + circle + + + + + Plot View + + + /org/opensourcephysics/cabrillo/tracker/resources/help/plotview.html + + + plot + + + + + Datatable View + + + /org/opensourcephysics/cabrillo/tracker/resources/help/tableview.html + + + datatable + + + + + Page View + + + /org/opensourcephysics/cabrillo/tracker/resources/help/pageview.html + + + pageview + + + + + Tracker Files + + + /org/opensourcephysics/cabrillo/tracker/resources/help/datafile.html + + + xml + + + + + Tracker ZIP Files + + + /org/opensourcephysics/cabrillo/tracker/resources/help/zip_resource.html + + + zip + + + + + Digital Library Browser + + + /org/opensourcephysics/cabrillo/tracker/resources/help/library_browser.html + + + library + + + \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html index f6d937ef..a3ce25b1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/tracks.html @@ -1,114 +1,114 @@ - - - - - - - Tracker Help: Tracks - - - - -

Tracks

-

A track represents a video feature that evolves over time. All interactive elements in Tracker, including the axes, measuring tools and calibration tools, are tracks.

-

The position or shape of the feature in a single video frame is known as a step; thus, a track is a series of steps. Each step can be selected and manipulated with the mouse or keyboard. Some steps, like those for point mass tracks, have only a single moveable point, but others, like vector steps, have two end points plus a center handle point.

-

There are several types of user-defined tracks and two measuring tools. For detailed information on a specific type, see its corresponding help topic: point mass, center of mass, vector, vector sum, line profile, rgb region, analytic particle model, dynamic particle model (cartesian, polar or two-body system), tape measure and protractor.

- -

1. Creating a track

-

- -

-

Create a new track by selecting the desired track type from the Create button menu on the toolbar or the Track|New menu on the menu bar. A newly created track is automatically selected for marking.

- -

2. Marking a track

-

- -

-

Marking a track refers to the process of defining its position on each frame in the video clip. Point mass tracks are special in that they can be marked either manually or automatically using autotracker. All other tracks must be marked manually using the crosshair cursor (shown above at twice actual size). To mark manually, hold down the shift key and click the mouse on the feature of interest as the video automatically steps through the video clip. Don't skip frames--if you do, velocities and accelerations cannot be determined.

-

When marking point mass and vector tracks, you can hit the enter key instead of clicking the mouse to mark a step at the exact location of the previous step. This can be useful when marking an object at rest.

-

Marking is done in the main video view. For more accurate marking, magnify the image up to 8x using the zoom tool or by right-clicking on the video and choosing the desired zoom level.

-

- -

-

There is some variability in marking requirements for the various track types. Vector and line profile tracks require dragging rather than clicking. Point mass and vector tracks expect every step to be marked, but offset origin, calibration point pair, line profile and rgb region tracks require marking only a single frame. Center of mass, vector sum, particle model and two-body system tracks are marked automatically.

-

In rare circumstances you may wish to control the marking process in more detail. If you prefer that the video not automatically step forward while marking you can uncheck the Autostep option.

- -

3. Track buttons and menus

-

- -

-

Every track has a track button that shows its name, color and footprint, and a track menu with items for setting its properties. Track buttons are displayed on both the toolbar and the track control. Track menus can be accessed by (a) clicking the track button, (b) choosing the track from the Tracks menu on the menu bar, or (c) right-clicking the main video view and choosing the track from the Tracks popup menu.

- -

4. Track control

-

- -

-

The track control displays a track button for each user-created track. This makes it easy to select tracks and provides ready access to all track menus.

-

To show the track control, click the track control button on the toolbar.

- -

5. Selecting a track

-

Tracks can be marked or edited only when they are selected. The track button of the currently selected track is displayed on the lower tier of the toolbar.

-

- -

-

To select a different track, click its track button on the track control or select one of its steps in the video view.

-

- - - -

-

To deselect all tracks, double-click the video or background mat.

- -

6. Cloning, copying and importing tracks

-

Make a duplicate copy of an existing track using the Clone item in the Create menu or the Track|New menu.

-

- -

-

Copy a track from one tab to another by selecting the track and copying it to the clipboard using the Edit|Copy menu item, then pasting using the Edit|Paste item.

-

Since the tape measure and axes are tracks, they can also be copied. When pasted, they replace the existing tape or axes in the tab. When no track is selected, the entire tracker panel (video clip, coordinate system and tracks) is copied.

-

Tracks can also be imported directly from saved tracker files into an open tab using the File|Import menu item. For more information see tracker files.

- -

7. Customizing and documenting a track

-

Every track is identified by its name, color, footprint (visible shape) and notes (descriptive comments). Newly created tracks are assigned default values for the first three properties that depend on the type of track. For example, a point mass might initially be named ”mass A” and be drawn as a red diamond.

-

- Toolbar track name and footprint -

-

A track button showing the name, footprint and color of the track are displayed on the toolbar when the track is selected. To change the default values, click the track button and choose the Name..., Color... or Footprint item from the track menu.

-

- -

-

To enter notes for a track, open the notes window by clicking the notes button at the right end of the toolbar. or choosing Notes... from the track menu. As you enter information, the field turns yellow to indicate the changes have not yet been saved. To save the notes, click anywhere outside the window. To discard the changes, click the Cancel button.

-

- -

- -

8. Controlling visibility

-

Hide a track by turning off the Visible property in its track menu. Or use the trails, labels, paths, positions, velocities and accelerations buttons on the toolbar to toggle the visibility of these features on all tracks.

- -

9. Selecting and identifying points

-

- - -

-

To select a point, move the mouse cursor over it in the main video view. The cursor will become a hand pointer and the point will be identified in the bottom right message box. Click to select it. Note: To select a point while marking, release the shift key.

-

When a single point is selected, its track is selected, its editable properties (position, etc) are displayed on the toolbar, and it is identified with a square selection icon.

-

You can also select multiple points (Point Mass positions) for simultaneous dragging or deleting. Select multiple points by (a) control-clicking additional points or (b) right-dragging a box and choosing Select Points from the popup menu. Deselect previously selected points by (a) control-clicking them or (b) right-dragging a box and choosing Deselect Points from the popup menu.

- -

10. Editing a step

-

To edit a step, select and drag one of its points. A selected point can also be nudged one pixel at a time with the arrow keys on the keyboard. Holding down the shift key increases the nudge distance.

-

Many tracks also provide input fields on the toolbar for setting positions or other properties of the selected step.

- -

11. Deleting

-

Delete a single or multiple steps by selecting them and hitting the delete key on the keyboard. Delete all steps for a track by choosing the Clear Steps item from its track menu.

-

Delete an entire track by name in the Edit|Delete menu or by choosing the Delete item in its track menu.

-

Clear all tracks in the current tab by choosing the Edit|Clear menu item.

-

- -

- -

12. Locking a track

-

Locking a track prevents any changes to its steps. Lock a track by turning on the Locked property in its track menu.

- - - + + + + + + + Tracker Help: Tracks + + + + +

Tracks

+

A track represents a video feature that evolves over time. All interactive elements in Tracker, including the axes, measuring tools and calibration tools, are tracks.

+

The position or shape of the feature in a single video frame is known as a step; thus, a track is a series of steps. Each step can be selected and manipulated with the mouse or keyboard. Some steps, like those for point mass tracks, have only a single moveable point, but others, like vector steps, have two end points plus a center handle point.

+

There are several types of user-defined tracks and three measuring tools. For detailed information on a specific type, see its corresponding help topic: point mass, center of mass, vector, vector sum, line profile, rgb region, analytic particle model, dynamic particle model (cartesian, polar or two-body system), tape measure, protractor, circle fitter and data track.

+ +

1. Creating a track

+

+ +

+

Create a new track by selecting the desired track type from the Create button menu on the toolbar or the Track|New menu on the menu bar. A newly created track is automatically selected for marking.

+ +

2. Marking a track

+

+ +

+

Marking a track refers to the process of defining its position on each frame in the video clip. Point mass tracks are special in that they can be marked either manually or automatically using autotracker. All other tracks must be marked manually using the crosshair cursor (shown above at twice actual size). To mark manually, hold down the shift key and click the mouse on the feature of interest as the video automatically steps through the video clip. Don't skip frames--if you do, velocities and accelerations cannot be determined.

+

When marking point mass and vector tracks, you can hit the enter key instead of clicking the mouse to mark a step at the exact location of the previous step. This can be useful when marking an object at rest.

+

Marking is done in the main video view. For more accurate marking, magnify the image up to 8x using the zoom tool or by right-clicking on the video and choosing the desired zoom level.

+

+ +

+

There is some variability in marking requirements for the various track types. Vector and line profile tracks require dragging rather than clicking. Point mass and vector tracks expect every step to be marked, but offset origin, calibration point pair, line profile and rgb region tracks require marking only a single frame. Center of mass, vector sum, particle model and two-body system tracks are marked automatically.

+

In rare circumstances you may wish to control the marking process in more detail. If you prefer that the video not automatically step forward while marking you can uncheck the Autostep option.

+ +

3. Track buttons and menus

+

+ +

+

Every track has a track button that shows its name, color and footprint, and a track menu with items for setting its properties. Track buttons are displayed on both the toolbar and the track control. Track menus can be accessed by (a) clicking the track button, (b) choosing the track from the Tracks menu on the menu bar, or (c) right-clicking the main video view and choosing the track from the Tracks popup menu.

+ +

4. Track control

+

+ +

+

The track control displays a track button for each user-created track. This makes it easy to select tracks and provides ready access to all track menus.

+

To show the track control, click the track control button on the toolbar.

+ +

5. Selecting a track

+

Tracks can be marked or edited only when they are selected. The track button of the currently selected track is displayed on the lower tier of the toolbar.

+

+ +

+

To select a different track, click its track button on the track control or select one of its steps in the video view.

+

+ + + +

+

To deselect all tracks, double-click the video or background mat.

+ +

6. Cloning, copying and importing tracks

+

Make a duplicate copy of an existing track using the Clone item in the Create menu or the Track|New menu.

+

+ +

+

Copy a track from one tab to another by selecting the track and copying it to the clipboard using the Edit|Copy menu item, then pasting using the Edit|Paste item.

+

Since the tape measure and axes are tracks, they can also be copied. When pasted, they replace the existing tape or axes in the tab. When no track is selected, the entire tracker panel (video clip, coordinate system and tracks) is copied.

+

Tracks can also be imported directly from saved tracker files into an open tab using the File|Import menu item. For more information see tracker files.

+ +

7. Customizing and documenting a track

+

Every track is identified by its name, color, footprint (visible shape) and notes (descriptive comments). Newly created tracks are assigned default values for the first three properties that depend on the type of track. For example, a point mass might initially be named ”mass A” and be drawn as a red diamond.

+

+ Toolbar track name and footprint +

+

A track button showing the name, footprint and color of the track are displayed on the toolbar when the track is selected. To change the default values, click the track button and choose the Name..., Color... or Footprint item from the track menu.

+

+ +

+

To enter notes for a track, open the notes window by clicking the notes button at the right end of the toolbar. or choosing Notes... from the track menu. As you enter information, the field turns yellow to indicate the changes have not yet been saved. To save the notes, click anywhere outside the window. To discard the changes, click the Cancel button.

+

+ +

+ +

8. Controlling visibility

+

Hide a track by turning off the Visible property in its track menu. Or use the trails, labels, paths, positions, velocities and accelerations buttons on the toolbar to toggle the visibility of these features on all tracks.

+ +

9. Selecting and identifying points

+

+ + +

+

To select a point, move the mouse cursor over it in the main video view. The cursor will become a hand pointer and the point will be identified in the bottom right message box. Click to select it. Note: To select a point while marking, release the shift key.

+

When a single point is selected, its track is selected, its editable properties (position, etc) are displayed on the toolbar, and it is identified with a square selection icon.

+

You can also select multiple points (Point Mass positions) for simultaneous dragging or deleting. Select multiple points by (a) control-clicking additional points or (b) right-dragging a box and choosing Select Points from the popup menu. Deselect previously selected points by (a) control-clicking them or (b) right-dragging a box and choosing Deselect Points from the popup menu.

+ +

10. Editing a step

+

To edit a step, select and drag one of its points. A selected point can also be nudged one pixel at a time with the arrow keys on the keyboard. Holding down the shift key increases the nudge distance.

+

Many tracks also provide input fields on the toolbar for setting positions or other properties of the selected step.

+ +

11. Deleting

+

Delete a single or multiple steps by selecting them and hitting the delete key on the keyboard. Delete all steps for a track by choosing the Clear Steps item from its track menu.

+

Delete an entire track by name in the Edit|Delete menu or by choosing the Delete item in its track menu.

+

Clear all tracks in the current tab by choosing the Edit|Clear menu item.

+

+ +

+ +

12. Locking a track

+

Locking a track prevents any changes to its steps. Lock a track by turning on the Locked property in its track menu.

+ + + \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties index e8136371..751d4b0c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.FFMPeg=FFMPeg +PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -729,14 +729,14 @@ PrefsDialog.Upgrades.BorderTitle=Check For Upgrades PrefsDialog.Tab.Runtime.Title=Runtime PrefsDialog.Tab.Display.Title=Display PrefsDialog.Language.Default=default -PrefsDialog.Upgrades.Always=Every Time +PrefsDialog.Upgrades.Always=Daily PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Video.Speed.BorderTitle=Video Playback -PrefsDialog.Video.Slow=Smooth (may be slow) -PrefsDialog.Video.Fast=Fast (may be jerky) +PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback +PrefsDialog.Xuggle.Slow=Smooth (may be slow) +PrefsDialog.Xuggle.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -816,22 +816,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found -Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. -Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.FFMPeg.com/FFMPegr/downloads/. -Tracker.Action.AboutFFMPeg=About FFMPeg... -Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg -Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version -Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: -Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: -Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's preferred video engine, is not yet installed. -Tracker.Dialog.NoFFMPeg.Message2=To install FFMPeg, download the latest Tracker installer from -Tracker.Dialog.NoFFMPeg.Title=Missing FFMPeg -Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can -Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=To install FFMPeg, Tracker's preferred video engine on -Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from -Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine +Tracker.Dialog.NoXuggle.Title=Xuggle not found +Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. +Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutXuggle=About Xuggle... +Tracker.Dialog.AboutXuggle.Title=About Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version +Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: +Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you +Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Title=No Video Engine +Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required +Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from +Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -877,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -Video.MenuItem.SmoothPlay=Smooth Play (may be slow) +XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -906,13 +907,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors +PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.FFMPeg=FFMPeg loading frame +TFrame.Progress.Xuggle=Xuggle loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -925,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1196,7 +1197,7 @@ PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1212,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. -Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine -Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 2.3 by reinstalling Tracker (version 4.85 -Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1281,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color @@ -1303,10 +1304,12 @@ DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + # Additions by Doug Brown 2014-05-09 PageTView.MenuItem.OpenInBrowser=Open Page in Browser TToolbar.Button.Desktop.Menu.OpenPage=Pages TToolbar.Button.Desktop.Menu.OpenFile=Files + # Additions by Doug Brown 2014-10-24 Tracker.Prefs.MenuItem.Text=Preferences File Tracker.Prefs.NotFound=Preferences file not found @@ -1314,6 +1317,7 @@ TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixe TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + # Additions by Doug Brown 2014-12-26 TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found @@ -1350,6 +1354,7 @@ DataTrackTimeControl.Border.Title=Time Basis TActions.Action.DataTrack.Unsupported.JarFile=Jar File TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + # Additions by Doug Brown 2015-04-17 to 2015-05-30 DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? @@ -1358,35 +1363,57 @@ DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file DataTrackTool.Dialog.FileNotFound.Title=File Not Found DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL TActions.Dialog.URLResourceNotFound.Title=Resource Not Found -Compass.Name=Compass -Compass.New.Name=compass -Compass.Label.Radius=radius -Compass.Checkbox.RadialLine=Radial line -Compass.Checkbox.RadialLine.Tooltip=Show or hide the radial line -Compass.Field.Radius.Tooltip=Radius of the best fit circle -Compass.Field.CenterX.Tooltip=x-component of the best fit center -Compass.Field.CenterY.Tooltip=y-component of the best fit center -Compass.Label.MarkPoint=Shift-click to mark at least 3 points -Compass.Hint.MarkMore=shift-click to mark more points if desired -Compass.Hint.Mark3=shift-click to mark at least 3 points along a circle -Compass.Data.Center=center -Compass.Data.Description.0=time -Compass.Data.Description.1=center x-component -Compass.Data.Description.2=center y-component -Compass.Data.Description.3=radius -Compass.Data.Description.4=step number -Compass.Data.Description.5=frame number -Compass.Data.Description.6=radial line angle -Compass.DataPoint.Name=circle point -Compass.DataPoint.Hint=drag to move -Compass.Slider.Name=radial line -Compass.Slider.Hint=drag to rotate -CompassFootprint.Circle4=small points -CompassFootprint.Circle7=large points -CompassFootprint.Circle4Bold=bold small points -CompassFootprint.Circle7Bold=bold large points +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps TActions.Action.SaveVideoAs=Save Video As... TrackerIO.Export.Option.WithVideo=with video TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties index 8f3b15fc..c09b94bc 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties @@ -1252,3 +1252,168 @@ TToolbar.Button.Refresh.Tooltip=\u062a\u062d\u062f\u064a\u062b \u0627\u0644\u062 # Additions by Doug Brown 2013-05-10 CoordAxes.Origin.Label=\u0646\u0642\u0637\u0629 \u0627\u0644\u0628\u062f\u0621 \u0628\u0627\u0644\u0628\u0643\u0633\u0644 CoordAxes.Origin.Field.Tooltip=\u0646\u0642\u0637\u0629 \u0627\u0644\u0628\u062f\u0621 \u062a\u0642\u0627\u0633 \u0645\u0646 \u0627\u0644\u0631\u0643\u0646 \u0627\u0644\u0639\u0644\u0648\u064a \u0627\u0644\u0623\u064a\u0633\u0631 \u0644\u0644\u0641\u064a\u062f\u064a\u0648 + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties index 296c70dc..98817762 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties @@ -1247,3 +1247,172 @@ TrackerIO.Dialog.Open.Title=Otev\u0159\u00edt TToolbar.Button.Refresh.Popup.RefreshNow=Obnoven\u00ed TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-obnoven\u00ed TToolbar.Button.Refresh.Tooltip=Obnovit data and zobrazen\u00ed + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties index 2218698a..0e39fe2d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties @@ -1187,3 +1187,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Skift thumbnail-visning, st ZipResourceDialog.Tooltip.AddFiles=Tilføj HTML- og PDF-filer i ZIP-ressourcen ZipResourceDialog.Tooltip.TrimVideo=Hak af for at eksportere videoklippet, fjern hakket for at benytte den originale video ZipResourceDialog.Tooltip.LoadHTML=Brug en filvælger for at hente en HTML-infofil + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties index 561b1e2d..e029cf12 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties @@ -1335,3 +1335,103 @@ TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixe TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties index c1da3567..6b6b2e40 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties @@ -1231,3 +1231,191 @@ TMenuBar.MenuItem.EditVideoFrames=\u03a6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u0 TMenuBar.Dialog.RequiresMemory.Message1=\u038c\u03bb\u03b5\u03c2 \u03bf\u03b9 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 \u03b8\u03b1 \u03c6\u03bf\u03c1\u03c4\u03c9\u03b8\u03bf\u03cd\u03bd \u03c3\u03c4\u03b7 \u03bc\u03bd\u03ae\u03bc\u03b7 \u03b3\u03b9\u03b1 \u03c4\u03b1\u03c7\u03cd\u03c4\u03b5\u03c1\u03b7 \u03b1\u03c0\u03cc\u03ba\u03c1\u03b9\u03c3\u03b7 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1. TMenuBar.Dialog.RequiresMemory.Message2=\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03bd\u03b1 \u03b5\u03bb\u03ad\u03b3\u03be\u03b5\u03c4\u03b5 \u03c4\u03b7 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03bc\u03bd\u03ae\u03bc\u03b7 \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03c4\u03ce\u03c3\u03c4\u03b5 \u03bc\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b7, \u03b1\u03bd \u03c7\u03c1\u03b5\u03b9\u03ac\u03b6\u03b5\u03c4\u03b1\u03b9. TMenuBar.Dialog.RequiresMemory.Title=\u039c\u03bd\u03ae\u03bc\u03b7 + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=x-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03b5\u03b9\u03ba\u03bf\u03bd\u03bf\u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 +PointMass.Data.Description.PixelY=y-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03b5\u03b9\u03ba\u03bf\u03bd\u03bf\u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 +ExportVideoDialog.Content.DeinterlacedVideo=\u0394\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +ExportVideoDialog.Deinterlace.OddFirst=\u039c\u03bf\u03bd\u03ac \u03c0\u03b5\u03b4\u03af\u03b1 \u03c0\u03c1\u03ce\u03c4\u03b1 +ExportVideoDialog.Deinterlace.EvenFirst=\u0396\u03c5\u03b3\u03ac \u03c0\u03b5\u03b4\u03af\u03b1 \u03c0\u03c1\u03ce\u03c4\u03b1 +ExportVideoDialog.Deinterlace.Dialog.Title=\u03a3\u03b5\u03b9\u03c1\u03ac \u03b4\u03b9\u03b1\u03c7\u03c9\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03c9\u03bd \u03c0\u03b5\u03b4\u03af\u03c9\u03bd +TFrame.Dialog.LibraryError.FileNotFound.Title=\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +TFrame.Dialog.LibraryError.FileNotFound.Message=\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03ae \u03b7 \u03b5\u03cd\u03c1\u03b5\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 +TrackerPanel.DataBuilder.Button.Autoload=\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c0\u03bf\u03c5 \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03bf\u03bd\u03c4\u03b1\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 +TrackerPanel.DataBuilder.Autoload.Title=\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +TrackerPanel.DataBuilder.Autoload.Message=\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7: +TrackerPanel.DataBuilder.Chooser.XMLFiles=\u0391\u03c1\u03c7\u03b5\u03af\u03b1 XML +TrackerIO.Dialog.Open.Title=\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 +TToolbar.Button.Refresh.Popup.RefreshNow=\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 +TToolbar.Button.Refresh.Popup.AutoRefresh=\u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03b1\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 +TToolbar.Button.Refresh.Tooltip=\u0391\u03bd\u03b1\u03bd\u03ad\u03c9\u03c3\u03b7 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03ba\u03b1\u03b9 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ce\u03bd + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=\u0398\u03ad\u03c3\u03b7 \u03b5\u03b9\u03ba\u03bf\u03bd\u03bf\u03c3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03bf\u03c5 \u03c3\u03c4\u03b7\u03bd \u0391\u03c1\u03c7\u03ae +CoordAxes.Origin.Field.Tooltip=\u03b8\u03ad\u03c3\u03b7 \u03c4\u03b7\u03c2 \u0391\u03c1\u03c7\u03ae\u03c2, \u03bc\u03b5\u03c4\u03c1\u03b7\u03bc\u03ad\u03bd\u03b7 \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c0\u03ac\u03bd\u03c9 \u03b1\u03c1\u03b9\u03c3\u03c4\u03b5\u03c1\u03ae \u03b3\u03c9\u03bd\u03af\u03b1 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c3\u03b7\u03bc\u03b5\u03af\u03c9\u03bd +MainTView.Popup.MenuItem.Deselect=\u0391\u03c0\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c3\u03b7\u03bc\u03b5\u03af\u03c9\u03bd +ZipResourceDialog.Checkbox.PreviewThumbnail=\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03c3\u03ba\u03cc\u03c0\u03b7\u03c3\u03b7 +ZipResourceDialog.Dialog.BadFileName.Message=\u03a4\u03b1 \u03bf\u03bd\u03cc\u03bc\u03b1\u03c4\u03b1 \u03c4\u03c9\u03bd \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03c0\u03b5\u03c1\u03b9\u03bb\u03b1\u03bc\u03b2\u03ac\u03bd\u03bf\u03c5\u03bd \u03c4\u03bf\u03c5\u03c2 \u03c0\u03b9\u03bf \u03ba\u03ac\u03c4\u03c9 \u03c7\u03b1\u03c1\u03b1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2: +ZipResourceDialog.Dialog.BadFileName.Title=\u039c\u03b7 \u03b5\u03c0\u03b9\u03c4\u03c1\u03b5\u03c0\u03c4\u03cc \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 +ZipResourceDialog.Dialog.ExportFailed.Message=\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf ZIP \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03be\u03b1\u03c7\u03b8\u03b5\u03af. +ZipResourceDialog.Dialog.ExportFailed.Title=\u0397 \u03b5\u03be\u03b1\u03b3\u03c9\u03b3\u03ae \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 +PrefsDialog.Button.SetCache=\u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03ba\u03c1\u03c5\u03c6\u03ae\u03c2 \u03bc\u03bd\u03ae\u03bc\u03b7\u03c2 (Cache) + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2 +Tracker.StartLog.NotFound=\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +Tracker.Dialog.MemoryReduced.Title=\u0397 \u03c0\u03c1\u03bf\u03c4\u03b9\u03bc\u03b7\u03c4\u03ad\u03b1 \u039c\u03bd\u03ae\u03bc\u03b7 \u03b5\u03bb\u03b1\u03c4\u03c4\u03ce\u03b8\u03b7\u03ba\u03b5 +Tracker.Dialog.MemoryReduced.Message1=\u03a4\u03bf Tracker \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03ba\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9 \u03bc\u03b5 \u03bc\u03bd\u03ae\u03bc\u03b7 +Tracker.Dialog.MemoryReduced.Message2=\u03ad\u03c4\u03c3\u03b9 \u03b7 \u03c0\u03c1\u03bf\u03c4\u03b9\u03bc\u03b7\u03c4\u03ad\u03b1 \u03bc\u03bd\u03ae\u03bc\u03b7 \u03b5\u03bb\u03b1\u03c4\u03c4\u03ce\u03b8\u03b7\u03ba\u03b5 \u03c3\u03c4\u03b1 +Tracker.Dialog.MemoryReduced.Message3=\u0393\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03b4\u03b5\u03af\u03c4\u03b5 \u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1|\u0394\u03b9\u03b1\u03b3\u03bd\u03c9\u03c3\u03c4\u03b9\u03ba\u03ac|\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03ba\u03b1\u03c4\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae\u03c2 \u03ad\u03bd\u03b1\u03c1\u03be\u03b7\u03c2... +TrackPlottingPanel.Popup.MenuItem.ShowZero=\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae +TableTrackView.Menu.TextColumn.Text=\u03a3\u03c4\u03ae\u03bb\u03b5\u03c2 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 +TableTrackView.Menu.TextColumn.Tooltip=\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03c4\u03c9\u03bd \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03ac\u03c3\u03b9\u03bc\u03c9\u03bd \u03c3\u03c4\u03b7\u03bb\u03ce\u03bd \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 +TableTrackView.Action.CreateTextColumn.Text=\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03af\u03b1... +TableTrackView.Action.DeleteTextColumn.Text=\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae +TableTrackView.Action.RenameTextColumn.Text=\u039c\u03b5\u03c4\u03bf\u03bd\u03bf\u03bc\u03b1\u03c3\u03af\u03b1 +TableTrackView.Dialog.NameColumn.Message=\u03a0\u03b1\u03c1\u03b1\u03ba\u03b1\u03bb\u03ce \u03b5\u03b9\u03c3\u03b1\u03b3\u03ac\u03b3\u03b5\u03c4\u03b5 \u03ad\u03bd\u03b1 \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03b7 \u03c3\u03c4\u03ae\u03bb\u03b7. +TableTrackView.Dialog.NameColumn.TryAgain=\u0391\u03c5\u03c4\u03cc \u03c4\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03ae\u03b4\u03b7 \u03c3\u03b5 \u03c7\u03c1\u03ae\u03c3\u03b7. +TableTrackView.Dialog.NameColumn.Title=\u03a3\u03c4\u03ae\u03bb\u03b7 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 +TToolBar.MenuItem.StretchOff=\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 Xuggle +PrefsDialog.Checkbox.WarnCopyFailed=\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03bc\u03b7\u03c7\u03b1\u03bd\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +Tracker.Dialog.FailedToCopy.Title=\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 +Velocity.Dialog.Color.Title=\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 +Acceleration.Dialog.Color.Title=\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b9\u03c4\u03ac\u03c7\u03c5\u03bd\u03c3\u03b7 +TMenuBar.Menu.FontSize=\u0395\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2 +TMenuBar.MenuItem.DefaultFontSize=\u03a0\u03c1\u03bf\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf +PrefsDialog.FontSize.BorderTitle=\u0395\u03c0\u03af\u03c0\u03b5\u03b4\u03bf \u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03bf\u03c3\u03b5\u03b9\u03c1\u03ac\u03c2 +TrackerPanel.Label.Booster=\u0395\u03bd\u03b1\u03c1\u03ba\u03c4\u03ae\u03c1\u03b1\u03c2 +TrackerPanel.Booster.None=(\u03ba\u03b1\u03bd\u03ad\u03bd\u03b1\u03c2) +TrackerPanel.Dropdown.Booster.Tooltip=\u03a4\u03bf \u03c5\u03bb\u03b9\u03ba\u03cc \u03c3\u03b7\u03bc\u03b5\u03af\u03bf \u03c0\u03bf\u03c5 \u03bf\u03c1\u03af\u03b6\u03b5\u03b9 \u03c4\u03b9\u03c2 \u03b1\u03c1\u03c7\u03b9\u03ba\u03ad\u03c2 \u03c3\u03c5\u03bd\u03b8\u03ae\u03ba\u03b5\u03c2 \u03c4\u03bf\u03c5 \u03bc\u03bf\u03bd\u03c4\u03ad\u03bb\u03bf\u03c5 +CoordAxes.Checkbox.Grid=\u03a0\u03bb\u03ad\u03b3\u03bc\u03b1 +CoordAxes.Checkbox.Grid.Tooltip=\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03c4\u03bf\u03c5 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 +CoordAxes.Button.Grid.Tooltip=\u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03ba\u03b1\u03b9 \u03b2\u03b1\u03b8\u03bc\u03bf\u03cd \u03b1\u03b4\u03b9\u03b1\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03c4\u03bf\u03c5 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 +CoordAxes.Dialog.GridColor.Title=\u0395\u03c0\u03b9\u03bb\u03cc\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 +CoordAxes.MenuItem.GridColor=\u03a7\u03c1\u03ce\u03bc\u03b1 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2... +CoordAxes.MenuItem.GridOpacity=\u0392\u03b1\u03b8\u03bc\u03cc\u03c2 \u03b1\u03b4\u03b9\u03b1\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2... +CoordAxes.Dialog.GridOpacity.Title=\u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03b1\u03b4\u03b9\u03b1\u03c6\u03ac\u03bd\u03b5\u03b9\u03b1\u03c2 \u03c0\u03bb\u03ad\u03b3\u03bc\u03b1\u03c4\u03bf\u03c2 +DynamicSystem.Dialog.RemoveBooster.Title=\u0391\u03bd\u03c4\u03af\u03b8\u03b5\u03c3\u03b7 \u03bc\u03b5 \u0395\u03bd\u03b1\u03c1\u03ba\u03c4\u03ae\u03c1\u03b1 +DynamicSystem.Dialog.RemoveBooster.Message1=\u03a4\u03b1 \u03c3\u03c9\u03bc\u03b1\u03c4\u03af\u03b4\u03b9\u03b1 \u03c3\u03b5 \u03ad\u03bd\u03b1 \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03b1\u03c0\u03bf\u03c4\u03b5\u03bb\u03bf\u03cd\u03bd \u03ba\u03b1\u03b9 \u0395\u03bd\u03b1\u03c1\u03ba\u03c4\u03ae\u03c1\u03b5\u03c2 \u03c4\u03bf \u03ad\u03bd\u03b1 \u03b3\u03b9\u03b1 \u03c4\u03bf \u03ac\u03bb\u03bb\u03bf. +DynamicSystem.Dialog.RemoveBooster.Message2=\u039f \u0395\u03bd\u03b1\u03c1\u03ba\u03c4\u03ae\u03c1\u03b1\u03c2 \u03c0\u03bf\u03c5 \u03b2\u03c1\u03af\u03c3\u03ba\u03b5\u03c4\u03b1\u03b9 \u03c3\u03b5 \u03b1\u03bd\u03c4\u03af\u03b8\u03b5\u03c3\u03b7 \u03b8\u03b1 \u03bc\u03b5\u03c4\u03b1\u03ba\u03b9\u03bd\u03b7\u03b8\u03b5\u03af \u03b1\u03c0\u03cc +DynamicSystem.Dialog.RemoveBooster.Message3=\u03c0\u03c1\u03b9\u03bd \u03c4\u03b7\u03bd \u03c4\u03c1\u03bf\u03c0\u03bf\u03c0\u03bf\u03af\u03b7\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03a3\u03b5\u03bb\u03af\u03b4\u03b1\u03c2 \u03c3\u03c4\u03bf\u03bd \u03a0\u03b5\u03c1\u03b9\u03b7\u03b3\u03b7\u03c4\u03ae +TToolbar.Button.Desktop.Menu.OpenPage=\u03a3\u03b5\u03bb\u03af\u03b4\u03b5\u03c2 +TToolbar.Button.Desktop.Menu.OpenFile=\u0391\u03c1\u03c7\u03b5\u03af\u03b1 + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03c9\u03bd +Tracker.Prefs.NotFound=\u03a4\u03bf \u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03c9\u03bd \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +TapeMeasure.Alert.UnfixScale.Message1=\u0397 \u03ba\u03bb\u03af\u03bc\u03b1\u03ba\u03b1 \u03c4\u03bf\u03c5 \u03c3\u03c5\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 \u03c3\u03c5\u03bd\u03c4\u03b5\u03c4\u03b1\u03b3\u03bc\u03ad\u03bd\u03c9\u03bd \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03bb\u03b5\u03c5\u03b8\u03b5\u03c1\u03c9\u03b8\u03b5\u03af \u03b3\u03b9\u03b1 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c4\u03c9\u03bd \u03ac\u03ba\u03c1\u03c9\u03bd. +TapeMeasure.Alert.UnfixScale.Message2=\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03b7\u03bd \u03b5\u03bb\u03b5\u03c5\u03b8\u03b5\u03c1\u03ce\u03c3\u03b5\u03c4\u03b5 \u03c4\u03ce\u03c1\u03b1; +TapeMeasure.Alert.UnfixScale.Title=\u0397 \u03ba\u03bb\u03af\u03bc\u03b1\u03ba\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c4\u03b1\u03b8\u03b5\u03c1\u03bf\u03c0\u03bf\u03b9\u03b7\u03bc\u03ad\u03bd\u03b7 +Tracker.Dialog.StarterWarning.Title=\u039c\u03b7 \u03ba\u03b1\u03bd\u03bf\u03bd\u03b9\u03ba\u03cc\u03c2 \u0395\u03bd\u03b1\u03c1\u03ba\u03c4\u03ae\u03c1\u03b1\u03c2 + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b3\u03b9\u03b1 \u03c4\u03bf\u03bd \u03c4\u03cd\u03c0\u03bf \u03c4\u03c1\u03bf\u03c7\u03b9\u03ac\u03c2 +TrackDataBuilder.Dialog.NoFunctionsFound.Title=\u039f\u03b9 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd +TrackDataBuilder.Instructions.SelectToAutoload=\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b1\u03c0\u03cc \u03c4\u03b7\u03bd \u03c0\u03b9\u03bf \u03ba\u03ac\u03c4\u03c9 \u03bb\u03af\u03c3\u03c4\u03b1 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7. +TrackDataBuilder.Instructions.WhereDefined=\u039f\u03b9 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03ad\u03c7\u03bf\u03c5\u03bd \u03bf\u03c1\u03b9\u03c3\u03b8\u03b5\u03af \u03c3\u03c4\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03b1 XML \u03c4\u03bf\u03c5 \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03bf\u03cd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03c0\u03bf\u03c5 \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03c3\u03c4\u03b9\u03c2 \u03b4\u03b9\u03b5\u03c5\u03b8\u03cd\u03bd\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bf\u03c5 \u03c6\u03b1\u03af\u03bd\u03bf\u03bd\u03c4\u03b1\u03b9. +TrackDataBuilder.Instructions.HowToAddFunction=\u0393\u03b9\u03b1 \u03c0\u03c1\u03bf\u03c3\u03b8\u03ae\u03ba\u03b7 \u03bd\u03ad\u03b1\u03c2 \u03c3\u03c5\u03bd\u03ac\u03c1\u03c4\u03b7\u03c3\u03b7\u03c2, \u03b4\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03b5\u03af\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c3\u03c4\u03bf\u03bd \u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03cc \u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd, \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c3\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c3\u03b5 \u03ad\u03bd\u03b1 \u03b1\u03c1\u03c7\u03b5\u03af\u03bf XML, \u03ba\u03b1\u03b9 \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03b1\u03c0\u03cc \u03c4\u03b9\u03c2 \u03b4\u03b9\u03b5\u03c5\u03b8\u03cd\u03bd\u03c3\u03b5\u03b9\u03c2. +TrackDataBuilder.Instructions.HowToAddDirectory=\u0393\u03b9\u03b1 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c4\u03c9\u03bd \u03b4\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ce\u03bd \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1\u03c2 \u03bd\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03c0\u03bb\u03ae\u03ba\u03c4\u03c1\u03bf \u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ad\u03c2 \u03ad\u03c1\u03b5\u03c5\u03bd\u03b1\u03c2. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=\u039c\u03b5\u03c1\u03b9\u03ba\u03ad\u03c2 \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c0\u03bf\u03c5 \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03bf\u03bd\u03c4\u03b1\u03b9 \u03b1\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03c5\u03bc\u03ad\u03bd\u03b5\u03c2 \u03c3\u03b5 \u03c0\u03b9\u03bf \u03c0\u03b1\u03bb\u03b9\u03ac \u03bc\u03bf\u03c1\u03c6\u03ae. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c4\u03b9\u03c2 \u03bc\u03b5\u03c4\u03b1\u03c4\u03c1\u03ad\u03c8\u03b5\u03c4\u03b5 \u03c3\u03c4\u03b7 \u03bd\u03ad\u03b1 \u03c6\u03bf\u03c1\u03b7\u03c4\u03ae \u03bc\u03bf\u03c1\u03c6\u03ae; +TrackDataBuilder.Dialog.ConvertAutoload.Message3=\u03a3\u03b7\u03bc\u03b5\u03af\u03c9\u03c3\u03b7: \u03b7 \u03bd\u03ad\u03b1 \u03bc\u03bf\u03c1\u03c6\u03ae \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03bd\u03b1\u03b3\u03bd\u03ce\u03c3\u03b9\u03bc\u03b7 \u03b1\u03c0\u03cc \u03c0\u03b9\u03bf \u03c0\u03b1\u03bb\u03b9\u03ad\u03c2 \u03b5\u03ba\u03b4\u03cc\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=\u039c\u03b5\u03c4\u03b1\u03c4\u03c1\u03bf\u03c0\u03ae \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u0391\u03c5\u03c4\u03cc\u03bc\u03b1\u03c4\u03b7\u03c2 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7\u03c2; +TrackDataBuilder.MenuItem.SaveAll.Text=\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd +TrackDataBuilder.MenuItem.SaveAll.Tooltip=\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03c3\u03b5 \u03bc\u03b9\u03b1 \u03c6\u03bf\u03c1\u03b7\u03c4\u03ae, \u03b1\u03c5\u03c4\u03bf\u03c6\u03bf\u03c1\u03c4\u03ce\u03c3\u03b9\u03bc\u03b7 \u03bc\u03bf\u03c1\u03c6\u03ae (\u03bc\u03b7 \u03b1\u03bd\u03b1\u03b3\u03bd\u03ce\u03c3\u03b9\u03bc\u03b7 \u03b1\u03c0\u03cc \u03c0\u03b1\u03bb\u03b1\u03b9\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03b5\u03ba\u03b4\u03cc\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03bc\u03cc\u03bd\u03bf +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b5\u03c0\u03b9\u03bb\u03b5\u03c7\u03b8\u03ad\u03bd\u03c4\u03c9\u03bd \u03c3\u03c5\u03bd\u03b1\u03c1\u03c4\u03ae\u03c3\u03b5\u03c9\u03bd \u03c4\u03c1\u03bf\u03c7\u03b9\u03ce\u03bd \u03c3\u03b5 \u03bc\u03bf\u03c1\u03c6\u03ae \u03b1\u03bd\u03b1\u03b3\u03bd\u03ce\u03c3\u03b9\u03bc\u03b7 \u03b1\u03c0\u03cc \u03cc\u03bb\u03b5\u03c2 \u03c4\u03b9\u03c2 \u03b5\u03ba\u03b4\u03cc\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 Tracker (\u03bc\u03b7 \u03b1\u03c5\u03c4\u03bf\u03c6\u03bf\u03c1\u03c4\u03ce\u03c3\u03b9\u03bc\u03b7) +ParticleDataTrack.Name=\u03a4\u03c1\u03bf\u03c7\u03b9\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +ParticleDataTrack.Builder.Title=\u03a4\u03c1\u03bf\u03c7\u03b9\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +ParticleDataTrack.New.Name=\u03c4\u03c1\u03bf\u03c7\u03b9\u03ac \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +TActions.Action.ImportData=\u03a0\u03b7\u03b3\u03ae \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd... +TrackerIO.TextFileFilter.Description=\u0391\u03c1\u03c7\u03b5\u03af\u03b1 \u03ba\u03b5\u03b9\u03bc\u03ad\u03bd\u03bf\u03c5 (.txt) +TrackerIO.JarFileFilter.Description=\u0391\u03c1\u03c7\u03b5\u03af\u03b1 Jar (.jar) +TrackerIO.Dialog.OpenData.Title=\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03a0\u03b7\u03b3\u03ae\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +DataTrackClipControl.Label.Data=\u0394\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +DataTrackClipControl.Label.Video=\u0392\u03af\u03bd\u03c4\u03b5\u03bf +DataTrackClipControl.Border.Title=\u03a4\u03bc\u03ae\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +DataTrackClipControl.Label.VideoStart=\u0391\u03c1\u03c7\u03b9\u03ba\u03cc \u03ba\u03b1\u03c1\u03ad +DataTrackClipControl.Label.FrameCount=\u0391\u03c1\u03af\u03b8\u03bc\u03b7\u03c3\u03b7 \u03ba\u03b1\u03c1\u03ad +DataTrackClipControl.Label.DataStart=\u0391\u03c1\u03c7\u03ae \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +DataTrackClipControl.Label.Stride=\u0392\u03ae\u03bc\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +ParticleDataTrackFunctionPanel.Border.Title=\u0388\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03a0\u03b7\u03b3\u03ae\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +DataTrackTimeControl.Button.Video=\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +DataTrackTimeControl.Button.Data=\u03a7\u03c1\u03cc\u03bd\u03bf\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +DataTrackTimeControl.Border.Title=\u0392\u03ac\u03c3\u03b7 \u03c7\u03c1\u03cc\u03bd\u03bf\u03c5 +TActions.Action.DataTrack.Unsupported.JarFile=\u03a4\u03bf \u0391\u03c1\u03c7\u03b5\u03af\u03bf Jar +TActions.Action.DataTrack.Unsupported.Message=\u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03c3\u03c4\u03b5\u03af\u03bb\u03b5\u03b9 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c3\u03c4\u03bf Tracker +TActions.Action.DataTrack.Unsupported.Title=\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03a0\u03b7\u03b3\u03ae \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +DataTrackTool.Dialog.VideoNotFound.Message2=\u0398\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03c8\u03ac\u03be\u03b5\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03b1\u03c5\u03c4\u03cc; +DataTrackTool.Dialog.VideoNotFound.Title=\u03a4\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +DataTrackTool.Dialog.FileNotFound.Message1=\u0394\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b2\u03c1\u03b5\u03b8\u03b5\u03af \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf +DataTrackTool.Dialog.FileNotFound.Title=\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +DataTrackTool.Dialog.InvalidTRK.Message=\u03a4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03bd\u03b1 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf TRK +DataTrackTool.Dialog.InvalidTRK.Title=\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf +DataTrackTool.Dialog.InvalidData.Message=\u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b4\u03b5\u03bd \u03c0\u03b5\u03c1\u03b9\u03ad\u03c7\u03bf\u03c5\u03bd \u03c4\u03b9\u03c2 \u03b8\u03ad\u03c3\u03b5\u03b9\u03c2 (x, y) +DataTrackTool.Dialog.InvalidData.Title=\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +ParticleDataTrack.Dialog.NoNewData.Message=\u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03c0\u03bf\u03c5 \u03c3\u03c4\u03ac\u03bb\u03b8\u03b7\u03ba\u03b1\u03bd \u03b4\u03b5\u03bd \u03b5\u03c0\u03b5\u03ba\u03c4\u03b5\u03af\u03bd\u03bf\u03c5\u03bd \u03c4\u03b1 \u03c5\u03c6\u03b9\u03c3\u03c4\u03ac\u03bc\u03b5\u03bd\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +ParticleDataTrack.Dialog.NoNewData.Title=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03bf\u03c5\u03bd \u03bd\u03ad\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +ParticleDataTrackFunctionPanel.Instructions.General=\u039d\u03b1 \u03ba\u03ac\u03bd\u03b5\u03c4\u03b5 \u03b4\u03b9\u03c0\u03bb\u03cc \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf\u03bd \u03b1\u03c1\u03c7\u03b9\u03ba\u03cc \u03c7\u03c1\u03cc\u03bd\u03bf \u03b3\u03b9\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03ae \u03bd\u03b1 \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03c5\u03c2 \u03bc\u03b5\u03c4\u03c1\u03b7\u03c4\u03ad\u03c2 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03ba\u03b1\u03b9 \u03c4\u03c9\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd. +TrackerPanel.Dialog.NoData.Message=\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b1\u03bd \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +TrackerPanel.Dialog.NoData.Title=\u03a7\u03c9\u03c1\u03af\u03c2 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 +TrackerPanel.Dialog.Exception.Message=\u03a4\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03b1 \u03b4\u03b5\u03bd \u03bc\u03c0\u03bf\u03c1\u03bf\u03cd\u03bd \u03bd\u03b1 \u03b5\u03b9\u03c3\u03b1\u03c7\u03b8\u03bf\u03cd\u03bd \u03b5\u03c0\u03b5\u03b9\u03b4\u03ae \u03b7 \u03b1\u03ba\u03cc\u03bb\u03bf\u03c5\u03b8\u03b7 \u03b1\u03bd\u03c4\u03af\u03b8\u03b5\u03c3\u03b7 \u03b5\u03bc\u03c6\u03b1\u03bd\u03af\u03c3\u03c4\u03b7\u03ba\u03b5 +TrackerPanel.Dialog.Exception.Title=\u0397 \u03b5\u03b9\u03c3\u03b1\u03b3\u03c9\u03b3\u03ae \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd \u03b1\u03c0\u03ad\u03c4\u03c5\u03c7\u03b5 +TActions.Dialog.URLResourceNotFound.Message=\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c5\u03bb\u03b9\u03ba\u03cc \u03c3\u03c4\u03bf URL +TActions.Dialog.URLResourceNotFound.Title=\u0394\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 \u03c5\u03bb\u03b9\u03ba\u03cc +CircleFitter.Name=\u03a0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ad\u03b1\u03c2 \u03ba\u03cd\u03ba\u03bb\u03bf\u03c5 +CircleFitter.New.Name=\u03ba\u03cd\u03ba\u03bb\u03bf\u03c2 +CircleFitter.Label.Radius=\u03b1\u03ba\u03c4\u03af\u03bd\u03b1 +CircleFitter.Checkbox.RadialLine=\u0391\u03ba\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae +CircleFitter.Checkbox.RadialLine.Tooltip=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03ae \u03b1\u03c0\u03cc\u03ba\u03c1\u03c5\u03c8\u03b7 \u03c4\u03b7\u03c2 \u03b1\u03ba\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 +CircleFitter.Field.Radius.Tooltip=\u0391\u03ba\u03c4\u03af\u03bd\u03b1 \u03ba\u03cd\u03ba\u03bb\u03bf\u03c5 \u03bc\u03b5 \u03c4\u03b7 \u03b2\u03ad\u03bb\u03c4\u03b9\u03c3\u03c4\u03b7 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae +CircleFitter.Field.CenterX.Tooltip=x-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03ad\u03bd\u03c4\u03c1\u03bf\u03c5 \u03c4\u03b7\u03c2 \u03b2\u03ad\u03bb\u03c4\u03b9\u03c3\u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae\u03c2 +CircleFitter.Field.CenterY.Tooltip=y-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03ad\u03bd\u03c4\u03c1\u03bf\u03c5 \u03c4\u03b7\u03c2 \u03b2\u03ad\u03bb\u03c4\u03b9\u03c3\u03c4\u03b7\u03c2 \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae\u03c2 +CircleFitter.Label.MarkPoint=\u0393\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03bf\u03b3\u03ae \u03b5\u03bd\u03cc\u03c2 \u03ba\u03cd\u03ba\u03bb\u03bf\u03c5 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bd\u03c4\u03b1\u03b9 3 \u03ae \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd +CircleFitter.Hint.MarkMore=\u0391\u03bd \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03bc\u03b1\u03c1\u03ba\u03ac\u03c1\u03b5\u03c4\u03b5 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 \u03c0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 shift-\u03ba\u03bb\u03b9\u03ba +CircleFitter.Hint.Mark3=\u03a0\u03b1\u03c4\u03ae\u03c3\u03c4\u03b5 shift-\u03ba\u03bb\u03b9\u03ba \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03bc\u03b1\u03c1\u03ba\u03ac\u03c1\u03b5\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 +CircleFitter.Data.Center=\u03ba\u03ad\u03bd\u03c4\u03c1\u03bf +CircleFitter.Data.Description.0=\u03c7\u03c1\u03cc\u03bd\u03bf\u03c2 +CircleFitter.Data.Description.1=x-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03ad\u03bd\u03c4\u03c1\u03bf\u03c5 +CircleFitter.Data.Description.2=y-\u03c3\u03c5\u03bd\u03b9\u03c3\u03c4\u03ce\u03c3\u03b1 \u03c4\u03bf\u03c5 \u03ba\u03ad\u03bd\u03c4\u03c1\u03bf\u03c5 +CircleFitter.Data.Description.3=\u03b1\u03ba\u03c4\u03af\u03bd\u03b1 +CircleFitter.Data.Description.4=\u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03b2\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2 +CircleFitter.Data.Description.5=\u03b1\u03c1\u03b9\u03b8\u03bc\u03cc\u03c2 \u03ba\u03b1\u03c1\u03ad +CircleFitter.Data.Description.6=\u03b3\u03c9\u03bd\u03af\u03b1 \u03b1\u03ba\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae\u03c2 \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae\u03c2 +CircleFitter.DataPoint.Name=\u03c3\u03b7\u03bc\u03b5\u03af\u03bf \u03c0\u03b5\u03c1\u03b9\u03bc\u03ad\u03c4\u03c1\u03bf\u03c5 +CircleFitter.DataPoint.Hint=\u03c3\u03cd\u03c1\u03b5\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03bc\u03b5\u03c4\u03b1\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03c4\u03b5 +CircleFitter.Slider.Name=\u03b1\u03ba\u03c4\u03b9\u03bd\u03b9\u03ba\u03ae \u03b3\u03c1\u03b1\u03bc\u03bc\u03ae +CircleFitter.Slider.Hint=\u03c3\u03cd\u03c1\u03b5\u03c4\u03b5 \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c4\u03c1\u03ad\u03c8\u03b5\u03c4\u03b5 +CircleFitterFootprint.Circle4=\u03bc\u03b9\u03ba\u03c1\u03ac \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 +CircleFitterFootprint.Circle7=\u03bc\u03b5\u03b3\u03ac\u03bb\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 +CircleFitterFootprint.Circle4Bold=\u03ad\u03bd\u03c4\u03bf\u03bd\u03b1 \u03bc\u03b9\u03ba\u03c1\u03ac \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 +CircleFitterFootprint.Circle7Bold=\u03ad\u03bd\u03c4\u03bf\u03bd\u03b1 \u03bc\u03b5\u03b3\u03ac\u03bb\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 +CircleFitter.MenuItem.OriginToCenter=\u039c\u03b5\u03c4\u03b1\u03ba\u03af\u03bd\u03b7\u03c3\u03b7 \u0391\u03c1\u03c7\u03ae\u03c2 \u03c3\u03c4\u03bf \u039a\u03ad\u03bd\u03c4\u03c1\u03bf +CircleFitter.MenuItem.Inspector=\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03c4\u03c9\u03bd \u03b2\u03b7\u03bc\u03ac\u03c4\u03c9\u03bd \u03c4\u03bf\u03c5 \u03a5\u03bb\u03b9\u03ba\u03bf\u03cd \u03a3\u03b7\u03bc\u03b5\u03af\u03bf\u03c5... +CircleFitter.MenuItem.ClearPoints=\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03c3\u03b7\u03bc\u03b5\u03af\u03c9\u03bd +CircleFitter.MenuItem.DeletePoint=\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae \u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf\u03c5 \u03c3\u03b7\u03bc\u03b5\u03af\u03bf\u03c5 +CircleFitter.Inspector.Instructions1=\u0391\u03c5\u03c4\u03cc \u03c0\u03c1\u03bf\u03c3\u03b1\u03c1\u03bc\u03cc\u03b6\u03b5\u03b9 \u03c4\u03bf\u03bd \u03ba\u03cd\u03ba\u03bb\u03bf \u03c3\u03b5 3 \u03ae \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 \u03b4\u03b5\u03b4\u03bf\u03bc\u03ad\u03bd\u03c9\u03bd. +CircleFitter.Inspector.Instructions2=\u039c\u03c0\u03bf\u03c1\u03b5\u03af\u03c4\u03b5 \u03bd\u03b1 \u03bc\u03b1\u03c1\u03ba\u03ac\u03c1\u03b5\u03c4\u03b5 \u03c4\u03b1 \u03c3\u03b7\u03bc\u03b5\u03af\u03b1 \u03c7\u03b5\u03b9\u03c1\u03bf\u03ba\u03af\u03bd\u03b7\u03c4\u03b1 \u03ae \u03bd\u03b1 \u03c4\u03b1 \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c8\u03b5\u03c4\u03b5 \u03b1\u03c0\u03cc \u03ad\u03bd\u03b1 \u03a5\u03bb\u03b9\u03ba\u03cc \u03a3\u03b7\u03bc\u03b5\u03af\u03bf. +CircleFitter.Inspector.Label.SourceTrack=\u03a0\u03b7\u03b3\u03ae-\u03a4\u03c1\u03bf\u03c7\u03b9\u03ac +CircleFitter.Inspector.Label.From=\u0392\u03ae\u03bc\u03b1\u03c4\u03b1 +CircleFitter.Inspector.Label.To=\u03bc\u03ad\u03c7\u03c1\u03b9 +CircleFitter.Inspector.Dropdown.None=\u039a\u03b1\u03bc\u03b9\u03ac +CircleFitter.Inspector.Button.Apply=\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b2\u03b7\u03bc\u03ac\u03c4\u03c9\u03bd +TActions.Action.SaveVideoAs=\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03c9\u03c2... +TrackerIO.Export.Option.WithVideo=\u03bc\u03b5 \u03c4\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +TrackerIO.Export.Option.WithoutVideo=\u03c7\u03c9\u03c1\u03af\u03c2 \u03c4\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +ParticleModel.MenuItem.UseDefaultReferenceFrame=\u03a0\u03ac\u03bd\u03c4\u03bf\u03c4\u03b5 \u03c3\u03b5 \u03c3\u03c7\u03ad\u03c3\u03b7 \u03bc\u03b5 \u03c4\u03bf \u03c0\u03c1\u03bf\u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03bf \u03c3\u03cd\u03c3\u03c4\u03b7\u03bc\u03b1 \u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac\u03c2 +TFrame.NotesDialog.Checkbox.ShowByDefault=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c3\u03b7\u03bc\u03b5\u03b9\u03ce\u03c3\u03b5\u03c9\u03bd \u03c9\u03c2 \u03c0\u03c1\u03bf\u03ba\u03b1\u03b8\u03bf\u03c1\u03b9\u03c3\u03bc\u03ad\u03bd\u03b7 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties index 4c4dd243..a18294d1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties @@ -1184,3 +1184,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or f ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties index d51e020b..0929378b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties @@ -1255,3 +1255,164 @@ CoordAxes.Origin.Field.Tooltip=origon paikka mitatuna videon yl # Additions by Doug Brown 2013-08-24 MainTView.Popup.MenuItem.Select=Valitse Pisteet MainTView.Popup.MenuItem.Deselect=Vapauta Pisteet +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties index 3493dfb9..f55c9c68 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties @@ -1197,3 +1197,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Modifier la miniature, ses dimension ZipResourceDialog.Tooltip.AddFiles=Ajouter les informations HTML et PDF à la ressource ZIP ZipResourceDialog.Tooltip.TrimVideo=Cocher pour exporter le clip vidéo, décocher afin d'utiliser la vidéo originale ZipResourceDialog.Tooltip.LoadHTML=Utiliser un navigateur de fichiers pour charger le HTML dans un fichier + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties index 882fc366..03a8d8b3 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties @@ -164,7 +164,7 @@ Tracker.Cursor.Crosshair.Description=Krusor salib untuk menandai titik Tracker.Action.AboutTracker=Perihal Tracker Tracker.Dialog.AboutTracker.Title=Tracker Tracker.Dialog.AboutTracker.Copyright=Alih Bahasa Tampilan Tracker oleh Wachid Qomaruddin, atas ijin Douglas Brown -Tracker.Dialog.AboutTracker.URL=http://www.cabrillo.edu/~dbrown/tracker/ +Tracker.Dialog.AboutTracker.URL=http://physlets.org/tracker/ Tracker.Action.AboutJava=Perihal JAVA VM Tracker.Dialog.AboutTrackerOSPorg=Open Source Physics (OSP) Project Tracker.Dialog.AboutTrackerOSPurl=http://www.opensourcephysics.org/ @@ -186,9 +186,9 @@ Tracker.Dialog.UpdateQT.Message1=Ditemukan Versi terbaru QuickTime.zip, silakan Tracker.Dialog.UpdateQT.Message2=Anda ingin memperbaharui berkas keluaran? Tracker.Dialog.CopyQT.Title=Salin QTJava.zip Tracker.Dialog.CopyQT.Message1=QuickTime telah terinstal, tetapi sebelum menggunakan Tracker dan anda harus : -Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip harus anda salin dari -Tracker.Dialog.CopyQT.Message3= ke -Tracker.Dialog.CopyQT.Message4= 2. Tracker harus direstart ulang. +Tracker.Dialog.CopyQT.Message2= 1. QTJava.zip harus anda salin dari +Tracker.Dialog.CopyQT.Message3= ke +Tracker.Dialog.CopyQT.Message4= 2. Tracker harus direstart ulang. Tracker.Dialog.CopyQT.Message5=Ada ingin menyalin QTJava.zip sekarang? Tracker.Dialog.CopyFailed.Title=Penyalinan gagal. Periksa versi QuickTime anda. Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Periksa QuickTime anda sekali lagi atau gunakan iTunes v7. Silakan download di http://www.apple.com/quicktime/download/ @@ -666,608 +666,773 @@ Tracker.Dialog.OutOfMemory.Message2=Klik tombol memori untuk opsi. Tracker.Dialog.OutOfMemory.Title=Diluar Memori # Additions by Doug Brown 2010-12-27 -AutoTracker.Wizard.Checkbox.LookAhead = Lihat dari Atas -AutoTracker.Label.Original = Kunci Frame -AutoTracker.Label.NoMask = non -AutoTracker.Label.Rate = Penilaian: -AutoTracker.Info.Mask3 = Tip: template tidak perlu besar atau mencakup seluruh objek. Sebuah fitur yang unik dan termasuk tepi kontras tinggi umumnya bekerja terbaik. -AutoTracker.Wizard.Checkbox.XAxis = Hanya sumbu x -AutoTracker.Info.SearchOnAxis1 = Pencarian pemindaian di daerah sumbu-x untuk pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret pusatnya atau masing-masing pegangan. -AutoTracker.Info.PossibleOnAxis = Pengamatan tampilan yang mungkin ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: -AutoTracker.Info.NoMatchOnAxis = Tidak ada pengamatan yang ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: -AutoTracker.Info.RetryOnAxis = - memindahkan area pencarian atau sumbu x dan cari lagi -AutoTracker.Wizard.Button.Delete = Hapus -AutoTracker.Wizard.Button.DeleteMore = Hapus Titik Selanjutnya -Button.Define.Tooltip = Tentukan fungsi kolom variabel yang ada -Calibration.Label.Point = titik -CalibrationStick.Hint = Mengatur panjang atau tarik hingga akhir untuk mengubah skala, atur sudut untuk ubah kemiringan -CalibrationStick.End.Hint = tarik untuk mengubah skala, shift+klik untuk kembali menandai -CalibrationStick.New.Name = kalibrasi tongkat -CalibrationTapeMeasure.New.Name = rekaman kalibrasi -CalibrationTapeMeasure.Readout.Magnitude.Hint = klik untuk masuk panjang dikenal dalam satuan dunia -CalibrationTapeMeasure.Hint = Mengatur panjang untuk mengubah skala, atur sudut untuk ubah kemiringan -DynamicSystem.Data.Description.0 = jarak relatif antara partikel -DynamicSystem.Data.Description.1 = sudut relatif -DynamicSystem.Data.Description.2 = kecepatan radial relatif -DynamicSystem.Data.Description.3 = kecepatan sudut relatif -ExportDataDialog.Subtitle.Table = Tabel Data -ExportDataDialog.Subtitle.Content = Sel -ExportDataDialog.Subtitle.Format = Format Nomor -ExportDataDialog.Subtitle.Delimiter = Pembatas -ExportDataDialog.Title = Ekspor Data -ExportDataDialog.Delimiter.Add = Tambah -ExportDataDialog.Delimiter.Remove = Hapus -ExportDataDialog.Content.AllCells = Semua Sel -ExportDataDialog.Content.SelectedCells = Sel Terpilih -ExportDataDialog.MenuItem.RemoveDelimiter = Hapus kustom pemisah -ExportDataDialog.Chooser.SaveData.Title = Simpan Data Seperti -ExportVideoDialog.Button.SaveAs = Simpan Sebagai -ExportVideoDialog.Button.FullSize = ukuran penuh -ExportVideoDialog.Button.DrawnSize = Seperti ditarik -ExportVideoDialog.Content.VideoOnly = Hanya video -ExportVideoDialog.Content.VideoAndGraphics = Video dan grafis -ExportVideoDialog.Content.GraphicsOnly = Hanya grafis -ExportVideoDialog.Title = Ekspor Video Klip -ExportVideoDialog.Label.ClipSettings = Pengaturan Klip -ExportVideoDialog.Subtitle.Size = Ukuran -ExportVideoDialog.Subtitle.Content = Konten -ExportVideoDialog.Subtitle.View = Pengamatan -ExportVideoDialog.Subtitle.Format = Format -ExportVideoDialog.Complete.Message1 = Video telah disimpan sebagai -ExportVideoDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ExportVideoDialog.Complete.Title = Ekspor Lengkap -ExportVideoDialog.VideoSize = ukuran video -ExportVideoDialog.MatSize = ukuran pita -ExportVideo.Dialog.HiddenPlots.Message = Plot harus terlihat penuh untuk ekspor . -ExportVideo.Dialog.HiddenPlots.Title = Pengamatan Tidak Lengkap -Footprint.DoubleTarget = Kepala Salib Ganda +AutoTracker.Wizard.Checkbox.LookAhead=Lihat dari Atas +AutoTracker.Label.Original=Kunci Frame +AutoTracker.Label.NoMask=non +AutoTracker.Label.Rate=Penilaian: +AutoTracker.Info.Mask3=Tip: template tidak perlu besar atau mencakup seluruh objek. Sebuah fitur yang unik dan termasuk tepi kontras tinggi umumnya bekerja terbaik. +AutoTracker.Wizard.Checkbox.XAxis=Hanya sumbu x +AutoTracker.Info.SearchOnAxis1=Pencarian pemindaian di daerah sumbu-x untuk pengamatan terbaik. Pindahkan atau ubah ukuran area pencarian dengan menyeret pusatnya atau masing-masing pegangan. +AutoTracker.Info.PossibleOnAxis=Pengamatan tampilan yang mungkin ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: +AutoTracker.Info.NoMatchOnAxis=Tidak ada pengamatan yang ditemukan di sepanjang sumbu-x di daerah pencarian yang ditampilkan. Pilihan Anda adalah: +AutoTracker.Info.RetryOnAxis=- memindahkan area pencarian atau sumbu x dan cari lagi +AutoTracker.Wizard.Button.Delete=Hapus +AutoTracker.Wizard.Button.DeleteMore=Hapus Titik Selanjutnya +Button.Define.Tooltip=Tentukan fungsi kolom variabel yang ada +Calibration.Label.Point=titik +CalibrationStick.Hint=Mengatur panjang atau tarik hingga akhir untuk mengubah skala, atur sudut untuk ubah kemiringan +CalibrationStick.End.Hint=tarik untuk mengubah skala, shift+klik untuk kembali menandai +CalibrationStick.New.Name=kalibrasi tongkat +CalibrationTapeMeasure.New.Name=rekaman kalibrasi +CalibrationTapeMeasure.Readout.Magnitude.Hint=klik untuk masuk panjang dikenal dalam satuan dunia +CalibrationTapeMeasure.Hint=Mengatur panjang untuk mengubah skala, atur sudut untuk ubah kemiringan +DynamicSystem.Data.Description.0=jarak relatif antara partikel +DynamicSystem.Data.Description.1=sudut relatif +DynamicSystem.Data.Description.2=kecepatan radial relatif +DynamicSystem.Data.Description.3=kecepatan sudut relatif +ExportDataDialog.Subtitle.Table=Tabel Data +ExportDataDialog.Subtitle.Content=Sel +ExportDataDialog.Subtitle.Format=Format Nomor +ExportDataDialog.Subtitle.Delimiter=Pembatas +ExportDataDialog.Title=Ekspor Data +ExportDataDialog.Delimiter.Add=Tambah +ExportDataDialog.Delimiter.Remove=Hapus +ExportDataDialog.Content.AllCells=Semua Sel +ExportDataDialog.Content.SelectedCells=Sel Terpilih +ExportDataDialog.MenuItem.RemoveDelimiter=Hapus kustom pemisah +ExportDataDialog.Chooser.SaveData.Title=Simpan Data Seperti +ExportVideoDialog.Button.SaveAs=Simpan Sebagai +ExportVideoDialog.Button.FullSize=ukuran penuh +ExportVideoDialog.Button.DrawnSize=Seperti ditarik +ExportVideoDialog.Content.VideoOnly=Hanya video +ExportVideoDialog.Content.VideoAndGraphics=Video dan grafis +ExportVideoDialog.Content.GraphicsOnly=Hanya grafis +ExportVideoDialog.Title=Ekspor Video Klip +ExportVideoDialog.Label.ClipSettings=Pengaturan Klip +ExportVideoDialog.Subtitle.Size=Ukuran +ExportVideoDialog.Subtitle.Content=Konten +ExportVideoDialog.Subtitle.View=Pengamatan +ExportVideoDialog.Subtitle.Format=Format +ExportVideoDialog.Complete.Message1=Video telah disimpan sebagai +ExportVideoDialog.Complete.Message2=Apakah Anda ingin membukanya di Tracker sekarang? +ExportVideoDialog.Complete.Title=Ekspor Lengkap +ExportVideoDialog.VideoSize=ukuran video +ExportVideoDialog.MatSize=ukuran pita +ExportVideo.Dialog.HiddenPlots.Message=Plot harus terlihat penuh untuk ekspor . +ExportVideo.Dialog.HiddenPlots.Title=Pengamatan Tidak Lengkap +Footprint.DoubleTarget=Kepala Salib Ganda Footprint.BoldDoubleTarget=Kepala salib ganda tebal -OffsetOrigin.MenuItem.Fixed = Koordinat Dunia Ditetapkan -ParticleModel.Dialog.Offscreen.Message1 = Beberapa Model langkah kosong karena mereka terlalu jauh dari layar . -ParticleModel.Dialog.Offscreen.Message2 = Untuk memperbaiki hal ini, ubah model atau atur ulang skala video . -ParticleModel.Dialog.Offscreen.Title = Diluar Batas -PrefsDialog.Tab.Configuration.Title = Konfigurasi -PrefsDialog.Memory.BorderTitle = Ukuran Memori -PrefsDialog.Tab.General.Title = Umum -PrefsDialog.RecentFiles.BorderTitle = Buka Menu Terbaru -PrefsDialog.Label.RecentSize = Hitung Berkas -PrefsDialog.Hints.BorderTitle = Petunjuk -PrefsDialog.Button.Relaunch = Peluncuran Ulang Sekarang -PrefsDialog.Button.ClearRecent = Batal -PrefsDialog.Checkbox.DefaultSize = Gunakan default -PrefsDialog.Checkbox.HintsOn = Tampilkan petunjuk secara default -PrefsDialog.Tab.Video.Title = Video -PrefsDialog.VideoPref.BorderTitle = Mesin Video -PrefsDialog.Button.Xuggle = Xuggle -PrefsDialog.Button.QT = QuickTime -PrefsDialog.Dialog.WebStart.Message = Pengaturan memori tidak tersedia saat menggunakan Web Start . -PrefsDialog.Dialog.WebStart.Title = Mode Web Start -PrefsDialog.LookFeel.BorderTitle = LnF -PrefsDialog.Language.BorderTitle = Bahasa -PrefsDialog.Upgrades.BorderTitle = Periksa Untuk Upgrade -PrefsDialog.Tab.Runtime.Title = Runtime -PrefsDialog.Tab.Display.Title = Tampilan -PrefsDialog.Language.Default = Default -PrefsDialog.Upgrades.Always = Setiap Saat -PrefsDialog.Upgrades.Weekly = Mingguan -PrefsDialog.Upgrades.Monthly = Bulanan -PrefsDialog.Upgrades.Never = Tidak pernah -PrefsDialog.Button.CheckForUpgrade = Periksa Sekarang -PrefsDialog.Xuggle.Speed.BorderTitle = Putar Ulang Video Xuggle -PrefsDialog.Xuggle.Slow = Halus (mungkin lambat) -PrefsDialog.Xuggle.Fast = Cepat (mungkin cepat) -PrefsDialog.CalibrationTool.BorderTitle = Alat Kalibrasi Standar -Protractor.Name = Busur Derajat -Protractor.New.Name = busur derajat -Protractor.Hint = tarik lengan untuk mengukur sudut -Protractor.Label.Angle = sudut -Protractor.Field.Angle.Tooltip = Sudut antara lengan busur derajat -Protractor.Vertex.Name = vertex -Protractor.Vertex.Hint = tarik untuk memindahkan vertex -Protractor.End.Name = akhir lengan -Protractor.End.Hint = tarik untuk memutar lengan -Protractor.Handle.Name = menangani -Protractor.Handle.Hint = tarik untuk memindahkan busur derajat -Protractor.Rotator.Name = pemutar -Protractor.Rotator.Hint = tarik untuk memutar busur derajat -Protractor.Readout.Name = pembacaan -Protractor.Readout.Hint = sudut antara lengan busur derajat -ProtractorFootprint.Circle3 = lingkaran kecil -ProtractorFootprint.Circle5 = lingkaran besar -ProtractorFootprint.Circle3Bold = lingkaran kecil tebal -ProtractorFootprint.Circle5Bold = lingkaran besar tebal -Stick.Name = Tongkat Kalibrasi -Stick.New.Name = tongkat kalibrasi -TableTrackView.MenuItem.Unformatted = Presisi Lengkap -TableTrackView.MenuItem.Formatted = Sebagai Terformat -TableTrackView.Menu.SetDelimiter = Atur Pembatas -TableTrackView.MenuItem.AddDelimiter = Tambah -TableTrackView.MenuItem.RemoveDelimiter = Hapus -TableTrackView.Dialog.CustomDelimiter.Message = Masukkan pembatas string baru: -TableTrackView.Dialog.CustomDelimiter.Title = Tambah Pembatas -TableTrackView.Header.Tooltip = Klik untuk menyortir atau klik ganda untuk memilih kolom -TableTrackView.MenuItem.CopySelectedData = Salin Data Dipilih -TableTrackView.Dialog.RemoveDelimiter.Message = Pilih pembatas untuk menghapus : -TableTrackView.Dialog.RemoveDelimiter.Title = Hapus Pembatas -TableTrackView.Radians.Tooltip = dalam radian -TableTrackView.Degrees.Tooltip = dalam derajat -TableTrackView.RadiansPerSecond.Tooltip = dalam radian/s -TableTrackView.DegreesPerSecond.Tooltip = dalam derajat/s -TableTrackView.RadiansPerSecondSquared.Tooltip = dalam radian/s^2 -TableTrackView.DegreesPerSecondSquared.Tooltip = dalam derajat/s^2 -TableTrackView.MenuItem.DeleteDataFunction = Hapus data Fungsi -TActions.Action.SaveFrame = Simpan Tabset Sebagai -TActions.AboutVideo = Properti -TActions.Dialog.AboutVideo.Title = Properti Video -TActions.Dialog.AboutVideo.Type = Tipe -TActions.Dialog.AboutVideo.Size = Dimensi -TActions.Dialog.AboutVideo.Length = Panjang -TActions.Dialog.AboutVideo.Frames = Frame -TActions.Dialog.AboutVideo.Seconds = detik -TActions.Dialog.AboutVideo.FrameRate = rerata frame -TActions.Dialog.AboutVideo.FramesPerSecond = fps -TActions.Dialog.AboutVideo.Path = Jalur -TActions.Action.ImportTRK =Berkas Tracker -TActions.Action.ProtractorVisible = Tampak -TapeMeasure.MenuItem.FixedLength = Panjang Tetap -TextTView.Label.NoTab = Klik "Halaman" untuk menambahkan teks dan halaman HTML di sini. -TextTView.NewTab.Text1 = Klik ganda untuk mengedit teks atau judul . Klik kanan untuk pilihan lainnya. -TextTView.NewTab.Text2 = Untuk menampilkan halaman HTML, masukkan url atau klik kanan untuk membuka file. -TextTView.NewTab.Title = TanpaNama -TextTView.Dialog.TabTitle.Title = Atur Nama -TextTView.MenuItem.OpenHTML = Buka HTML -TextTView.MenuItem.SetTitle = Atur Judul -TextTView.Button.NewTab = Baru -TextTView.TextEdit.Description = Teks -TFrame.Dialog.FileNotFound.Message = Berkas tidak dapat ditemukan. -TFrame.Dialog.FileNotFound.Title = Berkas Tidak Ditemukan -TFrame.View.Text = Tampilan Halaman -TFrame.View.Main = Pengamatan Utama -TMenuBar.Menu.OpenRecent = Buka Terbaru -TMenuBar.Menu.Import = Impor -TMenuBar.Menu.Export = Ekspor -TMenuBar.MenuItem.Video = Video -TMenuBar.MenuItem.Data = Berkas Data -TMenuBar.Menu.CopyObject = Salin Obyek -TMenuBar.MenuItem.Coords = Sistem Koordinat -TMenuBar.MenuItem.VideoClip = Video Clip -TMenuBar.Menu.MeasuringTools = Perangkat Pengukur -TMenuBar.Menu.AngleUnits = Satuan Sudut -TMenuBar.MenuItem.Degrees = Derajat -TMenuBar.MenuItem.Radians = Radian -Tracker.Dialog.NoXuggle.Title = Xuggle tidak ditemukan -Tracker.Dialog.NoXuggle.Message1 = Xuggle (mesin video cross-platform) tidak diinstal . -Tracker.Dialog.NoXuggle.Message2 = Download Xuggle dari http://www.xuggle.com/xuggler/downloads/ . -Tracker.Action.AboutXuggle = Perihal Xuggle -Tracker.Dialog.AboutXuggle.Title = Perihal Xuggle -Tracker.Dialog.AboutXuggle.Message.Version = Xuggle versi -Tracker.Dialog.AboutXuggle.Message.Home = Home Xuggle : -Tracker.Dialog.AboutXuggle.Message.Path = Jalur Xuggle.jar : -Tracker.Dialog.NoVideoEngine.Message1 = mesin video terinstal . Tanpa satu, Anda -Tracker.Dialog.NoVideoEngine.Message2 = hanya dapat membuka gambar (JPEG , PNG) dan animasi GIF . -Tracker.Dialog.NoVideoEngine.Message3 = Direkomendasikan: instal ulang Tracker dengan mesin video Xuggle . -Tracker.Dialog.NoVideoEngine.Title = Tidak Ada Mesin Video -Tracker.Dialog.NoXuggle.Message1 = Xuggle tidak bekerja dengan benar. Pastikan yang diperlukan -Tracker.Dialog.NoXuggle.Message2 = Berkas xuggle.jar berada di folder Tracker. Untuk rincian , -Tracker.Dialog.NoXuggle.Message3 = lihat Tracker_README.txt di folder Tracker -Tracker.Dialog.NoXuggle.Message4 = Untuk menginstal Xuggle, download installer Tracker terbaru dari -Tracker.Dialog.NoXuggle.Title = Xuggle Tidak Tersedia -Tracker.About.DefaultLocale = Bahasa default -Tracker.About.CurrentLanguage = Bahasa -Tracker.Dialog.InsufficientMemory.Title = Memori tidak cukup -Tracker.Dialog.InsufficientMemory.Message = ukuran memoriyang diminta terlalu besar . -TrackerIO.Dialog.TabMustBeSaved.Message1 = Tab -TrackerIO.Dialog.TabMustBeSaved.Message2 = harus disimpan sebagai berkas tracker untuk dimasukkan dalam tabset tersebut . -TrackerIO.Dialog.TabMustBeSaved.Message3 = Apakah Anda ingin menyimpannya? -TrackerIO.Dialog.TabMustBeSaved.Title = Tab belum disimpan -TrackerIO.Dialog.NoTabs.Message = Tidak ada tab untuk menghemat! -TrackerIO.Dialog.NoTabs.Title = Kosong Tabset -TrackerIO.Dialog.SaveTabset.Title = Simpan Tabset -TrackerIO.Dialog.SaveTab.Title = Simpan Tab -TrackerIO.Delimiter.Tab = Tab -TrackerIO.Delimiter.Space = Ruang -TrackerIO.Delimiter.Comma = Koma -TrackerIO.Delimiter.Semicolon = Titik koma -TrackerIO.VideoAndDataFileFilter.Description = Video dan berkas Tracker -TrackerPanel.Dialog.Version.Message1 = Anda membuka berkas yang dibuat dengan Tracker -TrackerPanel.Dialog.Version.Message2 = yang bisa merujuk ke -TrackerPanel.Dialog.Version.Message3 = fitur yang hilang di versi yang anda jalankan -TrackerPanel.Dialog.Version.Message4 = Versi terbaru tersedia di -TrackerPanel.Dialog.Version.Title = Versi Mismatch -TrackerPanel.Label.ModelStart = Frame Awal -TrackerPanel.Label.ModelEnd = Frame Akhir -TrackerPanel.Spinner.ModelStart.Tooltip = Mengatur frame awal untuk model ini -TrackerPanel.Spinner.ModelEnd.Tooltip = Mengatur frame akhir untuk model ini -TToolbar.Button.ProtractorVisible.Tooltip = Menampilkan atau menyembunyikan busur derajat -TToolbar.Button.AxesVisible.Tooltip = Menampilkan atau menyembunyikan sumbu koordinat -TToolBar.Button.TrackControl.Tooltip = Menampilkan atau menyembunyikan kontrol track -TTrack.Dialog.StepSizeWarning.Message1 = Perhatian: beberapa trek ditandai dengan ukuran langkah yang lebih besar dari satu, meninggalkan frame dilewati ditandai. -TTrack.Dialog.StepSizeWarning.Message2 = Mengubah ukuran langkah karena itu cenderung menghasilkan kesenjangan dalam kumpulan data. -TTrack.Dialog.StepSizeWarning.Message3 = kecepatan dan percepatan sekitar kesenjangan tidak dapat ditentukan sampai semua langkah yang ditandai. -TTrack.Dialog.StepSizeWarning.Title = Perhatian -TTrack.Dialog.SkippedStepWarning.Message1 = Perhatian: melewatkan langkah ketika menandai posisi meninggalkan kesenjangan dalam kumpulan data. -TTrack.Dialog.SkippedStepWarning.Title = Perhatian -TTrack.Dialog.SkippedStepWarning.Checkbox = Jangan tampilkan ini lagi -TTrack.Locked.Hint = terkunci -TTrack.AngleField.Radians.Tooltip = Sudut dalam radian -TTrack.AngleField.Degrees.Tooltip = Sudut dalam derajat -TTrack.AngleField.Popup.Radians = Beralih Untuk Radian -TTrack.AngleField.Popup.Degrees = Beralih ke Derajat -TTrackBar.Memory.Menu.SetSize = Atur ukuran memori -TTrackBar.Button.Version = Sekarang tersedia: versi -TTrackBar.Popup.MenuItem.Upgrade = Tingkatkan Sekarang -TTrackBar.Popup.MenuItem.Ignore = Abaikan -XuggleVideo.MenuItem.SmoothPlay = Bermain Halus (mungkin lambat) +OffsetOrigin.MenuItem.Fixed=Koordinat Dunia Ditetapkan +ParticleModel.Dialog.Offscreen.Message1=Beberapa Model langkah kosong karena mereka terlalu jauh dari layar . +ParticleModel.Dialog.Offscreen.Message2=Untuk memperbaiki hal ini, ubah model atau atur ulang skala video . +ParticleModel.Dialog.Offscreen.Title=Diluar Batas +PrefsDialog.Tab.Configuration.Title=Konfigurasi +PrefsDialog.Memory.BorderTitle=Ukuran Memori +PrefsDialog.Tab.General.Title=Umum +PrefsDialog.RecentFiles.BorderTitle=Buka Menu Terbaru +PrefsDialog.Label.RecentSize=Hitung Berkas +PrefsDialog.Hints.BorderTitle=Petunjuk +PrefsDialog.Button.Relaunch=Peluncuran Ulang Sekarang +PrefsDialog.Button.ClearRecent=Batal +PrefsDialog.Checkbox.DefaultSize=Gunakan default +PrefsDialog.Checkbox.HintsOn=Tampilkan petunjuk secara default +PrefsDialog.Tab.Video.Title=Video +PrefsDialog.VideoPref.BorderTitle=Mesin Video +PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.QT=QuickTime +PrefsDialog.Dialog.WebStart.Message=Pengaturan memori tidak tersedia saat menggunakan Web Start . +PrefsDialog.Dialog.WebStart.Title=Mode Web Start +PrefsDialog.LookFeel.BorderTitle=LnF +PrefsDialog.Language.BorderTitle=Bahasa +PrefsDialog.Upgrades.BorderTitle=Periksa Untuk Upgrade +PrefsDialog.Tab.Runtime.Title=Runtime +PrefsDialog.Tab.Display.Title=Tampilan +PrefsDialog.Language.Default=Default +PrefsDialog.Upgrades.Always=Setiap Saat +PrefsDialog.Upgrades.Weekly=Mingguan +PrefsDialog.Upgrades.Monthly=Bulanan +PrefsDialog.Upgrades.Never=Tidak pernah +PrefsDialog.Button.CheckForUpgrade=Periksa Sekarang +PrefsDialog.Xuggle.Speed.BorderTitle=Putar Ulang Video Xuggle +PrefsDialog.Xuggle.Slow=Halus (mungkin lambat) +PrefsDialog.Xuggle.Fast=Cepat (mungkin cepat) +PrefsDialog.CalibrationTool.BorderTitle=Alat Kalibrasi Standar +Protractor.Name=Busur Derajat +Protractor.New.Name=busur derajat +Protractor.Hint=tarik lengan untuk mengukur sudut +Protractor.Label.Angle=sudut +Protractor.Field.Angle.Tooltip=Sudut antara lengan busur derajat +Protractor.Vertex.Name=vertex +Protractor.Vertex.Hint=tarik untuk memindahkan vertex +Protractor.End.Name=akhir lengan +Protractor.End.Hint=tarik untuk memutar lengan +Protractor.Handle.Name=menangani +Protractor.Handle.Hint=tarik untuk memindahkan busur derajat +Protractor.Rotator.Name=pemutar +Protractor.Rotator.Hint=tarik untuk memutar busur derajat +Protractor.Readout.Name=pembacaan +Protractor.Readout.Hint=sudut antara lengan busur derajat +ProtractorFootprint.Circle3=lingkaran kecil +ProtractorFootprint.Circle5=lingkaran besar +ProtractorFootprint.Circle3Bold=lingkaran kecil tebal +ProtractorFootprint.Circle5Bold=lingkaran besar tebal +Stick.Name=Tongkat Kalibrasi +Stick.New.Name=tongkat kalibrasi +TableTrackView.MenuItem.Unformatted=Presisi Lengkap +TableTrackView.MenuItem.Formatted=Sebagai Terformat +TableTrackView.Menu.SetDelimiter=Atur Pembatas +TableTrackView.MenuItem.AddDelimiter=Tambah +TableTrackView.MenuItem.RemoveDelimiter=Hapus +TableTrackView.Dialog.CustomDelimiter.Message=Masukkan pembatas string baru: +TableTrackView.Dialog.CustomDelimiter.Title=Tambah Pembatas +TableTrackView.Header.Tooltip=Klik untuk menyortir atau klik ganda untuk memilih kolom +TableTrackView.MenuItem.CopySelectedData=Salin Data Dipilih +TableTrackView.Dialog.RemoveDelimiter.Message=Pilih pembatas untuk menghapus : +TableTrackView.Dialog.RemoveDelimiter.Title=Hapus Pembatas +TableTrackView.Radians.Tooltip=dalam radian +TableTrackView.Degrees.Tooltip=dalam derajat +TableTrackView.RadiansPerSecond.Tooltip=dalam radian/s +TableTrackView.DegreesPerSecond.Tooltip=dalam derajat/s +TableTrackView.RadiansPerSecondSquared.Tooltip=dalam radian/s^2 +TableTrackView.DegreesPerSecondSquared.Tooltip=dalam derajat/s^2 +TableTrackView.MenuItem.DeleteDataFunction=Hapus data Fungsi +TActions.Action.SaveFrame=Simpan Tabset Sebagai +TActions.AboutVideo=Properti +TActions.Dialog.AboutVideo.Title=Properti Video +TActions.Dialog.AboutVideo.Type=Tipe +TActions.Dialog.AboutVideo.Size=Dimensi +TActions.Dialog.AboutVideo.Length=Panjang +TActions.Dialog.AboutVideo.Frames=Frame +TActions.Dialog.AboutVideo.Seconds=detik +TActions.Dialog.AboutVideo.FrameRate=rerata frame +TActions.Dialog.AboutVideo.FramesPerSecond=fps +TActions.Dialog.AboutVideo.Path=Jalur +TActions.Action.ImportTRK=Berkas Tracker +TActions.Action.ProtractorVisible=Tampak +TapeMeasure.MenuItem.FixedLength=Panjang Tetap +TextTView.Label.NoTab=Klik "Halaman" untuk menambahkan teks dan halaman HTML di sini. +TextTView.NewTab.Text1=Klik ganda untuk mengedit teks atau judul . Klik kanan untuk pilihan lainnya. +TextTView.NewTab.Text2=Untuk menampilkan halaman HTML, masukkan url atau klik kanan untuk membuka file. +TextTView.NewTab.Title=TanpaNama +TextTView.Dialog.TabTitle.Title=Atur Nama +TextTView.MenuItem.OpenHTML=Buka HTML +TextTView.MenuItem.SetTitle=Atur Judul +TextTView.Button.NewTab=Baru +TextTView.TextEdit.Description=Teks +TFrame.Dialog.FileNotFound.Message=Berkas tidak dapat ditemukan. +TFrame.Dialog.FileNotFound.Title=Berkas Tidak Ditemukan +TFrame.View.Text=Tampilan Halaman +TFrame.View.Main=Pengamatan Utama +TMenuBar.Menu.OpenRecent=Buka Terbaru +TMenuBar.Menu.Import=Impor +TMenuBar.Menu.Export=Ekspor +TMenuBar.MenuItem.Video=Video +TMenuBar.MenuItem.Data=Berkas Data +TMenuBar.Menu.CopyObject=Salin Obyek +TMenuBar.MenuItem.Coords=Sistem Koordinat +TMenuBar.MenuItem.VideoClip=Video Clip +TMenuBar.Menu.MeasuringTools=Perangkat Pengukur +TMenuBar.Menu.AngleUnits=Satuan Sudut +TMenuBar.MenuItem.Degrees=Derajat +TMenuBar.MenuItem.Radians=Radian +Tracker.Dialog.NoXuggle.Title=Xuggle tidak ditemukan +Tracker.Dialog.NoXuggle.Message1=Xuggle (mesin video cross-platform) tidak diinstal . +Tracker.Dialog.NoXuggle.Message2=Download Xuggle dari http://www.xuggle.com/xuggler/downloads/ . +Tracker.Action.AboutXuggle=Perihal Xuggle +Tracker.Dialog.AboutXuggle.Title=Perihal Xuggle +Tracker.Dialog.AboutXuggle.Message.Version=Xuggle versi +Tracker.Dialog.AboutXuggle.Message.Home=Home Xuggle : +Tracker.Dialog.AboutXuggle.Message.Path=Jalur Xuggle.jar : +Tracker.Dialog.NoVideoEngine.Message1=mesin video terinstal . Tanpa satu, Anda +Tracker.Dialog.NoVideoEngine.Message2=hanya dapat membuka gambar (JPEG , PNG) dan animasi GIF . +Tracker.Dialog.NoVideoEngine.Message3=Direkomendasikan: instal ulang Tracker dengan mesin video Xuggle . +Tracker.Dialog.NoVideoEngine.Title=Tidak Ada Mesin Video +Tracker.Dialog.NoXuggle.Message1=Xuggle tidak bekerja dengan benar. Pastikan yang diperlukan +Tracker.Dialog.NoXuggle.Message2=Berkas xuggle.jar berada di folder Tracker. Untuk rincian , +Tracker.Dialog.NoXuggle.Message3=lihat Tracker_README.txt di folder Tracker +Tracker.Dialog.NoXuggle.Message4=Untuk menginstal Xuggle, download installer Tracker terbaru dari +Tracker.Dialog.NoXuggle.Title=Xuggle Tidak Tersedia +Tracker.About.DefaultLocale=Bahasa default +Tracker.About.CurrentLanguage=Bahasa +Tracker.Dialog.InsufficientMemory.Title=Memori tidak cukup +Tracker.Dialog.InsufficientMemory.Message=ukuran memoriyang diminta terlalu besar . +TrackerIO.Dialog.TabMustBeSaved.Message1=Tab +TrackerIO.Dialog.TabMustBeSaved.Message2=harus disimpan sebagai berkas tracker untuk dimasukkan dalam tabset tersebut . +TrackerIO.Dialog.TabMustBeSaved.Message3=Apakah Anda ingin menyimpannya? +TrackerIO.Dialog.TabMustBeSaved.Title=Tab belum disimpan +TrackerIO.Dialog.NoTabs.Message=Tidak ada tab untuk menghemat! +TrackerIO.Dialog.NoTabs.Title=Kosong Tabset +TrackerIO.Dialog.SaveTabset.Title=Simpan Tabset +TrackerIO.Dialog.SaveTab.Title=Simpan Tab +TrackerIO.Delimiter.Tab=Tab +TrackerIO.Delimiter.Space=Ruang +TrackerIO.Delimiter.Comma=Koma +TrackerIO.Delimiter.Semicolon=Titik koma +TrackerIO.VideoAndDataFileFilter.Description=Video dan berkas Tracker +TrackerPanel.Dialog.Version.Message1=Anda membuka berkas yang dibuat dengan Tracker +TrackerPanel.Dialog.Version.Message2=yang bisa merujuk ke +TrackerPanel.Dialog.Version.Message3=fitur yang hilang di versi yang anda jalankan +TrackerPanel.Dialog.Version.Message4=Versi terbaru tersedia di +TrackerPanel.Dialog.Version.Title=Versi Mismatch +TrackerPanel.Label.ModelStart=Frame Awal +TrackerPanel.Label.ModelEnd=Frame Akhir +TrackerPanel.Spinner.ModelStart.Tooltip=Mengatur frame awal untuk model ini +TrackerPanel.Spinner.ModelEnd.Tooltip=Mengatur frame akhir untuk model ini +TToolbar.Button.ProtractorVisible.Tooltip=Menampilkan atau menyembunyikan busur derajat +TToolbar.Button.AxesVisible.Tooltip=Menampilkan atau menyembunyikan sumbu koordinat +TToolBar.Button.TrackControl.Tooltip=Menampilkan atau menyembunyikan kontrol track +TTrack.Dialog.StepSizeWarning.Message1=Perhatian: beberapa trek ditandai dengan ukuran langkah yang lebih besar dari satu, meninggalkan frame dilewati ditandai. +TTrack.Dialog.StepSizeWarning.Message2=Mengubah ukuran langkah karena itu cenderung menghasilkan kesenjangan dalam kumpulan data. +TTrack.Dialog.StepSizeWarning.Message3=kecepatan dan percepatan sekitar kesenjangan tidak dapat ditentukan sampai semua langkah yang ditandai. +TTrack.Dialog.StepSizeWarning.Title=Perhatian +TTrack.Dialog.SkippedStepWarning.Message1=Perhatian: melewatkan langkah ketika menandai posisi meninggalkan kesenjangan dalam kumpulan data. +TTrack.Dialog.SkippedStepWarning.Title=Perhatian +TTrack.Dialog.SkippedStepWarning.Checkbox=Jangan tampilkan ini lagi +TTrack.Locked.Hint=terkunci +TTrack.AngleField.Radians.Tooltip=Sudut dalam radian +TTrack.AngleField.Degrees.Tooltip=Sudut dalam derajat +TTrack.AngleField.Popup.Radians=Beralih Untuk Radian +TTrack.AngleField.Popup.Degrees=Beralih ke Derajat +TTrackBar.Memory.Menu.SetSize=Atur ukuran memori +TTrackBar.Button.Version=Sekarang tersedia: versi +TTrackBar.Popup.MenuItem.Upgrade=Tingkatkan Sekarang +TTrackBar.Popup.MenuItem.Ignore=Abaikan +XuggleVideo.MenuItem.SmoothPlay=Bermain Halus (mungkin lambat) # Penambahan oleh Doug Brown 2011-02-05 -CalibrationTapeMeasure.Name = Pita Kalibrasi -CircleFootprint.Circle = lingkaran -CircleFootprint.FilledCircle = lingkaran penuh -CircleFootprint.Dialog.Title = Lingkaran Jejak -CircleFootprint.Dialog.Label.Radius = Radius -CircleFootprint.Dialog.Checkbox.Bold = Bold -CircleFootprint.Dialog.Checkbox.CenterSpot = Pusat Spot -LineProfile.Hint.Marking = tikus tarik untuk menandai profil garis -PageTView.Button.Page = Halaman -PageTView.MenuItem.ClosePage = Tutup Halaman -PointMass.Hint.Marking = klik mouse untuk menandai, tekan tombol Enter untuk mengkloning langkah sebelumnya -PrefsDialog.Dialog.NewVersion.Title = Upgrade -PrefsDialog.Dialog.NewVersion.Message1 = Versi -PrefsDialog.Dialog.NewVersion.Message2 = sekarang tersedia di -PrefsDialog.Dialog.NewVersion.None.Message = Tidak ada versi baru yang tersedia saat ini . -RGBRegion.Hint.Marking = klik mouse untuk menandai pusat daerah -TMenuBar.MenuItem.Restore = Pulihkan Pengamatan -TrackControl.StretchVectors.None = Tidak ada peregangan -TViewChooser.Maximize.Tooltip = Maksimalkan pandangan ini -TViewChooser.Restore.Tooltip = Pulihkan pengamatan -Vector.Hint.Marking = tarik tetikus untuk menandai, tekan Enter untuk mengkloning langkah sebelumnya -WorldTView.Button.World = Dunia +CalibrationTapeMeasure.Name=Pita Kalibrasi +CircleFootprint.Circle=lingkaran +CircleFootprint.FilledCircle=lingkaran penuh +CircleFootprint.Dialog.Title=Lingkaran Jejak +CircleFootprint.Dialog.Label.Radius=Radius +CircleFootprint.Dialog.Checkbox.Bold=Bold +CircleFootprint.Dialog.Checkbox.CenterSpot=Pusat Spot +LineProfile.Hint.Marking=tikus tarik untuk menandai profil garis +PageTView.Button.Page=Halaman +PageTView.MenuItem.ClosePage=Tutup Halaman +PointMass.Hint.Marking=klik mouse untuk menandai, tekan tombol Enter untuk mengkloning langkah sebelumnya +PrefsDialog.Dialog.NewVersion.Title=Upgrade +PrefsDialog.Dialog.NewVersion.Message1=Versi +PrefsDialog.Dialog.NewVersion.Message2=sekarang tersedia di +PrefsDialog.Dialog.NewVersion.None.Message=Tidak ada versi baru yang tersedia saat ini . +RGBRegion.Hint.Marking=klik mouse untuk menandai pusat daerah +TMenuBar.MenuItem.Restore=Pulihkan Pengamatan +TrackControl.StretchVectors.None=Tidak ada peregangan +TViewChooser.Maximize.Tooltip=Maksimalkan pandangan ini +TViewChooser.Restore.Tooltip=Pulihkan pengamatan +Vector.Hint.Marking=tarik tetikus untuk menandai, tekan Enter untuk mengkloning langkah sebelumnya +WorldTView.Button.World=Dunia # Penambahan oleh Doug Brown 2011-04-04 -PrefsDialog.NoVideoWarning.BorderTitle = Peringatan -PrefsDialog.Checkbox.WarnIfNoEngine = Tidak ada mesin video yang -PrefsDialog.Checkbox.WarnIfXuggleError = kesalahan non-fatal Xuggle -PropertiesDialog.Title = Properti -PropertiesDialog.Label.Author = Penulis -PropertiesDialog.Label.Contact = Kontak -TActions.Action.Properties = Properti -TActions.Action.OpenBrowser = Buka Peramban Pustaka -TFrame.Progress.Xuggle = Xuggle pemuatan frame -TFrame.Progress.ClickToCancel = (klik untuk membatalkan ) -TFrame.Dialog.StalledVideo.Title = Error Saat Memuat Video -TFrame.Dialog.StalledVideo.Message0 = video telah terhenti saat dimuat. Ini mungkin sementara. -TFrame.Dialog.StalledVideo.Message1 = Anda dapat memilih untuk menghentikan pemuatan sekarang atau terus menunggu. -TFrame.Dialog.StalledVideo.Message2 = Pilihan lain untuk membuka video ini meliputi: -TFrame.Dialog.StalledVideo.Message3 = 1. Gunakan perangkat lunak konversi video untuk mengubahnya menjadi format yang berbeda. -TFrame.Dialog.StalledVideo.Message4 = 2. Pilih QuickTime dalam file pemilih atau preferensi dialog . -TFrame.Dialog.StalledVideo.MessageMac = 2. Buka Tracker di Java VM 32-bit dan membukanya dengan QuickTime . -TFrame.Dialog.StalledVideo.Button.Stop = Berhenti -TFrame.Dialog.StalledVideo.Button.Wait = Tunggu -Tracker.Dialog.NoVideoEngine.Checkbox = Jangan tampilkan ini lagi -TrackerIO.ZipFileFilter.Description = Berkas ZIP (*.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1 = Xuggle telah mengalami kesalahan saat membuka video ini : -TrackerIO.Dialog.ErrorFFMPEG.Message2 = Tidak semua kesalahan adalah fatal. Untuk pesan kesalahan penuh, pilih Panduan | Log Pesan . -TrackerIO.Dialog.ErrorFFMPEG.Message3 = Jika Xuggle gagal, Anda mungkin dapat membuka video dengan QuickTime . -TrackerIO.Dialog.ErrorFFMPEG.MessageMac = Catatan: Pada Mac OSX ini membutuhkan menjalankan Tracker dala Java VMm 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title = Kesalahan Xuggle -TrackerIO.ErrorFFMPEG.LogMessage = Untuk lebih jelasnya, aktifkan peringatan Xuggle dalam preferensi dialog (Pembenahan | Preferensi ) . -TToolBar.Button.OpenBrowser.Tooltip = Buka Peramban Pustaka Digital OSP +PrefsDialog.NoVideoWarning.BorderTitle=Peringatan +PrefsDialog.Checkbox.WarnIfNoEngine=Tidak ada mesin video yang +PrefsDialog.Checkbox.WarnIfXuggleError=kesalahan non-fatal Xuggle +PropertiesDialog.Title=Properti +PropertiesDialog.Label.Author=Penulis +PropertiesDialog.Label.Contact=Kontak +TActions.Action.Properties=Properti +TActions.Action.OpenBrowser=Buka Peramban Pustaka +TFrame.Progress.Xuggle=Xuggle pemuatan frame +TFrame.Progress.ClickToCancel=(klik untuk membatalkan ) +TFrame.Dialog.StalledVideo.Title=Error Saat Memuat Video +TFrame.Dialog.StalledVideo.Message0=video telah terhenti saat dimuat. Ini mungkin sementara. +TFrame.Dialog.StalledVideo.Message1=Anda dapat memilih untuk menghentikan pemuatan sekarang atau terus menunggu. +TFrame.Dialog.StalledVideo.Message2=Pilihan lain untuk membuka video ini meliputi: +TFrame.Dialog.StalledVideo.Message3=1. Gunakan perangkat lunak konversi video untuk mengubahnya menjadi format yang berbeda. +TFrame.Dialog.StalledVideo.Message4=2. Pilih QuickTime dalam file pemilih atau preferensi dialog . +TFrame.Dialog.StalledVideo.MessageMac=2. Buka Tracker di Java VM 32-bit dan membukanya dengan QuickTime . +TFrame.Dialog.StalledVideo.Button.Stop=Berhenti +TFrame.Dialog.StalledVideo.Button.Wait=Tunggu +Tracker.Dialog.NoVideoEngine.Checkbox=Jangan tampilkan ini lagi +TrackerIO.ZipFileFilter.Description=Berkas ZIP (*.zip) +TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle telah mengalami kesalahan saat membuka video ini : +TrackerIO.Dialog.ErrorFFMPEG.Message2=Tidak semua kesalahan adalah fatal. Untuk pesan kesalahan penuh, pilih Panduan | Log Pesan . +TrackerIO.Dialog.ErrorFFMPEG.Message3=Jika Xuggle gagal, Anda mungkin dapat membuka video dengan QuickTime . +TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Catatan: Pada Mac OSX ini membutuhkan menjalankan Tracker dala Java VMm 32-bit. +TrackerIO.Dialog.ErrorFFMPEG.Title=Kesalahan Xuggle +TrackerIO.ErrorFFMPEG.LogMessage=Untuk lebih jelasnya, aktifkan peringatan Xuggle dalam preferensi dialog (Pembenahan | Preferensi ) . +TToolBar.Button.OpenBrowser.Tooltip=Buka Peramban Pustaka Digital OSP # Penambahan oleh Doug Brown 2011-07-20 -TFrame.Dialog.NoTRKInComPADRE.Title = Berkas Tidak Ditemukan -TFrame.Dialog.NoTRKInComPADRE.Message = Tidak ditemukan berkas Tracker dalam node +TFrame.Dialog.NoTRKInComPADRE.Title=Berkas Tidak Ditemukan +TFrame.Dialog.NoTRKInComPADRE.Message=Tidak ditemukan berkas Tracker dalam node # Penambahan oleh Doug Brown 2011-08-08 -AnalyticParticle.Builder.Title = Partikel kinematik -DynamicParticle.Builder.Title = Partikel Dinamis (Cartesian) -DynamicParticlePolar.Builder.Title = Dinamis Partikel (Polar) -DynamicSystem.Builder.Title = Sistem Dinamis (internal) -PropertiesDialog.Button.CopyFilePath = Salin Berkas Tracker -PropertiesDialog.Button.CopyVideoPath = Salin Video Tracker -PropertiesDialog.Tab.TrackerFile = Berkas Tracker -PropertiesDialog.Tab.Metadata = Metadata -PropertiesDialog.Header.Property = Properti -PropertiesDialog.Header.Value = Nilai -TActions.Action.OpenURL = Buka URL -TActions.Dialog.OpenURL.Title = Buka URL -TActions.Dialog.OpenURL.Message = Masukkan URL video berbasis web, berkas Tracker atau berkas zip Tracker -TActions.Dialog.AboutVideo.Name = Nama +AnalyticParticle.Builder.Title=Partikel kinematik +DynamicParticle.Builder.Title=Partikel Dinamis (Cartesian) +DynamicParticlePolar.Builder.Title=Dinamis Partikel (Polar) +DynamicSystem.Builder.Title=Sistem Dinamis (internal) +PropertiesDialog.Button.CopyFilePath=Salin Berkas Tracker +PropertiesDialog.Button.CopyVideoPath=Salin Video Tracker +PropertiesDialog.Tab.TrackerFile=Berkas Tracker +PropertiesDialog.Tab.Metadata=Metadata +PropertiesDialog.Header.Property=Properti +PropertiesDialog.Header.Value=Nilai +TActions.Action.OpenURL=Buka URL +TActions.Dialog.OpenURL.Title=Buka URL +TActions.Dialog.OpenURL.Message=Masukkan URL video berbasis web, berkas Tracker atau berkas zip Tracker +TActions.Dialog.AboutVideo.Name=Nama # Penambahan oleh Doug Brown 2011-08-25 -PrefsDialog.CacheFiles.BorderTitle = Berkas Tembolok Web -PrefsDialog.Button.ClearCache = Batal Semua +PrefsDialog.CacheFiles.BorderTitle=Berkas Tembolok Web +PrefsDialog.Button.ClearCache=Batal Semua # Penambahan oleh Doug Brown 2011-10-07 -PointMass.Remark.Hint = shift- klik untuk kembali menandai posisi disorot -PointMass.Remarking.Hint = klik mouse untuk menandai ulang posisi -PointMass.PositionSelected.Hint = tarik atau masukkan posisi pada toolbar -PointMass.VectorSelected.Hint = tarik untuk memindahkan -Vector.Remark.Hint = shift-klik untuk kembali menandai yang disorot tip -Vector.TipSelected.Hint = tarik atau masukkan komponen pada toolbar -Vector.HandleSelected.Hint = tarik untuk memindahkan -Vector.Remarking.Hint = klik mouse untuk kembali menandai tip -AutoTracker.Label.Search = Pencarian -AutoTracker.Label.Target = Target -AutoTracker.Label.Frame = Frame -AutoTracker.Label.Point = Titik -AutoTracker.Label.Template = Contoh -AutoTracker.Label.Track = Jalur -AutoTracker.Label.Match = Pengamatan -AutoTracker.Label.NoTemplate = Tidak ada Contoh -AutoTracker.Label.EvolutionRate = Tingkat Evolusi -AutoTracker.Label.Automark = Tandai Automatis -AutoTracker.Info.Instructions = Klik tombol Cari untuk mencari pertandingan di daerah pencarian ditampilkan. -AutoTracker.Info.KeyFrame.Instructions1 = Ini frame kunci untuk mendefinisikan contoh dan target yang ditampilkan. Klik tombol Cari untuk mencari contoh pengamatan. -AutoTracker.Info.KeyFrame.Instructions2 = Anda dapat menyeret daerah sasaran, contoh atau pencari untuk memindahkan atau mengubah ukurannya. -AutoTracker.Info.MouseOver.Instructions = Mouse kontrol atas untuk mempelajari lebih lanjut tentang pengaturan dan penyesuaian . -AutoTracker.Info.Mask1 = Contoh adalah gambar untuk dicocokkan. Dimulai dengan frame kunci dan berkembang untuk beradaptasi dengan perubahan bentuk dan warna. -AutoTracker.Info.Mask2 = Tingkat tandai automatik adalah skor pengamatan minimum yang diperlukan untuk otomatis menandai. -AutoTracker.Info.Mask.Instructions = Memindahkan atau mengubah ukuran template dengan menyeret pinggiran atau sudut pegangannya (bingkai kunci saja). Sesuaikan tingkat evolusi dan tingkat automark menggunakan pemintal. -AutoTracker.Info.Mask.Tip = Tingkat tandai automatik yang rendah dapat mengakibatkan pengamatan palsu - coba tingkatkan laju evolusi sebagai penggantinya. -AutoTracker.Info.Search = Area pencarian dipindai untuk pengamatan terbaik. -AutoTracker.Info.SearchOnAxis = Sumbu-x di daerah pencarian dipindai untuk pengamatan terbaik. -AutoTracker.Info.Search.Instructions = Pindahkan atau ubah ukuran area pencarian dengan menyeret pinggiran atau sudut pegangannya. Atur sumbu x dan pilihan tampak-depan dengan memeriksa kotak mereka. -AutoTracker.Info.Search.Tip = Daerah pencari tidak perlu besar dalam banyak kasus. Pilihan automatis tampak-depan untuk memindahkan area pencarian demi prediksi pengamatan posisi. -AutoTracker.Info.Target = Targetnya adalah titik di mana trek ditargetkan ditandai . -AutoTracker.Info.Target.Instructions = Pindahkan target dengan menyeretnya (frame kunci saja). Pilih trek yang ditargetkan dan titik dari daftar drop-down . -AutoTracker.Info.Title.Settings = Pengaturan -AutoTracker.Info.Title.Tip = Tip -AutoTracker.Info.SelectTrack = Silakan pilih atau membuat trek dan titik Anda ingin AutoTrack. -AutoTracker.Info.OutsideXAxis = Sumbu-x tidak melewati area pencarian. Pilihan Anda adalah : -AutoTracker.Info.NewKeyFrame = - langkah kembali dan mengubah tingkat evolusi atau pergeseran kontrol - klik untuk menentukan bingkai kunci baru -AutoTracker.Info.Replace = - menerima pertandingan -AutoTracker.Info.Keep = - melewatkan frame ini dan meninggalkan tidak berubah -AutoTracker.Info.PossibleReplace = Sebuah pertandingan yang mungkin ditampilkan . Pilihan Anda adalah : -AutoTracker.Wizard.Button.Accept = Terima -AutoTracker.Wizard.Button.Stop = Berhenti -AutoTracker.Wizard.Button.Skip = Loncat -AutoTracker.Wizard.Button.Replace = Ganti -AutoTracker.Wizard.Button.Keep = Penurunan -AutoTracker.Wizard.Button.Search = Pencarian -AutoTracker.Wizard.Button.SearchThis = Cari Ini -AutoTracker.Wizard.Button.SearchNext = Cari Berikutnya -AutoTracker.Wizard.Button.Delete = Hapus -AutoTracker.Wizard.Button.ShowKeyFrame = Tampilkan Frame Kunci -AutoTracker.Wizard.Button.DeleteKeyFrame = Hapus Frame Kunci -AutoTracker.Wizard.Checkbox.LookAhead = Lihat Dari Atas -AutoTracker.Wizard.Checkbox.XAxis = Hanya Sumbu X -AutoTracker.Wizard.Menuitem.DeleteThis = Titik ini -AutoTracker.Wizard.Menuitem.DeleteLater = Titik Selanjutnya -AutoTracker.Wizard.Menuitem.DeleteAll = Batal Semua -TToolBar.Button.AutoTracker.Tooltip = Menampilkan atau menyembunyikan autotracker -MainTView.Popup.MenuItem.ZoomIn = Perbesar -MainTView.Popup.MenuItem.ZoomOut = Perkecil -MainTView.Popup.MenuItem.ZoomToFit = Pembesaran Ditetapkan -TrackerIO.Dialog.DurationVaries.Title = Frame Durasi -TrackerIO.Dialog.DurationVaries.Message1 = Beberapa beda durasi frame dari lebih dari rata-rata -TrackerIO.Dialog.DurationVaries.Message2 = Untuk kecepatan dan percepatan akurat, Anda harus mengecualikan frame ini dari -TrackerIO.Dialog.DurationVaries.Message3 = perhitungan dengan menetapkan frame awal dan frame akhir dari klip video. -TrackerIO.Dialog.DurationVaries.Message4 = Pengecualian Untuk Frame : -TrackerIO.Dialog.DurationVaries.Message5 = Durasi rata-rata dan nilai frame jika dikesampingkan: -TFrame.Dialog.LibraryError.Title = Kesalahan -TFrame.Dialog.LibraryError.Message = Tidak ada sumber daya dapat diambil untuk node +PointMass.Remark.Hint=shift- klik untuk kembali menandai posisi disorot +PointMass.Remarking.Hint=klik mouse untuk menandai ulang posisi +PointMass.PositionSelected.Hint=tarik atau masukkan posisi pada toolbar +PointMass.VectorSelected.Hint=tarik untuk memindahkan +Vector.Remark.Hint=shift-klik untuk kembali menandai yang disorot tip +Vector.TipSelected.Hint=tarik atau masukkan komponen pada toolbar +Vector.HandleSelected.Hint=tarik untuk memindahkan +Vector.Remarking.Hint=klik mouse untuk kembali menandai tip +AutoTracker.Label.Search=Pencarian +AutoTracker.Label.Target=Target +AutoTracker.Label.Frame=Frame +AutoTracker.Label.Point=Titik +AutoTracker.Label.Template=Contoh +AutoTracker.Label.Track=Jalur +AutoTracker.Label.Match=Pengamatan +AutoTracker.Label.NoTemplate=Tidak ada Contoh +AutoTracker.Label.EvolutionRate=Tingkat Evolusi +AutoTracker.Label.Automark=Tandai Automatis +AutoTracker.Info.Instructions=Klik tombol Cari untuk mencari pertandingan di daerah pencarian ditampilkan. +AutoTracker.Info.KeyFrame.Instructions1=Ini frame kunci untuk mendefinisikan contoh dan target yang ditampilkan. Klik tombol Cari untuk mencari contoh pengamatan. +AutoTracker.Info.KeyFrame.Instructions2=Anda dapat menyeret daerah sasaran, contoh atau pencari untuk memindahkan atau mengubah ukurannya. +AutoTracker.Info.MouseOver.Instructions=Mouse kontrol atas untuk mempelajari lebih lanjut tentang pengaturan dan penyesuaian . +AutoTracker.Info.Mask1=Contoh adalah gambar untuk dicocokkan. Dimulai dengan frame kunci dan berkembang untuk beradaptasi dengan perubahan bentuk dan warna. +AutoTracker.Info.Mask2=Tingkat tandai automatik adalah skor pengamatan minimum yang diperlukan untuk otomatis menandai. +AutoTracker.Info.Mask.Instructions=Memindahkan atau mengubah ukuran template dengan menyeret pinggiran atau sudut pegangannya (bingkai kunci saja). Sesuaikan tingkat evolusi dan tingkat automark menggunakan pemintal. +AutoTracker.Info.Mask.Tip=Tingkat tandai automatik yang rendah dapat mengakibatkan pengamatan palsu - coba tingkatkan laju evolusi sebagai penggantinya. +AutoTracker.Info.Search=Area pencarian dipindai untuk pengamatan terbaik. +AutoTracker.Info.SearchOnAxis=Sumbu-x di daerah pencarian dipindai untuk pengamatan terbaik. +AutoTracker.Info.Search.Instructions=Pindahkan atau ubah ukuran area pencarian dengan menyeret pinggiran atau sudut pegangannya. Atur sumbu x dan pilihan tampak-depan dengan memeriksa kotak mereka. +AutoTracker.Info.Search.Tip=Daerah pencari tidak perlu besar dalam banyak kasus. Pilihan automatis tampak-depan untuk memindahkan area pencarian demi prediksi pengamatan posisi. +AutoTracker.Info.Target=Targetnya adalah titik di mana trek ditargetkan ditandai . +AutoTracker.Info.Target.Instructions=Pindahkan target dengan menyeretnya (frame kunci saja). Pilih trek yang ditargetkan dan titik dari daftar drop-down . +AutoTracker.Info.Title.Settings=Pengaturan +AutoTracker.Info.Title.Tip=Tip +AutoTracker.Info.SelectTrack=Silakan pilih atau membuat trek dan titik Anda ingin AutoTrack. +AutoTracker.Info.OutsideXAxis=Sumbu-x tidak melewati area pencarian. Pilihan Anda adalah : +AutoTracker.Info.NewKeyFrame=- langkah kembali dan mengubah tingkat evolusi atau pergeseran kontrol - klik untuk menentukan bingkai kunci baru +AutoTracker.Info.Replace=- menerima pertandingan +AutoTracker.Info.Keep=- melewatkan frame ini dan meninggalkan tidak berubah +AutoTracker.Info.PossibleReplace=Sebuah pertandingan yang mungkin ditampilkan . Pilihan Anda adalah : +AutoTracker.Wizard.Button.Accept=Terima +AutoTracker.Wizard.Button.Stop=Berhenti +AutoTracker.Wizard.Button.Skip=Loncat +AutoTracker.Wizard.Button.Replace=Ganti +AutoTracker.Wizard.Button.Keep=Penurunan +AutoTracker.Wizard.Button.Search=Pencarian +AutoTracker.Wizard.Button.SearchThis=Cari Ini +AutoTracker.Wizard.Button.SearchNext=Cari Berikutnya +AutoTracker.Wizard.Button.Delete=Hapus +AutoTracker.Wizard.Button.ShowKeyFrame=Tampilkan Frame Kunci +AutoTracker.Wizard.Button.DeleteKeyFrame=Hapus Frame Kunci +AutoTracker.Wizard.Checkbox.LookAhead=Lihat Dari Atas +AutoTracker.Wizard.Checkbox.XAxis=Hanya Sumbu X +AutoTracker.Wizard.Menuitem.DeleteThis=Titik ini +AutoTracker.Wizard.Menuitem.DeleteLater=Titik Selanjutnya +AutoTracker.Wizard.Menuitem.DeleteAll=Batal Semua +TToolBar.Button.AutoTracker.Tooltip=Menampilkan atau menyembunyikan autotracker +MainTView.Popup.MenuItem.ZoomIn=Perbesar +MainTView.Popup.MenuItem.ZoomOut=Perkecil +MainTView.Popup.MenuItem.ZoomToFit=Pembesaran Ditetapkan +TrackerIO.Dialog.DurationVaries.Title=Frame Durasi +TrackerIO.Dialog.DurationVaries.Message1=Beberapa beda durasi frame dari lebih dari rata-rata +TrackerIO.Dialog.DurationVaries.Message2=Untuk kecepatan dan percepatan akurat, Anda harus mengecualikan frame ini dari +TrackerIO.Dialog.DurationVaries.Message3=perhitungan dengan menetapkan frame awal dan frame akhir dari klip video. +TrackerIO.Dialog.DurationVaries.Message4=Pengecualian Untuk Frame : +TrackerIO.Dialog.DurationVaries.Message5=Durasi rata-rata dan nilai frame jika dikesampingkan: +TFrame.Dialog.LibraryError.Title=Kesalahan +TFrame.Dialog.LibraryError.Message=Tidak ada sumber daya dapat diambil untuk node # Penambahan oleh Doug Brown 2011-12-01 -TTrack.Label.Unmarked = shift-klik untuk menandai -PrefsDialog.Label.Path = Jalur -PrefsDialog.Checkbox.ClearCacheOnExit = Hapus pada keluar -PrefsDialog.FileChooser.Title.Cache = Atur Tombolok -PrefsDialog.FileFilter.Directories = Direktori -Tracker.Action.AboutThreads = Perihal Thread -PrefsDialog.JRE.BorderTitle = Java Virtual Machine -PrefsDialog.FileChooser.Title.JRE = Atur Java VM -PrefsDialog.FileFilter.JRE = Direktori dan Java VM -PrefsDialog.Version.BorderTitle = Tracker Versi -PrefsDialog.Version.Default = default -PrefsDialog.Tab.ClearCacheOnExit = Hapus pada keluar -PrefsDialog.Run.BorderTitle = Program Dieksekusi saat Startup -PrefsDialog.FileChooser.Title.Run = Pilih Berkas Executable -PrefsDialog.Button.Save = Simpan -Tracker.Readme = Tracker README -Tracker.Readme.NotFound = README file tidak ditemukan -Popup.MenuItem.Algorithm = Algoritma -AlgorithmDialog.Button.FiniteDifference = Hingga Perbedaan -AlgorithmDialog.Button.BounceDetect = Deteksi Pantulan -AlgorithmDialog.TitledBorder.Choose = Pilih algoritma yang digunakan untuk menghitung kecepatan dan percepatan: -AlgorithmDialog.Title = Algoritma -AlgorithmDialog.FiniteDifference.Message1 = ini adalah algoritma default. -AlgorithmDialog.FiniteDifference.Message2 = Velocity : v[i] = (x[i+1] - x[i-1]) / (2*dt ) -AlgorithmDialog.FiniteDifference.Message3 = Percepatan : a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2] ) / (7*dt^2) -AlgorithmDialog.BounceDetect.Message1 = Algoritma ini menghaluskan kecepatan dan percepatan, tetapi juga mendeteksi perubahan mendadak dalam kecepatan. -AlgorithmDialog.BounceDetect.Message2 = Perhatian: dapat menghasilkan artefak. Untuk informasi lebih lanjut, lihat : -TMenuBar.Menu.Diagnostics = Diagnostik +TTrack.Label.Unmarked=shift-klik untuk menandai +PrefsDialog.Label.Path=Jalur +PrefsDialog.Checkbox.ClearCacheOnExit=Hapus pada keluar +PrefsDialog.FileChooser.Title.Cache=Atur Tombolok +PrefsDialog.FileFilter.Directories=Direktori +Tracker.Action.AboutThreads=Perihal Thread +PrefsDialog.JRE.BorderTitle=Java Virtual Machine +PrefsDialog.FileChooser.Title.JRE=Atur Java VM +PrefsDialog.FileFilter.JRE=Direktori dan Java VM +PrefsDialog.Version.BorderTitle=Tracker Versi +PrefsDialog.Version.Default=default +PrefsDialog.Tab.ClearCacheOnExit=Hapus pada keluar +PrefsDialog.Run.BorderTitle=Program Dieksekusi saat Startup +PrefsDialog.FileChooser.Title.Run=Pilih Berkas Executable +PrefsDialog.Button.Save=Simpan +Tracker.Readme=Tracker README +Tracker.Readme.NotFound=README file tidak ditemukan +Popup.MenuItem.Algorithm=Algoritma +AlgorithmDialog.Button.FiniteDifference=Hingga Perbedaan +AlgorithmDialog.Button.BounceDetect=Deteksi Pantulan +AlgorithmDialog.TitledBorder.Choose=Pilih algoritma yang digunakan untuk menghitung kecepatan dan percepatan: +AlgorithmDialog.Title=Algoritma +AlgorithmDialog.FiniteDifference.Message1=ini adalah algoritma default. +AlgorithmDialog.FiniteDifference.Message2=Velocity : v[i]=(x[i+1] - x[i-1]) / (2*dt ) +AlgorithmDialog.FiniteDifference.Message3=Percepatan : a[i]=(2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2] ) / (7*dt^2) +AlgorithmDialog.BounceDetect.Message1=Algoritma ini menghaluskan kecepatan dan percepatan, tetapi juga mendeteksi perubahan mendadak dalam kecepatan. +AlgorithmDialog.BounceDetect.Message2=Perhatian: dapat menghasilkan artefak. Untuk informasi lebih lanjut, lihat : +TMenuBar.Menu.Diagnostics=Diagnostik # Penambahan oleh Doug Brown 2012-02-12 -Tracker.Dialog.Invalid.Title = Berkas XML Tidak Valid -Tracker.Dialog.Invalid.Message = Berkas tidak dapat dibaca . -TrackPlottingPanel.Popup.Menu.CompareWith = Bandingkan Dengan -TrackerPanel.DataBuilder.TrackType.Unknown = TakDikenal -TrackerPanel.DataBuilder.Button.Load.Tooltip = Memuat fungsi Data dari berkas XML -TrackerPanel.DataBuilder.Button.Save.Tooltip = Simpan fungsi data dalam berkas XML -TrackerPanel.DataBuilder.Load.Title = Memuat Fungsi Data -TrackerPanel.DataBuilder.Load.Message = Pilih fungsi untuk dimuat : -TrackerPanel.DataBuilder.Save.Title = Simpan Fungsi Data -TrackerPanel.DataBuilder.Save.Message = Pilih fungsi untuk disimpan : -TrackerPanel.DataBuilder.Dialog.Load.Button.All = Memuat ke semua -TrackerPanel.DataBuilder.Dialog.Load.Button.Only = Memuat hanya -TrackerPanel.DataBuilder.Dialog.Load.Title = Seleksi Track -TrackerPanel.DataBuilder.Dialog.Load.Message = Apakah Anda ingin memuat fungsi untuk menjadi semua jenis trek -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title = Salah Tipe Track -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1 = Berkas mendefinisikan fungsi data untuk jenis track -TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2 = Mereka tidak dapat dimuat ke dalam jenis -TrackerPanel.DataBuilder.Dialog.WrongType.Title = Salah Ketik -TrackerPanel.DataBuilder.Dialog.WrongType.Message = Berkas tidak mendefinisikan fungsi data. +Tracker.Dialog.Invalid.Title=Berkas XML Tidak Valid +Tracker.Dialog.Invalid.Message=Berkas tidak dapat dibaca . +TrackPlottingPanel.Popup.Menu.CompareWith=Bandingkan Dengan +TrackerPanel.DataBuilder.TrackType.Unknown=TakDikenal +TrackerPanel.DataBuilder.Button.Load.Tooltip=Memuat fungsi Data dari berkas XML +TrackerPanel.DataBuilder.Button.Save.Tooltip=Simpan fungsi data dalam berkas XML +TrackerPanel.DataBuilder.Load.Title=Memuat Fungsi Data +TrackerPanel.DataBuilder.Load.Message=Pilih fungsi untuk dimuat : +TrackerPanel.DataBuilder.Save.Title=Simpan Fungsi Data +TrackerPanel.DataBuilder.Save.Message=Pilih fungsi untuk disimpan : +TrackerPanel.DataBuilder.Dialog.Load.Button.All=Memuat ke semua +TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Memuat hanya +TrackerPanel.DataBuilder.Dialog.Load.Title=Seleksi Track +TrackerPanel.DataBuilder.Dialog.Load.Message=Apakah Anda ingin memuat fungsi untuk menjadi semua jenis trek +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Salah Tipe Track +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Berkas mendefinisikan fungsi data untuk jenis track +TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Mereka tidak dapat dimuat ke dalam jenis +TrackerPanel.DataBuilder.Dialog.WrongType.Title=Salah Ketik +TrackerPanel.DataBuilder.Dialog.WrongType.Message=Berkas tidak mendefinisikan fungsi data. # Penambahan oleh Doug Brown 2012-04-22 -ExportTRKDialog.Complete.Message1 = Klip Tracker telah disimpan sebagai -ExportTRKDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ExportTRKDialog.Complete.Title = Ekspor Lengkap -ExportTRKDialog.Title = Ekspor Klip Tracker -ExportTRKDialog.Message1 = Ini (1) ekspor klip video, (2) ubah data tab untuk mencocokkan video yang diekspor, dan (3) simpan tab dikonversi sebagai file Tracker baru. -ExportTRKDialog.Message2 = Tracker dan berkas video disimpan dalam direktori yang sama dengan nama yang sama tapi ekstensi berbeda. -TMenuBar.MenuItem.TabClip = Klip Tracker -TMenuBar.Menu.CalibrationTools = Alat Kalibrasi -TrackerIO.Dialog.DurationVaries.Button.SetClip = Pengaturan Direkomendasikan Klip -TrackerIO.Dialog.DurationVaries.Start = mulai -TrackerIO.Dialog.DurationVaries.End = akhir -TrackerIO.Dialog.DurationVaries.Recommended = Rekomendasi Clip +ExportTRKDialog.Complete.Message1=Klip Tracker telah disimpan sebagai +ExportTRKDialog.Complete.Message2=Apakah Anda ingin membukanya di Tracker sekarang? +ExportTRKDialog.Complete.Title=Ekspor Lengkap +ExportTRKDialog.Title=Ekspor Klip Tracker +ExportTRKDialog.Message1=Ini (1) ekspor klip video, (2) ubah data tab untuk mencocokkan video yang diekspor, dan (3) simpan tab dikonversi sebagai file Tracker baru. +ExportTRKDialog.Message2=Tracker dan berkas video disimpan dalam direktori yang sama dengan nama yang sama tapi ekstensi berbeda. +TMenuBar.MenuItem.TabClip=Klip Tracker +TMenuBar.Menu.CalibrationTools=Alat Kalibrasi +TrackerIO.Dialog.DurationVaries.Button.SetClip=Pengaturan Direkomendasikan Klip +TrackerIO.Dialog.DurationVaries.Start=mulai +TrackerIO.Dialog.DurationVaries.End=akhir +TrackerIO.Dialog.DurationVaries.Recommended=Rekomendasi Clip # Penambahan oleh Doug Brown 2012-05-07 -AttachmentInspector.Title = Lampirkan Akhir -AttachmentInspector.Label.End = Akhir -AttachmentInspector.Label.Vertex = Vertex -AttachmentInspector.Header.PointName = Nama -AttachmentInspector.Header.AttachedTo = Lampirkan Untuk -ExportTRKDialog.Label.VideoFormat = Format Video -MeasuringTool.MenuItem.Attach = Lampirkan Akhir -PerspectiveTrack.Corner = sudut -PrefsDialog.LogLevel.BorderTitle = Startup Pesan Tingkat Log -Protractor.Data.Description.0 = waktu -Protractor.Data.Description.1 = busur derajat sudut -Protractor.Data.Description.2 = panjang lengan 1 -Protractor.Data.Description.3 = panjang lengan 2 -Protractor.Data.Description.4 = jumlah langkah -Protractor.Data.Description.5 = nomor rangka -TapeMeasure.Data.Description.0 = waktu -TapeMeasure.Data.Description.1 = panjang -TapeMeasure.Data.Description.2 = sudut diukur dari sumbu x + -TapeMeasure.Data.Description.3 = jumlah langkah -TapeMeasure.Data.Description.4 = nomor rangka +AttachmentInspector.Title=Lampirkan Akhir +AttachmentInspector.Label.End=Akhir +AttachmentInspector.Label.Vertex=Vertex +AttachmentInspector.Header.PointName=Nama +AttachmentInspector.Header.AttachedTo=Lampirkan Untuk +ExportTRKDialog.Label.VideoFormat=Format Video +MeasuringTool.MenuItem.Attach=Lampirkan Akhir +PerspectiveTrack.Corner=sudut +PrefsDialog.LogLevel.BorderTitle=Startup Pesan Tingkat Log +Protractor.Data.Description.0=waktu +Protractor.Data.Description.1=busur derajat sudut +Protractor.Data.Description.2=panjang lengan 1 +Protractor.Data.Description.3=panjang lengan 2 +Protractor.Data.Description.4=jumlah langkah +Protractor.Data.Description.5=nomor rangka +TapeMeasure.Data.Description.0=waktu +TapeMeasure.Data.Description.1=panjang +TapeMeasure.Data.Description.2=sudut diukur dari sumbu x + +TapeMeasure.Data.Description.3=jumlah langkah +TapeMeasure.Data.Description.4=nomor rangka # Penambahan oleh Doug Brown 2012-06-07 -AutoTracker.Info.Unsearched = Pencarian tidak ditemukan -AutoTracker.Info.KeyFrame = Frame Kunci -AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame = Kunci Frame Ini -AutoTracker.Wizard.Menuitem.DeleteThisMatch = Pengamatan Ini -AutoTracker.Wizard.Menuitem.DeleteLaterMatches = Pengamatan Se;anjutnya -PrefsDialog.Checkbox.64BitVM = 64-bit +AutoTracker.Info.Unsearched=Pencarian tidak ditemukan +AutoTracker.Info.KeyFrame=Frame Kunci +AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Kunci Frame Ini +AutoTracker.Wizard.Menuitem.DeleteThisMatch=Pengamatan Ini +AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Pengamatan Se;anjutnya +PrefsDialog.Checkbox.64BitVM=64-bit # Penambahan oleh Doug Brown 2012/11/20 -AutoTracker.Wizard.Title = Autotracker -Dialog.Button.Add = Tambah -Dialog.Button.Remove = Hapus -PrefsDialog.Button.ClearHost = Batal host -PrefsDialog.Button.ClearHost.Tooltip = menghapus semua berkas yang berhubungan dengan web host yang dipilih dari tembolok OSP -PrefsDialog.Button.ClearCache.Tooltip = menghapus semua berkas dari tembolok OSP -TActions.Action.SaveZip = Ekspor Tracker ZIP -ThumbnailDialog.Title = Ekspor Gambar kecil -ThumbnailDialog.Settings.Title = Pilihan Thumbnail -ThumbnailDialog.Label.CurrentImage = Gambar Lancar -ThumbnailDialog.Label.FrameNumber = frame -ThumbnailDialog.Label.StepNumber = langkah -ThumbnailDialog.View.VideoOnly = Hanya Video -ThumbnailDialog.View.MainView = Pengamatan Utama -ThumbnailDialog.View.WholeFrame = Seluruh Frame -ThumbnailDialog.Format.PNG = Gambar PNG -ThumbnailDialog.Format.JPG = Image JPEG -ThumbnailDialog.Chooser.SaveThumbnail.Title = Simpan Thumbnail -ThumbnailDialog.Subtitle.Image = Gambar -TMenuBar.MenuItem.Thumbnail = Gambar kecil -TToolBar.Button.SaveZip.Tooltip = Ekspor Tracker berkas ZIP -TTrack.MenuItem.DeletePoint = Hapus Langkah Dipilih -ZipResourceDialog.Title = Ekspor Tracker ZIP -ZipResourceDialog.Label.Format = Format -ZipResourceDialog.Label.Title = Nama -ZipResourceDialog.Label.Description = Keterangan -ZipResourceDialog.Label.Keywords = Kata Kunci -ZipResourceDialog.Label.Link = Link eksternal -ZipResourceDialog.Label.HTML = Sumber HTML -ZipResourceDialog.Complete.Message1 = Berkas Tracker ZIP telah disimpan sebagai -ZipResourceDialog.Complete.Message2 = Apakah Anda ingin membukanya di Tracker sekarang? -ZipResourceDialog.Complete.Title = Sukses -ZipResourceDialog.Border.Title.Documentation = Dokumentasi HTML -ZipResourceDialog.Border.Title.Video = Video -ZipResourceDialog.Border.Title.Thumbnail = Thumbnail -ZipResourceDialog.FileChooser.SaveZip.Title = Ekspor Tracker ZIP -ZipResourceDialog.FileChooser.AddFile.Title = Tambah Berkas untuk Tracker ZIP -ZipResourceDialog.FileChooser.OpenHTML.Title = Buka berkas HTML -ZipResourceDialog.Button.AddFiles = Tambah Berkas -ZipResourceDialog.Button.ThumbnailSettings = Thumbnail Pilihan -ZipResourceDialog.Checkbox.TrimVideo = Potong untuk Klip -ZipResourceDialog.AddHTMLInfo.Title = Tambah Info Berkas HTML -ZipResourceDialog.AddHTMLInfo.Message1 = Apakah Anda ingin menambahkan berkas info HTML -ZipResourceDialog.AddHTMLInfo.Message2 = ke ZIP Tracker? -ZipResourceDialog.HTMLField.DefaultText = Jika tidak ditentukan, berkas akan dibuat dari awal -ZipResourceDialog.Dialog.AddFiles.Title = Tambah HTML dan Berkas PDF -ZipResourceDialog.Tooltip.HTML = Jalur ke berkas sumber HTML (jika tidak ada, berkas akan dibuat dari awal) -ZipResourceDialog.Tooltip.Author = Penulis sumber daya ini -ZipResourceDialog.Tooltip.Title = Nama Tampilan sumber ini (bukan nama file) -ZipResourceDialog.Tooltip.Description = Penjelasan yang berguna sumber daya ini -ZipResourceDialog.Tooltip.Keywords = Sebuah daftar kata kunci untuk mencari di browser DL -ZipResourceDialog.Tooltip.Contact = Penulis informasi kontak (institusi, e-mail, situs web, dll ) -ZipResourceDialog.Tooltip.Link = URL dari berkas HTML eksternal dengan informasi lebih lanjut tentang sumber daya ini -ZipResourceDialog.Tooltip.ThumbnailSettings = Mengubah tampilan thumbnail, ukuran atau jenis file -ZipResourceDialog.Tooltip.AddFiles = Tambah HTML dan berkas PDF ke ZIP Tracker -ZipResourceDialog.Tooltip.TrimVideo = Periksa untuk mengekspor klip video, hapus centang untuk menggunakan video asli -ZipResourceDialog.Tooltip.LoadHTML = Gunakan pemilih berkas untuk memuat file HTML Info +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Tambah +Dialog.Button.Remove=Hapus +PrefsDialog.Button.ClearHost=Batal host +PrefsDialog.Button.ClearHost.Tooltip=menghapus semua berkas yang berhubungan dengan web host yang dipilih dari tembolok OSP +PrefsDialog.Button.ClearCache.Tooltip=menghapus semua berkas dari tembolok OSP +TActions.Action.SaveZip=Ekspor Tracker ZIP +ThumbnailDialog.Title=Ekspor Gambar kecil +ThumbnailDialog.Settings.Title=Pilihan Thumbnail +ThumbnailDialog.Label.CurrentImage=Gambar Lancar +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=langkah +ThumbnailDialog.View.VideoOnly=Hanya Video +ThumbnailDialog.View.MainView=Pengamatan Utama +ThumbnailDialog.View.WholeFrame=Seluruh Frame +ThumbnailDialog.Format.PNG=Gambar PNG +ThumbnailDialog.Format.JPG=Image JPEG +ThumbnailDialog.Chooser.SaveThumbnail.Title=Simpan Thumbnail +ThumbnailDialog.Subtitle.Image=Gambar +TMenuBar.MenuItem.Thumbnail=Gambar kecil +TToolBar.Button.SaveZip.Tooltip=Ekspor Tracker berkas ZIP +TTrack.MenuItem.DeletePoint=Hapus Langkah Dipilih +ZipResourceDialog.Title=Ekspor Tracker ZIP +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Nama +ZipResourceDialog.Label.Description=Keterangan +ZipResourceDialog.Label.Keywords=Kata Kunci +ZipResourceDialog.Label.Link=Link eksternal +ZipResourceDialog.Label.HTML=Sumber HTML +ZipResourceDialog.Complete.Message1=Berkas Tracker ZIP telah disimpan sebagai +ZipResourceDialog.Complete.Message2=Apakah Anda ingin membukanya di Tracker sekarang? +ZipResourceDialog.Complete.Title=Sukses +ZipResourceDialog.Border.Title.Documentation=Dokumentasi HTML +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Ekspor Tracker ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Tambah Berkas untuk Tracker ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Buka berkas HTML +ZipResourceDialog.Button.AddFiles=Tambah Berkas +ZipResourceDialog.Button.ThumbnailSettings=Thumbnail Pilihan +ZipResourceDialog.Checkbox.TrimVideo=Potong untuk Klip +ZipResourceDialog.AddHTMLInfo.Title=Tambah Info Berkas HTML +ZipResourceDialog.AddHTMLInfo.Message1=Apakah Anda ingin menambahkan berkas info HTML +ZipResourceDialog.AddHTMLInfo.Message2=ke ZIP Tracker? +ZipResourceDialog.HTMLField.DefaultText=Jika tidak ditentukan, berkas akan dibuat dari awal +ZipResourceDialog.Dialog.AddFiles.Title=Tambah HTML dan Berkas PDF +ZipResourceDialog.Tooltip.HTML=Jalur ke berkas sumber HTML (jika tidak ada, berkas akan dibuat dari awal) +ZipResourceDialog.Tooltip.Author=Penulis sumber daya ini +ZipResourceDialog.Tooltip.Title=Nama Tampilan sumber ini (bukan nama file) +ZipResourceDialog.Tooltip.Description=Penjelasan yang berguna sumber daya ini +ZipResourceDialog.Tooltip.Keywords=Sebuah daftar kata kunci untuk mencari di browser DL +ZipResourceDialog.Tooltip.Contact=Penulis informasi kontak (institusi, e-mail, situs web, dll ) +ZipResourceDialog.Tooltip.Link=URL dari berkas HTML eksternal dengan informasi lebih lanjut tentang sumber daya ini +ZipResourceDialog.Tooltip.ThumbnailSettings=Mengubah tampilan thumbnail, ukuran atau jenis file +ZipResourceDialog.Tooltip.AddFiles=Tambah HTML dan berkas PDF ke ZIP Tracker +ZipResourceDialog.Tooltip.TrimVideo=Periksa untuk mengekspor klip video, hapus centang untuk menggunakan video asli +ZipResourceDialog.Tooltip.LoadHTML=Gunakan pemilih berkas untuk memuat file HTML Info # Penambahan oleh Doug Brown 2012/12/10 -PrefsDialog.Checkbox.32BitVM = 32-bit -PrefsDialog.Checkbox.WarnVariableDuration = Variabel durasi frame -PrefsDialog.Button.NoEngine = Tidak ada -PrefsDialog.Dialog.SwitchToQT.Message = Beralih ke QuickTime juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message = Beralih ke Xuggle juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message = Beralih ke Xuggle juga perubahan VM Java untuk 64-bit. -PrefsDialog.Dialog.SwitchVM.Title = Java VM Berubah -PrefsDialog.Dialog.SwitchTo32.Message = Beralih ke 32-bit Java VM juga mengubah mesin video QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message = Beralih ke 64-bit Java VM juga mengubah mesin video Xuggle. -PrefsDialog.Dialog.SwitchEngine.Title = Video Mesin Berubah -PrefsDialog.Dialog.NoEngineIn64bitVM.Message1 = mesin ada video yang tersedia untuk 64-bit Java VM. Anda akan -PrefsDialog.Dialog.NoEngineIn64bitVM.Message2 = masih dapat gambar terbuka (JPEG , PNG) dan animasi GIF. -PrefsDialog.Dialog.NoEngineIn64bitVM.Question = Anda yakin ingin beralih ke VM 64-bit? -PrefsDialog.Dialog.NoEngineIn64bitVM.Title = Tidak ada 64-bit Video Mesin -PrefsDialog.Dialog.No32bitVMXuggle.Message = A 32-bit Java VM harus diinstal sebelum Xuggle dapat digunakan. -PrefsDialog.Dialog.No32bitVMQT.Message = A 32-bit Java VM harus diinstal sebelum QuickTime dapat digunakan. -PrefsDialog.Dialog.No32bitVM.Message = Untuk informasi lebih lanjut, lihat Bantuan Tracker: Instalasi. -PrefsDialog.Dialog.No32bitVM.Title = Diperlukan VM 32-bit -PrefsDialog.Button.ShowHelpNow = Tampilkan Bantuan Sekarang -TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant = TIDAK KONSTAN -TMenuBar.MenuItem.CheckFrameDurations = Pemeriksaan Durasi Frame -TMenuBar.MenuItem.ExportZIP = Tracker Zip -Tracker.Dialog.Install32BitVM.Message = Anda harus menginstal Java VM 32-bit sebelum mesin video dapat digunakan. -Tracker.Dialog.SwitchTo32BitVM.Message1 = Satu atau lebih mesin video terinstal tapi tidak tersedia karena mereka -Tracker.Dialog.SwitchTo32BitVM.Message2 = memerlukan Java VM 32-bit dan Anda sekarang sedang berjalan di VM 64-bit. -Tracker.Dialog.SwitchTo32BitVM.Question = Apakah Anda ingin meluncurkan kembali dengan VM 32 bit dan mesin default? -Tracker.Dialog.Button.RelaunchNow = Ya, peluncuran kembali sekarang -Tracker.Dialog.Button.ShowPrefs = Tidak, tapi melalui preferensi -Tracker.Dialog.Button.ContinueWithoutEngine = Tidak, lanjutkan tanpa video -Tracker.Dialog.EngineProblems.Message1 = Satu atau lebih mesin video terinstal tapi tidak bekerja . -Tracker.Dialog.EngineProblems.Message2 = Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang Xuggle atau QuickTime . -Tracker.Dialog.ReplaceXuggle.Message1 = Kami sarankan anda mengganti mesin video Xuggle anda saat ini -Tracker.Dialog.ReplaceXuggle.Message2 = Xuggle dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 -Tracker.Dialog.ReplaceXuggle.Message3 = atau di atasnya) dan memilih Xuggle dalam pilihan instalasi. -TrackerIO.Dialog.DurationIsConstant.Message = Semua durasi frame sama (fps konstan) . -TrackerIO.ZIPResourceFilter.Description = Tracker Berkas ZIP (*.TRZ) -TToolbar.Button.Desktop.Tooltip = Tampilan tambahan HTML dan atau dokumen PDF -ZipResourceDialog.BadModels.Message1 = Klip video tidak termasuk awal kerangka -ZipResourceDialog.BadModels.Message2 = berikut trek Partikel Model. Jika Anda memotong video yang -ZipResourceDialog.BadModels.Message3 = model TIDAK akan disertakan dalam diekspor Tracker ZIP. -ZipResourceDialog.BadModels.Question = Apakah Anda ingin melanjutkan dan membuang model? -ZipResourceDialog.BadModels.Title = Klip - Model Konflik -TMenuBar.MenuItem.EditVideoFrames = Muat Semua Gambar -TMenuBar.Dialog.RequiresMemory.Message1 = Semua gambar akan dimuat ke memori untuk respon lebih cepat dan pembenahan. -TMenuBar.Dialog.RequiresMemory.Message2 = Silakan periksa memori yang tersedia dan peluncuran dengan lebih jika diperlukan. -TMenuBar.Dialog.RequiresMemory.Title = Memori +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variabel durasi frame +PrefsDialog.Button.NoEngine=Tidak ada +PrefsDialog.Dialog.SwitchToQT.Message=Beralih ke QuickTime juga perubahan VM Java untuk 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Beralih ke Xuggle juga perubahan VM Java untuk 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Beralih ke Xuggle juga perubahan VM Java untuk 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Berubah +PrefsDialog.Dialog.SwitchTo32.Message=Beralih ke 32-bit Java VM juga mengubah mesin video QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Beralih ke 64-bit Java VM juga mengubah mesin video Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Mesin Berubah +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=mesin ada video yang tersedia untuk 64-bit Java VM. Anda akan +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=masih dapat gambar terbuka (JPEG , PNG) dan animasi GIF. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Anda yakin ingin beralih ke VM 64-bit? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Tidak ada 64-bit Video Mesin +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM harus diinstal sebelum Xuggle dapat digunakan. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM harus diinstal sebelum QuickTime dapat digunakan. +PrefsDialog.Dialog.No32bitVM.Message=Untuk informasi lebih lanjut, lihat Bantuan Tracker: Instalasi. +PrefsDialog.Dialog.No32bitVM.Title=Diperlukan VM 32-bit +PrefsDialog.Button.ShowHelpNow=Tampilkan Bantuan Sekarang +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=TIDAK KONSTAN +TMenuBar.MenuItem.CheckFrameDurations=Pemeriksaan Durasi Frame +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=Anda harus menginstal Java VM 32-bit sebelum mesin video dapat digunakan. +Tracker.Dialog.SwitchTo32BitVM.Message1=Satu atau lebih mesin video terinstal tapi tidak tersedia karena mereka +Tracker.Dialog.SwitchTo32BitVM.Message2=memerlukan Java VM 32-bit dan Anda sekarang sedang berjalan di VM 64-bit. +Tracker.Dialog.SwitchTo32BitVM.Question=Apakah Anda ingin meluncurkan kembali dengan VM 32 bit dan mesin default? +Tracker.Dialog.Button.RelaunchNow=Ya, peluncuran kembali sekarang +Tracker.Dialog.Button.ShowPrefs=Tidak, tapi melalui preferensi +Tracker.Dialog.Button.ContinueWithoutEngine=Tidak, lanjutkan tanpa video +Tracker.Dialog.EngineProblems.Message1=Satu atau lebih mesin video terinstal tapi tidak bekerja . +Tracker.Dialog.EngineProblems.Message2=Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang Xuggle atau QuickTime . +Tracker.Dialog.ReplaceXuggle.Message1=Kami sarankan anda mengganti mesin video Xuggle anda saat ini +Tracker.Dialog.ReplaceXuggle.Message2=Xuggle dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=atau di atasnya) dan memilih Xuggle dalam pilihan instalasi. +TrackerIO.Dialog.DurationIsConstant.Message=Semua durasi frame sama (fps konstan) . +TrackerIO.ZIPResourceFilter.Description=Tracker Berkas ZIP (*.TRZ) +TToolbar.Button.Desktop.Tooltip=Tampilan tambahan HTML dan atau dokumen PDF +ZipResourceDialog.BadModels.Message1=Klip video tidak termasuk awal kerangka +ZipResourceDialog.BadModels.Message2=berikut trek Partikel Model. Jika Anda memotong video yang +ZipResourceDialog.BadModels.Message3=model TIDAK akan disertakan dalam diekspor Tracker ZIP. +ZipResourceDialog.BadModels.Question=Apakah Anda ingin melanjutkan dan membuang model? +ZipResourceDialog.BadModels.Title=Klip - Model Konflik +TMenuBar.MenuItem.EditVideoFrames=Muat Semua Gambar +TMenuBar.Dialog.RequiresMemory.Message1=Semua gambar akan dimuat ke memori untuk respon lebih cepat dan pembenahan. +TMenuBar.Dialog.RequiresMemory.Message2=Silakan periksa memori yang tersedia dan peluncuran dengan lebih jika diperlukan. +TMenuBar.Dialog.RequiresMemory.Title=Memori # Penambahan oleh Doug Brown 2013/01/25 -PointMass.Data.Description.PixelX = komponen pixel-x -PointMass.Data.Description.PixelY = komponen pixel-y -ExportVideoDialog.Content.DeinterlacedVideo = Video yang ter-deinterlace -ExportVideoDialog.Deinterlace.OddFirst = Isian negatif pertama -ExportVideoDialog.Deinterlace.EvenFirst = Kejadian lapangan pertama -ExportVideoDialog.Deinterlace.Dialog.Title = Isian orde ter-deinterlace -TFrame.Dialog.LibraryError.FileNotFound.Title = Berkas Tidak Ditemukan -TFrame.Dialog.LibraryError.FileNotFound.Message = Tidak dapat menemukan berkas -TrackerPanel.DataBuilder.Button.Autoload = Memuat automatik -TrackerPanel.DataBuilder.Button.Autoload.Tooltip = Mengelola automuat fungsi data -TrackerPanel.DataBuilder.Autoload.Title = Automuat Fungsi Data -TrackerPanel.DataBuilder.Autoload.Message = Pilih fungsi untuk automuat: -TrackerPanel.DataBuilder.Chooser.XMLFiles = Berkas XML -TrackerIO.Dialog.Open.Title = Buka -TToolbar.Button.Refresh.Popup.RefreshNow = Segarkan -TToolbar.Button.Refresh.Popup.AutoRefresh = Autosegar -TToolbar.Button.Refresh.Tooltip = Segarkan data dan pandangan +PointMass.Data.Description.PixelX=komponen pixel-x +PointMass.Data.Description.PixelY=komponen pixel-y +ExportVideoDialog.Content.DeinterlacedVideo=Video yang ter-deinterlace +ExportVideoDialog.Deinterlace.OddFirst=Isian negatif pertama +ExportVideoDialog.Deinterlace.EvenFirst=Kejadian lapangan pertama +ExportVideoDialog.Deinterlace.Dialog.Title=Isian orde ter-deinterlace +TFrame.Dialog.LibraryError.FileNotFound.Title=Berkas Tidak Ditemukan +TFrame.Dialog.LibraryError.FileNotFound.Message=Tidak dapat menemukan berkas +TrackerPanel.DataBuilder.Button.Autoload=Memuat automatik +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Mengelola automuat fungsi data +TrackerPanel.DataBuilder.Autoload.Title=Automuat Fungsi Data +TrackerPanel.DataBuilder.Autoload.Message=Pilih fungsi untuk automuat: +TrackerPanel.DataBuilder.Chooser.XMLFiles=Berkas XML +TrackerIO.Dialog.Open.Title=Buka +TToolbar.Button.Refresh.Popup.RefreshNow=Segarkan +TToolbar.Button.Refresh.Popup.AutoRefresh=Autosegar +TToolbar.Button.Refresh.Tooltip=Segarkan data dan pandangan # Penambahan oleh Doug Brown 2013/05/10 -CoordAxes.Origin.Label = posisi asal pixel -CoordAxes.Origin.Field.Tooltip = posisi asal diukur dari sudut kiri atas video \ No newline at end of file +CoordAxes.Origin.Label=posisi asal pixel +CoordAxes.Origin.Field.Tooltip=posisi asal diukur dari sudut kiri atas video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties index 6bf84bda..b9edcc6a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties @@ -1192,3 +1192,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Cambia la vista miniatura, dimension ZipResourceDialog.Tooltip.AddFiles=Aggiungi file HTML e PDF alla risorsa ZIP ZipResourceDialog.Tooltip.TrimVideo=Seleziona per l'esportazione della clip video, deseleziona per usare il video originale ZipResourceDialog.Tooltip.LoadHTML=Usa un navigatore file per caricare un file di informazioni HTML + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties index 124453e4..eb0afb93 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties @@ -1293,3 +1293,141 @@ TableTrackView.Action.RenameTextColumn.Text=\u05ea\u05df \u05e9\u05dd \u05d7\u05 TableTrackView.Dialog.NameColumn.Message=\u05d4\u05db\u05e0\u05e1 \u05e9\u05dd \u05e2\u05de\u05d5\u05d3\u05d4. TableTrackView.Dialog.NameColumn.TryAgain=\u05e9\u05dd \u05d6\u05d4 \u05db\u05d1\u05e8 \u05d1\u05e9\u05d9\u05de\u05d5\u05e9. TableTrackView.Dialog.NameColumn.Title=\u05e2\u05de\u05d5\u05d3\u05ea \u05d8\u05e7\u05e1\u05d8 +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties index c5b4f983..76c8cda2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties @@ -1197,3 +1197,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=\ubbf8\ub9ac\ubcf4\uae30\uc758 \ud06 ZipResourceDialog.Tooltip.AddFiles=HTML \ub610\ub294 PDF \ud30c\uc77c\uc744 \uc555\ucd95 \ud30c\uc77c\uc5d0 \ucd94\uac00 ZipResourceDialog.Tooltip.TrimVideo=\ube44\ub514\uc624 \ud074\ub9bd\uc744 \ub2e4\ub978 \ud615\uc2dd\uc73c\ub85c \ubcf4\ub0b4\ub824\uba74 \uc120\ud0dd, \uc6d0\ubcf8 \ube44\ub514\uc624\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ud574\uc81c ZipResourceDialog.Tooltip.LoadHTML=\ud30c\uc77c \ub300\ud654 \uc0c1\uc790\uc5d0\uc11c HTML \ud30c\uc77c\uc744 \uc120\ud0dd\ud558\uc5ec \ubd88\ub7ec\uc634 + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties index c3281901..3bd2a3ee 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties @@ -1261,4 +1261,159 @@ ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the follow ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed -PrefsDialog.Button.SetCache=Set Cache \ No newline at end of file +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties index 90047665..85f9ee5d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties @@ -1,5 +1,5 @@ # This is the Brazilian Portuguese tracker.properties file -# Translated by Arthur Nunes Santana,Paulo Simeão Carvalho, Edite Briosa, Marcelo Rodrigues e Daniel Ribeiro +# Translated by Arthur Nunes Santana, Paulo Simeão Carvalho, Edite Briosa, Marcelo Rodrigues e Daniel Ribeiro Calibration.Name=Pontos de Calibração Calibration.New.Name=calibração @@ -1143,3 +1143,298 @@ AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Este Quadro-chave AutoTracker.Wizard.Menuitem.DeleteThisMatch=Esta correspondência AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Últimas correspondências PrefsDialog.Checkbox.64BitVM=64-bit + +# Additions by Doug Brown 2012-11-20 +AutoTracker.Wizard.Title=Autotracker +Dialog.Button.Add=Add +Dialog.Button.Remove=Remove +PrefsDialog.Button.ClearHost=Clear Host +PrefsDialog.Button.ClearHost.Tooltip=delete all files associated with a selected web host from the OSP cache +PrefsDialog.Button.ClearCache.Tooltip=delete all files from the OSP cache +TActions.Action.SaveZip=Export Tracker ZIP +ThumbnailDialog.Title=Export Thumbnail Image +ThumbnailDialog.Settings.Title=Thumbnail Options +ThumbnailDialog.Label.CurrentImage=Current image +ThumbnailDialog.Label.FrameNumber=frame +ThumbnailDialog.Label.StepNumber=step +ThumbnailDialog.View.VideoOnly=Video Only +ThumbnailDialog.View.MainView=Main View +ThumbnailDialog.View.WholeFrame=Entire Frame +ThumbnailDialog.Format.PNG=PNG Image +ThumbnailDialog.Format.JPG=JPEG Image +ThumbnailDialog.Chooser.SaveThumbnail.Title=Save Thumbnail +ThumbnailDialog.Subtitle.Image=Image +TMenuBar.MenuItem.Thumbnail=Thumbnail Image +TToolBar.Button.SaveZip.Tooltip=Export a Tracker ZIP file +TTrack.MenuItem.DeletePoint=Delete Selected Step +ZipResourceDialog.Title=Export Tracker ZIP +ZipResourceDialog.Label.Format=Format +ZipResourceDialog.Label.Title=Name +ZipResourceDialog.Label.Description=Description +ZipResourceDialog.Label.Keywords=Keywords +ZipResourceDialog.Label.Link=External Link +ZipResourceDialog.Label.HTML=HTML Source +ZipResourceDialog.Complete.Message1=The Tracker ZIP file has been saved as +ZipResourceDialog.Complete.Message2=Do you wish to open it in Tracker now? +ZipResourceDialog.Complete.Title=Success +ZipResourceDialog.Border.Title.Documentation=HTML Documentation +ZipResourceDialog.Border.Title.Video=Video +ZipResourceDialog.Border.Title.Thumbnail=Thumbnail +ZipResourceDialog.FileChooser.SaveZip.Title=Export Tracker ZIP +ZipResourceDialog.FileChooser.AddFile.Title=Add File to Tracker ZIP +ZipResourceDialog.FileChooser.OpenHTML.Title=Open HTML File +ZipResourceDialog.Button.AddFiles=Add Files +ZipResourceDialog.Button.ThumbnailSettings=Settings +ZipResourceDialog.Checkbox.TrimVideo=Trim to Clip +ZipResourceDialog.AddHTMLInfo.Title=Add HTML Info File +ZipResourceDialog.AddHTMLInfo.Message1=Do you wish to add the HTML info file +ZipResourceDialog.AddHTMLInfo.Message2=to the Tracker ZIP? +ZipResourceDialog.HTMLField.DefaultText=If none specified, file will be created from scratch +ZipResourceDialog.Dialog.AddFiles.Title=Add HTML and PDF Files +ZipResourceDialog.Tooltip.HTML=Path to the HTML source file (if none, file will be created from scratch) +ZipResourceDialog.Tooltip.Author=Authors of this resource +ZipResourceDialog.Tooltip.Title=Display name of this resource (not file name) +ZipResourceDialog.Tooltip.Description=A useful description of this resource +ZipResourceDialog.Tooltip.Keywords=A list of keywords to search in the DL browser +ZipResourceDialog.Tooltip.Contact=Author contact information (institution, e-mail, web site, etc.) +ZipResourceDialog.Tooltip.Link=URL of an external HTML file with more information about this resource +ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or file type +ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the Tracker ZIP +ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video +ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties index 2a59873d..85181f64 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties @@ -1184,7 +1184,238 @@ ZipResourceDialog.Tooltip.Keywords=Uma lista de palavras chave para pesquisar no ZipResourceDialog.Tooltip.Contact=Informação de contato do Autor (instituição, email, site, etc). ZipResourceDialog.Tooltip.Link=URL para um arquivo HTML externo com mais informações sobre este recurso ZipResourceDialog.Tooltip.ThumbnailSettings=Mudar a miniatura, tamanho ou tipo do arquivo -ZipResourceDialog.Tooltip.AddFiles=Adicionar arquivo HTML e -PDF para o ZIP +ZipResourceDialog.Tooltip.AddFiles=Adicionar arquivo HTML e PDF para o ZIP ZipResourceDialog.Tooltip.TrimVideo=Checar para exportar o vídeo clip, desmarcar para usar o arquivo original de vídeo ZipResourceDialog.Tooltip.LoadHTML=Usar um selecionador de arquivo para carregar um arquivo Info HTML + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties index b0102b22..20ecf7b7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties @@ -1281,3 +1281,141 @@ TableTrackView.Action.RenameTextColumn.Text=Rename TableTrackView.Dialog.NameColumn.Message=Please enter a column name. TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. + +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files + +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch + +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source + +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties index 4be7e922..ff210072 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties @@ -1189,3 +1189,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Spremeni pogled na slikovno ikono, v ZipResourceDialog.Tooltip.AddFiles=Dodajanje HTML in PDF datotek viru ZIP ZipResourceDialog.Tooltip.TrimVideo=Odkljukaj za izvoz video izrezka, razkljukaj za uporabo originalnega videa ZipResourceDialog.Tooltip.LoadHTML=Za nalaganje informacijske HTML datoteke uporabi izbiralnik datotek + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Trajanje spremenljivega okvirja +PrefsDialog.Button.NoEngine=Ni\u010D +PrefsDialog.Dialog.SwitchToQT.Message=Preklop na QuickTime tudi spremeni JVM na 32-bitno verzijo. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Preklop na Xuggle tudi spremeni JVM na 32-bitno verzijo. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Preklop na Xuggle tudi spremeni JVM na 64-bitno verzijot. +PrefsDialog.Dialog.SwitchVM.Title=Java VM je spremenjen +PrefsDialog.Dialog.SwitchTo32.Message=Preklop na 32-bitni Java VM tudi spremeni video pogon na QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Preklop na 64-bitni Java VM tudi spremeni video pogon na Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video pogon je spremenjen +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Ni na voljo video pogona za 64-bitni Java VM. \u0161e vedno +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=bo\u0161 lahko odpiral slike (JPEG, PNG) in animirane GIF. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Ali res \u017Eeli\u0161 preklop na 64-bitni VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ni 64-bitnega Video pogona +PrefsDialog.Dialog.No32bitVMXuggle.Message=Pred uporabo Xuggle moramo namestiti 32-bitni Java VM. +PrefsDialog.Dialog.No32bitVMQT.Message=Pred uporabo QuickTime moramo namestiti 32-bitni Java VM. +PrefsDialog.Dialog.No32bitVM.Message=Za ve\u010D informacij si oglej Pomo\u010D Trackerja: Namestitev. +PrefsDialog.Dialog.No32bitVM.Title=Zahtevan je 32-bitni VM +PrefsDialog.Button.ShowHelpNow=Sedaj poka\u017Ei pomo\u010D +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NI KONSTANTNO +TMenuBar.MenuItem.CheckFrameDurations=Trajanje okvir\u010Dkov +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=Pred uporabo video pogonov moramo namestiti 32-bitni Java VM. +Tracker.Dialog.SwitchTo32BitVM.Message1=Name\u0161\u010Den je en ali ve\u010D video pogonov, vendar niso na voljo, ker +Tracker.Dialog.SwitchTo32BitVM.Message2=zahtevajo 32-bitni Java VM, trenutno pa uporabljamo 64-bitni VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Ali \u017Eeli\u0161 program ponovno pognati z bitnim VM in privzetim pogonom? +Tracker.Dialog.Button.RelaunchNow=Da, za\u017Eeni ponovno +Tracker.Dialog.Button.ShowPrefs=Ne, vendar poka\u017Ei preference +Tracker.Dialog.Button.ContinueWithoutEngine=Ne, nadaljuj brez videa +Tracker.Dialog.EngineProblems.Message1=En ali ve\u010D video pogonov je name\u0161\u010Denih, a ne dela. +Tracker.Dialog.EngineProblems.Message2=Za ve\u010D informacij poglej Pomo\u010D|Diagnostika|O Xuggle ali QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=Priporo\u010Damo, da zamenjate trenutni video pogon Xuggle +Tracker.Dialog.ReplaceXuggle.Message2=z Xuggle verzije 3.4 s ponovno namestitvijo programa Tracker (verzija 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=ali ve\u010D) in pri opcijah namestitve izberete Xuggle. +TrackerIO.Dialog.DurationIsConstant.Message=Trajanja vseh okvirjev so enaka (konstantni fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Prikaz ustreznih dokumentov HTML oziroma PDF +ZipResourceDialog.BadModels.Message1=Video klip ne vsebuje za\u010Detnega okvirja sledi +ZipResourceDialog.BadModels.Message2=modelu 'Particle'. \u010De pore\u017Eete video, +ZipResourceDialog.BadModels.Message3=modeli NE bodo vklju\u010Deni v izvo\u017Eeno ZIP datoteko Trackerja. +ZipResourceDialog.BadModels.Question=Ali \u017Eeli\u0161 nadaljevati in odstraniti modele? +ZipResourceDialog.BadModels.Title=Konflikti Klip-Model +TMenuBar.MenuItem.EditVideoFrames=Dodaj/Odstrani okvirje +TMenuBar.Dialog.RequiresMemory.Message1=Za urejanje okvirjev morajo biti nalo\u017Eene v pomnilnik vse slike. To tudi pospe\u0161i hitrost predvajanja. +TMenuBar.Dialog.RequiresMemory.Message2=Preveri razpolo\u017Eljiv pomnilnik in, \u010De je potrebno po\u017Eeni z ve\u010D spomina. +TMenuBar.Dialog.RequiresMemory.Title=Pomnilnik + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=x-komponenta piksla +PointMass.Data.Description.PixelY=y-komponenta piksla +ExportVideoDialog.Content.DeinterlacedVideo=Neprepleten video +ExportVideoDialog.Deinterlace.OddFirst=Najprej liho polje +ExportVideoDialog.Deinterlace.EvenFirst=Najprej sodo polje +ExportVideoDialog.Deinterlace.Dialog.Title=Zaporedje neprepletenih polj +TFrame.Dialog.LibraryError.FileNotFound.Title=Datoteke ne najdem +TFrame.Dialog.LibraryError.FileNotFound.Message=Ne morem najti datoteke +TrackerPanel.DataBuilder.Button.Autoload=Avtomatsko nalaganje +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Upravljanje avtomatsko nalaganih funkcij +TrackerPanel.DataBuilder.Autoload.Title=Avtomatsko nalaganje podatkovnih funkcij +TrackerPanel.DataBuilder.Autoload.Message=SIzberi funkcije za avtomatsko nalaganje: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML datoteke +TrackerIO.Dialog.Open.Title=Odpri +TToolbar.Button.Refresh.Popup.RefreshNow=Osve\u017Ei +TToolbar.Button.Refresh.Popup.AutoRefresh=Avtomatsko osve\u017Eevanje +TToolbar.Button.Refresh.Tooltip=Osve\u017Ei podatke in poglede + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=Polo\u017Eaj izhodi\u0161\u010Dnega piksla +CoordAxes.Origin.Field.Tooltip=Polo\u017Eaj izhodi\u0161\u010Da merjen od zgornjega levega kota videa + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Izberi to\u010Dke +MainTView.Popup.MenuItem.Deselect=Preklic izbire to\u010Dk +ZipResourceDialog.Checkbox.PreviewThumbnail=Predogled +ZipResourceDialog.Dialog.BadFileName.Message=Imena datotek ne smejo vsebovati naslednjih znakov: +ZipResourceDialog.Dialog.BadFileName.Title=Neveljavno ime datoteke +ZipResourceDialog.Dialog.ExportFailed.Message=ZIP datoteke ne morem izvoziti. +ZipResourceDialog.Dialog.ExportFailed.Title=Izvoz ni uspel +PrefsDialog.Button.SetCache=Nastavi medpomnilnik + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Za\u010Detek zapisa (log) +Tracker.StartLog.NotFound=Ne najdem za\u010Detka datoteke z zapisom (log) +Tracker.Dialog.MemoryReduced.Title=Preferenca pomnilnika zmanj\u0161ana +Tracker.Dialog.MemoryReduced.Message1=Tracker ni mogel startati s pomnilnikom +Tracker.Dialog.MemoryReduced.Message2=zato je bila preferenca pomnilnika zmanj\u0161ana na +Tracker.Dialog.MemoryReduced.Message3=Za ve\u010D informacij poglej Pomo\u010D|Diagnostika|Za\u010Detek zapisa (log)... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Prika\u017Ei +TableTrackView.Menu.TextColumn.Text=Stolpci besedila +TableTrackView.Menu.TextColumn.Tooltip=Upravljanje urejevalnih stolpcev besedila +TableTrackView.Action.CreateTextColumn.Text=Tvori... +TableTrackView.Action.DeleteTextColumn.Text=Zbri\u0161i +TableTrackView.Action.RenameTextColumn.Text=Preimenuj +TableTrackView.Dialog.NameColumn.Message=Prosim vnesi ime stolpca. +TableTrackView.Dialog.NameColumn.TryAgain=To ime je \u017Ee v uporabi. +TableTrackView.Dialog.NameColumn.Title=Stolpec besedila +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Verzija +PrefsDialog.Checkbox.WarnCopyFailed=Napake pri kopiranju datoteke za video pogon +Tracker.Dialog.FailedToCopy.Title=Napaka pri kopiranju datoteke +Velocity.Dialog.Color.Title=Izbira barve hitrosti +Acceleration.Dialog.Color.Title=Izbira barve pospe\u0161ka +TMenuBar.Menu.FontSize=Nivo Fonta +TMenuBar.MenuItem.DefaultFontSize=Privzeto +PrefsDialog.FontSize.BorderTitle=Nivo fonta +TrackerPanel.Label.Booster=Zaganjalnik +TrackerPanel.Booster.None=(noben) +TrackerPanel.Dropdown.Booster.Tooltip=Masna to\u010Dka, ki postavlja za\u010Detne pogoje tega modela +CoordAxes.Checkbox.Grid=Mre\u017Ea +CoordAxes.Checkbox.Grid.Tooltip=Prikaz plasti z mre\u017Eo +CoordAxes.Button.Grid.Tooltip=Nastavi barvo in prosojnost mre\u017Ee +CoordAxes.Dialog.GridColor.Title=Izberi barvo mre\u017Ee +CoordAxes.MenuItem.GridColor=Barva mre\u017Ee... +CoordAxes.MenuItem.GridOpacity=Prosojnost... +CoordAxes.Dialog.GridOpacity.Title=Nastavi prosojnost mre\u017Ee +DynamicSystem.Dialog.RemoveBooster.Title=Konflikt v zaganjalniku +DynamicSystem.Dialog.RemoveBooster.Message1=Delci v sistemu ne morejo pognati \u0161e drug drugega. +DynamicSystem.Dialog.RemoveBooster.Message2=Konfliktni zaganjalnik bo odstranjen +DynamicSystem.Dialog.RemoveBooster.Message3=pred spreminjanjem sistema. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Odpri stran v brkljalniku +TToolbar.Button.Desktop.Menu.OpenPage=Strani +TToolbar.Button.Desktop.Menu.OpenFile=Datoteke +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Datoteka s preferencami +Tracker.Prefs.NotFound=Ne najdem datoteke s preferencami +TapeMeasure.Alert.UnfixScale.Message1=Za prilepjenje koncev moramo sprostiti merilo koordinatnega sistema +TapeMeasure.Alert.UnfixScale.Message2=Ali ga \u017Eeli\u0161 sprostiti sedaj? +TapeMeasure.Alert.UnfixScale.Title=Merilo je fiksirano +Tracker.Dialog.StarterWarning.Title=Nestandardni zagon +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=Za tip steze ne najdem podatkovnih funkcij +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Funkcij ne najdem +TrackDataBuilder.Instructions.SelectToAutoload=V spodnjem seznamu izberi podatkovne funkcije za avtomatsko nalaganje. +TrackDataBuilder.Instructions.WhereDefined=Funkcije so definirane v 'Data Builder' XML datotekah, ki so v prikazanih direktorijih. +TrackDataBuilder.Instructions.HowToAddFunction=Novo funkcijo dodamo tako, da jo naredimo v 'Data Builder', shranimo kot XML datoteko in kopiramo datoteko v enega od direktorijev. +TrackDataBuilder.Instructions.HowToAddDirectory=Iskalne poti spremenimo s klikom na gmb za iskanje poti. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Nekatere avtomatsko nalagane funkcije so shranjene v starej\u0161ih formatih. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Ali jih \u017Eeli\u0161 pretvoriti v novi, prenosljiv format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Opomba: stare verzije Trackerja novega formata ne morejo brati. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Pretvorim avtomatsko nalagane funkcije? +TrackDataBuilder.MenuItem.SaveAll.Text=Shrani vse +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Shrani vse funkcije v prenosljiv, avtomatsko nalagan format (stare verzije Trackerja ga ne morejo brati) +TrackDataBuilder.MenuItem.SaveOnly.Text=Samo shrani +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Shrani izbrane sledilne funkcije v formatu, ki ga berejo vse verzije Trackerja (brez avtomatskega nalaganja) +ParticleDataTrack.Name=Podatkovna sled +ParticleDataTrack.Builder.Title=Podatkovna sled +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Podatkovni vir... +TrackerIO.TextFileFilter.Description=Tekstovne datoteke (.txt) +TrackerIO.JarFileFilter.Description=Jar datoteke (.jar) +TrackerIO.Dialog.OpenData.Title=Odprt podatkovni vir +DataTrackClipControl.Label.Data=Podatki +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Podatkovni klip +DataTrackClipControl.Label.VideoStart=Za\u010Detni okvir +DataTrackClipControl.Label.FrameCount=\u0161tevilo okvirjev +DataTrackClipControl.Label.DataStart=Za\u010Detek podatkov +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Kontrola podatkovnega vira +DataTrackTimeControl.Button.Video=\u010Das video +DataTrackTimeControl.Button.Data=\u010Das podatkov +DataTrackTimeControl.Border.Title=\u010Dasovna osnova +TActions.Action.DataTrack.Unsupported.JarFile=Jar datoteka +TActions.Action.DataTrack.Unsupported.Message= ni mo\u017Eno poslati podatkov Trackerju +TActions.Action.DataTrack.Unsupported.Title=Ni podatkovni vir +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Ne morem najti videa +DataTrackTool.Dialog.VideoNotFound.Message2=Ali ga \u017Eeli\u0161 poiskati? +DataTrackTool.Dialog.VideoNotFound.Title=Videa ne najdem +DataTrackTool.Dialog.FileNotFound.Message1=Ne najdem datoteke +DataTrackTool.Dialog.FileNotFound.Title=Ne najdem datoteke +DataTrackTool.Dialog.InvalidTRK.Message=To ni veljavna TRK datoteka +DataTrackTool.Dialog.InvalidTRK.Title=Neveljavna datoteka +DataTrackTool.Dialog.InvalidData.Message=Podatki ne vsebujejo pozicij (x, y) +DataTrackTool.Dialog.InvalidData.Title=Neveljavni podatki +ParticleDataTrack.Dialog.NoNewData.Message=Poslani podatki ne raz\u0161irjajo obstoje\u010Dih podatkov +ParticleDataTrack.Dialog.NoNewData.Title=Ni novih podatkov +ParticleDataTrackFunctionPanel.Instructions.General=Dvoklik za\u010Detnega \u010Dasa za urejanje ali uporabo 'spinners' za spremembo videa in nastavitve podatkov. +TrackerPanel.Dialog.NoData.Message=Ne najdem podatkov +TrackerPanel.Dialog.NoData.Title=Ni podatkov +TrackerPanel.Dialog.Exception.Message=Podatkov ne morem uvoziti, ker je pri\u0161lo do naslednje izjeme +TrackerPanel.Dialog.Exception.Title=Uvoz podatkov ni uspel +TActions.Dialog.URLResourceNotFound.Message=Na tem URL ne najdem nobenega vira +TActions.Dialog.URLResourceNotFound.Title=Vira ne najdem +CircleFitter.Name=Prilagajanje kroga +CircleFitter.New.Name=krog +CircleFitter.Label.Radius=polmer +CircleFitter.Checkbox.RadialLine=Radialna \u010Drta +CircleFitter.Checkbox.RadialLine.Tooltip=Prika\u017Ei ali skrij radialno \u010Drto +CircleFitter.Field.Radius.Tooltip=Polmer najbolj prilagojenega kroga +CircleFitter.Field.CenterX.Tooltip=x-komponenta od centra najbolj\u0161e prilagoditve +CircleFitter.Field.CenterY.Tooltip=y-komponenta od centra najbolj\u0161e prilagoditve +CircleFitter.Label.MarkPoint=Prilagajanje kroga terja najmanj 3 podatkovne to\u010Dke +CircleFitter.Hint.MarkMore=\u010De \u017Eeli\u0161 ozna\u010Diti ve\u010D to\u010Dk, uporabi SHIFT-klik +CircleFitter.Hint.Mark3=za ozna\u010Devanje podatkovnih to\u010Dk uporabi SHIFT-klik +CircleFitter.Data.Center=sredi\u0161\u010De +CircleFitter.Data.Description.0=\u010Das +CircleFitter.Data.Description.1=x-komponenta sredi\u0161\u010Da +CircleFitter.Data.Description.2=y-komponenta sredi\u0161\u010Da +CircleFitter.Data.Description.3=polmer +CircleFitter.Data.Description.4=\u0161tevilo korakov +CircleFitter.Data.Description.5=\u0161tevilka okvirja +CircleFitter.Data.Description.6=kot radialne \u010Drte +CircleFitter.DataPoint.Name=to\u010Dka perimetra +CircleFitter.DataPoint.Hint=za premik povleci +CircleFitter.Slider.Name=radialnao \u010Drto +CircleFitter.Slider.Hint=vrti\u0161 z vle\u010Denjem +CircleFitterFootprint.Circle4=majhne to\u010Dke +CircleFitterFootprint.Circle7=velike to\u010Dke +CircleFitterFootprint.Circle4Bold=poudarjene male to\u010Dke +CircleFitterFootprint.Circle7Bold=poudarjene velike to\u010Dke +CircleFitter.MenuItem.OriginToCenter=Premik izhodi\u0161\u010Da v center +CircleFitter.MenuItem.Inspector=Kopiraj korake masnih to\u010Dk... +CircleFitter.MenuItem.ClearPoints=Po\u010Disti to\u010Dke +CircleFitter.MenuItem.DeletePoint=Zbri\u0161i izbrano to\u010Dko +CircleFitter.Inspector.Instructions1=To prilagaja krog najman 3 podatkovnim to\u010Dkam. +CircleFitter.Inspector.Instructions2=To\u010Dke lahko ozna\u010Di\u0161 ro\u010Dno ali z njihovim kopiranjem iz izvora masne to\u010Dke. +CircleFitter.Inspector.Label.SourceTrack=Sled izvora +CircleFitter.Inspector.Label.From=Koraki +CircleFitter.Inspector.Label.To=do +CircleFitter.Inspector.Dropdown.None=Ni\u010D +CircleFitter.Inspector.Button.Apply=Kopiraj korake +TActions.Action.SaveVideoAs=Shrani video kot... +TrackerIO.Export.Option.WithVideo=z videom +TrackerIO.Export.Option.WithoutVideo=brez videa +ParticleModel.MenuItem.UseDefaultReferenceFrame=Vedno relativno na privzeti referen\u010Dni okvir +TFrame.NotesDialog.Checkbox.ShowByDefault=Privzeto prika\u017Ei opombe diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties index 165de2a2..8a5fb537 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties @@ -1194,3 +1194,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings= ZipResourceDialog.Tooltip.AddFiles=Lägg till HTML och PDF filer till ZIP resursen ZipResourceDialog.Tooltip.TrimVideo=Markera för att exportera video klippet, avmarkera för att använda original videon ZipResourceDialog.Tooltip.LoadHTML=Använd en filväljare för att lasta in en HTML info fil + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties index afaac750..4454a481 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties @@ -1189,3 +1189,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or f ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties index 55abf894..f4a1e712 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties @@ -1175,3 +1175,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or f ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties index 972b4cce..2484b781 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties @@ -1188,3 +1188,235 @@ ZipResourceDialog.Tooltip.ThumbnailSettings=Change the thumbnail view, size or f ZipResourceDialog.Tooltip.AddFiles=Add HTML and PDF files to the ZIP resource ZipResourceDialog.Tooltip.TrimVideo=Check to export the video clip, uncheck to use the original video ZipResourceDialog.Tooltip.LoadHTML=Use a file chooser to load an HTML info file + +# Additions by Doug Brown 2012-12-10 +PrefsDialog.Checkbox.32BitVM=32-bit +PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations +PrefsDialog.Button.NoEngine=None +PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed +PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed +PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will +PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. +PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? +PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine +PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. +PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. +PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required +PrefsDialog.Button.ShowHelpNow=Show Help Now +TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=NOT CONSTANT +TMenuBar.MenuItem.CheckFrameDurations=Frame Durations +TMenuBar.MenuItem.ExportZIP=Tracker Zip +Tracker.Dialog.Install32BitVM.Message=You must install a 32-bit Java VM before the video engines can be used. +Tracker.Dialog.SwitchTo32BitVM.Message1=One or more video engines are installed but unavailable because they +Tracker.Dialog.SwitchTo32BitVM.Message2=require a 32-bit Java VM and you are curently running in a 64-bit VM. +Tracker.Dialog.SwitchTo32BitVM.Question=Do you wish to relaunch with a 32 bit VM and default engine? +Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now +Tracker.Dialog.Button.ShowPrefs=No, but show preferences +Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video +Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. +Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine +Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). +TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) +TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents +ZipResourceDialog.BadModels.Message1=The video clip does not include the start frame of the +ZipResourceDialog.BadModels.Message2=following Particle Model tracks. If you trim the video the +ZipResourceDialog.BadModels.Message3=models will NOT be included in the exported Tracker ZIP. +ZipResourceDialog.BadModels.Question=Do you wish to continue and discard the models? +ZipResourceDialog.BadModels.Title=Clip-Model Conflicts +TMenuBar.MenuItem.EditVideoFrames=Add/Remove Frames +TMenuBar.Dialog.RequiresMemory.Message1=All images must be loaded into memory to edit frames. This also increases playback speed. +TMenuBar.Dialog.RequiresMemory.Message2=Please check the available memory and relaunch with more memory if needed. +TMenuBar.Dialog.RequiresMemory.Title=Memory + +# Additions by Doug Brown 2013-01-25 +PointMass.Data.Description.PixelX=pixel x-component +PointMass.Data.Description.PixelY=pixel y-component +ExportVideoDialog.Content.DeinterlacedVideo=Deinterlaced video +ExportVideoDialog.Deinterlace.OddFirst=Odd field first +ExportVideoDialog.Deinterlace.EvenFirst=Even field first +ExportVideoDialog.Deinterlace.Dialog.Title=Deinterlaced Field Order +TFrame.Dialog.LibraryError.FileNotFound.Title=File Not Found +TFrame.Dialog.LibraryError.FileNotFound.Message=Unable to find the file +TrackerPanel.DataBuilder.Button.Autoload=Autoload +TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Manage autoloaded data functions +TrackerPanel.DataBuilder.Autoload.Title=Autoload Data Functions +TrackerPanel.DataBuilder.Autoload.Message=Select functions to autoload: +TrackerPanel.DataBuilder.Chooser.XMLFiles=XML Files +TrackerIO.Dialog.Open.Title=Open +TToolbar.Button.Refresh.Popup.RefreshNow=Refresh +TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh +TToolbar.Button.Refresh.Tooltip=Refresh data and views + +# Additions by Doug Brown 2013-05-10 +CoordAxes.Origin.Label=origin pixel position +CoordAxes.Origin.Field.Tooltip=origin position measured from the top left corner of the video + +# Additions by Doug Brown 2013-08-24 +MainTView.Popup.MenuItem.Select=Select Points +MainTView.Popup.MenuItem.Deselect=Deselect Points +ZipResourceDialog.Checkbox.PreviewThumbnail=Preview +ZipResourceDialog.Dialog.BadFileName.Message=Filenames cannot include the following characters: +ZipResourceDialog.Dialog.BadFileName.Title=Disallowed Filename +ZipResourceDialog.Dialog.ExportFailed.Message=The ZIP file could not be exported. +ZipResourceDialog.Dialog.ExportFailed.Title=Export Failed +PrefsDialog.Button.SetCache=Set Cache + +# Additions by Doug Brown 2013-12-17 +Tracker.StartLog=Start Log +Tracker.StartLog.NotFound=Start log file not found +Tracker.Dialog.MemoryReduced.Title=Preferred Memory Reduced +Tracker.Dialog.MemoryReduced.Message1=Tracker could not be started with memory +Tracker.Dialog.MemoryReduced.Message2=so the preferred memory was reduced to +Tracker.Dialog.MemoryReduced.Message3=For more information see Help|Diagnostics|Start Log... +TrackPlottingPanel.Popup.MenuItem.ShowZero=Show +TableTrackView.Menu.TextColumn.Text=Text Columns +TableTrackView.Menu.TextColumn.Tooltip=Manage editable text columns +TableTrackView.Action.CreateTextColumn.Text=Create... +TableTrackView.Action.DeleteTextColumn.Text=Delete +TableTrackView.Action.RenameTextColumn.Text=Rename +TableTrackView.Dialog.NameColumn.Message=Please enter a column name. +TableTrackView.Dialog.NameColumn.TryAgain=That name is already in use. +TableTrackView.Dialog.NameColumn.Title=Text Column +TToolBar.MenuItem.StretchOff=Reset + +# Additions by Doug Brown 2014-02-20 +PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors +Tracker.Dialog.FailedToCopy.Title=File Copy Error +Velocity.Dialog.Color.Title=Choose Velocity Color +Acceleration.Dialog.Color.Title=Choose Acceleration Color +TMenuBar.Menu.FontSize=Font Level +TMenuBar.MenuItem.DefaultFontSize=Default +PrefsDialog.FontSize.BorderTitle=Font Level +TrackerPanel.Label.Booster=Launcher +TrackerPanel.Booster.None=(none) +TrackerPanel.Dropdown.Booster.Tooltip=Point mass that sets this model's initial conditions +CoordAxes.Checkbox.Grid=Grid +CoordAxes.Checkbox.Grid.Tooltip=Display the grid overlay +CoordAxes.Button.Grid.Tooltip=Set grid color and opacity +CoordAxes.Dialog.GridColor.Title=Choose Grid Color +CoordAxes.MenuItem.GridColor=Grid Color... +CoordAxes.MenuItem.GridOpacity=Opacity... +CoordAxes.Dialog.GridOpacity.Title=Set Grid Opacity +DynamicSystem.Dialog.RemoveBooster.Title=Launcher Conflict +DynamicSystem.Dialog.RemoveBooster.Message1=Particles in a system cannot also launch one another. +DynamicSystem.Dialog.RemoveBooster.Message2=The conflicting launcher will be removed from +DynamicSystem.Dialog.RemoveBooster.Message3=before modifying the system. +# Additions by Doug Brown 2014-05-09 +PageTView.MenuItem.OpenInBrowser=Open Page in Browser +TToolbar.Button.Desktop.Menu.OpenPage=Pages +TToolbar.Button.Desktop.Menu.OpenFile=Files +# Additions by Doug Brown 2014-10-24 +Tracker.Prefs.MenuItem.Text=Preferences File +Tracker.Prefs.NotFound=Preferences file not found +TapeMeasure.Alert.UnfixScale.Message1=The coordinate system scale must be unfixed to attach ends. +TapeMeasure.Alert.UnfixScale.Message2=Do you wish to unfix it now? +TapeMeasure.Alert.UnfixScale.Title=Scale is Fixed +Tracker.Dialog.StarterWarning.Title=Non-Standard Launch +# Additions by Doug Brown 2014-12-26 +TrackDataBuilder.Dialog.NoFunctionsFound.Message=No data functions were found for track type +TrackDataBuilder.Dialog.NoFunctionsFound.Title=Functions Not Found +TrackDataBuilder.Instructions.SelectToAutoload=Select data functions to autoload from the list below. +TrackDataBuilder.Instructions.WhereDefined=Functions are defined in Data Builder XML files found in the directories shown. +TrackDataBuilder.Instructions.HowToAddFunction=To add a new function, create it in Data Builder, save it in an XML file, and copy the file to one of the directories. +TrackDataBuilder.Instructions.HowToAddDirectory=To change the search paths, click the Search Paths button. +TrackDataBuilder.Dialog.ConvertAutoload.Message1=Some autoloaded functions are stored in an older format. +TrackDataBuilder.Dialog.ConvertAutoload.Message2=Do you wish to convert them to the new portable format? +TrackDataBuilder.Dialog.ConvertAutoload.Message3=Note: the new format is not readable by older versions of Tracker. +TrackDataBuilder.Dialog.ConvertAutoload.Title=Convert Autoload Functions? +TrackDataBuilder.MenuItem.SaveAll.Text=Save all +TrackDataBuilder.MenuItem.SaveAll.Tooltip=Save all functions in a portable, autoloadable format (not readable by older versions of Tracker) +TrackDataBuilder.MenuItem.SaveOnly.Text=Save only +TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Save the selected track functions in a format readable by all versions of Tracker (not autoloadable) +ParticleDataTrack.Name=Data Track +ParticleDataTrack.Builder.Title=Data Track +ParticleDataTrack.New.Name=datatrack +TActions.Action.ImportData=Data Source... +TrackerIO.TextFileFilter.Description=Text Files (.txt) +TrackerIO.JarFileFilter.Description=Jar Files (.jar) +TrackerIO.Dialog.OpenData.Title=Open Data Source +DataTrackClipControl.Label.Data=Data +DataTrackClipControl.Label.Video=Video +DataTrackClipControl.Border.Title=Data Clip +DataTrackClipControl.Label.VideoStart=Start Frame +DataTrackClipControl.Label.FrameCount=Frame Count +DataTrackClipControl.Label.DataStart=Data Start +DataTrackClipControl.Label.Stride=Data Stride +ParticleDataTrackFunctionPanel.Border.Title=Data Source Control +DataTrackTimeControl.Button.Video=Video Time +DataTrackTimeControl.Button.Data=Data Time +DataTrackTimeControl.Border.Title=Time Basis +TActions.Action.DataTrack.Unsupported.JarFile=Jar File +TActions.Action.DataTrack.Unsupported.Message=is unable to send data to Tracker +TActions.Action.DataTrack.Unsupported.Title=Not a Data Source +# Additions by Doug Brown 2015-04-17 to 2015-05-30 +DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video +DataTrackTool.Dialog.VideoNotFound.Message2=Would you like to search for it? +DataTrackTool.Dialog.VideoNotFound.Title=Video Not Found +DataTrackTool.Dialog.FileNotFound.Message1=Unable to find file +DataTrackTool.Dialog.FileNotFound.Title=File Not Found +DataTrackTool.Dialog.InvalidTRK.Message=File is not a valid TRK file +DataTrackTool.Dialog.InvalidTRK.Title=Invalid File +DataTrackTool.Dialog.InvalidData.Message=Data does not include (x, y) positions +DataTrackTool.Dialog.InvalidData.Title=Invalid Data +ParticleDataTrack.Dialog.NoNewData.Message=The data sent does not extend the existing data +ParticleDataTrack.Dialog.NoNewData.Title=No New Data +ParticleDataTrackFunctionPanel.Instructions.General=Double-click initial time to edit or use spinners to change video and data settings. +TrackerPanel.Dialog.NoData.Message=No data was found +TrackerPanel.Dialog.NoData.Title=No Data +TrackerPanel.Dialog.Exception.Message=The data could not be imported because the following exception occurred +TrackerPanel.Dialog.Exception.Title=Data Import Failed +TActions.Dialog.URLResourceNotFound.Message=No resource could be found at URL +TActions.Dialog.URLResourceNotFound.Title=Resource Not Found +CircleFitter.Name=Circle Fitter +CircleFitter.New.Name=circle +CircleFitter.Label.Radius=radius +CircleFitter.Checkbox.RadialLine=Radial line +CircleFitter.Checkbox.RadialLine.Tooltip=Show or hide the radial line +CircleFitter.Field.Radius.Tooltip=Radius of the best fit circle +CircleFitter.Field.CenterX.Tooltip=x-component of the best fit center +CircleFitter.Field.CenterY.Tooltip=y-component of the best fit center +CircleFitter.Label.MarkPoint=Fitting a circle requires 3 or more data points +CircleFitter.Hint.MarkMore=shift-click to mark more points if desired +CircleFitter.Hint.Mark3=shift-click to mark data points +CircleFitter.Data.Center=center +CircleFitter.Data.Description.0=time +CircleFitter.Data.Description.1=center x-component +CircleFitter.Data.Description.2=center y-component +CircleFitter.Data.Description.3=radius +CircleFitter.Data.Description.4=step number +CircleFitter.Data.Description.5=frame number +CircleFitter.Data.Description.6=radial line angle +CircleFitter.DataPoint.Name=perimeter point +CircleFitter.DataPoint.Hint=drag to move +CircleFitter.Slider.Name=radial line +CircleFitter.Slider.Hint=drag to rotate +CircleFitterFootprint.Circle4=small points +CircleFitterFootprint.Circle7=large points +CircleFitterFootprint.Circle4Bold=bold small points +CircleFitterFootprint.Circle7Bold=bold large points +CircleFitter.MenuItem.OriginToCenter=Move Origin to Center +CircleFitter.MenuItem.Inspector=Copy Point Mass Steps... +CircleFitter.MenuItem.ClearPoints=Clear Points +CircleFitter.MenuItem.DeletePoint=Delete Selected Point +CircleFitter.Inspector.Instructions1=This fits a circle to 3 or more data points. +CircleFitter.Inspector.Instructions2=You can mark the points manually or copy them from a point mass source. +CircleFitter.Inspector.Label.SourceTrack=Source track +CircleFitter.Inspector.Label.From=Steps +CircleFitter.Inspector.Label.To=to +CircleFitter.Inspector.Dropdown.None=None +CircleFitter.Inspector.Button.Apply=Copy Steps +TActions.Action.SaveVideoAs=Save Video As... +TrackerIO.Export.Option.WithVideo=with video +TrackerIO.Export.Option.WithoutVideo=without video +ParticleModel.MenuItem.UseDefaultReferenceFrame=Always Relative To Default Reference Frame +TFrame.NotesDialog.Checkbox.ShowByDefault=Show notes by default From a0f32507511427c0ce33be5235a024907f611830 Mon Sep 17 00:00:00 2001 From: fschuett Date: Sat, 12 Sep 2015 20:44:55 +0200 Subject: [PATCH 10/20] Fix override errors. Add some files. --- .../cabrillo/tracker/CircleFitter.java | 1283 +++++++++++++++ .../tracker/CircleFitterFootprint.java | 390 +++++ .../cabrillo/tracker/CircleFitterStep.java | 902 +++++++++++ .../tracker/DataTrackClipControl.java | 17 - .../tracker/DataTrackTimeControl.java | 1 - .../cabrillo/tracker/FileDropHandler.java | 5 +- .../cabrillo/tracker/ParticleDataTrack.java | 2 - .../cabrillo/tracker/PrefsDialog.java | 12 +- .../cabrillo/tracker/TMenuBar.java | 4 +- .../cabrillo/tracker/Tracker.java | 8 +- .../cabrillo/tracker/TrackerIO.java | 2 +- .../cabrillo/tracker/Undo.java | 3 - .../cabrillo/tracker/WorldGrid.java | 1 - .../tracker/analytics/DownloadCounter.java | 168 ++ .../tracker/analytics/LaunchCounter.java | 167 ++ .../analytics/UncountedFilesReader.java | 201 +++ .../tracker/deploy/TrackerStarter.java | 6 +- .../tracker/resources/help/circlefitter.html | 36 + .../tracker/resources/help/datatrack.html | 68 + .../resources/help_images/circle_fitter.gif | Bin 0 -> 2535 bytes .../help_images/circle_fitter_dialog.gif | Bin 0 -> 12641 bytes .../help_images/circle_fitter_display.gif | Bin 0 -> 4516 bytes .../tracker/resources/help_images/data1.gif | Bin 0 -> 1009 bytes .../tracker/resources/help_images/data2.gif | Bin 0 -> 2426 bytes .../help_images/datatrack_model_builder.gif | Bin 0 -> 24576 bytes .../tracker/resources/tracker_ru.properties | 1424 +++++++++++++++++ .../tracker/resources/tracker_sr.properties | 1418 ++++++++++++++++ .../tracker/resources/tracker_uk.properties | 1422 ++++++++++++++++ 28 files changed, 7497 insertions(+), 43 deletions(-) create mode 100644 src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/CircleFitterFootprint.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/CircleFitterStep.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/analytics/DownloadCounter.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/analytics/LaunchCounter.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/analytics/UncountedFilesReader.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help/circlefitter.html create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help/datatrack.html create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_dialog.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_display.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data1.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data2.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/help_images/datatrack_model_builder.gif create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ru.properties create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sr.properties create mode 100644 src/org/opensourcephysics/cabrillo/tracker/resources/tracker_uk.properties diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java new file mode 100644 index 00000000..3ac9b2c9 --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java @@ -0,0 +1,1283 @@ +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.ArrayList; +import java.util.Iterator; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.DataPoint; +import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.Slider; +import org.opensourcephysics.controls.*; + +/** + * A CircleFitter track fits and measures circles and their centers. + * + * @author Douglas Brown + */ +public class CircleFitter extends TTrack { + + // instance fields + protected boolean fixedPosition=true, radialLineVisible=false, radialLineEnabled=false; + protected JCheckBoxMenuItem fixedItem; + protected JCheckBox radialLineCheckbox; + protected JLabel clickToMarkLabel; + protected JLabel xDataPointLabel, yDataPointLabel; + protected NumberField xDataField, yDataField; + protected Component xDataPointSeparator, yDataPointSeparator, checkboxSeparator; + protected JMenuItem inspectorItem, originToCenterItem, clearPointsItem; + protected PointMass sourceTrack; + protected int sourceStartStep = 0, sourceEndStep = 100000; + protected CircleFitterInspector inspector; + protected boolean inspectorVisible; + + /** + * Constructs a CircleFitter. + */ + public CircleFitter() { + defaultColors = new Color[] {new Color(0, 140, 40)}; + // assign a default name + setName(TrackerRes.getString("CircleFitter.New.Name")); //$NON-NLS-1$ + // set up footprint choices and color + setFootprints(new Footprint[] + {CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle4"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle7"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle4Bold"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle7Bold")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + + // assign default table variables + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar2", "2"); //$NON-NLS-1$ //$NON-NLS-2$ + // assign default plot variables + String center = TrackerRes.getString("CircleFitter.Data.Center"); //$NON-NLS-1$ + setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot0", "x"+center); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot1", "y"+center); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot2", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot2", "r"); //$NON-NLS-1$ //$NON-NLS-2$ + + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ + // initialize the autofill step array + CircleFitterStep step = new CircleFitterStep(this, 0); + step.setFootprint(getFootprint()); + steps = new StepArray(step); // autofills + keyFrames.add(0); + fixedItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixed(fixedItem.isSelected()); + } + }); + + clickToMarkLabel = new JLabel(); + clickToMarkLabel.setForeground(Color.red.darker()); + + if (radialLineEnabled) { + radialLineCheckbox = new JCheckBox(); + radialLineCheckbox.setOpaque(false); + radialLineCheckbox.setBorder(BorderFactory.createEmptyBorder()); + radialLineCheckbox.setSelected(isRadialLineVisible()); + radialLineCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setRadialLineVisible(radialLineCheckbox.isSelected()); + repaint(); + dataValid = false; + firePropertyChange("data", null, null); //$NON-NLS-1$ + } + }); + checkboxSeparator = Box.createRigidArea(new Dimension(6, 4)); + } + + // create actions, listeners, labels and fields for data points + final Action dataPointAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (trackerPanel==null) return; + if (e!=null && e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; + if (e!=null && e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; + TPoint p = trackerPanel.getSelectedPoint(); + if (!(p instanceof DataPoint)) return; + double xValue = xDataField.getValue(); + double yValue = yDataField.getValue(); + int n = trackerPanel.getFrameNumber(); + ImageCoordSystem coords = trackerPanel.getCoords(); + double x = coords.worldToImageX(n, xValue, yValue); + double y = coords.worldToImageY(n, xValue, yValue); + p.setXY(x, y); + p.showCoordinates(trackerPanel); + if (e!=null && e.getSource() instanceof NumberField) { + ((NumberField)e.getSource()).requestFocusInWindow(); + } + } + }; + // focus listener + FocusListener dataFieldFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; + if (e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; + dataPointAction.actionPerformed(null); + } + }; + xDataPointLabel = new JLabel("selected x"); //$NON-NLS-1$ + xDataPointLabel.setBorder(xLabel.getBorder()); + xDataField = new NumberField(5); + xDataField.setBorder(fieldBorder); + xDataField.addActionListener(dataPointAction); + xDataField.addFocusListener(dataFieldFocusListener); + yDataPointLabel = new JLabel("y"); //$NON-NLS-1$ + yDataPointLabel.setBorder(xLabel.getBorder()); + yDataField = new NumberField(5); + yDataField.setBorder(fieldBorder); + yDataField.addActionListener(dataPointAction); + yDataField.addFocusListener(dataFieldFocusListener); + xDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); + yDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); + + xLabel.setText("center x"); //$NON-NLS-1$ + xField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + xField.setEnabled(false); + yField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + yField.setEnabled(false); + magField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + magField.setEnabled(false); + xDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + yDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + + // set action for angle field + final Action sliderAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (angleField.getBackground()!=Color.yellow) { + return; + } + double theta = angleField.getValue(); + int n = trackerPanel.getFrameNumber(); + CircleFitterStep step = (CircleFitterStep)getStep(n); + step.setSliderAngle(theta); + } + }; + angleField.addActionListener(sliderAction); + FocusListener sliderFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + sliderAction.actionPerformed(null); + } + }; + angleField.addFocusListener(sliderFocusListener); + + // inspector item + inspectorItem = new JMenuItem(); + inspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + getInspector().setVisible(true); + } + }); + + // originToCenter item + originToCenterItem = new JMenuItem(); + originToCenterItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setCoordsOriginToCenter(); + } + }); + + // clearPoints item + clearPointsItem = new JMenuItem(); + clearPointsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + XMLControl control = new XMLControlElement(CircleFitter.this); + boolean changed = false; + for (Step step: getSteps()) { + CircleFitterStep next = (CircleFitterStep)step; + if (next.dataPoints.isEmpty()) continue; + changed = true; + next.dataPoints.clear(); + next.refreshCircle(); + } + if (changed) { + repaint(); + dataValid = false; + firePropertyChange("data", null, this); //$NON-NLS-1$ + if (trackerPanel != null) { + trackerPanel.changed = true; + } + TTrackBar.getTrackbar(trackerPanel).refresh(); + Undo.postTrackEdit(CircleFitter.this, control); + } + } + }); + } + + /** + * Sets the fixed property. When fixed, it has the same position at all times. + * + * @param fixed true to fix + */ + public void setFixed(boolean fixed) { + if (fixedPosition == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + CircleFitterStep source = (CircleFitterStep)getStep(n); + CircleFitterStep target = (CircleFitterStep)getStep(0); + target.copy(source); + trackerPanel.repaint(); + } + fixedPosition = fixed; + if (fixed) { // refresh data and post undo only when fixing + keyFrames.clear(); + keyFrames.add(0); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + Undo.postTrackEdit(this, control); + } + } + + /** + * Gets the fixed property. + * + * @return true if fixed + */ + public boolean isFixed() { + return fixedPosition; + } + + /** + * Sets the visibility of the radial line. + * + * @param vis true to draw a radial line + */ + public void setRadialLineVisible(boolean vis) { + boolean changed = vis!=radialLineVisible; + radialLineVisible = vis; + if (trackerPanel!=null) { + int n = trackerPanel.getFrameNumber(); + steps.getStep(n).repaint(); + if (changed) { + trackerPanel.changed = true; + } + } + } + + /** + * Copies step positions from a point mass source. Source may be null. + * + * @param source a PointMass to copy + */ + public void copySourceStepPositions(PointMass source) { + if (sourceTrack==null && source==null) { + return; + } + sourceTrack = source; + trackerPanel.setSelectedPoint(null); + boolean changed = false; + XMLControl control = new XMLControlElement(this); // for undo (only if changed) + CircleFitterStep circleStep = null; + if (isFixed()) { + circleStep = (CircleFitterStep)getStep(0); + } + else { + int n = trackerPanel.getFrameNumber(); + circleStep = (CircleFitterStep)getStep(n); + } + if (sourceTrack!=null) { + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + ArrayList tempList = new ArrayList(); + tempList.addAll(circleStep.dataPoints); + circleStep.dataPoints.clear(); + // copy step positions as circleStep DataPoints + Step[] steps = sourceTrack.getSteps(); + for (int i=0; i< steps.length; i++) { + // check if frame is included in video clip and falls in specified range + if (!clip.includesFrame(i)) continue; + int stepNumber = clip.frameToStep(i); + if (steps[i]!=null && stepNumber>=sourceStartStep && stepNumber<=sourceEndStep) { + PositionStep p = (PositionStep)steps[i]; + circleStep.addDataPoint(p.getPosition().x, p.getPosition().y, false); + } + } + // determine if number of points have changed + changed = circleStep.dataPoints.size()!=tempList.size(); + if (!changed) { + // determine if point positions have changed + for (DataPoint next: circleStep.dataPoints) { + Iterator it = tempList.iterator(); + while (it.hasNext()) { + DataPoint test = it.next(); + if (next.x==test.x && next.y==test.y) { + it.remove(); + break; + } + } + } + changed = !tempList.isEmpty(); + } + } + Step[] steps = getSteps(); + for (int i=0; i< steps.length; i++) { + if (steps[i]!=null) { + if (!isFixed() && i-1) { + step = (CircleFitterStep)steps.getStep(0); + p = step.dataPoints.get(index); + step.removeDataPoint(p, true); + } + } + return null; + } + + @Override + public Step getStep(int n) { + CircleFitterStep step = (CircleFitterStep)steps.getStep(n); + refreshStep(step); + return step; + } + + @Override + public Step getStep(TPoint point, TrackerPanel trackerPanel) { + if (point == null) return null; + Step[] stepArray = steps.array; + for (Step step: stepArray) { + if (step==null) continue; + TPoint[] points = step.getPoints(); + for (int i = 0; i < points.length; i++) { + if (points[i]==point) return step; + } + CircleFitterStep circleStep = (CircleFitterStep)step; + for (TPoint p: circleStep.dataPoints) { + if (p==point) return step; + } + } + return null; + } + + @Override + public int getStepLength() { + return CircleFitterStep.getLength(); + } + + @Override + public int getFootprintLength() { + return 3; + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {clickToMarkLabel, xDataPointLabel, yDataPointLabel, + xDataField, yDataField}; + FontSizer.setFonts(objectsToSize, level); + if (radialLineEnabled) { + FontSizer.setFonts(radialLineCheckbox, level); + } + if (inspector!=null) { + inspector.refreshDisplay(); + } + } + + @Override + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + + inspectorItem.setText(TrackerRes.getString("CircleFitter.MenuItem.Inspector")); //$NON-NLS-1$ + originToCenterItem.setText(TrackerRes.getString("CircleFitter.MenuItem.OriginToCenter")); //$NON-NLS-1$ + originToCenterItem.setEnabled(!trackerPanel.getCoords().isLocked()); + deleteStepItem.setText(TrackerRes.getString("CircleFitter.MenuItem.DeletePoint")); //$NON-NLS-1$ + clearPointsItem.setText(TrackerRes.getString("CircleFitter.MenuItem.ClearPoints")); //$NON-NLS-1$ + clearPointsItem.setEnabled(!isLocked()); + fixedItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.setSelected(isFixed()); + fixedItem.setEnabled(attachments==null || (attachments[0]==null && attachments[1]==null && attachments[2]==null)); + + // add inspector item and separator at beginning + menu.insert(inspectorItem, 0); + menu.insertSeparator(1); + // add originToCenter item and separator below inspector item + menu.insert(originToCenterItem, 2); + menu.insertSeparator(3); + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + menu.add(fixedItem); + + menu.addSeparator(); + menu.add(deleteStepItem); + menu.add(clearPointsItem); + menu.add(deleteTrackItem); + return menu; + } + + @Override + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + int n = trackerPanel.getFrameNumber(); + refreshFields(n); + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + list.add(stepSeparator); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (step.dataPoints.size()>2) { + if (radialLineEnabled) { + radialLineCheckbox.setText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine")); //$NON-NLS-1$ + radialLineCheckbox.setToolTipText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine.Tooltip")); //$NON-NLS-1$ + list.add(radialLineCheckbox); + list.add(checkboxSeparator); + } + xField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterX.Tooltip")); //$NON-NLS-1$ + yField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterY.Tooltip")); //$NON-NLS-1$ + magLabel.setText(TrackerRes.getString("CircleFitter.Label.Radius")); //$NON-NLS-1$ + magField.setToolTipText(TrackerRes.getString("CircleFitter.Field.Radius.Tooltip")); //$NON-NLS-1$ + list.add(magLabel); + list.add(magField); + list.add(magSeparator); + list.add(xLabel); + list.add(xField); + list.add(xSeparator); + list.add(yLabel); + list.add(yField); + list.add(ySeparator); + } + else if (trackerPanel.getSelectedPoint()==null) { + clickToMarkLabel.setText(TrackerRes.getString("CircleFitter.Label.MarkPoint")); //$NON-NLS-1$ + list.add(clickToMarkLabel); + } + return list; + } + + @Override + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + int n = trackerPanel.getFrameNumber(); + refreshFields(n); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (point==step.slider) { + list.add(angleLabel); + list.add(angleField); + list.add(angleSeparator); + } + else { + list.add(xDataPointLabel); + list.add(xDataField); + list.add(xDataPointSeparator); + list.add(yDataPointLabel); + list.add(yDataField); + list.add(yDataPointSeparator); + } + if (step.dataPoints.size()<3) { + clickToMarkLabel.setText(TrackerRes.getString("CircleFitter.Label.MarkPoint")); //$NON-NLS-1$ + list.add(clickToMarkLabel); + } + return list; + } + + @Override + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || !isVisible()) + return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + int n = trackerPanel.getFrameNumber(); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { + Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (step.dataPoints.size()<3) { + hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ + } + else { + hint = TrackerRes.getString("CircleFitter.Hint.MarkMore"); //$NON-NLS-1$ + } + return null; + } + if (ia instanceof DataPoint) { + partName = TrackerRes.getString("CircleFitter.DataPoint.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.DataPoint.Hint"); //$NON-NLS-1$ + } + else if (ia instanceof Slider) { + partName = TrackerRes.getString("CircleFitter.Slider.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Slider.Hint"); //$NON-NLS-1$ + } + return ia; + } + return null; + } + + @Override + public String toString() { + return TrackerRes.getString("CircleFitter.Name"); //$NON-NLS-1$ + } + +//__________________________ protected methods ________________________ + + @Override + protected void setTrackerPanel(TrackerPanel panel) { + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + if (trackerPanel.getTFrame()!=null) { + trackerPanel.getTFrame().removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.setTrackerPanel(panel); + if (trackerPanel != null) { + trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + setFixed(isFixed()); + } + + @Override + protected void setAnglesInRadians(boolean radians) { + super.setAnglesInRadians(radians); + CircleFitterStep step = (CircleFitterStep)getStep(trackerPanel.getFrameNumber()); + step.repaint(); // refreshes angle readout + } + + @Override + protected String getTargetDescription(int pointIndex) { + if (pointIndex==0) return TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ + String s = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ + return s+" "+(pointIndex); //$NON-NLS-1$ + } + + @Override + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (refreshDataLater || trackerPanel == null || data == null) return; + dataFrames.clear(); + // get the datasets: radius, x_center, y_center, step, frame + int count = 0; + Dataset angle = null; + Dataset x_center = data.getDataset(count++); + Dataset y_center = data.getDataset(count++); + Dataset r = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + if (radialLineEnabled) { + angle = data.getDataset(count++); + } + // assign column names to the datasets + String time = "t"; //$NON-NLS-1$ + if (!x_center.getColumnName(0).equals(time)) { // not yet initialized + String center = TrackerRes.getString("CircleFitter.Data.Center"); //$NON-NLS-1$ + x_center.setXYColumnNames(time, "x_"+center); //$NON-NLS-1$ + y_center.setXYColumnNames(time, "y_"+center); //$NON-NLS-1$ + r.setXYColumnNames(time, "r"); //$NON-NLS-1$ + stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ + frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ + if (radialLineEnabled) { + angle.setXYColumnNames(time, "$\\theta$"); //$NON-NLS-1$ + } + } + else for (int i = 0; i0 && !trackerPanel.getCoords().getKeyFrames().contains(i)) { + continue; + } + trackerPanel.getCoords().setOriginXY(i, pt.x, pt.y); + } + } + else { + Step[] stepArray = steps.array; + for (Step step: stepArray) { + if (step==null) continue; + CircleFitterStep circleStep = (CircleFitterStep)step; + if (!circleStep.isValidCircle()) continue; + valid = true; + } + if (!valid) return; + trackerPanel.getCoords().setFixedOrigin(false); + for (Step step: stepArray) { + if (step==null) continue; + CircleFitterStep circleStep = (CircleFitterStep)step; + trackerPanel.getCoords().setOriginXY(step.n, circleStep.center.x, circleStep.center.y); + } + } + trackerPanel.getAxes().setVisible(true); + // post undoable edit + Undo.postCoordsEdit(trackerPanel, control); + } + + protected CircleFitterInspector getInspector() { + if (inspector==null) { + inspector = new CircleFitterInspector(); + } + inspector.refreshDisplay(); + return inspector; + } + +//__________________________ inner classes ___________________________ + + /** + * Inner CircleFitterInspector class to control source track and frames. + */ + protected class CircleFitterInspector extends JDialog { + + private JTextArea textPane; + private JComboBox trackDropdown; + private JSpinner startStepSpinner, endStepSpinner; + private JLabel dropdownLabel, startLabel, endLabel; + private JButton copyButton, closeButton; + private boolean refreshing; + + /** + * Constructs the CircleFitterInspector. + */ + public CircleFitterInspector() { + super(trackerPanel.getTFrame(), false); +// setResizable(false); + createGUI(); + refreshDisplay(); + // center on screen + Rectangle rect = getBounds(); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width-rect.width)/2; + int y = (dim.height-rect.height)/2; + setLocation(x, y); + } + + /** + * Creates the visible components. + */ + void createGUI() { + // initialize sourceStartFrame and sourceEndFrame + setSourceStartStep(0); + setSourceEndStep(trackerPanel.getPlayer().getVideoClip().getStepCount()-1); + // create components + + // create text area for hints + textPane = new JTextArea() { + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + int n = (int)(250*FontSizer.getFactor()); + dim.width = Math.max(n, dim.width); + return dim; + } + }; + textPane.setEditable(false); + textPane.setLineWrap(true); + textPane.setWrapStyleWord(true); + Border etched = BorderFactory.createEtchedBorder(); + Border empty = BorderFactory.createEmptyBorder(2,4,2,4); + textPane.setBorder(BorderFactory.createCompoundBorder(etched, empty)); + textPane.setForeground(Color.blue); + + + trackDropdown = new JComboBox() { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height-=1; + return dim; + } + }; + trackDropdown.setRenderer(new TrackRenderer()); + + SpinnerModel spinModel = new SpinnerNumberModel(sourceStartStep, 0, sourceEndStep, 1); + startStepSpinner = new JSpinner(spinModel); + ChangeListener listener = new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if (refreshing) return; + int in = (Integer)startStepSpinner.getValue(); + if (in==sourceStartStep) { + return; + } + setSourceStartStep(in); + } + }; + startStepSpinner.addChangeListener(listener); + + int last = trackerPanel.getPlayer().getVideoClip().getStepCount()-1; + spinModel = new SpinnerNumberModel(sourceEndStep, sourceStartStep, last, 1); + endStepSpinner = new JSpinner(spinModel); + listener = new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if (refreshing) return; + int in = (Integer)endStepSpinner.getValue(); + if (in==sourceEndStep) { + return; + } + setSourceEndStep(in); + } + }; + endStepSpinner.addChangeListener(listener); + + dropdownLabel = new JLabel(); + dropdownLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + startLabel = new JLabel(); + startLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + endLabel = new JLabel(); + endLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + + copyButton = new JButton(); + copyButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Object[] item = (Object[])trackDropdown.getSelectedItem(); + if (item!=null) { + for (PointMass next: trackerPanel.getDrawables(PointMass.class)) { + if (item[1].equals(next.getName())) { + copySourceStepPositions(next); + refreshGUI(); + } + } + } + } + }); + + closeButton = new JButton(); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + inspector.setVisible(false); + } + }); + + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + JPanel centerPanel = new JPanel(new BorderLayout()); + contentPane.add(centerPanel, BorderLayout.CENTER); + + centerPanel.add(textPane, BorderLayout.NORTH); + + JPanel sourcePanel = new JPanel(new BorderLayout()); + centerPanel.add(sourcePanel, BorderLayout.CENTER); + + JPanel dropdownPanel = new JPanel(); + dropdownPanel.setBorder(BorderFactory.createEmptyBorder(8,4,4,4)); + dropdownPanel.add(dropdownLabel); + dropdownPanel.add(trackDropdown); + sourcePanel.add(dropdownPanel, BorderLayout.NORTH); + + JPanel spinnerPanel = new JPanel(); + spinnerPanel.setBorder(BorderFactory.createEmptyBorder(4,4,8,4)); + spinnerPanel.add(startLabel); + spinnerPanel.add(startStepSpinner); + spinnerPanel.add(endLabel); + spinnerPanel.add(endStepSpinner); + sourcePanel.add(spinnerPanel, BorderLayout.SOUTH); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setBorder(etched); + buttonPanel.add(copyButton); + buttonPanel.add(closeButton); + contentPane.add(buttonPanel, BorderLayout.SOUTH); + + refreshGUI(); + } + + /** + * Refreshes the visible components. + */ + public void refreshGUI() { + setTitle(TrackerRes.getString("CircleFitter.Name")+" \""+CircleFitter.this.getName()+"\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + dropdownLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.SourceTrack")); //$NON-NLS-1$ + startLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.From")); //$NON-NLS-1$ + endLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.To")); //$NON-NLS-1$ + String info = TrackerRes.getString("CircleFitter.Inspector.Instructions1") //$NON-NLS-1$ + +" "+TrackerRes.getString("CircleFitter.Inspector.Instructions2"); //$NON-NLS-1$ //$NON-NLS-2$ + textPane.setText(info); + copyButton.setText(TrackerRes.getString("CircleFitter.Inspector.Button.Apply")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + pack(); + } + + /** + * Updates this inspector to reflect the current settings. + */ + void refreshDisplay() { + ArrayList trackList = trackerPanel.getDrawables(PointMass.class); + copyButton.setEnabled(!trackList.isEmpty() && !isLocked()); + + // update trackDropdown + Object toSelect = null; + refreshing = true; + trackDropdown.removeAllItems(); + + if (trackList.isEmpty()) { + Object[] item = new Object[] {null, TrackerRes.getString("CircleFitter.Inspector.Dropdown.None")}; //$NON-NLS-1$ + trackDropdown.addItem(item); + toSelect = item; + } + else for (PointMass next: trackList) { + Icon icon = next.getFootprint().getIcon(21, 16); + Object[] item = new Object[] {icon, next.getName()}; + trackDropdown.addItem(item); + if (next==sourceTrack) { + toSelect = item; + } + } + // select desired item + if (toSelect!=null) { + trackDropdown.setSelectedItem(toSelect); + } + else { + trackDropdown.setSelectedIndex(0); + } + refreshing = false; + // resize and pack + FontSizer.setFonts(this, FontSizer.getLevel()); + pack(); + } + + @Override + public void setVisible(boolean vis) { + super.setVisible(vis); + inspectorVisible = vis; + } + + } + + + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + CircleFitter circleFitter = (CircleFitter)obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed property + control.setValue("fixed", circleFitter.isFixed()); //$NON-NLS-1$ + // save steps + Step[] steps = circleFitter.getSteps(); + int count = steps.length; + if (circleFitter.isFixed()) count = 1; + double[][] data = new double[count][]; + for (int n = 0; n < count; n++) { + // save only key frames + if (steps[n] == null || !circleFitter.keyFrames.contains(n)) continue; + CircleFitterStep step = (CircleFitterStep)steps[n]; + int len = step.dataPoints.size(); + if (len==0) { + data[n] = new double[] {n}; + continue; + } + double[] stepData = new double[2*len+3]; + stepData[0] = n; + for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.awt.*; +import java.awt.geom.AffineTransform; +import java.awt.geom.Arc2D; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.GeneralPath; +import java.awt.geom.Line2D; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + +import javax.swing.Icon; + +import org.opensourcephysics.tools.FontSizer; + +/** + * A CircleFitterFootprint returns a circle, center point and data point marks. + * It requires a minimum Point array of length 2 {center, edge} but accommodates many data points. + * + * @author Douglas Brown + */ +public class CircleFitterFootprint implements Footprint, Cloneable { + + // static constants + @SuppressWarnings("javadoc") + private static BasicStroke hitStroke = new BasicStroke(4); + private static final CircleFitterFootprint CIRCLE_4, CIRCLE_7, + CIRCLE_4_BOLD, CIRCLE_7_BOLD; + protected static final int MAX_RADIUS = 100000; + + // static fields + private static Collection footprints + = new HashSet(); + private static Shape hitShape = new Ellipse2D.Double(-6, -6, 12, 12); + private static Shape emptyHitShape = new Rectangle(); + private static Line2D line = new Line2D.Double(); + private static AffineTransform transform = new AffineTransform(); + private static Arc2D.Float iconArc = new Arc2D.Float(); + + // instance fields + protected String name; + protected BasicStroke baseStroke, stroke; + protected Color color = Color.black; + protected ArrayList hitShapes = new ArrayList(); + protected Ellipse2D circle; + protected double radius; + protected Shape marker; + protected Shape crosshatch; + protected int markerSize; + protected Point selectedPoint; + protected boolean drawRadius; + + /** + * Constructs a CircleFitterFootprint. + * + * @param name the name + * @param size the radius + */ + public CircleFitterFootprint(String name, int size) { + this.name = name; + markerSize = size; + circle = new Ellipse2D.Double(); + marker = new Ellipse2D.Double(-size, -size, 2*size, 2*size); + double d = size*0.707; + GeneralPath path = new GeneralPath(); + path.moveTo(-d, -d); + path.lineTo(d, d); + path.moveTo(-d, d); + path.lineTo(d, -d); + crosshatch = path; + setStroke(new BasicStroke()); + } + + /** + * Gets the name of this footprint. + * + * @return the name + */ + public String getName() { + return name; + } + + /** + * Gets the display name of the footprint. + * + * @return the localized display name + */ + public String getDisplayName() { + return TrackerRes.getString(name); + } + + /** + * Gets the minimum point array length required by this footprint. + * + * @return the length + */ + public int getLength() { + return 3; + } + + /** + * Gets the icon. + * + * @param w width of the icon + * @param h height of the icon + * @return the icon + */ + public Icon getIcon(int w, int h) { + int scale = FontSizer.getIntegerFactor(); + w *= scale; + h *= scale; + int r = markerSize/2; + iconArc.setArc(0, 0, scale*20, scale*20, 200, 140, Arc2D.OPEN); + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } + Shape shape = stroke.createStrokedShape(iconArc); + Area area = new Area(shape); + circle.setFrameFromCenter(scale*10, scale*20, scale*(10+r), scale*(20+r)); + shape = stroke.createStrokedShape(circle); + area.add(new Area(shape)); + ShapeIcon icon = new ShapeIcon(area, w, h); + icon.setColor(color); + return icon; + } + + /** + * Gets the footprint mark. + * + * @param points a Point array + * @return the mark + */ + public Mark getMark(Point[] points) { + final Shape shape = getShape(points); + final Color color = this.color; + return new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + Color gcolor = g.getColor(); + g.setColor(color); + g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + g.fill(shape); + g.setColor(gcolor); + } + + public Rectangle getBounds(boolean highlighted) { + return shape.getBounds(); + } + }; + } + + /** + * Gets the hit shapes {vertex, end1, end2, line1, line2, rotator}. + * + * @return the hit shapes + */ + public Shape[] getHitShapes() { + return hitShapes.toArray(new Shape[hitShapes.size()]); + } + + /** + * Sets the stroke. + * + * @param stroke the desired stroke + */ + public void setStroke(BasicStroke stroke) { + if (stroke == null) return; + baseStroke = new BasicStroke(stroke.getLineWidth(), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_MITER, + 8, + stroke.getDashArray(), + stroke.getDashPhase()); + } + + /** + * Gets the stroke. + * + * @return the stroke + */ + public BasicStroke getStroke() { + return baseStroke; + } + + /** + * Sets the color. + * + * @param color the desired color + */ + public void setColor(Color color) { + this.color = color; + } + + /** + * Gets the color. + * + * @return the color + */ + public Color getColor() { + return color; + } + + /** + * Sets the flag to draw a line from the center to the slider. + * + * @param drawRadius true to draw a line + */ + protected void setDrawRadialLine(boolean drawRadius) { + this.drawRadius = drawRadius; + } + + /** + * Sets the radius of the circle. + * + * @param drawRadialLine true to draw a line + */ + protected void setPixelRadius(double r) { + radius = r; + } + + /** + * Sets the selected screen point. The selected point is not drawn so CircleStep + * can draw a selection shape instead. + * + * @param p the selected screen point (may be null) + */ + protected void setSelectedPoint(Point p) { + selectedPoint = p; + } + + /** + * Gets the shape of this footprint for a Point array {center, edge, slider, data1, data2, ...}. + * Also sets up hit shapes {circle, data1, data2, ...} + * + * @param points an array of Points + * @return the shape + */ + public Shape getShape(Point[] points) { + Point center = points[0]; + Point edge = points[1]; + hitShapes.clear(); + Area drawMe = new Area(); + int scale = FontSizer.getIntegerFactor(); + if (stroke==null || stroke.getLineWidth()!=scale*baseStroke.getLineWidth()) { + stroke = new BasicStroke(scale*baseStroke.getLineWidth()); + } + + // draw shapes only if there are 3 or more data points (plus center, edge and slider) + if (points.length<6) { + hitShapes.add(emptyHitShape); // add empty hit shape in place of circle + } + else { + // special case: infinite or very large radius, so draw straight line thru edge + if (Double.isInfinite(radius) || radius>MAX_RADIUS) { + double x = edge.getX(); + double y = edge.getY(); + // get slope of line + double dx = points[4].getX()-points[3].getX(); + double dy = points[4].getY()-points[3].getY(); + double slope = dy/dx; + // draw long line to extend past window bounds + double len = MAX_RADIUS/10; + if (dx==0) { // vertical line + line.setLine(x, y-len, x, y+len); + } + else { + if (Math.abs(dx)>Math.abs(dy)) { + line.setLine(x-len, y-slope*len, x+len, y+slope*len); + } + else { + line.setLine(x-len/slope, y-len, x+len/slope, y+len); + } + } + drawMe.add(new Area(stroke.createStrokedShape(line))); + hitShapes.add(hitStroke.createStrokedShape(line)); + + // perpendicular line + if (drawRadius) { + Point slider = points[2]; + transform.setToRotation(Math.PI/2, slider.x, slider.y); + drawMe.add(new Area(stroke.createStrokedShape(transform.createTransformedShape(line)))); + } + } + else { + // circle + circle.setFrameFromCenter(center.x, center.y, center.x+radius, center.y+radius); + drawMe.add(new Area(stroke.createStrokedShape(circle))); + + // center + transform.setToTranslation(points[0].x, points[0].y); + if (scale>1) { + transform.scale(scale, scale); + } + Shape s = transform.createTransformedShape(marker); + drawMe.add(new Area(stroke.createStrokedShape(s))); + s = transform.createTransformedShape(crosshatch); + drawMe.add(new Area(stroke.createStrokedShape(s))); + + // radial line + Point slider = points[2]; + int dx = slider.x-center.x, dy = slider.y-center.y; + line.setLine(center.x+dx/4, center.y+dy/4, slider.x, slider.y); + hitShapes.add(hitStroke.createStrokedShape(line)); + if (drawRadius) { + line.setLine(center, slider); + drawMe.add(new Area(stroke.createStrokedShape(line))); + } + } + } + + // always draw data points + for (int i=3; i1) { + transform.scale(scale, scale); + } + if (points[i]!=selectedPoint) { + Shape s = transform.createTransformedShape(marker); + drawMe.add(new Area(stroke.createStrokedShape(s))); + } + hitShapes.add(transform.createTransformedShape(hitShape)); + } + + return drawMe; + } + + /** + * Gets a predefined Footprint. + * + * @param name the name of the footprint + * @return the footprint + */ + public static Footprint getFootprint(String name) { + for (CircleFitterFootprint footprint: footprints) { + if (name == footprint.getName()) try { + return (CircleFitterFootprint)footprint.clone(); + } catch(CloneNotSupportedException ex) {ex.printStackTrace();} + } + return null; + } + + // static initializers + static { + BasicStroke stroke = new BasicStroke(1); + + // create standard footprints + CIRCLE_4 = new CircleFitterFootprint("CircleFitterFootprint.Circle4", 4); //$NON-NLS-1$ + CIRCLE_4.setStroke(stroke); + footprints.add(CIRCLE_4); + + CIRCLE_7 = new CircleFitterFootprint("CircleFitterFootprint.Circle7", 7); //$NON-NLS-1$ + CIRCLE_7.setStroke(stroke); + footprints.add(CIRCLE_7); + + stroke = new BasicStroke(2); + CIRCLE_4_BOLD = new CircleFitterFootprint("CircleFitterFootprint.Circle4Bold", 4); //$NON-NLS-1$ + CIRCLE_4_BOLD.setStroke(stroke); + footprints.add(CIRCLE_4_BOLD); + + CIRCLE_7_BOLD = new CircleFitterFootprint("CircleFitterFootprint.Circle7Bold", 7); //$NON-NLS-1$ + CIRCLE_7_BOLD.setStroke(stroke); + footprints.add(CIRCLE_7_BOLD); + } +} diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFitterStep.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFitterStep.java new file mode 100644 index 00000000..c5137184 --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFitterStep.java @@ -0,0 +1,902 @@ +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.geom.*; + +import javax.swing.SwingUtilities; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLControlElement; +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; + +/** + * This is a Step for a CircleFitter. It is used for measuring and finding centers of circles. + * + * @author Douglas Brown + */ +public class CircleFitterStep extends Step { + + protected static AffineTransform transform = new AffineTransform(); + protected static TPoint endPoint1 = new TPoint(); // used for large radius case + protected static TPoint endPoint2 = new TPoint(); // used for large radius case + + // instance fields + protected CircleFitter circleFitter; + protected ArrayList dataPoints = new ArrayList(); + protected TPoint center, edge; + protected Slider slider; + protected double radius; + protected Map lineHitShapes = new HashMap(); + protected ArrayList> pointHitShapes = new ArrayList>(); + protected Shape selectedShape; + + /** + * Constructs an empty CircleFitterStep. + * + * @param track the track + * @param n the frame number + */ + public CircleFitterStep(CircleFitter track, int n) { + super(track, n); + circleFitter = track; + center = new TPoint(); + edge = new TPoint(); + slider = new Slider(0, 0); + points = new TPoint[] {center, edge, slider}; + screenPoints = new Point[points.length]; + } + + /** + * Adds an data point to this step at the specified image coordinates. + * + * @param x the image x coordinate of the data point + * @param y the image y coordinate of the data point + * @param refreshAndPostEdit true to refresh circle, fire event and post undo edit + * + */ + public void addDataPoint(double x, double y, boolean refreshAndPostEdit) { + XMLControl control = new XMLControlElement(this); + if (!circleFitter.isFixed()) { + circleFitter.keyFrames.add(n); + } + dataPoints.add(new DataPoint(x, y)); + if (refreshAndPostEdit) { + defaultIndex = dataPoints.size()-1; + refreshCircle(); + circleFitter.dataValid = false; + circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ + if (circleFitter.trackerPanel != null) { + circleFitter.trackerPanel.changed = true; + } + TTrackBar.getTrackbar(circleFitter.trackerPanel).refresh(); + Undo.postStepEdit(this, control); + } + } + + /** + * Removes a data point. + * + * @param p the point to remove + */ + public void removeDataPoint(TPoint p, boolean postUndoableEdit) { + boolean found = false; + for (TPoint next: dataPoints) { + if (next==p) { + found = true; + break; + } + } + XMLControl control = new XMLControlElement(this); + if (found) { + if (!circleFitter.isFixed()) { + circleFitter.keyFrames.add(n); + } + dataPoints.remove(p); + if (circleFitter.trackerPanel != null) { + circleFitter.trackerPanel.changed = true; + } + } + refreshCircle(); + if (found && postUndoableEdit) { + Undo.postStepEdit(this, control); + } + if (n==circleFitter.trackerPanel.getFrameNumber()) { + repaint(); + circleFitter.refreshFields(n); + } + circleFitter.dataValid = false; + circleFitter.firePropertyChange("data", null, null); //$NON-NLS-1$ + circleFitter.trackerPanel.setSelectedPoint(null); + TTrackBar.getTrackbar(circleFitter.trackerPanel).refresh(); + repaint(); + } + + @Override + public TPoint getDefaultPoint() { + if (dataPoints.size()>defaultIndex) { + return dataPoints.get(defaultIndex); + } + return slider; + } + + @Override + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + TrackerPanel trackerPanel = (TrackerPanel)panel; + setHitRectCenter(xpix, ypix); + Shape hitShape; + Interactive hit = null; + + for (int i=0; i map = pointHitShapes.get(i); + if (map!=null) { + hitShape = map.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = dataPoints.get(i); + } + } + + } + + if (hit==null && circleFitter.isRadialLineVisible()) { + hitShape = lineHitShapes.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = slider; + } + } + + return hit; + } + + @Override + public void draw(DrawingPanel panel, Graphics _g) { + // draw the mark + TrackerPanel trackerPanel = (TrackerPanel)panel; + Graphics2D g = (Graphics2D)_g; + getMark(trackerPanel).draw(g, false); + } + + @Override + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + TPoint selection = null; + if (mark==null) { + selection = trackerPanel.getSelectedPoint(); + // assemble screen points array + if (screenPoints.length!=points.length+dataPoints.size()) { + screenPoints = new Point[points.length+dataPoints.size()]; + } + Point p = null; + for (int i = 0; i1) { + transform.scale(scale, scale); + } + selectedShape = transform.createTransformedShape(selectionShape); + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + stepMark.draw(g, false); + Paint gpaint = g.getPaint(); + g.setPaint(color); + if (selectedShape != null) + g.fill(selectedShape); + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = stepMark.getBounds(false); + if (selectedShape != null) { + bounds.add(selectedShape.getBounds()); + } + return bounds; + } + }; + } + marks.put(trackerPanel, mark); + + // get new hit shapes + Shape[] shapes = footprint.getHitShapes(); + lineHitShapes.put(trackerPanel, shapes[0]); + if (shapes.length-1 newMap = new HashMap(); + pointHitShapes.add(newMap); + } + Map map = pointHitShapes.get(i-1); + map.put(trackerPanel, shapes[i]); + } + + } + return mark; + } + + /** + * Returns the circle radius in world units. + * + * @return the radius in world units + */ + public double getWorldRadius() { + if (dataPoints.size()<3) { + return Double.NaN; + } + return radius/circleFitter.trackerPanel.getCoords().getScaleX(n); + } + + /** + * Returns the circle center coordinates in world units. + * + * @return the center point in world units + */ + public Point2D getWorldCenter() { + if (dataPoints.size()<3 || Double.isInfinite(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { + return null; + } + return center.getWorldPosition(circleFitter.trackerPanel); + } + + /** + * Returns the slider angle relative to the +x-axis. + * + * @return the slider angle + */ + public double getSliderAngle() { + // deal with special cases + if (dataPoints.size()<3 || Double.isNaN(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { + return Double.NaN; + } + double theta = -center.angle(slider); + if (circleFitter.trackerPanel!=null) { + theta -= circleFitter.trackerPanel.getCoords().getAngle(n); + } + return theta; + } + + /** + * Returns the slider angle relative to the horizontal. + * + * @return the slider angle + */ + public void setSliderAngle(double theta) { + double prev = getSliderAngle(); + if (theta==prev || Double.isNaN(prev)) return; + if (circleFitter.trackerPanel!=null) { + theta += circleFitter.trackerPanel.getCoords().getAngle(n); + } + double sin = -Math.sin(theta); + double cos = Math.cos(theta); + slider.setLocation(center.x+radius*cos, center.y+radius*sin); + repaint(); + circleFitter.refreshFields(n); +// circleFitter.dataValid = false; +// circleFitter.firePropertyChange("data", null, null); + } + + /** + * Returns true if the circle is valid (ie if at least 3 data points have been successfuly fit). + * + * @return true if valid + */ + public boolean isValidCircle() { + return dataPoints.size()>2 && !Double.isInfinite(radius) + && radius>0 && radius0 + && radiusCircleFitterFootprint.MAX_RADIUS) { + if (circleFitter.trackerPanel!=null) { + p = circleFitter.trackerPanel.getSelectedPoint(); + } + p0 = dataPoints.get(0); + p1 = dataPoints.get(1); + p2 = dataPoints.get(2); + edge.setLocation(p==p1? p1: p==p2? p2: p0); + } + else { + edge.setLocation(center.x, center.y+radius); + } + } + + boolean isVisible = circleFitter.trackerPanel!=null && n==circleFitter.trackerPanel.getFrameNumber(); + if (radius!=prevR || center.x!=prevX || center.y!=prevY) { + if (!Double.isInfinite(radius) + && radius>0 + && radius pts) { + // check for colinear points + double[] deltax = new double[pts.size()-1]; + double[] deltay = new double[pts.size()-1]; + double[] slope = new double[pts.size()-1]; + DataPoint prev = null; + boolean allDeltaXZero = true, allSameSlope = true; + for (int i=0; i1) { + allDeltaXZero = allDeltaXZero && deltax[i-1]==deltax[i-2]; + allSameSlope = allSameSlope && slope[i-1]==slope[i-2]; + } + } + if (allDeltaXZero || allSameSlope) { + radius = Double.POSITIVE_INFINITY; + return; + } + + // find center + double sumx=0, sumy=0, sumx2=0, sumy2=0, sumx3=0, sumy3=0, sumxy=0, sumxy2=0, sumx2y=0; + double val; + for (DataPoint p: pts) { + val = p.x; + sumx += val; + val *= p.x; + sumx2 += val; + val *= p.x; + sumx3 += val; + val = p.y; + sumy += val; + val *= p.y; + sumy2 += val; + val *= p.y; + sumy3 += val; + val = p.x*p.y; + sumxy += val; + sumxy2 += val*p.y; + sumx2y += val*p.x; + } + double n = pts.size(); + double a = n*sumx2 - sumx*sumx; + double b = n*sumxy - sumx*sumy; + double c = n*sumy2 - sumy*sumy; + double d = 0.5*(n*sumxy2 - sumx*sumy2 +n*sumx3 - sumx*sumx2); + double e = 0.5*(n*sumx2y - sumy*sumx2 +n*sumy3 - sumy*sumy2); + double denom = a*c - b*b; + double x = (d*c - b*e)/denom; // center x-coordinate + double y = (a*e - b*d)/denom; // center y-coordinate + center.setLocation(x, y); + + // find radius + double r = 0, dx, dy; + for (DataPoint p: pts) { + dx = p.x - x; + dy = p.y - y; + r += Math.sqrt(dx*dx + dy*dy); + } + radius = r/n; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + CircleFitterStep step = (CircleFitterStep)super.clone(); + if (step != null) { + step.points[0] = step.center = new TPoint(center.getX(), center.getY()); + step.points[1] = step.edge = new TPoint(edge.getX(), edge.getY()); + step.points[2] = step.slider = step.new Slider(slider.getX(), slider.getY()); + step.lineHitShapes = new HashMap(); + step.pointHitShapes = new ArrayList>(); + step.dataPoints = new ArrayList(); + for (DataPoint next: dataPoints) { + step.dataPoints.add(new DataPoint(next.x, next.y)); + } + } + return step; + } + + /** + * Copies data points from another step, then refreshes the circle. + * + * @param step the step to copy + */ + public void copy(CircleFitterStep step) { + if (dataPoints.size()!=step.dataPoints.size()) { + dataPoints.clear(); + for (int i=0; iCircleFitterFootprint.MAX_RADIUS) { + if (dataPoints.size()<2) return; + double dx = dataPoints.get(1).getX()-dataPoints.get(0).getX(); + double dy = dataPoints.get(1).getY()-dataPoints.get(0).getY(); + double slope = dy/dx; + double len = CircleFitterFootprint.MAX_RADIUS/100; + if (dx==0) { // vertical line + endPoint1.setLocation(edge.x, edge.y-len); + endPoint2.setLocation(edge.x, edge.y+len); + } + else { + if (Math.abs(dx)>Math.abs(dy)) { + endPoint1.setLocation(edge.x-len, edge.y-slope*len); + endPoint2.setLocation(edge.x+len, edge.y+slope*len); + } + else { + endPoint1.setLocation(edge.x-len/slope, edge.y-len); + endPoint2.setLocation(edge.x+len/slope, edge.y+len); + } + } + setPositionOnLine(xScreen, yScreen, trackerPanel, endPoint1, endPoint2); + return; + } + + // get image coordinates of the screen point + if(screenPt==null) { + screenPt = new Point(); + } + if(worldPt==null) { + worldPt = new Point2D.Double(); + } + screenPt.setLocation(xScreen, yScreen); + AffineTransform toScreen = trackerPanel.getPixelTransform(); + if(!trackerPanel.isDrawingInImageSpace()) { + int n = getFrameNumber(trackerPanel); + toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); + } + try { + toScreen.inverseTransform(screenPt, worldPt); + } catch(NoninvertibleTransformException ex) { + ex.printStackTrace(); + } + // set location to nearest point on circle + double d = center.distance(worldPt); + double dx = worldPt.getX()-center.getX(); + double dy = worldPt.getY()-center.getY(); + double r = center.distance(edge); + double x = center.getX()+r*dx/d; + double y = center.getY()+r*dy/d; + setLocation(x, y); + repaint(); + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ + } + } + + + } + + //______________________ inner DataPoint class ________________________ + + class DataPoint extends TPoint { + + /** + * Constructs a DataPoint with specified image coordinates. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public DataPoint(double x, double y) { + super(x, y); + setStepEditTrigger(true); + } + + /** + * Constructs a DataPoint with coordinates equal to those of a TPoint. + * + * @param p the TPoint + */ + public DataPoint(TPoint p) { + this(p.x, p.y); + } + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + if (track.locked) return; + if (circleFitter.isFixed()) { + int pointIndex = 0; + for (int i=0; i0) { + // add data point(s) + for (int i=0; i ffmpegClass = Class.forName(ffmpegName); Method method = ffmpegClass.getMethod("setSmoothPlay", new Class[] {Boolean.class}); //$NON-NLS-1$ @@ -1443,7 +1443,7 @@ public synchronized void run() { String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ try { Class ffmpegClass = Class.forName(ffmpegName); - Method method = xuggleClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ + Method method = ffmpegClass.getMethod("isSmoothPlay", (Class[])null); //$NON-NLS-1$ Boolean smooth = (Boolean)method.invoke(video, (Object[])null); playVideoSmoothlyItem.setSelected(smooth); videoMenu.add(playVideoSmoothlyItem); diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index d2949740..b184bb28 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -75,7 +75,7 @@ public class Tracker { static final String THETA = TeXParser.parseTeX("$\\theta"); //$NON-NLS-1$ static final String OMEGA = TeXParser.parseTeX("$\\omega"); //$NON-NLS-1$ static final String ALPHA = TeXParser.parseTeX("$\\alpha"); //$NON-NLS-1$ - static final String DEGREES = "º"; //$NON-NLS-1$ + static final String DEGREES = "�"; //$NON-NLS-1$ static final Level DEFAULT_LOG_LEVEL = ConsoleLevel.OUT_CONSOLE; // for testing @@ -547,7 +547,7 @@ private void createFrame() { OSPRuntime.setLookAndFeel(true, lookAndFeel); frame = new TFrame(); Diagnostics.setDialogOwner(frame); - DiagnosticsForXuggle.setDialogOwner(frame); + DiagnosticsForFFMPeg.setDialogOwner(frame); // set up the Java VM exit mechanism when used as application if ( org.opensourcephysics.display.OSPRuntime.applet == null) { frame.addWindowListener(new WindowAdapter() { @@ -877,7 +877,7 @@ public void actionPerformed(ActionEvent e) { }; aboutFFMPegAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutFFMPeg"), null) { //$NON-NLS-1$ public void actionPerformed(ActionEvent e) { - DiagnosticsForFFMPeg.aboutXuggle("Tracker"); //$NON-NLS-1$ + DiagnosticsForFFMPeg.aboutFFMPeg("Tracker"); //$NON-NLS-1$ } }; aboutThreadsAction = new AbstractAction(TrackerRes.getString("Tracker.Action.AboutThreads"), null) { //$NON-NLS-1$ @@ -1546,7 +1546,7 @@ public static void main(String[] args) { String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ String pathEnv = System.getenv(pathName); - if (pathEnv==null || !pathEnv.contains(xugglePath)) { + if (pathEnv==null || !pathEnv.contains(ffmpegPath)) { needsEnvironment = true; } } diff --git a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java index 91cfc081..ae295f7a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TrackerIO.java @@ -671,7 +671,7 @@ private static void open(String path, TrackerPanel existingPanel, TFrame frame, if (requestedType==null) { String ext = XML.getExtension(path); if (!engine.equals(VideoIO.ENGINE_FFMPEG)) { - VideoType ffmpetType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ + VideoType ffmpegType = VideoIO.getVideoType("FFMPeg", ext); //$NON-NLS-1$ if (ffmpegType!=null) otherEngines.add(ffmpegType); } if (!engine.equals(VideoIO.ENGINE_QUICKTIME)) { diff --git a/src/org/opensourcephysics/cabrillo/tracker/Undo.java b/src/org/opensourcephysics/cabrillo/tracker/Undo.java index 24ab90df..0cbacf26 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Undo.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Undo.java @@ -788,7 +788,6 @@ public static XML.ObjectLoader getLoader() { */ static class Loader implements XML.ObjectLoader { - @Override public void saveObject(XMLControl control, Object obj) { TrackProperties props = (TrackProperties)obj; control.setValue("name", props.name); //$NON-NLS-1$ @@ -796,7 +795,6 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("color", props.color); //$NON-NLS-1$ } - @Override public Object createObject(XMLControl control) { String name = control.getString("name"); //$NON-NLS-1$ String footprint = control.getString("footprint"); //$NON-NLS-1$ @@ -804,7 +802,6 @@ public Object createObject(XMLControl control) { return new TrackProperties(name, footprint, color); } - @Override public Object loadObject(XMLControl control, Object obj) { return obj; } diff --git a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java index ff6e263b..1ba557ca 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java +++ b/src/org/opensourcephysics/cabrillo/tracker/WorldGrid.java @@ -73,7 +73,6 @@ public WorldGrid() { dotted = new BasicStroke(2,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER,8,DOTTED_LINE,0); } - @Override public void draw(DrawingPanel panel, Graphics g) { if (!visible || (!showMajorX && !showMajorY)) return; Graphics2D g2 = (Graphics2D)g; diff --git a/src/org/opensourcephysics/cabrillo/tracker/analytics/DownloadCounter.java b/src/org/opensourcephysics/cabrillo/tracker/analytics/DownloadCounter.java new file mode 100644 index 00000000..25d79ce9 --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/analytics/DownloadCounter.java @@ -0,0 +1,168 @@ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker.analytics; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.opensourcephysics.tools.Resource; + +/** + * A program to read the PHP download counter and update the download counter file. + * + * @author Doug Brown + * @version 1.0 + */ +public class DownloadCounter { + + static String dataFile = "C:/Users/Doug/Eclipse/workspace_deploy/analytics/download_counts.csv"; //$NON-NLS-1$ + static String NEW_LINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + + public static void main(String[] args) { + + // create StringBuffer and append date/time + StringBuffer buffer = new StringBuffer(); + buffer.append(getDateAndTime()); + + // get file names (first line of dataFile except data/time) + String[] filenames = getFileNames(dataFile); + + // go through file names and append tabs and download counts + for (int j = 0; j0) { + String[] fileNames = new String[split.length-1]; + System.arraycopy(split, 1, fileNames, 0, fileNames.length); + return fileNames; + } + } + } catch(IOException ex) { + } + return new String[0]; + } + + /** + * Reads a file. + * + * @param fileName the name of the file + * @return the contents as a String + */ + static String read(String fileName) { + File file = new File(fileName); + StringBuffer buffer = null; + try { + BufferedReader in = new BufferedReader(new FileReader(file)); + buffer = new StringBuffer(); + String line = in.readLine(); + while(line!=null) { + buffer.append(line+NEW_LINE); + line = in.readLine(); + } + in.close(); + } catch(IOException ex) { + } + return buffer.toString(); + } + + /** + * Writes a file. + * + * @param contents the contents to write + * @param fileName the name of the file + */ + static void write(String contents, String fileName) { + File file = new File(fileName); + try { + FileOutputStream stream = new FileOutputStream(file); + Charset charset = Charset.forName("UTF-8"); //$NON-NLS-1$ + OutputStreamWriter out = new OutputStreamWriter(stream, charset); + BufferedWriter writer = new BufferedWriter(out); + writer.write(contents); + writer.flush(); + writer.close(); + } catch (IOException ex) { + } + } + + + static String getDateAndTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //$NON-NLS-1$ + Calendar cal = Calendar.getInstance(); + return sdf.format(cal.getTime()); + } + + static String getDownloadCount(String filename) { + String path = "http://physlets.org/tracker/installers/download.php?file="+filename+"__read"; //$NON-NLS-1$ //$NON-NLS-2$ + try { + URL url = new URL(path); + Resource res = new Resource(url); + return res.getString().trim(); + } catch (MalformedURLException e) { + } + return null; + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 2 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/analytics/LaunchCounter.java b/src/org/opensourcephysics/cabrillo/tracker/analytics/LaunchCounter.java new file mode 100644 index 00000000..6ba71c2c --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/analytics/LaunchCounter.java @@ -0,0 +1,167 @@ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker.analytics; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.Charset; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import org.opensourcephysics.tools.Resource; + +/** + * A program to read the PHP launch counter and update the launch counter file. + * + * @author Doug Brown + * @version 1.0 + */ +public class LaunchCounter { + + static String dataFile = "C:/Users/Doug/Eclipse/workspace_deploy/analytics/launch_counts.csv"; //$NON-NLS-1$ + static String NEW_LINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + + public static void main(String[] args) { + + // create StringBuffer and append date/time + StringBuffer buffer = new StringBuffer(); + buffer.append(getDateAndTime()); + + // get file names (first line of dataFile except data/time) + String[] filenames = getFileNames(dataFile); + + // go through file names and append tabs and download counts + for (int j = 0; j0) { + String[] fileNames = new String[split.length-1]; + System.arraycopy(split, 1, fileNames, 0, fileNames.length); + return fileNames; + } + } + } catch(IOException ex) { + } + return new String[0]; + } + + /** + * Reads a file. + * + * @param fileName the name of the file + * @return the contents as a String + */ + static String read(String fileName) { + File file = new File(fileName); + StringBuffer buffer = null; + try { + BufferedReader in = new BufferedReader(new FileReader(file)); + buffer = new StringBuffer(); + String line = in.readLine(); + while(line!=null) { + buffer.append(line+NEW_LINE); + line = in.readLine(); + } + in.close(); + } catch(IOException ex) { + } + return buffer.toString(); + } + + /** + * Writes a file. + * + * @param contents the contents to write + * @param fileName the name of the file + */ + static void write(String contents, String fileName) { + File file = new File(fileName); + try { + FileOutputStream stream = new FileOutputStream(file); + Charset charset = Charset.forName("UTF-8"); //$NON-NLS-1$ + OutputStreamWriter out = new OutputStreamWriter(stream, charset); + BufferedWriter writer = new BufferedWriter(out); + writer.write(contents); + writer.flush(); + writer.close(); + } catch (IOException ex) { + } + } + + + static String getDateAndTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); //$NON-NLS-1$ + Calendar cal = Calendar.getInstance(); + return sdf.format(cal.getTime()); + } + + static String getCount(String filename) { + String path = "http://physlets.org/tracker/counter/counter.php?page=read_"+filename; //$NON-NLS-1$ + try { + URL url = new URL(path); + Resource res = new Resource(url); + return res.getString().trim(); + } catch (MalformedURLException e) { + } + return null; + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 2 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/analytics/UncountedFilesReader.java b/src/org/opensourcephysics/cabrillo/tracker/analytics/UncountedFilesReader.java new file mode 100644 index 00000000..0869d1db --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/analytics/UncountedFilesReader.java @@ -0,0 +1,201 @@ +/* + * Open Source Physics software is free software as described near the bottom of this code file. + * + * For additional information and documentation on Open Source Physics please see: + * + */ + +package org.opensourcephysics.cabrillo.tracker.analytics; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.net.MalformedURLException; +import java.net.URL; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +import org.opensourcephysics.tools.Resource; + +/** + * A program to read the launch/download "uncounted" files on the server and write to a local file. + * + * @author Doug Brown + * @version 1.0 + */ +public class UncountedFilesReader extends JFrame { + + private String NEW_LINE = System.getProperty("line.separator", "\n"); //$NON-NLS-1$ //$NON-NLS-2$ + private String launchListPage = "list_"; //$NON-NLS-1$ + private String downloadListFile = "list__list"; //$NON-NLS-1$ + private String launchClearPage = "clear_"; //$NON-NLS-1$ + private String downloadClearFile = "clear__clear"; //$NON-NLS-1$ + private String launchPHPPath = "http://physlets.org/tracker/counter/counter.php?page="; //$NON-NLS-1$ + private String downloadPHPPath = "http://physlets.org/tracker/installers/download.php?file="; //$NON-NLS-1$ + + JTextArea textArea; + + private UncountedFilesReader() { + super("Uncounted PHP calls"); //$NON-NLS-1$ + this.setDefaultCloseOperation(EXIT_ON_CLOSE); + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + textArea = new JTextArea(); + textArea.setPreferredSize(new Dimension(200, 400)); + JScrollPane scroller = new JScrollPane(textArea); + contentPane.add(scroller, BorderLayout.CENTER); + + JPanel buttonbar = new JPanel(); + contentPane.add(buttonbar, BorderLayout.SOUTH); + + Box box = Box.createVerticalBox(); + box.setBorder(BorderFactory.createEmptyBorder(2, 20, 2, 10)); + + JButton button = new JButton("List"); //$NON-NLS-1$ + box.add(button); + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + listAll(); + } + }); + buttonbar.add(box); + + box = Box.createVerticalBox(); + box.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 10)); + + JLabel label = new JLabel("Launches"); //$NON-NLS-1$ + label.setAlignmentX(LEFT_ALIGNMENT); + box.add(label); + + button = new JButton("Clear"); //$NON-NLS-1$ + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String result = send(launchPHPPath+launchClearPage); + textArea.setText(result); + } + }); + box.add(button); + + button = new JButton("Send"); //$NON-NLS-1$ + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String text = textArea.getText().trim(); + if ("".equals(text)) return; //$NON-NLS-1$ + String result = send(launchPHPPath+text); + textArea.setText(result); + } + }); + box.add(button); + buttonbar.add(box); + + box = Box.createVerticalBox(); + box.setBorder(BorderFactory.createEmptyBorder(2, 10, 2, 20)); + + label = new JLabel("Downloads"); //$NON-NLS-1$ + box.add(label); + + button = new JButton("Clear"); //$NON-NLS-1$ + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String result = send(downloadPHPPath+downloadClearFile); + textArea.setText(result); + } + }); + box.add(button); + + button = new JButton("Send"); //$NON-NLS-1$ + button.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + String text = textArea.getText().trim(); + if ("".equals(text)) return; //$NON-NLS-1$ + String result = send(downloadPHPPath+text); + textArea.setText(result); + } + }); + box.add(button); + buttonbar.add(box); + + pack(); + + } + + private void listAll() { + // create StringBuffer + StringBuffer buffer = new StringBuffer(); + + // append uncounted launch page names + String uncounted = send(launchPHPPath+launchListPage); + if (!"".equals(uncounted)) { //$NON-NLS-1$ + buffer.append("Launches:"+NEW_LINE); //$NON-NLS-1$ + buffer.append(uncounted); + } + + // append uncounted download file names + uncounted = send(downloadPHPPath+downloadListFile); + if (!"".equals(uncounted)) { //$NON-NLS-1$ + if (!"".equals(buffer.toString())) { //$NON-NLS-1$ + buffer.append(NEW_LINE); + buffer.append(NEW_LINE); + } + buffer.append("Downloads:"+NEW_LINE); //$NON-NLS-1$ + buffer.append(uncounted); + } + + textArea.setText(buffer.toString()); + } + + private String send(String command) { + try { + URL url = new URL(command); + Resource res = new Resource(url); + return res.getString().trim(); + } catch (MalformedURLException e) { + } + return null; + } + + public static void main(String[] args) { + UncountedFilesReader app = new UncountedFilesReader(); + // center on screen + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width - app.getBounds().width) / 2; + int y = (dim.height - app.getBounds().height) / 2; + app.setLocation(x, y); + // display + app.setVisible(true); + } + +} + +/* + * Open Source Physics software is free software; you can redistribute + * it and/or modify it under the terms of the GNU General Public License (GPL) as + * published by the Free Software Foundation; either version 2 of the License, + * or(at your option) any later version. + + * Code that uses any portion of the code in the org.opensourcephysics package + * or any subpackage (subdirectory) of this package must must also be be released + * under the GNU GPL license. + * + * This software 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; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at http://www.gnu.org/copyleft/gpl.html + * + * Copyright (c) 2007 The Open Source Physics project + * http://www.opensourcephysics.org + */ diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java index 9aa36ff9..639c435c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java @@ -48,7 +48,7 @@ import org.opensourcephysics.controls.XMLControl; import org.opensourcephysics.controls.XMLControlElement; import org.opensourcephysics.display.OSPRuntime; -import org.opensourcephysics.tools.DiagnosticsForXuggle; +import org.opensourcephysics.tools.DiagnosticsForFFMPeg; import org.opensourcephysics.tools.ExtensionsManager; /** @@ -72,8 +72,8 @@ public class TrackerStarter { static String newline = "\n"; //$NON-NLS-1$ static String encoding = "UTF-8"; //$NON-NLS-1$ static String exceptions = ""; //$NON-NLS-1$ - static String qtJavaWarning, xuggleWarning, starterWarning; - static String trackerHome, userHome, javaHome, xuggleHome, userDocuments; + static String qtJavaWarning, ffmpegWarning, starterWarning; + static String trackerHome, userHome, javaHome, ffmpegHome, userDocuments; static String startLogPath; static FilenameFilter trackerJarFilter = new TrackerJarFilter(); static File codeBaseDir, starterJarFile; diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/circlefitter.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/circlefitter.html new file mode 100644 index 00000000..bac6d7fd --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/circlefitter.html @@ -0,0 +1,36 @@ + + + + + + + Tracker Help: Circle Fitter + + + + +

Circle Fitter

+

Circle Fitter

+ +

A circle fitter track is a tool for fitting circles and finding their centers. It requires at least 3 data points, but can fit a circle to any number of points. Points can be marked manually or copied from a point mass source.

+

To create a circle fitter, click the Create button and choose Measuring Tools|Circle Fitter from the popup menu. Multiple circle fitters can be created as needed.

+ +

1. Fitting a circle

+

At least 3 data points are required to fit a circle. To mark points manually, shift-click the video repeatedly along a circular path. You can mark as many points as you wish; all points are weighted equally in the fit. To move a marked point, select it and drag with the mouse or nudge it using the arrow keys.

+

Once 3 or more data points have been marked, the radius and center position of the best fit circle is displayed on the toolbar as shown below. Also, if a data point is selected, its position is displayed and you can enter a desired position directly in the x or y toolbar fields.

+

circle fitter toolbar fields +

+ +

2. Unfixing the circle

+

By default, the circle fitter has a fixed position--that is, the data point positions and fitted circle center and radius are the same in all frames. Uncheck the Fixed Position checkbox in its track menu to allow these properties to vary independently from frame to frame.

+ +

3. Copying data points from a point mass source

+

It is often useful to fit a circle to the path of a existing point mass track. You can do this easily by copying some or all of the point mass step positions using the dialog shown below. The dialog is displayed automatically when the circle fitter is first created. To redisplay the dialog after closing it, choose the Copy Point Mass Steps... item in the circle fitter's track menu. To copy data points, select the desired point mass source from the dropdown list, set the desired step range, and click the Copy Steps button. Note: copied data points are not "attached" to the original point mass positions--i.e., the circle fitter points can be moved or deleted without affecting the point mass positions, and vice versa.

+

circle fitter dialog to copy point mass steps

+

4. Moving the coordinate system origin to the circle center

+

To move the origin of the coordinate system to the center of the circle in every frame, choose the Move Origin to Center item in the circle fitter's track menu. This is particularly useful when the center of the circle is outside the video frame (e.g., a video of a pendulum bob that does not include the support).

+

5. Locking the circle fitter

+

Locking the circle fitter prevents any changes to the data points or circle. Lock the circle fitter by turning on the Locked property in its track menu.

+ + + \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/datatrack.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/datatrack.html new file mode 100644 index 00000000..67ce8c20 --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/datatrack.html @@ -0,0 +1,68 @@ + + + + + + + Tracker Help: Data Track + + + + +

Data Track

+

Data track steps

+ +

A data track is a point mass with world positions determined by an external data source, typically based on a dynamic model. It enables the model to be drawn directly on a real-world video for visual comparison.

+

There are two types of data source:

+
    +
  1. Delimited text data in a file or pasted from the clipboard.
  2. +
  3. An EjsS simulation or other program able to send data directly to Tracker.
  4. +
+

There are four ways to create a data track:

+
    +
  1. Click the Create button and choose Data Track... from the popup menu, then open a data source file using the resulting file chooser.
  2. +
  3. Choose Import|Data Source... from the File menu, then open a data source file using the resulting file chooser.
  4. +
  5. Copy delimited text data to the clipboard from a separate program and choose Paste from the Edit menu.
  6. +
  7. Run an EjsS simulation and send data directly to Tracker.
  8. +
+

1. Data sources: delimited text data

+

The figure below shows two examples of delimited text data suitable for a data track. Note that:

+
    +
  • Data and variable names are organized into rows and columns.
  • +
  • The very first row may define an optional track name. Names should not contain spaces or punctuation marks. Underscores ("_") are converted to spaces in a track name.
  • +
  • A row defining variable names must come before the first data row. Positions "x" and "y" are required; time "t" is optional. Variable names can be in any order.
  • +
  • Every data row defines a separate data point. Data points must contain a value for every variable in the same order as the variables are defined.
  • +
  • Names or values in a given row are separated ("delimited") by tabs, spaces, commas or semicolons. You must use the same delimiter throughout.
  • +
  • Data values can be written in decimal or scientific format. The numbers "-6", "3.14" and "9.5E-2" are all valid values.
  • +
+

+ Tab-delimited x-y data + + + + + + Comma-delimited t-x-y data with track name +

+

Most programs that collect, generate or analyze data, including spreadsheets, are able to save or export delimited text files that conform to these specifications.

+ +

2. Data sources: EjsS simulations

+

EjsS (Easy Java/Javascript Simulations) is a free authoring tool written in Java that helps non-programmers create interactive simulations for teaching and learning. EJsS was created by Francisco Esquembre and, along with Tracker, is part of the Open Source Physics project. EjsS can be downloaded from http://www.um.es/fem/EjsWiki/Main/Download.

+

Starting with EjsS version 5.1_150801, simulations can send data directly to Tracker where it is displayed as a data track. In addition, video and Tracker files can be loaded into Tracker directly from EjsS. This greatly increases the potential for comparing dynamic models with videos.

+

For more information about creating simulations and sending data from EjsS, see the EjsS Wiki help pages.

+

3. Data track properties

+

Since the data source usually provides data generated by a theoretical model, a data track is treated as a type of particle model. For this reason it's user-controlled properties are displayed and edited using the Model Builder tool. To use the builder, choose Model Builder... from the data track's track menu.

+

+

Data points loaded from a data source are stored in a data point array. Each data point can be referred to by its index (starting from 0) in the array. For example, in the "launched_marble" delimited text data example above the array would have a length of 11 with indices from 0 to 10. The data point at index 10 would have the value (t=1.0, x=5.0, y=-10.0).

+

The following properties are user-settable in the model builder:

+
    +
  1. Start Frame: the video frame displaying the first data point.
  2. +
  3. Frame Count: the number of video frames displaying data points.
  4. +
  5. Data Start: the index of the first displayed data point.
  6. +
  7. Data Stride: the index increment between displayed data points.
  8. +
  9. Time Basis: the source of the time base used to determine video frame times (and thus velocities and accelerations). Data Time is enabled only if a data source provides time data.
  10. +
+

For example, using the settings shown in the figure above, data point index 2 is displayed in video frame 15, index 4 in frame 16, index 6 in frame 17, index 8 in frame 18 and index 10 in frame 19 as shown in the green and white bar graphics. In this example, the data time is ignored since video time is selected as the time basis.

+ + + \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0f28b3fbfae7a775a200ce51b712fc9ef57bc2e GIT binary patch literal 2535 zcmaJ>c|cO>9=#VXOMnVWW~So}Ey)EgxRWLzk~v|xOj=VtP)IEW21v0Lmo_uCY@4#e z)U>A+Q?~e8#BJJqjirt4QfXRFrHxI_RO4VToA<}-eSh5hecwIj{Lb%w=ib?Kgn>cQ zWMCO^D-?M5;r-ipBa$;&uSQ<~`p27fttAILkGYi!W%a9nde*h*RED5N3hxc$9$7*^ z5J@ia6C0QNmdELuwgy(lU+eFfdn_g8oPKwERmt@Vhuy*F%s;Mf*_KeJ_A-c64IB2| ztU1%&wDHQ`hR0XZF62^o1`Yi7^4_aQ%{^^>!vp0%{}5dDEomFOW8iM?rCmjBWpO8z zCm%FCdEK|=+WxK=545IyLtGZ4(eb0@kl|zM|$M2oT7c)mkN2iVw z6GUQIAk|7O_ux>SN}9A>u7wlj$*GDE+N*O7G&ofjLW}nkAtF_nJS8<^rCJ`lGAb@< zO_vs6>dmU3bQ!cVm< zs}Nd>R;%JLnVFfHj7%SfQk~3X1qB6-X|UPe7KFDZOQDtOycHVPaRq@~lcY{nX;YO7 zcuY~6s9d29p;?^%r-gLYXIX`Y@v$97k}{pCld7031~S&tI8Y?||IqaG&uEP{M*g?o z|0%4A%TmdiF>;M^g*r)YfxC{CQgOo6a;a9Sj#Dbr#^0hiMX6P4Qj{tPgTg2 znVOGik%%)#q0veeN%A>@5SoS0NKKV-5TT!sz+dRg_VM>)vBLfMVLm~877`ZV$KtaB zSp0FWK$)~6U9QlMb7g;X{l3T@3qrceQduBZr)J1yLbWm-{@5@l^~+w^U)1}=m3`TZ z&lkB&iy7wFvHsUFk8fGBGdBGkTFc^d?Bxne*436!gQI_bc>nH?-$&m5_Gb9k*F%G^ zUcUHc;Q6!uzNfuCPaZ!qcRze^|K8m@x4VA6)!A|LM*C0K|J`=&>Xplver#=NZfZ0& zT)c4p+`sD2o;iK0?&OIdjK_~1t*!azk?N|$l@;ZO$_xh&>@VH7_xnA&ckSF!vVB`| zQQ_8tE%}=_ZQQUvFE=M!zi#cC)vH!!=`u4`Xf^8ZR7yp9+VW+oDalLavZO?*H#4##0D zI|6X!IQ9w=Yy8ClzK=8h>QFf7i}M_W0FJl!Zsyxsu+z++)%*NX1nU0NjF(sO;|~ zOH1qtJ@cc*+(&lk=yP@=I z$*f9jp__xhcz29}WgC01TyI{}!!-}iJv==Nas04t;>_egl}#(}7R|A+BeMx?*+$)b z)CY$>urn7>h1VG#1VD5$&(ZF@vD6ncEN{Vj??RgqT*+oM03@_?R}Bvhl8Me|r4MbCZ|eKWJ~D9&#`QF<1wXZb z0}&Z2#F@fKfLpNY!_PbbBBD1zwe-CJ`l22ItDQ|}yHTi-Lwr;YxiJku2a9uX6VGyL zne^aG3$oF}%XnCuxrXY4rwBu%;HJ=uXaR~5h+nMpF1Xx?sX4tYPqX2LJHHC7C8JLq zvW*5~kMX(aG((|khONKTz;hcAZ)!%lYTJRhr&|9Zo2XMJ_ru!NUZxxoWHMz9KY$VH zR7t%HNkGvHi^^lhk zaKoM$jE%YNzLgtw(Rz^5Rud0U%;#G1GbMZNak0wi?SOiAcr&zY9z{<`5(;w(OOjb! z2;Z}RJLFM1(E5ll{DJbMuz|%z6OlEs0;{_Eh)QQwL8q064i1{+(ogOZg~*Ee!DU;; zx*&9?^tn73&=rH7Z%xJ7n7zAQ`4E}zDIyWIlGA*Le!af0U=PB;R;{zsLv9J?emnO? z<{W(fDAJ6doCkam(eqSXjDNL=izc-jLGP3EO86KYRU8_F&<(j5N4gW_r6K}pT=&@y zTmo!FSr5ajxzX!U5rZ)LexKm0BR9ziFBd-|0U3easenG$=DYztc@Gy&L$Zk@jetuE z*D6DtJF%E+>xf^X!xsZqbP38nuzB*@X#iO)S+~~l0L9TzSTwB+gs3QhfOxvo9;r#i YCahC?peKU|vGF{+3lYLl3<%8p3v4jIZ2$lO literal 0 HcmV?d00001 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_dialog.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_dialog.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b90bf5770e3d81627d62762b21d45c79040bfe6 GIT binary patch literal 12641 zcmaKQbyOVP_GRPN1W0hV0158y?gZE11n&kKmoyGR69`U#;K9A|#v6Bc2pXIaAV7NZ zz4^U2^T)iYRjcaWQ+pq&yKmK6M_E-#MAVuWWgBn{01OTec6D{_?CcCHayG240vwRY zW@JZ4M}2*Lz=zDmmHLy?EI1sVo0~fpV~Zl8O4f@WrB4x9XzmX?kzlA0BH*VfjSYf24xxed~0=jZ1;lMSz~u2zu9g@pxO zUER#gOowLV%E}512HV`+Z2ECFwRzUu+NU zggPuAAuErsa|Y(>0{{tQS07aXiH$wA1l6^?S^<9v{*?f=tjCQ!US7kuZ{Lo1n9f3s zf84Bmt$+al0YZA2YMX*{PFQ|B@wA-=-}|zD2hx>L^?Pix5u-Z{t5!Q zx$zzZs<~9p8#z6lMk0F>9gunIfOfU-$cAp@6*8df@u53tb8}?!{Cd83Z}^Lvk&KK^ z!gN;<@6^yTsBkE6^S-sUbEA2xufM+{ZL$T{UNE|nlv-F*+t}IJ`7Pw*+Vo|lr7dzF z*|;_Y`uerCwe>P4mjQ`qtf@nw@p|HHNW z@3{#5S1$M8WVruX*8gjn|84rKoqvY^5$)f}e`Ig({#Wase?^Ug{PXnq@caJm_SenN z>#NI)^Rv^FAIC?B2m5>9cXzh8HaFJSR#%pn78mB{W@o0SCMU+nMn{GbLxThTeZ4*K z?yk;`_O@17OLJ3WLw#LsO?6de#kcaZ(vsq$!mkDSd0%pKva>QX($hYtrhNLCoRpXl zANL_PCORrIB0MY<`aUE$C@{d^&)3Hr;^pZ92D!Vrx;Q&IzH_j*v$e6dvV3b{Zf0s? zY-DJluc!M)M_Wr%LtRZ(MOjHvL0(Q)Mp{ZzLR?H#L|8~rfS>R0hT`JnV1NCJjg{pk zGZP~NJsm9#H5DZVITKF87m`H4^Ifke(~BIQCrX#O~|B{qf+;EAdZ~hc@05Sh$(CjW{{b(8kHqs(fwvV zTyL*V$74H^quNlSnJ(gWyw+O(VKPr9Sd2=ok!@N-CFQlnhq_^qpPVAF!H&F2Yn8vsh6++@E_>~f=djnKHG3(^3WO5F~ zy0JFc{)oD2^L1JHruBYy=qLeQn4TD=Oh&$eOFa;$9k60gV;PLHKyIVVT(%VklH*yHv-lKqwMY3c$m6Z>!xU|pvth%+HF08tA;}hjL_ffo~^!)m&CC6)0 zv(y#>u|BYUyXvMK?yE#>@|_ru18Vn4L+I#xiYAv+Kd};}wIzC{cWs`m20GzZy3E=9 zqGdP*W`E|pD*!ryYxB{5w&UQdgPeClOI8tnzowS#$UI95Ao>2rrq0;$*i^(Vr}d+; zFx5IL5PS38S8)HZpSkDAcE)a^_^-QNZ&_z7%#Q}7txzJJl5fZ5rD@K4!I_*$lqmdH zRys-qlp#m2l5HuCjk8?c=}&6=NnK9r5YHa=>qlpfII^D6HnUn?T4fZZPlqaH#YAVp z@VGvFQCTfyXSrN0!tQrGDi(D3_Np{@;^tLZ0Ur-D+l%im=opV$@bhj!645x^R)?Oa z2f#X3L-afB(=+lq)Hj%zLQ__`)we)Ix@8!NPk)vKP`wwyTxfMQ%vLCKHNw%N;aSf! zq`}ePLCe7K{F6Zi#k(&i^ppkF0}iV#TU@W*Kh%8=JS#djRV!>4>8;qUzIGsE#%J8h zK3}-k-Ky!G&SCTsK#dDl6Tp2Ky;;bQk&&;woB}7~kgeKJlDfOTnIx@)BkSvGB!j50 zFqsOcdbVR&tM7K=h0jEGUbS=FBltjDEQC0e`{Yeo)>NjziXOvNF6k}Z0GP5g?yER> z!D^#NhTMA2+}yC4cgBh}4Juj3=GFtg4?6ebg?*Bn&~hIZ^5MM0izsZhj?21tZE>DN zovtLNUX4D~Z)S+}z4sa#qW4p>2;O0M{-56`E$4rJ9}aONAFrj|kvnWH68zayE0wGh z^E+ejnn@a`pSGYd75ZbH?`$NBBZ`M=M#WablvKm+dX3@F=J%Uucw(%4&B1_k>e>z} zJ0|~SwvEd{9*M2bwf-G}8>=>gl2lVw0Vq>p?9LvE`Z2x4NRgq}NU6F=J`6772zhF} zjiG)PvCG)A!aU;hQdmlrhRLJ6o;6^p742?UAo5ef3k_cx^w(34K<0Fi=|LL~DXS0J z7=4nfZ~IyuBYHC!N_&fqjb*o+1O*nsbGBd9V?0lWA_i&6oZ<*;QEdc@XnkxvaClSY zfLpLg^4{%GHuSI8}b zGnqpBpp^=E8KDZj$FU~$@}uS@8sf7rkR^>)NhTzoCQxkbQ8m;EO`$6$Nr`{H9g;DRniY8d{0??5|rEZ6jlk5s;KtRGE$=&c|(8@L1 z&r~!rIo`gpxr?ZUP(?cDH@FI0J!qsiGK?povG2ERX?I_|#F@&+qK4$Bce~niTE9{^ zt^WBL*59LMdmNV52FReVReBkr6U)N!F<945b|=OO)>nRFPZbl+@Y4#1mKp`eNCcha zSr1?`s7|NW1NA5*IlMZJH*`y*5N*6k!0Stj#cBPtm=kOM>QN--r3Rbi^((Bfv)MdU zgv(nDXQMVo{c60(BKen2xyIjjscqnWQqJ2b;4L%);2jpL69X)nX10jNYE#`rY;?Ts zQ%O@%xu*4fS9Ti!PyF;1&q2#re`dU$1Ys|&Cp<|RAFEjM&#wEt!Yhh~Ymh!tQ-Z6V!%|L8X0ze zu|U%x?IFr6)(=@6Ad8HKtd-vKAHHdJL!RhmWo-O#`hF4Y%h&P}(Lae&CNvM>k=o5D z8Yxi1GyrNsI<$(4Dw&fcrU@L4x3H6lhmcLoM^BHNU>thm4A`*(Y>h;6kv}XUCc^8} zbFtn(JHZ{N&5+6LbhTp&MBPa!!mn$~B3&J&BR=mac?%9M$G)4O%ZTPZz~D?kAiS zS}NEba)&`Cuh=2m_EEM{nd^ti`xgm=NW~SjNFbB&SHUV_&k3)J7wbCYJ-8y1tt3hx zqu*St9mo*0O+`z6$fdG4FogTa7n3=3z!(VcML@*vA3yk2`UkG9_TGhgoAh-Cc9&AS zb+&vwOb=VwtUwpx+#a_kGtY>{)~@YU)k(I1;D zqNRg&0>|#=suFVu`vpD;`#armU55EDp8obd(fESxQ&Ep3{%kzP>lC67-1qY z5yml5jxq0-qK%W$8{xRjNI05Rv)g<)0qq4!3KXXTio=eO%p=5$sPhirwTZq4`$p-3 zOHJ0^eb6VBPSVqlvgM<(QdEi5=eHHrdifqOrC7a>9!2J2cNcdb9pwb`dx~as!-l#M zN2k2AgOtglgwd$LQH^9UDs>VT91|GfxXWy)Yh?-Rh=i@OgdM+xMK)BUEmUPfNe$N6 z`9cD-TJ&sKm;y6-#2b^nl#sX=(%;HH=qV^BzYzV6#t&i)GE0pME7cSkB<+SJ+mXjR zs<{qRMCj6KE3k)1Tgr-?*Hkf z=qD>e6e2hp`d2qXq&E%c7G^LUEBjFLT!kgiG3hpjFTOBIlUV-`Lgdx8DHl`n*jJV( zCeG_cGkPrZE<`e(QxpNt$7Ufzl3~xj9+zTY$zHBqL)vxDYb4XmHSufXC{s}s;rrXAM^W zI1EWn3>nj+Uejj3qS-pwqPk&d;#Qf!*vz-{wjXQ+b{aiFi1r)ZrUp{S<#}?2} zhKc%yu@d*PrdxBaz7fuup+;C!7BEp2g}?uNp9i4KM|F;RnVu;n^l@m3vbrJP!9Q28 zFxOk4K*_Wq&$9qh#9M$Wylwl1HjDgPw3tMfLJTcEyC;k46KAL#6CWRS&o<@PYfjPq zJi&kxp>Ll>0-`Y5{P2i#WrcEkQHmB`WjU3nDLNOe#}<(~lTE-F1a6rq+6uJQl4f;_ zZ=CXsJ`~R*8;Yr)vkA?79Y85LyrSx4P_n~y8Hz2*`H(ZxT4Ld(w2hvIbL^SFj7oWw zFaM#`|66Iva4CJhQN372qiIF6X$3=OMO#}%$4W(eKt=Ph33pS{@in;GJEJ9&qsfF% z$w~SOO{15xss_Ds&a`Slt%|FbMgf^TRla=bT z-_;kCHCJLaN2Zv|Z4@f60k8619#?Aq{H_5|)uM{mqMOxX2G(L{*Wy;xmL{X3$`n|a z)L>f)5u4SK2G)^h*HO0DQLom~KGe}u)ia9MGn>`31lH4t*FD3lt9Vt%_E675)xam- zAYj%YgbZvb&95hjt08Ky5qW5kp=y*9Z&aXa5F4!*J*ro1Z`4?A)Ou)S3v85Ft(U@U zG7M}o&Tdj*ZwmZaV^Gm#Mb&I0-b_2%1l($Rq2BD=-t3y)=te+7^OOl!sYJ?fUv`?;(+Ynx)`(ik1j$ft1TE-LgV08?T2Q` z>}C=d*yr}T7^*fQ^)?&Zwo)0`RDNs11B^7TjSa6ouL7?xxh<%@6~Dc~Vzo6nuszTW z-|GPuQ33NBg_X(xy()11;yOA3DE+G)4OAVZqaA&OuvQ-Y89?Wp3vA4#V?D5A02x=8 z^3b`M-5DPToa1R3lj#_<68aw3xkA-N64x-JSFu7-QWOqpkWsS_6Kxw@r0n)&f~&VExH0 z6%RdxR-HkCy`{;$Pi8$W>_UlwxJ*GU?3H-cW_`kAEzcf%D_z?CANrVrP|5K6GT3{W zJ6ft;gb?7?K)eB|%Kn#?eKyy9DnSE`K|Mq4eWE!n{aXW1>b)Pt`}N0q->vnsQTLOp z1HbX$E3Ltua#}u)_Ayfr%5}8pSJqMIG+I{lmX5Y?00&Vd+AUpsBXjDwkkp8HafF;k zDlv@39$2w3O-(ox^aT|6+afs z(M2CWvMJFvAKx1HV>D>3R)a8>1ILg8f2RB}eO za-M-^mT7(7fCJ{BS*H-x(?&h&w%(ooW6B|TI&^i;tZFhod%@3jbdY_%4LaYvI!WYK zCmT#bK*A18o>JwV>@Dd}z1}X}-`6@m)2yE1bsS2-1#(+HN-h^swQjPncEW)rW6Mo} ztG^y*$;_70E_E_`&=uF4=QP(F&DZ&Utc9Sgr!lP4BIDP$G@BP`Hr}XDeY({7w7vel zbK_)vgPLmY(>5B`HrkQo`dRSiUBbHTDfyKfniMqdICm3OYRk2KGhuoYxlWFvwFTVR zGOnn%0+VBhkXu=8J`33{-a@d}OxQ(_ z-9=CGXPuR5hah-H&}B!uVn=Iqm#Jdc2yfdXY|Ddhx8|w)M@3gCN9W#ZM_xQoYrI3h zYE@HW?d+jDa%^?c1#Z69i9_9@GSQ_zF<>_FeMn;naWd=oV|p=g@!X~BDQ>*)w0nGP zf1YEnO=hnIfAX-R%cko91U%?lKNxsANUrP=KvvWXY_VXUu?X<2YrD4VY9IzrMx-C7 z0^i@9eV)rm)z zRYwBm$E5hvKRSj!(hhJZ49PsJ|DeTzt;La~wOh_Pky$xDdvUC;IsECQvsz=uLSyk` zeBI=;g|pSwvEY$J4t&-rU~J_q5$789>CAWY_Wi^&VfRzEr&FHXaTdv$Us4;}?hUW0 zP)4LS`=6sEbIshIEv<|J_qleyg^U-w4PTp28U#<~X)c^UTflz5FP?i@u{Ml1IlI?! zhCCU^Lc(af=gG#G$2-m=bFRoHuSmp~1^@OZBKY~RyZF%0PcV~)xW=b)f%r9Fu7+qP z?W)dpXs6YJFV!ZmofG#vgF7^9+U8|Wm1?Hg@MqH=ho^XMfagC~&ichSuMDbA{eah! zPczHwwM051G|;WcSX5EuiuL9KGu_UsyoEEW#TQRU%I6&~a({AY-{R-3jkDhg@85YiQ?dn zw%ol+&Z%zv@i&t9BbvY8S}qSJ^cJ39caN>kvL9Tj1FO#aapQk~OI#zZS+VIJ$sC_7 z$U`)ppW|oa#9m`!U1FZ3;Ly1@JtDtswoYLRi*Ib^Z8KNYPr#)XKxm)~HTo^!DnZlw z`_1N@d)~nHYwbTw74-%H^&*;9mRMGLHF-V z)3yo`uf7pNE(fC$gi-Zzd15Yh)iZeQCyGpF_s5eB3~_m4JxgQ5g(IK6G@UzqQ^26f zV?9!IkX@nyZBsCvKQ^c|dG|WuH}RMek5riROS6TOf*UUlZVrV*f6^sI?U_c@zd(krER7&0Ue8L--X=(F!s%ld6x`1o7~Iealvu3 z1Cmm?+m%3Eii5XfK!`)y6c_S1qCxTCY%Ht5eG|thsVnfqPXVVcqxXiLR99YzPpn2= zK_b_3Hltc&gR7OzD5piOwUjUCv3Uowlmtb1qsB15R&6;)PvpaIn~`G7AaiYGe7jC|LjnEDl#QhUZ`0_9i?=?xt-G+ zRUe-Hq~K`$Ks4FTBY2}@8mA^Oqe9cvgRb(@UJvG+gYG7*X@QrhWoL5gO5vnyHq-hp zX*_AzI^0FD8RyzuOT_xR@@BP4OH~$NPB8V^$eh)UO%=TAy;x)BA=$EsHaE}F?|VH@ z#^W*kc~L_kxENv?hFAT1!yM&o{%tswj~`pacraw!lCJsACP~h-V9kHF@|GT5j?~}o zle*BoU8X(J$jDuFLrngk5{iP zj?0q;LuNYD)-EOqz@g_eX1-6})7l`0n|bS&C!aO6^d~Po=gBAEt#E?uLvmA|E>FCG zcNTv8*}k;SJ8^kWMX$jIfBa7xu%v$Pq*VU_;5}Yi1YV7@<~|&`mDwCz3<)EH@8}Ms zFwav!@9*yvwXNR&dALQs2Vm+z(U`4J@Uh|J4mIRB*h=_re)7~SwGmnBDA*2A zx!-Rl{RX|Z@Oa7OPsRz!)$MFv5UnbgjtWivhpb3^FC%D|RDU?^^Tdpo{5?qGjH8@(lpZ*0$ zJ}ag!7^?9zKQHM}Mh44Nr_?|ejoi2lGoxHNW}i1J2MtBAN>$P|%qlHwmt`&>7Dc&| z;YHJ5wbq?EZ ziPM{RRsxv(GEgOT;fXXcx17B>SryeRoRluBoUO6`x5@#ddC!}j0=);V`d)=YVg!)2 zQB}pyVaw{~x^86`kQFi2S50~|^e;;7dL4PefhH*I%s{bY}uiu zuj*o*n~Gnow!vC-`Kyn!T@WXxZAs6YYZ&+TEm_sIlnj44jY_&Y;HgjiDA~>+DtoE2 zNN-VkGxPi{xZGjZAMpm)E7cl<6En+a*r;n5!;5L)r0GfhmfqzV;EB2-Kr6p` zyHDG;+$J*MZMnbD3%+W~AWf>x*GodE7m6Bqq{kbyNLYirP6ZWEqSvyBWEc-gY93Al zv_4KafmK&U+bU2|v=<*+bEA4WM;}Qf>hsFxXK(@A-6$L;cy`7L$s+Nw97;&%R;D+S@Dd z;x0&~HC5dD=$DkXxB>TAX^DwsN};)z-X3#ND~&#ke4R$&UP1i4;T6x9JL&H(nRJJL z=>2YMD24P$x&3IQV3A)Qb?|9OUw4ETLosxqkmrmVM+^4WrFNvDzS$+G(vEPVu+!RD z?ee{|jpxo=3kuQiMs&Oz8gpn)598`slz)Aw!c~gA>B`#&zDH(no+|htQ4wHp1grTr zcJ!~!B270HOL05-49{!kkDxjt31>>O)rx|s%jt0*G$vO6VNI>8sE5;S!gLWq_6=3x z-X(v23Hfoi5U-q7iM?QTS*-jEFPFT23T(fNQR}xVnZlr`Agh4c+`oOx^A2~(^xnyW zWSj!&jGfO?Vp|el+9`g^p4hSmE)Q{ex81Da7<30LlxLzB`dWZ3ht`2f9=;t17UzD- z4{LK=k>70BF(>@Q*IK!5yA+edis_;1nY-mf5%yZAd%hCc7nQ|9t1(FunI@74qr!<`D~K_2<|7jo{;O%ctfS z$U6_B&=fn=3+U~i->2`No;}JS&y%`|!IsDeJou(63h|WmQ@Au00)5R36+kS56+weK zhJvObgJIWc;RweXgI~*rQYXXd@@4Qk;6G<&p4;&}JAo6#OS3vknZx1FgJjhiL!YI} z5UycddC8KG$!;-*;%3O=+Vzl9%hFKywy2`ep7c=5z_Dv(&F@gCndR6t+L=ydUouNS z1@^Ly^)lx4;+FNYK;#(ajQhV3F9G!Rdnvvv(Burn zlnpdrD#iem4q6AyHTo=q6v&AOqsxj6pDP-nDH>5J?)435%neZJ50cp_MQ<_v$y72) z9W1?9DhnM%uUFFOS2B#xgN$-me4=vij{*gRMbIlHtrS;TD|w2%R0c-}j8S@hXMkuZ zQpG?mm_rSNXxy(@p3T;)LSo$WQGs`80TLL2a}`KWG(=PkLO>+aJ6|OZ9pNl77?#t6 zE2DB(-lE~xqQ--j@x0u0CBoh7Rj$}e!Z@YBU_I2~Wb~49Yt{6VW-h9MC`WWlvB<8g zp*Z3%W^17?3WLuih9e*}9hAH};;g)V(6qWF{!xqmn(Ri%ex^u%cd zHaEauIeOPxD~M1hO5qx*f7wkv6pcOh!F=T8sunnksIkK?q(&(^8T!(Z1x@{mzl5^H zjKCI=FApjhc|F#c!`mgnT53|)?TS75sEo{G);Ou>+hA6Unkx4Yi3~Q^np*p^7%@(x zBe#+|cGcRb-#%h#T5Y?xennHKez^l@3o0~eg*B1CeNnjsyaH8X3rwL2dBCgU@$$4`f zgdn1s!2LXd$B6)*4rqwbe@q=<6wGIOdP6m!^FS@9V>i|ktIH(#hQ9O74-Ey*T*{#$ zZC1@`PJBHs$!YF^H@uRwGR%4m!MaER#aS-=nPt0KA(C0)0bP<@z2}v)eB-(jiVBhz zdOWAIoKLeN`1-P%3UV|v@{0O`ocjD0bJEOn)X91(P4cS6b86mwX8I^37c-x7^vjv0 z-_RK7avJDK8t7{p7+4q>x)~S+8yF`TnB*FmRvDPt8+a@Ov~Kjn<^^$>GH9EKKq`Xo9-)H;R^H1h8v7aR=+Tp?BVRfe1$hK}p~Qs{=Drv>u? zLyx@$&v7~Mp1$071y4>IwH%{>sztzS<-qa9*DrH@#uvhJ`aDhzXD;cP*^R>`jUzOT zBQ1<0Zj_>ejbnnB?&7mUs^pMpIbD7X?d>cw<^;L3)A8orOI{F>QmF20n-9+s;>s}>_N*5s?eA)Hd__5W;e5z;MGP8 zGuVw1tjest(@Y$9wVA?=KJT3;i!HW!FQ<8*C?TbH4kQ; ztE%;31%2(?$~~64M>Omu_H!C0+uFBPO&ceI(Wl-K^ku~!Y?k*=jE5LhM^)n65k zFZul#GjLI@08?qEn;w**EITYLs3S;xD`4_)n(5c9e&`>;sNB=#+&xRy-YpEwDC{#! ztEDYm_uK~>iv$uATPw8Nfr3t4OyUsBDgi8^WGkUNG}*09s&8skrq(VO#a2A!lz%%- zLg6&Dp|n1hw&W%tfo0M`hCdeDq_jJX&rsQZZKslKd*Lq%xOVOLSw2}C+g?}`$!*Ks zMKVY=5YgLOu2>`aGpuC^3uwL|gqq6*?l5@&VEhrZ6`&2JDX}Kx!;JDaj>6a_+}RYP z-H~+PCHQ9h=d&@pkfHCm4d?#OlqyuQ!cKud>Nz+<&RBrg5K~l&-|fQA^EWEDN;roK znz~^W`GTFOp*<0r{hKel{Hv<6JW=}1cAyS>^@;DAN&-6jd&YkvO`>+mwb*s1_SC93 zYbdObbM4**I@t4L>bN&+oJH6Xq7u=?Hk95L-h|2Qbu?%S{KyOX}N zXGZ}}VcJ6X-~CeZ57~EeXttC(@OBXLRf=@3J_s;$sIlJf&ix)Kei+V=saqXEMjswB zxGw-c^pfI7MpZlTi8Oc_!a~vxwUTZ5;10T5jvqoooj3O51_Am!m=RKrAoHW}w}(+@ z2mJCFF{DmF?4wLfr$nEl$QOsz42KPpq6M^~wg`Z3^GkhlQCG}zEd-R`%gUQv6eAxs zDhefKR2vxMOb!tCCEqU!Id+e8E^RI@<2o*o5(P>8D3ChV`|X@M0WFp~_(iHQOG6a2A&Qm| zB@jfJ6(W3y;#z!7-;G6k2+){>Xl_EZ&H==CKebs=-q3mLa(nAZd+Tf8=wo>k>)hyW z0*sTqP4c`=YrM_6z0D`REm&`~&mopbZz}>HYdRlmtQ(_6Z{u?mbQvS6vQkoPPsgNR zj%4$qYlKKlI%^fbPnbiS^Vz7TC+ElxBakgxB1U%#YVi-b{r z1z9v^X{Slw;Jjb_!t>5aYW!mgOZvXv(P4Z`uc@p;gDw47%=-+`@7$C8kg<7p0m7z0c;nM&(`Lq*RplJ^i`wdtsRvvb)e*KgUx56$}l(Hk9TN z<@2Pk^J2FJy1@s6fP&KTJgna?LwE6;e#M(8nYVr)-v{_bFTlp+1AV)5yMIT$^Dn%) zPba(0xb?%-L80=CF!n>I(m^5h^Qm0ise12MNEZOhyUXkLi?<9&0R2vk4(O!2w;fPO zk-l$w=U2r#{~jygFPCiz%2yjoJO!lzhiA8h^3k(kmIsY?2aQbzjc*1`oCi%JgQmKJ zddP!kxPxb)}r-64t_+T_v9TZ_d^ag31_03@Bjq~75WbhV2$TnTb f4tL0|bjWw@kUh(geNf1O(I0Wg$7KR+fcXCcG{7@S literal 0 HcmV?d00001 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_display.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/circle_fitter_display.gif new file mode 100644 index 0000000000000000000000000000000000000000..7d0ba4f34432486a9a60040b60e52bad64e2edc3 GIT binary patch literal 4516 zcmd5-X&{vCzaIORQW23%qGTJ7C1cB4wx}>N(wk-M%V=hpiD($hSjvzXC6g9wG%+z{ ziIjbh@{(PaiA<6`b4KUw{htq~^Z7g-w$t^O#$nf$F&J<&*-gfz_Y=o|>Ba z_U+sE@82~vG#CuV!otGL%*>ZBUuI`#zkdD7WHNC$T+JL?yRVNu%>A0O>M5fv00?D` zQUCykCDqK;kn;Oj`B>5@i&f8J!2lovfV2AY9n#v^oKOIug#sjOeqTP8wy?mek8l8h zd@L4#Qyc*Ri_PyyXEQ<~>RE6gVxcFaGaXh#B281#^R&=V+Wbsg+9(B1o1b6o%_Na( zU>Q9?C=E@WPVbn*0Km))wJpt|`wk3?CBf1=GkX^S01W_+ce>|is2H|Q5|$JK0BLPA z0N?tG* zvgH5_6;2t&vSX$#l+De}ci+KKXUal=xw4Q50AR2sfQU2)01g1`Oi*_S@WsW7Oh*7) zu{bwZwz$~KV1vpT6gC1)g{5~)Pg5g+2?uesTvc17pvNK1j>1&&5qc1Hj^^@85+Gb{& zN%nxFBMb)6alq76DUQAb0JtSOt|tRl$z;OV2k27Roo;poW@g$-CMTK9%C_lg2BQ-O zz-szxdKP*d*-@j>%t|aJ0+^m|qtsKV7$AdPC0IrToPw=nR$u|p|Fh=^OUTLQJlM<) z_sgbHJe~lPaj{4FqEf#n5~0Hn7@Y( zLe}sUSRbd03k(kQ#JGWRfdN5iU7Ufe8v^O>smq@4Y(r$hzaSWY16kvp1MrSbQzXh0 ztfi`^;-Pj@4SW(%1vE6ZwY8PO>S}-*L`@w6sH*_lx*F=bYHHwr9$B_E6v9i_&g{%T zw%98JSsx50SQi4pVzH`N4OJw{8v^L)=zblG-7rX$0}>hVJB#OikQgM|2N?`D zwbue)^bJBFvFKlD8yj8AAT-7;$ivgp%s`gSSM~Kp=xVE-1a!1C)zvkiS^#ib%LLFd zfu24MXqmBdudZ?OH`fg55fbPbg!#=y{D-UYNA6A|1O~G$n|Y#qLp>2^P{=^=uYh%Z z|Llv}ANBs>BL3_P@JB9$?F?k6tpB6Tzqi=Evorm-Y1xZ^+uk#X-RmfJQ**Gke{OAV ztgo%E{8;|J^o_arbz%MsV{Ue4`t#J}#Q50g$ndA3!M_JSe(3Le-`msO)!EVB*4onC z)cEdg!<+iL*R?g(Rj*#sD=S{m%FCWppOuz8EiNi7$j^K7_|e1M2b7%q+4t^dkux*y zq~A_UC8gZDnVgiEK#Y%zjUhxw;crAnTn`VshQo%2V9=y^JQyIgXHJ6&{yIoR7>IDgL8=B%}qrG@#K(`Ke7#zuyx4D|JMb)ecOwKO%<*%wMx zMOjJlgu?M-@^VLIkAP(kOCOSwJSZW4KumQ1zP%!Qb_?$k5)|O)+v54dcS#Z&exI73KWa(=^MNER z%O1DfRb}*BqW)s1a=+o$7sVf+xi%!KxITFLce&5|qRVX+B}0|LldboyD@%u~aNiljZI#bP zU*oxi4hPgljW-bYEB)1uyNYij9ktFm`?BnFTLy>bNc+ojZ$7eV(qRMV@7}!y_K!~f zeEH(bM_<>F`^K}bebAAg?Gn4ol}vs#CHvgz6}>~4csopYV# z{-fJfuR^j1vcg%cAdTup-r4uXSGsCzHdiKF-fM2x*8bdFlX{y8xgE)Fnfj?Kk=zG- z9)y8-XM6Fh@&#b)U3vL+F`|w>T6ZX3XCmR)6N`x? zwMM7$MCG)pheXW}{B<`)PmN8c81bH%BAM;Z^0?V3RydV*_T+k9s`9Zpx%A^!b5nPm zyaeR#NISR4W$p=EKgxs1@SV=`X*5YveBq!bbT>FdATPS{o$t(jM5&2j&h<1MZ+ys# zWj$q!M{zbQu=Yej&h?@~K}t-kx58uHT20@q{fMHuyzEftM9E5wqF?@GEZCgS0Iy~z zC{4TTXPNhqRip@#neFBflwC%ADyUx3je>-dC%#a#P!cA>tG z5BR5*m2u)r$_FbLC4wMLy)U*^jzfij7}Q>c`etLpx1g4jY{s+PE5r>tx_qI2w{p5B zvPSHazX@1utH;Fl^S&yIfbpSS_=Cv~M*ITDgaaTT)`xJ&%f8Uo`X(81_a-HM#MRSM zKT5v=t$yC=TKlG2 zpWO|XN=5U<6m6O%;Tbnq>8axpt0Q)V?DBS*+a)3Gde)Jrr(hSyv0NR44&ZdTrvj-B@-;= zU@WnH@5;|JC`0FO$e=B~4|G5GY>-LUfpIArK5JPM$zG&9Mo4_iCxpg&$-KtzKsm;W zE->QSw>Mf+d2CG<_m(H@S+uyaF|YQ(sSMFQS4dEahC_~NN_WS0{ggC5kpH7WxQ@xo zo9$-VY(zw8?n-h|7TE2goi?@?8G24>l4pf(uI)og5m)1^v32r#q{?@n@nC95IEN^8urYYT+LjK56 z2gql&IUPo&CZ)?mVFJz0iS~EO&LY_N#9E%2YFZ-IBHlnWzx{Uq72MOyuM-Pd9T$$F zv%b>gtSb2Nki(|#EqX0t=BO@~v<8<*Y=LaG2ru#08y-UiE=k+5gd@S4T&B$hGKy4U zs`C*ppJpH4Gggp0UJtSii=+8Wx_KV=ljOPu2ggfw-qf64&Nl_0IM3n8q2#js_=HM> znUbUf9`06XcvC?#apV1E_2N8Sm7A@2<$GIOr6LiY#uIPwafv2<5l&)9Yy!g?y!UEc zJwcjd)d^n6a0EZHDajN&^NLvA+a_py`R%z}#>a-hI~9RbSvO0}P)6;Y$x#1p4hA=dpbJf$umznrDT{rO&E!tf0N) zl2H_iAJ%oRcmXTnxn4Kam%(r-@KLf96jy!v1`KPMpQFVT4-PjP(<{Zk9(Q35eJcC# z;&0djw$MLnVM4Z|=*KN#XIRH}NwA#hB_&XfUg@lDW_5!BhjOI9%N;fG+U#s(w*}GV z^H<^51D^wN_Wr{>m+D@b;RpKY*4hZCPtktUqKR{93a4>a8atJi1djL9uSGlzJwQ+!UBsKgUe2LIiR2sE(kO z7iyPg9l~Hr!e}!bg08yTBD#^{p}SinC1M_N+}~Bu>}0umy1th%`5>#~iVvE6jf1HD z_+e)WUESINmzI0=;5~TgBJIr~uVee+P13uVH)1OU(zzwuWAacuc`l!|+1J$klt${% zJi^vnvh#i%N)B_@TW=EHrFewv=D1V0cInlAQi=C9kjUI2sSP1wC{TOX_}tzbALNR* z6R!H*jB*#>+>7=xd!EX{A13yQ^IRQ>^c*jsT$jt=-B<@!Gz#?h01YiCMm-PzVCp9b zy{Il?7IFVx(G#t~Pb`g!YJik*sN4GQ(b9{wFDhS+ap6NBc(E0!H<2D(I)eiTw0WO~ z1yvVbs$G^(sCv;q0`D3cXpU@vG+s_C&6DCje6dp4oWDJBabe;e>j3=?&n;#^dG)}L zTI_R<$iN8k@WK8#LjC1abMD8RcV$}4`T%Fl(?ABfO^*f=CZRH*2Zy*0j?%kAgh6`I zPB~EnihdPS-tE15LIoW%p|4C$C+iIrb~QT!Js4Vy6dL*p*j9KfmHqKn+#> zQS=6B-|Hick#^N2ohg&~$qSC3#P;C+a!1#eNUAk0*{-)<%9$5P1Uv)HyCpVv=Mo^{ z<9lRQVqe}ZQy6h?R6Q`+a{DqTHKk_W``qT>Q0+>pY|7Q3uFa9n?bUtFKe3_b!Y?`) ziPn&6m?fsy$Mjh1-4`RD9N@+eO3AGEQclGboeSs1u{Ou{yk@O6o!kBfG1P55@p|K9 z*Y=9W*jAI}>&*8ox1G3F3Cb^WyOQWV|35|FQ>P$N>_P zh}s8@5~YK7F1a&Au zy&wW&On{OJx^#koD?zoMU@%Ki=7=$Kia9e7Z32zaC&wrqA#gKe&P&AFL1P`9VjXd@ zPUKi;daTPp>|blKt`c$X&^UxsoEI+6haBfej|&)x;|>M|OT?p~@ffH0P+UBY93MuH zzdjHjxfYL?AVx!pF;2ud9Fa&SCen$?1H@b2I1s-`LK-w7-6b+@&XE4?ODrHK7SR)*4kVVYCGvwoWzZy=Q&I&kiB3*>MNg_8NUB{+s*^~5 g15JMGl-!6*ZYC$U(v#Z1DIxBvhE literal 0 HcmV?d00001 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data1.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data1.gif new file mode 100644 index 0000000000000000000000000000000000000000..af5ca16b2fc96207069156896704bbbcd646032d GIT binary patch literal 1009 zcmZ?wbhEHbRAo5D5X!)y!vF*z_R|0V|8M*Me}YvSP+-DsFz@z++Y_v;CfsIVNK3Pt z@PAtxL)tbV!N6cO!HU6(f#LRqw6tyifjppC+JxKN(yV~0L5hINfdEXWF<5N_>I7=s z1~eQfKLKPT4FKDJhlTl(^vCs! zYogeO`%^M6bl6B72#B4Uck7(z9FL8Qj&|4ZS-2ctcS5((|H)Y<2971dO~raYqRV_j zr6>C`a7CUF@LA`z`-Nmr(}r6D|9zNq?2d>DF214qe>&*w-m>oQ?h5^7ueV>w7G7a|e{1$> zmnG*EKYx38#N8*9g^!2%Xij8-M{@|P!4g}hZ5y9@M5y1lo)hHJcGm44-@?c&QRh{@ z&z{Zo-M#ItuS55~M2`s01crBqZrEI??o3p+?95Kx^Xg2VUVznPkzc`^qfSj*`PnJ9 zQoG;=tCdagPnWH-IlS5@>o)z{_WS#X$IJ>(x9i_k-OueC8*6j&qtfq_n_>j7TYQN~ zxtQqg(lDKMf@Jya%CZRN1$U>jcs*RZvB8&ZLizuw%JV-;=9wq&VRNniv~ZxjDEyHk%i^5zls;fdpCTYq`7lq>D-nBh9cpq>bl1w?N2p& z^twm$ga?agYX!mcsUV-b|h$k;|G)eHj&8W++VFRg;jt`bSMf!@4zAA76-an9Y={UZ1t<&89PD zQmTWWnp}TrNc2HEicez4Vgv{PuaR(i!$oo*fZ;+kekWY>_~}*hh`* RS8LK&nw~Vv_7q^S1^^b%rj!5x literal 0 HcmV?d00001 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data2.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/data2.gif new file mode 100644 index 0000000000000000000000000000000000000000..913ce570fb9553b438b10434bd7e452d2635f10c GIT binary patch literal 2426 zcmbu7`#;nD8^>qn7-BJ+$Z^hRIgDnFZ6+Z(cQh<9D%_G=HEx6rpE3+NWTY@M>_$Y| z?XK*07IFx=?^sk)Id<<}-+$rz`sMX{KdBtlzs-4r14@7YhTv0aq;KI~u{)bX00R^1gWq`4ya4M{Q2V$0@Y8tG?U0@=* zRNi4Z@VO{U5s~C_F)j5UNO?{AxKsuGhlthMU$>0ooc*|1C6u3*n1C<2k*LCDqzSL zN(#J@QX)38XOsimW4`CT;hfS_kesp2Tg1b!$QN)CuJ5`_?fH1tgxPuL+DJ>0{X0d! z)pW>h!~M{vc;0QDZytY48tZ)2W!JFDgde!v)WNrd-QB{Y6xW}pKwykiRZ#26$>e=n z$raH3mUd$*5dBd=K`AlSCEYYQTyQ_?aI{KgFluG^PG(J2Z@MCCbeF|^Uf(O6Y}YGWl)ZYfWN^hjr-OEcbr4kcO3y)hX2`X4D?2LEPs* zJmqe1p6UrrKF-o}Bh)Fn88#W-W%8M)-JQNLu#cZgml#7&n!NP)#7f#~ZJ675&LqW5h3ad{W41nLggaIZR1pCknR>;k?r|-xwHFUqAFa=HKGAJ41UjCU;b8_tu6-P_UD&PY6WoA*93d z*U_bDD*3fhW9t#6PdN@UJrRpCjZZGKcO$3%G@Rvjih7<7DC4uf^}XS3Q8%xEH`K}u ziVSAvEC8fq+M=@U$E|k&-gJ8@D1&BEZV|gvhiWtpzCNkrv=F2Es)AKESaNNEyL|ZX z-ULO*ZW6Mc^XOke>x5*W*5(8jiTm=nZ-f{3q36Omv2lFo+^^7K@lHR)i(6kZL=Sad zOZw}~hqkXHZEqvQW>zdK(P!SscH7to*5<`S=MR`&o+l0NZki`LDR#fz?v>~ct)`tV zS~vx|K%s9!z}_DzlI|5?!pHG)z!uNYvPFHtWY_D=Lp`n?`Y z-TI4xlcP#}#!y#b3lRRYSxu>OQ|96xIULskAE2Q{&Iul%B#RWj7Qd&M(6<@oe&rXgXJXq* zpZ&9@dr2v^f!3oQdU5$qpL{R@p9rtn#oy|~zwtE14h)*D=EZtzQ2qpM3?lUD*cVN5 z=Buu+^k2~Yp1_S7{A~L*b;jVnL|9K+r)o`L=~1@QX6_cMCQqMn}OSmVC&P83K12C;!M(?_*cNBgEyL`J9+ zvfIwrti|dB=3e^N5O&(Dw%No{J4d<-j{3?&mGHE^ClAGd4BE=0s;_uD44i7Q(Vsm# zraVzlY>H}%zMTI@?6KhS>hBNAP$nMl+?40JSUu8y(a0^8>%pk_l=`dLJsKd8!+-i? BOyU3l literal 0 HcmV?d00001 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/datatrack_model_builder.gif b/src/org/opensourcephysics/cabrillo/tracker/resources/help_images/datatrack_model_builder.gif new file mode 100644 index 0000000000000000000000000000000000000000..27db8450d0f8ba5b2af8dd150f37f9f90050088b GIT binary patch literal 24576 zcmaI6Wn3IVw>~(7OVAJ?xVy~Y!7aGEyURducXzkoZoz`PyN3`6?(VL$dGG%3-Tkn4 z`$KnC_46F5K3(;zQza=a!Sls94!8|`fC7eQS1vAQFYli2@9%T!2e!7hLb98`#gsff zJvN@5WoBlst*w~_7r6dBpIkjVJ8P_LA5%}A>zi8E^)1v7DC!vdJ+gdq+URBe{PP2Dr)M^Tbl*ZcvugnIwtkx5`)RDP3vbb0IWf@?xmCA*4KT!pPiWY@&f z?8dnv*yj5BnubI4=;){_BO|q<^K35d_4T!NW>4QQ=SkNB?Do@59qgG{`Ll0Y-7WRc z?v+P!wXm>o{>JN1H}G^r#^J@icWQ0ck8CZkG&T`M@01_P#^2^QFO~~7%gP!OO4?Li zQ|w~vGJf=Ed1YCJ6}@ld>G@`^3KVNScAT4cw{KMB%N*y zrfcvhYg#xJ^iM5ro}8RmWOPt~1ny#Df7iIrot*)Aqf#p>mA=KNXOt;BB^dhWrp=wX zfx-LJX<)Fswok6MSI+5N6IeZ69SrV)LKW;IK|*q6gX?cZM2%-nV6gi1(NRW5Q)y|b zS5zh^KsaUkSl1`RETm*{G@X=@Tg@eT`LLx9qsF(UH*Wf7W3Vim2cYhjaejUtThy|A z1hxADP;!jhT)nGoYI2M$aEUK#IGF(eL?V3z+>@(T=dK1f&j9)vzG>C|8Fd-}fRc0K z!pDH1aPstJF|AB>XHh{=>Pz%ienpn{S$kq*8qGX>Td3u?y2pi z+iUNBm4mlK6OJ0dg+}OqV-;-a+!_nB(*4%~6#N5&vB0zD`(L+IIZ6-jW$te$# zcN8bF! z?qKR_Zw_(!Z?4(@!{z*6x&H|Sd&hs8#m$|p-OSA-oE+@Q{>x!r>;K&rw*OV$|KXbb z@3yf2uUyuD#<2e9v;Mz6^M5z}i=F=z|0ihwRsJXJ%_09{-RWOY1EKG4uP@I}j}P~E zw>Q^Umlx+}rzgiphX?z6yF1%kn;YwEt1Ew(m;NmNUidXXH#;*uH90XpHaapqG&s=T z*W1(G)!EVB*4onC)cCWZzOJ_BM|D+YMR{3iNpVqOL4ICtPWJb#%#8H3)Rg3;#Dw^` z*qG?3$cXT;(2(GuzyNsGui|2&BEmv~0{ncuUwF8=I62ta{{2ua%uI|7^mMc| z)KrudO8Q7zoFt=qaQSvvKd$N5;CqwYY6(Q65i0BWQQD3VI1pdMGN_*JGvu+?Q8!`9N*nejGT3d`eLQnBJh2a{jdy}96~zaTjQR!%J|g_7)9vwF z%en)uAfkhQO?_WJ-)Q%RMa<><1>9*cga5}pAMDJ(_rfw8wTs5jSZFEs*)Ol#r@KxQP#CvpY}TK30qEJ}R< zb6_VA#C^G)6^j={IHHUfMTneClp-nEO_Jg|Doz#<4jBCSg=}CawRaaVnWl?!P?FwM zkNbhf6v1>qlQQ6&G#y->@n6M(L8b2=F2naaZarYtwKVQ~=@03A7M>+}dN9Ar3jFpr zX$yQQIutDH(8!!t2jl?V9c~w&ySv!Jp)83m0^|?NrMlUQ4#hX=1CaPT{kDa z;@0-0K@ZANi=4zN5NEm?#L=|78p5}%z8XBFI68|Lf41&Vqp_+yavJwMrjOn+PO9|& zv44bV^T3w>R}Si)UCzbOl|00gv{&2 zx7(r@&sP&KnN?+$Y!Dwy)uEwt#L}rhjcQ^05Jg{_X?<@?17vws9R^ixL3L^E=Z~xp z<32_Q4Q)lx);w;Qy|YbXJj|gZ7L_^5m zdLeEN6Q6OS>V6t*vbZCo=!Awza6HdSdQ4K}{+zyH+7*$v0XvbPKr3+t2#w_>MMZ~O z8b<~lT`wXn#J)cca??re1$;J|4P~(aAlz6dM&CBzb%C(B+u(~JmMCH9dK7`Lb2RYv zy@-S+1sEIn$NmK%BHRyj$kL##_<#?^WQfwEq6F6o!MCQQcw?gyyeim~0aR4PQo=|o zvq2eyWC&QaC>ZzoW{hl~!ex-ivI`P4^pwa^UDc6zZ~If*S90on4)_Sy>%_)X2(Dy? z26m`xRex7%U`6v35xVw!30M`f6(9{!O4m#8psJ;HmVX6J=4Tz6qyn>@f7?MD-kk~qwD zVr&c*HEU$30zYU2{}@k>Z6(tQV*GIJquF~7JmfdJW=vIEe36AA^GdV%LSWA(E6ehY{>V9x?<^@S zLFcytGW@=GA1d4I5bJN*=Ej_jOh?%|W1a!r=zws9B)hPWOa(X=0f^w;F}OX29Rwq4 z0G333BuMLF!f?1Iy>E35gwa1yDJ7;oW~cw4(E_bL*JpR%_+VIH+25gf*_%33smC~O^ffvg+&q%xV3`a{2o!`=SOP{3xH}S6! z;W)@jF{A%E(6VE}AJHl!HcDUSl^7zh%OM7;P1pDyh{&7_1lsnhY^tDxcm;}NV8y4=27Vm>PuYfkQ zvm4!m*coA1m)RsxBY_0fWi0ysqk-eSG<4|-?EwDTS^3earMc67UL_*SA1EQZ4IwWbT;<}l>f2Ij;8 z98~JYot6Wh5oC^pcsDJh&s;nrxb4r9do-pvSRO%qbjlIz-@UuJTL*uafl;eYv^%lr zZd_;hU7a)d*3RWSvdUNt1d4ULe;J*pC4yqhB-h%vSWeO?0R~s4BKW`K_$XmEK4`vv zLAYNO1?Pg%P%v{pfR`FP9E_~IR$*{3UW$>5W*MS*m+BJI>O#FWtYvLmw}zd9OXZ^m zQdsQ6aq(Oui`=&NGoN>ekvz|38M%@MGQ77;(xa!~d%%nl@bpm_&Bb|A1%9ei3V^a@D4Y?N!{ESqv}6d(nj-~p!<0T{R*A3R4+9-`1n92@^h^rMXp;dol1aIl6w;9B&=Jg2FM&p*HbS1}>)c(QEpU-6? z7{VW@Zc@x8E*8REOw9rsHd*;))BQ()_5p5(f{R3zn#o;IKg3ic10IqL+8`Ig1aSjE zc1_B@$-*u@@Tdg&aE$p1jQKEjWcGdwmQi>Jm5#8^9{y{t{w8VmH^0rdN?p$_U9%Gm ztOFp>GJ`vS>mh>2b1Fh46yMFE*Zi~io%d2ULQ22$>I(UW|3_Qc z!{n<6vt&d_RkJtQfj7ym3Dq9~6;Z&iB>~k|O3EVYUJ%R6R0%dWTom)(vq=~p(UK4On&GL>v4cmJA|bdhm}3CRX2>e$`zI|i z9`VlJn5l>mIjYzm$yn(nZ_ETl#aZcPDW4`TL2hi;-hA4d{?OiDIH}7}lLobua$Q^_ zgoy+=HBJovUX*I1_-c@!9Ib=baKZ^U8VZtuSue7_1l%#mzs1PSVs z@EtDIp|%dA$PqUC7ch!T>jenUDg{6Og^#H`Tew2&6K*j3qgMa5J zBctHyA=9n}c_twAt#Bz(ODLIo%B~1;6ueP3(Wzc+i~g*lLP8N^8C5#; zF?YDPROPd(x^^muN-DRyj!UKY$rqTnBt$99nr+^iU7ebJuNot=8v0AP0x~2n&3r@@ zl8j5#$9&i%uUgW4b)0eaUv3qC&$ZL3=70$ee=kG$7sX%;rMf636l!UdRAG2rr$NUm z@}y`M95M|Vc=^pL?aJ(g-jbF>#vYUE;i&2{f^W30+VY;I)+o8V^r?_>)UQ@Q7G)^) zp+y2m)@3f0Kf6cZF!NzCF&jns8pU-RC3G9%FdL-_8?`{X)xcV~8v<PY%!C7R$U{igTX2f76z@oUf zO3JpQ4x>W}J48Ae_6uR7NZv14C9mW{juO;nQJm6xf7Di@juMg2!Kl~D*bS}G(23Sq zzEYYFYu-Z=x}oX;sW#==hFPy~!#qDg6hCQ{esW&7EmO8XuY@S>s`5M0g_^Jl-q##U zfu=`@*Aqd%zjb&t);=#aV-oej!?k3FbbfE-nehHngNxGp2PioYE3ZOT#@s6gz$laWu9L7qs(C&iqHi)Xq(nia+E?7_U4yM=+N_Ljc>zK$*4zgbl(l~~EsS;4@ z?D_jhMaE8-*g!8RAyM-(gqYm>>P$ZzB8mACob&SwE-Y{Mz!zB)@Gudt;w`6$6K~53 zE$3aVxC=dak76vCf7p~lZa|j2nE@0`-gZdVRmYBfpWInlA9ykv{4zQ#jTmNYox((( zJ~=?GJIx`^(d*n@$Ug}9(Y;Qed)cAg3G!B$Y`c@?Y<(E7#GO!El`A=6d6K4YJtb_v zYBYEqs-BxLBH}?|r;lr(j1QvYh3O50p`)6jOA=L`yCIq^U|adXSqL@ZFJ_}ir{?D^ z&*4YoCm$k1HsMQ5t3TsJnK8}^#vy~j=>=%}ssNeC zPpe3ny~k-KejXmp?!e5|p9&Or#6BFwrfqX|)K3ukf=F_Dm$&#A`bOwK^04&NGb9s@ zUj11nXXc6}p$yT^4HNs(5Y5rZS6fJ$K)jrUwqW2jjl{i>p}&xIR!{nUA!)b^MP=-x zoZ|wSRJTkAZc5SRpZ7jdxdVa&3dRsLlN5v*XMM4KO zpzC{FqBO}?S5ZtCR*rxH@rpw)C=-y^p z-)4E=22F310k+vmcDVd@s10^_6?S;mcLX7DUVvTU^DUB^4>&ADLuWn=`G|?Ly9)2S zN+f$Kf_rKPdm4UwTDf~V-FtfLdj{`&MkMJdA2Edewcd_Bn*4Het!Obeo1n1EqHNjaB*G((60f^k|0}? zumY6M{*nWia?jyv&-N6KHsbcS3@$&^9wQ1JA^Y#4Zd~FB!JgzEI4HnAPVYSn!p_wU zK_U5m%s`3RU8DfOAIEF@_-lrZYbNM5Bk2tbl=TKAbi-wM!;^Q7!Fq({uoonJBkX@8 zl6NC&cq=}0%}079V7M1#bSnnERUo|+_rJn-*eA%lpr1JcDAAE)0A>;iVH~b$h3?G^ z?=AfAt@7?|dhRXrZWFq1)z)wAgdSWBADl1lL38YU+LQg4%Pig*7$?*?y-M3z(|EBAweA4Ga(&wy=!|a}iqP*uy zjOResM-zod-5Nk#?Hxn_10IawHTjrW_uRShQtfcA@P4fF{?u*w+HLq8vwqW0x;Nz?J%?DNCzGV_hyG7HwTF8cCkJ`& zmluyeSlpCJ@0>Q)$l^=f~iymzuTB?+qt_#o{=$*~w+nnO*mH+mtZTzKet|egFiAwG>F( zE&@YJsnFnMY#FpNlrRE_z69)LSe8ukf23jiERJ6>q}^!ADrLH|SsjCHy*D1ph$pqu z=6QE+4^%D1!S&#AGGdgEGs=>IKT7>pR+q=^qYFq(COgx&hEO|9pWqeajLdhVvG{0d zZWl-2;8OQ4H|ep0oVp}lRF9$dNpV@*X*w=5zsfr)>3M8F*=p1nz=u(P2RZB@0lU@w z03+Gl4oOvpGwX%z#2k&*-U!Ikbw>JI65iqhYIk~vwe-4zF9Mw&e|Gs00&c|cjGzlI zs(6l*;2T1&wbO{+{OuI>4rFf^aiEg(RVg~W1s_%{ z3M)=(KdP)fd9$$SP~4zmeuxMfKJP6;KT>EETKSSm!hzZ%#kb-Cqi}nM<_(3|;y7&8 z4{=m@`W({0Q*5^F*6Q|#`eX&U1YwMV%7LWfV~A1;yl7`;ZTmQdbPLtXraT$;=Ox#c zhNg%ViM6NvXtVC`X4^=hzDaXi0TBYXN8mL#Zr)*LyA$wlnU=-o4vz zj_kwcI2;X6lBB@)1>!r3DUV4OAv#K*9fb%(vyLKl)3UiSW||g0623Z+AW0x~St0sHu{Gr~?&sak97H`6-p}skUw3lc zW5A0hx3Qjkp*sj(LJ~y|op)h&KcfEFkYS@Egfd|dp>pAGLA5Sx=YQFhekuQ&qt@0i zyn)ZN9&-G~SJ1!A`?@+RhCzHiNfmF60M{Lne?74>splLaPe55DdNY%&~K!8@Oy_4mwG%&Mwa#hka_P0VthwyXr8p4AFF=d~( z-}4CBB!=ibaZ&wvK(8Sb48U~Qc!C8yr30W?FyA~UV%{#@sVTR9m?NtGl7yqG&q6Bn zy9q{r(LBQ6w;TeaoXN<^BB+rGVuXy5#^ARaMLO#xkZz*oRfA>= z@&qu{|9+&n-wo%s_yqR(XE@jX2;&JdhIRGd+&=`j0=22dHVZN33Bh=odmo26YO*3n)&A>f1uq66>iJxWEwMpCe6L8n2wX zfUkucBvpyzR>h6=Q;IRUF}o=^8wvvqi>BSjaSv{Ipy`mX?O;L5WwL7G(5@=zMk}cu2kQ zCYvc!cGDlf-(+J@o`uT0B&p_XtL5`;eeU-RtIGug<>|;%XMFE(IG}KcsKdQk_8zzJ zON=OlOuf~G3rX6nR(td62?IF9n* zB&^Tp!GwT?r8zt^0K3+BfErp+Bx@Zt>ej1;`h`knrQgBF{cLlMlKS5WWGt{z6T(P; zbnqbxE>54Al1NuW`jTBZU|FTijM)aHDuUD%ePo2y*vT{+y!xuG)ERZxDqALvZlKDn zMDqF<<8yHkIv;O3VN79HAv58ha7xT_x|xAnAlhM`)6R z!h~O#r4fP>3JSOP%ULmZu;P@4*?ds-6y&AUb6)fgB{bWAmDD(+>FS?qa3&ypM3(k) zPdW|bhK0wxFqqI?J9FX&Z!kxal}1lJ$UL+kOr87KuS^vB1hh~YkCO&`B!^dPY8^i7 z^XJ^rjy)}0XCd@VnE*LiE`c@mv?6Y+sszrm{tc?JEHGW=q@1Ybl#4Ewx{P1C^ z72#b5!)rEB0mO|>R(ci6NtApqRo&0I4|a3lPfj+g91#nviIDc$-CRc)GJz8HV`}&q z;koC-0_bFcqqcij2HF$a`)p}loqMeApC?Umoin>$O%pbox-4j%GuBoucz$Y6!wcU8 zY~JpF8TmZpy?B!v8)Jr@JXOB)$&@b4$O?C+2$nUsf#Aohm6W8;d~&Hv3A3-Y%%3Ou zu)%*x=r?Oc+h-Mb1lJ1r*drlWubv>>n$%36Lvkveag|ahQ3YRHJ$IdjwLO;_-<%VD zhsHlWG|e?rZgyt0y2}$5_x1ACIPk5!S%p?k)foII^qOr;D}r}Y9uH^ejA1J~-Hk1M zQ+z7Px@#_i?j37y5Jy(!^_#So#ujQ68{HSir5aZ%l)3+FwJu!$)RfkHdCJeNu}uHW*3x@r?cJ?)ME~5m%zN$3&%Kz@_vCHe zW8>}Jy%*8oGMLt93(enSkk;TT+LC`uG0q9B=e=j1De|9O=cJ{<&G!xdP64RrY`DQ~ z5v}i$yua7Nzic0RmCt$;%Tpu`n)LU(ErY(!<^`Ty z5kJ*_=zC6VMS#Ing1)SfLSO#)LvNt|@36h^JAzk?!m#|paMirm69@=)!iYY-2sk0n z&O*uoLSMfNy-WzBtqP-`3S+zq!^jC^5s6?kiL851T~iHOt*6%W9Sc5por z2Kf;Jh$cmdS4BupMM!V^FgZlXi9{**g|7z?sN_Vc_4=vABZ0G@DKik668ca=1Zq?x zNGC;^SNnldO^hH|_SPVEI#D(zF?Omi*BuC)dSYC515i#E(Lc!|sMTDAOsFiKV*G<5 zST|veo3KKSK%vecb|P_6Ch;w@p59=wqwoFnjlJmQ&4j1O(yPc=Ct`#EF%aA!V*tVT zh-|En87o?u*`nD=m*QglUoU0Fxb?nr4MyUdiA&lwFczbZvN{oK7 z0SdN?%T0<4;t%A5zOKW3t-u^Ip!k|3ETI-70gnSmQ$0+r7OQC|P7ovTQ!08G0DGB$ z4jTR1y)@KzIMmo$D@ZhKybCMBKfFYavs950&=$;Bkr4?_iUh*?PL7Ni6Ah46Tc(8Z zT_yRYj2vU)Fq27*NM$c+r}(ExL=t_$Q4{HDmx5YriP-54(pUFCR`vNMCl4cs1kxc?n7h+Cp*_ja;+*9qb9TvAqsma)tu7f$Bujm z2x@Ex{_!L_ET5FbChpP8zOR&i(w20C6N9?nj!p8AK|NuI&15Q9OIz&5@uC9$Yysvo zC6~0bJH^T2{!ad?Q0Qp`j(1A=5XoO<6I?qB+Fvr>$jQ^|O*Qd@v^)Es+vE>JrV)dR zT>>eOQsgep3iPk1LXd_x;Re-tVIo(I;cbxEa(v)uRl+mf;NI}emtVwO{Qwp3rKk~U<4;F zSRQN_ID!y?-AI6+uBH@pMARE8w`3h1f?s{qDTm?RNNF3W{wPX_Ibg6Q zzCb=piCSa=uWo@RDOp2Trh?I}g=jZ705U(D2A!&yMH zf~@D0mZqD%rn~tc6tQ-@-x`dk+!Uy_Wa65>Yk%^|gb*J!1JJYr;g>vOLvT0)?A8`} z?P|R5z$AN`5wS~IWJ0LrTF~e&t(c~zAOWqA-x_%3f`6Ez`3bcJ*?;<^YNgm~L``X> zb!j~?0B~}`O0#jmx=J$;7nx;p{}yYdEm`Ud;vEB&c!kKg$@VGWLd7%VHZ z>SL}S+P5Dy8C(pl#kR(tHm%I=aZ?_yU&tFyqZtn28&0b0+%Q4I`-&k-oTn;rn zqFzw&8AZkn`j@)Nna`NVA{z9OdzRmXZ8Uu7-RSsjh|g&7&YXVsVII*}&YbBhoQ4rP zf)GL+T=OUy;=NXhD;PdGqqtLY$r$cuLoj>9NWY_$BK*){%+|4-l0Ob{K*$36x$(M* zQ4enI>4rWX!E;lgcT-`6-5_bC zh7^Pg3eytbJbb|!}`p8JJJX~vbo>7B-%J-8W3&KRUO6J-sQil*6&u91t@!H*+q* zoC`f#CQf8@BSfO!5pwe~nMK*X55zKi=7#J0^}zj?PZsQ4z&7Juh~WNcOm^*c_+;yX zLFg0%Fn6eZZ|I33@Kg=?OcFAE;KXH)BDUv& zpt8oMs@tZz#>VF8C=dO(faSPI;kYF2sH{7&oMqn^!rx?I+YGVoLFHg0U8@- zAlMYp*c3_FlvvoPAs`sxBV|JlbIw2cvDop{+tv)9)UMms-`hGO*cpM48oR9qn{x-c zPZyLrOu0B{9r0a9Yo<#36!p4Dy!-$20F+xE7 zD4a#W#f#v8&lO_tRT$6a`LuR6;1OOt642Er>6|&u9^+7@`ft-7nXDWiy)`iT6?+8^ zmZ(=osoQdX?z>0D1xgQI`z{=bLhlXN{vU+%_gs5Sq`(LGO91WVDU0;-V0se2^c?wx zwnhq{mD>5a<8Z~i$iEGt2?rPBKtX(`zBWMNt~?FY(Q^yJA~fc`b^UB{jat6V%;F3! zOSpP#zM38Wwyp6O&;yxZ8HDGS))NlqWwmkuI3Ho=2wpgKdzye~#p%j;;W5x?t%3cc zNymi)zH+Mhri6EX z#05Z=(jj3*Ql%Z__YY((M`Sc4qD+^i1G-a?-Ucd7^nMbT<<6k=2kwXmeog0F1G{(hyX3{ISNMP+;XsvIyMC^LSHXO<7B#3N20+g$ z-OVA;Q7YTJ=TeuoSFda$W{dD7Ae&*`kqr@pgVvKn%9Dfk!tT(Kncfpm(@hcMar*tt zG94n0;D~ehWJ@~eZ<*~uk8Q=Grg!Q5tz{hW?5a;QAez@M)+2=r39zGc{%Qoo509}M zb=IzR6&JXwy-4^|)^2L&M3rw!&V;=XPU@q}aR$)I$Z3{&QuJHTQw}7(qCs^UY z5r=bC7V(bor3t*pNki}JoO?E5k5EM4Fh$6m!^X0EyrQNz6afH>6bwa_c${&6sj$eb zCh^<;L$t-}w=3!Q-Q8`~{iacT2{Zpbmln7rdG=Q^$~xcnY{Tz7yw$q(?QZznnve%h zz8`kNv2XW#!RY(Bga5Loq~6&k=*WPfA~jI z$YmcdKl^CGM{i6Z(YL}f)moCQM&n=KRDYTK;)PU`cMs0|tmsGc;-*GAk&tWTd40S- z(ELsP6UMHXS)0D*R#Yn@6 zy;?IwHtk%0^S&I3PLs`xSW*Nsw@c*&lIGB)+qgD`rNea|S_OqL$ZZYdaB3|Xn2-{9 zQYA^qOQ8EvHF(T^Xm`A)NLBa3EpkI%Jk$@Sxx6-tSAFGy4kav`XY__iSGJY z?d8XND!U3}L(&=+XUoz(EmOtP(`nK{TfQ;oU7df&K)9fZ%-9JUK;wG_4PwdigNHup z`hbT&+jfFSh`nFIqtNb&lDxHfMho(L2^Fnw=8jh=+vIiq_neOYq!0bQ*cwK4t&AhD z?6V@MQwx)bUN+8oJkYV|76u%X%5f$P0nXp*>AHrit?s{2o zT@kEcJU^bDOxx+!9UWW3FPpr7RG#((D7(KLSE#OeHUqio+VYDuA+1M@s7`$6Z71D) z7hNy!e3yNwLi|@lg#P^3V~jogH&c8U{JIj}=e!2~H`^g0)C%#G=|(mh+zLV{1Q z%`cA!XuJhQACqbOyB?M+1clzzWjCJx^6H7&SqB9Cp(YwiIp?is~jTM#Zxk&h5dL(v3s?oMqJ|n#G1OTrJKJ z+b^X7VM}fsG=sA_8r5|IWWgQnaq?Bj>u@Ax_Po+y1h;)%`t&QqQ;J3;jXuGAJOJJy z0uGbx^MrQuP0p2E3d=_36oN-m@`4Ku53Ej&a(A4s634-pRP{dB8Wpk|GhEt|`iXGS zg~Se`QGwWbMf(Po9D8eWDKUom#H7Yz8UcC~!;D^DzatR?@p1~pQ6-Cp8}tOYesS~9 z$P(+fg)n1f5=~=@mMUub66QECk{XilcZ!Ihk`-b8@lgc8T`tCtV@CL(sX#lIa$@^K z<$>|iVha0&fSWYcsn4qBL3g>op?1Pd&b$*X!|HiII``PaD>eNKf#oJ|j7g&?Z9#rV z`8J^pV&EqkYZ*$^>CR#zjw^Uc-uq-2<7)PfacPLm!1sVRyKuM@vCD*;lwmzvwa$8+ z-wL70x$w+(N0d6o?-l-~@>Vm8yMLFiHJTaJE45`kbr`>cFyJ>XMh4C0*T)#?c>D(7!_4-w{e%H{_b?(dRv%|RYG~d#F z-^J?JN7%KIma6s3)yVyuZWeV)Z7+f#D2QBi^G4nw`d5>^>rXKwHKo>m+-^`9d-WEY zbL#-fJ19boX&WoKb&y6742@E)-u_hU(Z}(z3`UmFxJ52wh^reM=Ulx*eA7B2_+B5T zU%j@8?cBQY8$KbqdY78LZA`(BEjn~^qfbL|IQ&dIwxD{C*|}}P;JqQdB%5n93Al!S@acIK)be>)MH zi>fS7gj2VoBeR>EDxd{om42ms9v6HKZI%{L^C~cB47btmz zpWd1u;+F+<5Yb)&uNQ$`v}l*6@h=}vx)pKY?5wjO0cXTsXmzRw$v6CaPRq#C^rY8Kmi zWaG{w2=(`HH*PERkFRB_jnTkRmtTglF2$A}C)y+5W=dXeu+_SbHESRKe2u*+-dNqW zQ}m9`gV@B#5+9lib@XqM9ET@&p2;4xuS*i$mm^M}TabFq!PY(wg?n7OJixcef(FUA z-*!IV2V$_qctR&_1#h^|`F6x+%w~gg2jU(smi~aA#y=A8;_Sbk2*evN{cPR9P;|_x zE_hkH>3-;j3S7F!d(ZB^><$b0g)6e2w#(+?Ok4VHn;IHV59B`QZgig3*WR|MdOWJ5 z2tE#w`doNh4A3F^gr?To8%`?iP&>ZgU|o2r&8|P+&b;nlu)ZBnbPqK5fS$S{9?{5v z2xK}Lq+tc5p%r-@VA9t_nA@qm_p7{j`OUkn4fto`hk_trGZN5`?9nw}+hy%35FZv> z@5O!Av^xioCRwR2$Jp&0H328t7VvS6jEPsVMZ*`8~crEcIQ527e9MvWR zm8IZ=4iq1Lp6uF{6hkK*U8CS!o?PP52nU8dc#60lg!$5^i%dk0Jx&_FNBUvi@FQCR z!a51AO86&@EkYgftF9avoh4)#<=sSMJgNfhMMH#ZQnGoH!L#q7Q(G>B1?UtMU#arR zSti5x3J5-te||1FJj*1%*P=0?!0X0ec#0)yCneRPpl#MZI$NSiD?EZXu6t9$i!`Cm zDqyHtrZ3zkp5BIOFlqiW#|T-a8>e7_Xtz;oGa&4QNmF1wn=p-MgL$=?ZMK=YC>h91 zG3iY|vlVf`EVExPaamA?DVy$c_OY4daQ`*o_^Sm@+W{Y&bSx`#rU`$HFeQa4;$1Z0 zeTFUxESiSpkiCEt@P~IelZpg$wYWuhgro3<1S39sQ_ z%el*MLiyEc2_&d3=(fwPQw$0%FBZ$^QYw^^N<$K*-)DFPcZE^*lyFNTm5UTb6U6p&1bO#VMa|Vn%n7I| z;izF`*v#4esM3u~H1>;Wy~q^_21MKQ&^Uog(}mg=d)h2n3e6O(UgrD~N_qy{dh_P` zf6aBycQNWqz;fpQ&Q}?-tQ*2u7@_PZ_=clUnVa-e3$PiO^6s08?x*ORDYhG$vp_8t z&1nSJcP%t__0J3WBn&91_7U{92jj=@KCH7@;$~4`8PWPov#+Gh22X1bq zpwGd^3bYUug0n`B+zqJ) zf7u`5FcNI!#~TPfwRDX-nBzS3;Vn3vDlR9X1NT+lYFj@nl)K8}A3C2? z#8j5WK=jPJErT?S;BE5mD~#hHd4w`>i7et7G=mvQ6^Xdk7kev7T-GVy%;&``yi^X+ zwX9=#jqkTMZhsi(W-Z12HHy!z$bhNLJSWS7u`W0__|rz5+;Ak=Ze8AcWISyZdQY2% zZt`)Mgj~W5O@=%J3vykmrmbcPO#=01?iaxlL9d?*gN={}{ z(QVIw_)cGdU{mYIa6x=j3sZHT!*E?vSxHb5-Ca?oK>ca9d~fS8S7q~~MP)h+S#6L_ zxtC3alWhz7NjZfz41-OBlSNSzVX=aFHCJD?j#U$a3Bq<|DTMrM0<@APp|Wegs&%n| zIPE03!N#4dYFHic=`^5k-nwymJRBnl_k#H(Z~6rY)9W%5hztkca47f8-xQ+1}psyA9~W^$Q6IrjaUUrh(E z)$9C-1FlSPNloT5;RP^Ho#$lzs8|jn?%jqjc4J-%`w=ux(KdbddyyHb_@vkCY^IyJ zl$??K{>Mi1QNy`iHhRsUW9Djd$adlJ_BGMwc>iCCnk@~2Jq;*i+2GtWm+_lSMIf*J z0Sy6FP-c{0&EdYu4$BWOE@nK(n$T`YgDBk}bSAuo{xKPr^P1{&Hs*^($ksaKvf=1* z8gkXld`aWb#&S`mA-uxta4hQJD_TyD=`bcLawo`o&sKR~Sw_zB<3We@I?N$}%?KWU z;9h|hC!6)Lk~P}q;y&%7cewUpn)Qvh{EYzS-Ob^(-TwLB!MTAI;86R74uTTYdA>UU zGy~p6MPT_Zfv^yGDn~d)M|fS3J%u9-tK%z-yXyJDi7p9NqL!@%3#+-#$8kaU{RtPhfm*0XJq`;X2pjRb9=t)f11P z;HC=`y%eKN0*O_x)c9wveIm#hG05@Qu8IDy0A(JU;W8o{k7K~`7I$$O^zj_{@fyn% zRcu6Pj1f|3GJIe%XmGMofHHA-@@I(hK$x=Lhz2Ux4P)eS97D1sPjV$Y1}S^SDz9>6 z)N)$fG9jz-Q{XaW=rUUHa$~siBWs)r)W94l^DH-pFrNi6cgQoFMKp8BG?zs+)5kTF zMK(``F;9RTNAfZ+b2Br>HjhO&%Zx8O1u#FxIb%dR$HzNg|3o}Pg)vjW1i z#yndD;%IU^)ABl>a#9SmGn<7pFhoEfbT4OeC_8j9qi6o;@i9lTGBa~OUvfd)&KM!I zId?SfZ1O{s#X>KH)Qt2|fV4l0^zD%JM3Zh4S+o|zat%y?Mgy``{BuRHjP9&-Ntf~| z=MGSN2v0M_Nh^d;6LmxzbwU4hQ@1ij-waKMvkFka9AI@hw=_hvb5PszFMst#By~d6 zb8#H?M3}Wx+_P0@^c-w8M_U8}xRP^#119;wuBi2Jp!Gu7wMFH1SUYuDNP}NX!#5m+ zUZ=8I6!u~3LSiokTkA7cQvh5CvPHy_G{}K-go9?6|8-zX^I32C~HRZDgagm-U41zOiqXD0-NSGPNRMvFi9eDHNb zEc9y|w{y=ng`35VAGeDiMP$2x3!E`HS2lsm|22BEIBNfRLZ?NH>-dJ7G;rg1j%zo4 zSHzSzH6rVeKT$?l|#rK;p#deQ3 zSrj&=Q~Hy(o1jNBIBPMOi#a=6#0*f&LoBsQ6U3$;`6mzcs~dEFV+2|ExktZrRPVS@ z2L)5ZI*8XcReQG!T=f>8x)^i%uLJu>$2m8{I1-}){e{3thkz5h9}i@34lJ7w#;B{TcHTe-v!GsW+< z#TWI%hdiA3_r-mOpoe?1dps@gx*(Ul-q8H>*nDvO#3F`7FU4G zJBBK2IDIVrhkuCE3y+aReeeu>vsv^6M4x+mHR$$2{8iJ>j$bC)$162ma9~ec?C$ zaQr>qO90o$z2jFtZC^b;1Af`V|NX~XzUNDYD}!_7Pk!frzUemwzU^~22*iHkZ$9JSzVCDS>*Iy)YyR8!{_p>O>MMT75B~92e)97^^G6gw zP0~|PKUZD4W$707&&MS>Qub4Y^*071DOMyY(*!t$^nX(LGsXHt#`r%{`KQzQH%0od z)BNufL1dKStEKP*!~}s8RJd@Vfx$AY@9FD_Mp#iLzzPl^N}ziNwLr8<`+6qOo=Q{2F#_*|TZawtX9S?!bZv6;i0s@S(4mg5$MFdXj+! zLL$+vBcie*4kiQPSTDf^H!=yj8@$o2FWo|WOr!~?LQp~7Fzil44x#e!A)MMH?IRa) zvv9XN?5F~(rLKbw|0*6MAd$ucD`YXm0);GbqXwsXa7T%T0}4n6jf#@1BAb)&BPAgO zO34nZjOjhG$TABpwb*hCF1aRnN1*-gN+_=Yck;}^rN%Jnvp1T05YNES$m&kOa+*=Q z({7{9sXl806wg6ZD|E6$BP6m#(14mz#oUtA@w(x93N+8AK$XqO%<3d*R6UnsvPmC9 z{3umX8-1}eQq1gL$3P;Vy#x4>N|+I1vMH}X=csygivN@>ll_M>vo4e41` z`_=c{JvnXF|5YFT<(J28X_YA8o^m~DR}MBpE!*UVvT3jeEZX`FE=8o5)vkuqt?`Z+&KwR>Z<<@`y$!Cq)yppy zJ@f`Nr?v6J1-^UBi@HqQ^Ok_^IBjA>7N~7E`-}7Bn1JwZLG&~UFN?1w8lJ1cqXI1X z1`O|&|F8&A&U>lfqM!ayz^s4X`&#pSh24`QxESlzigjM_&2* z<&L*sntxZjBtAX#}wnQaf5sO*W;ug8sMH@PCg1eI<6@O^OE}jvMX;kAH z)%ZmT>Q09f=tU3Tw2%z45s!J);~x1K8aL)Hhf$Ox8SMzfJ{}U0iB#kk|A<2KOp;ZE2n~o?Ok*AsnaNb6GU@>DiKXf^n9>{A4-n*-wAY^PX?~ zr6(_V%YPmep}PzyARkFkTLLek5tXPY7aC4?suG?P)#yeQSq-b6%s*>q;Go-NQ#!-%2QSGMMR*E)JppTrx z1m?O=W)%}}T;*P*bmA+Oz9v=WnvGh&G|X-u7O{y{>|z<)SjT#ki4kNd1?M_ftUi>I z6ai6D`{p`~6(~D}Sy*5Fr?b)YsjzNUts;F1#SP4%vUbHKSM}Q2p0PDyBgxsjP6D*n ztrobf{U$qQT7t?>;IcuTEre>@Ex$#Mb}tHT1USbn2yxcA!PV{|TU)Hx(lw+84JC80 zYuoP8@2?+u-&4Kwm_A);yYa(9V%WkK#WdD2i-(KPU*7n{F}CoIiF{5Qzc|N5R&z{@{~u} zVhS5X7WkDimAP!nCQo*EP{yo-yIf{WS{b}pZVPgkSS zkQT(JK`rS?OT@}IzAUEy9O#1zLI|;zb*vwqln|MeeotcwNf~oe{|E99*0Ywiq*a<) zCrv;ID&cite4Su82iV0p#&V`J?dpFD0vp%>SGFbn+u=||*D<-N3$dMTb8{OceX%u2 zDhHBrueQ*tHVC3Medi(56E3=7mo#*ti$@PfMhY|^kH$xEwr;k!(&$ZVkZPNUsU+Y1 zmbk?Kz0~tmhC9pAENwWuaMv^^sR>QBv|T{&Ojp1NWUgnq_l@p}EN($Hd5PrCYBb1g zoTv%U5RK>+lX9Q?+!Y7;MG&MDmcfPvMlUSFySnqDg`1uupTlKMZU}pC`JBPtH?2Wp zF{L;+XVk-*(0Vl3<}&xTr2REWf-US}f9GzoveT?^es)NS|6SzIE-sJ@QU+N>f!Zoa zIiAxw>T2xU)5KQV1te9m(}9b+pkWfz_xf4*LY&l@2Q}RD<*;ZutnTH_ZqL|t`F={B z>V^Qk)dzoXd?z6Z;DWuWGjanCG)8PnPk_&M^=;aU9_@yDcuNEUd*d5l@k1ZG&0R;M z&|^3FeATGb`_Af23tr_bcfj_!zkO5RgdI3&&dg;ux#&Kw`FRCCqyUH8kO-pt-A_LG zPN%xgy{@_sqr7>c8x);JUGMS<$Wo8mP%iscP7p#s0Yf0vQo-znP#Cq)7@JWdxB(iYQ5vT)7SC`M|04|>vr!wjksG_w8@~}8!%-Z^ksQm> z9M2IQ(@`DQksaI793w#xpeapWOWvR`@KWykobeLjA|8Ei!RiqV@lhX}(chME9+lA^ zDKQ@hvJv^wAb~O3Mlm28kReaeA^kBJ%U~iGvLf;DB8e|9Hb4_y!0)Jy0Su5MJCY4Q zk|nBfBsJ0y7~tdtQYAZ)C08OAMN$<>647MxBx$lHE%7EH4kAa=&ty^vQ!*&KkRRa@ z9E)-%HIf0Q@+T>BDF=}sCr&H1(j}u(0;n=6uhJ2-5+h6CCBKp?QBo`$(%*EUEMHOu zz)~&OQV_`!Br`HD(-J7@awXf+9|a69|3zRb!;&xW&@NjNKh9DF1hXoYvM^80F82*E zBw`-nk^v}SD(CVs$?!1uZ6YeO4@-a~RX_wV(?9ldGr90EBLQ3}qAL?|G%u3^L_jlB zQ#Ji^A|}%{LsApVpbSXUG;7l~scyKWusAs|B%y!~xWEs66Cp~I zHc_)Vi|{$$4A2b4ey)IbjuK@(I#7t|f~lRvqj1gujzPcss>(n2p3Lo-xEHJKq820>MUa6i0JZM|YG*d(=mN z6i900=DHSIf^c*Qd0Y;TnOVw0Q z6;)GJRaZ4tMU_=w6;@;QRb3NQYZV)5)mGJ!B^(t~HPt$6fKw+`PjONkiq%+;6`}Tf5a;pVc+LRb0olSvitdF?CacwFVXy zC%3^}-xXftRbJWm`656_!1F z)mML0UDwr9Ax;2tR%dsXXM5IXe->ziHfK53TKBbMT~lb2R%w@(X`6Ovk=ALWR%(G3 zW_3Vj8`frr72<%7YrEEKzZPu678{6mk31G+@knIFR&CdoZQE9DAMNMdR&M9EYpeEZ zt#b<0^i8v536|Nj4V%$8p%({LNtaUU0QBlmD!Q*tZUatqgP z8TME8_GY1zOhFWJL)K`E_A@`%bo&i%Pq#!fw-pirYxnm3E?0IVH+0co-K^A>j5u5G2@BCz2aa6%lq796DE8|c>DYF8z^00#Ep zAsm4XK7l2I01#|qM-+D_xVKcjcYMpYNz#^WtCujYS8cCB2DpK1<=1+#p?c{Td$|^F z(z80D9IWzF}&0R(n%|d)XI!#djsh z*L<%7eP!Z<|GzhU+qZ;+Lu8vagPpb`%pn_g_9`}FgM}7un|5)qL3(32hnF^Ui#J9q zpn)G)YdH{Qfg)mEBpYHw9I~O~G9v;~wu3_=g(D$^x%U!aKmkBl0RX`t+*f^9*e6an zCbGB=6d)qXScDxRjK|m}+}J5Z7G+;zV%g(~@1Qr1BRM3Ni6xe^s%MY$#EMt;WHXpz z@mPNKnOzkjBmFkvN#CBH-%xjdu5rHVZfGgc_&0xU|-^0M`9a3nUils zD#qgm|KhbH3gcasc^f*SCPI0XHv*LlHef$FUSDE{o7oRQxs#~{okdwUzIi3g)M_=i zk{h^zmp5Fym6O5coW=X{M7CSE;iMR2_s&@xLOGPHK{uosSpnKsK>8%KVHX-_68QP0yA^J| zRX2{+rLm?FO8O!=c_WOKrW-(@h1Uq;8C`wTk{#HdKU4Fb`qK{KB0TMrEzh4Dpcns?!;pQRCeZ5MFF4n85KOV6-g~d0ym%F(s^S6K7*I1jjZ=1Ix0I-u_ zu%+3zd4LD5x*JYvx4#>=w;R6U7QSCQy-(t`ea*IUTeex72O5X3=X<-Wwh2mmW-9;+ zP`ekJnljOw!5iGc(R;jkAiu|(ul>2P`8o+6T*J{jxE~^+%QvB!KpTvkt&5wO|8JSP zJ6f$*B83y$puLxs_duA@fP0HM#alvTH+;i=EyH<0s&Bx($Gf~eqQ}v@aopS2761q2 z;0GZ5BHUZYH5_iE{J|Of6KMM+eC@~k`?lFT3AFsl`I^cdT)+psz@eZQP+P&V_4wM{ z%~xQ&R{+B~y8*sD%N6bptRMp1oX?N1!y{n~WO-D{c(_Sei{qHk72w8ke8snSxW^#6 zBVmn4^()|5j1zs)Swdv{yw7npMCpS zVFk8N+OhrGhrKW?VA{WZ+W%aOB3g7m6Wq_e+N0e8)V=WGbdi- zH=g4=-s8Q`H9ubDM_%Fy-rx^B;o*P;a2B+ z{^O6mz`5YyQ{Lr^-sq1W>62dRm)_`O{)%RPjYO8|r=IGo-s-Qu<>40Vx1Q^lo^^ws z3yJ^=Qr-j0-t5mF?bBZE(cbBm2O`c3yq6^C=19e%wiZ!d&tz5f${R%d$*s)~Gnmvm)t=hG0+q!*= zwW&#zR-&@(0wINwy?px`(E~WJ;K76o8$LYPuj0jw8#{gsIkM!*lq*}l{1~z3&73=P z{);)Z5lc}JbZmGHJGSiEv}@a@T_U&c-MTlFxD7nG@ZrQa=s1o%x$@=A zn>&9FJvwgQ)T>+1?K}JL?Y?(w&pw;G`0wMn&yJ2By7BeOjWcHtUk8LCPAjAw7Nv_+ zsZFR*;Q}BO0uCr(5k&y#9~C<+xI-Kx|A7`7m`a9)6f#AJ9@fxdFNF*U zAQuUqh+>KfPBoQ^DV7Lhj55lY;0{zwrC*LZ=15A9KK=+~8*2EYH zP8vyM8&bBB+Jd!Mm}dku8ARrYrY9*oEcikg@ZfX z)#H>xCaGtiQtFpTpn|d_s7b0#{&CAtV}e>buS>xm}Lh%2rs;;0{xlk(_muu>{XY?Q+;`DC(u zQW?6rP?%3;(>#EEy%PqUiq>@tt>g>!}_JZ@Y zn&)io&SV0uDz|JJO*)*YVp@cqcgC#W!_!i?j(BQ=!W-z-_GY~(29gYeNZ0&Yp~o=1 zRZv0&#vgxt@yIVv{B^}E&wTX9t55;;)>kh*^3M~`{r1j7pMCh^i~oK3=5Oa6`p%Qb zzIfCzf4vIwV;?{L_ScX9{p0V?fAr`755VC)&pN}M(*e?4b`|h`@jV06R Date: Sun, 13 Sep 2015 13:23:51 +0200 Subject: [PATCH 11/20] Fix startup process. --- .../cabrillo/tracker/Tracker.java | 29 +++++++++++++++---- .../tracker/deploy/TrackerStarter.java | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index b184bb28..317a07c0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -75,7 +75,7 @@ public class Tracker { static final String THETA = TeXParser.parseTeX("$\\theta"); //$NON-NLS-1$ static final String OMEGA = TeXParser.parseTeX("$\\omega"); //$NON-NLS-1$ static final String ALPHA = TeXParser.parseTeX("$\\alpha"); //$NON-NLS-1$ - static final String DEGREES = "�"; //$NON-NLS-1$ + static final String DEGREES = "°"; //$NON-NLS-1$ static final Level DEFAULT_LOG_LEVEL = ConsoleLevel.OUT_CONSOLE; // for testing @@ -1193,6 +1193,24 @@ protected static void setCache(String cachePath) { ResourceLoader.setOSPCache(cacheDir); } + /** + * Test for writable directory + * + * @param dir the directory file object + */ + protected static boolean isDirWritable(File dir) { + if(dir == null || !dir.isDirectory()) + return false; + File test = new File(dir,"empty"); + try { + test.createNewFile(); + test.delete(); + return true; + } catch (IOException e) { + return false; + } + } + /** * Checks and updates QuickTime resources. * @@ -1203,7 +1221,8 @@ protected static boolean updateResources() { // copy ffmpeg files to Tracker home, if needed try { File trackerDir = new File(TrackerStarter.findTrackerHome(false)); - updated = ExtensionsManager.getManager().copyFFMPegJarsTo(trackerDir); + if(isDirWritable(trackerDir)) + updated = ExtensionsManager.getManager().copyFFMPegJarsTo(trackerDir); } catch (Exception e) { } // OSX doesn't need QTJava updating @@ -1212,7 +1231,7 @@ protected static boolean updateResources() { // copy newer QTJava, if found, to current Java extensions String jre = System.getProperty("java.home"); //$NON-NLS-1$ File extDir = new File(jre, "lib/ext"); //$NON-NLS-1$ - if (extDir.exists()) { + if (extDir.exists() && isDirWritable(extDir)) { updated = ExtensionsManager.getManager().copyQTJavaTo(extDir) || updated; } return updated; @@ -1540,8 +1559,8 @@ public static void main(String[] args) { needsEnvironment = true; } else { - if (ffmpegDir!=null) { - String subdir = OSPRuntime.isWindows()? "bin": "lib"; //$NON-NLS-1$ //$NON-NLS-2$ + if (!OSPRuntime.isLinux() && ffmpegDir!=null) { + String subdir = OSPRuntime.isWindows()? "bin":"lib" ; //$NON-NLS-1$ //$NON-NLS-2$ String ffmpegPath = ffmpegDir+File.separator+subdir; String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ OSPRuntime.isMac()? "DYLD_LIBRARY_PATH": "LD_LIBRARY_PATH"; //$NON-NLS-1$ //$NON-NLS-2$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java index 639c435c..39f045c7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/deploy/TrackerStarter.java @@ -312,7 +312,7 @@ public static XMLControl findPreferences() { } /** - * Finds the FFMPeg home directory and sets/returns the static variable xuggleHome. + * Finds the FFMPeg home directory and sets/returns the static variable ffmpegHome. * * @param trackerHome the Tracker home directory (may be null) * @param writeToLog true to write results to the start log From 65d8272e7daf97af6ba22895043d1dace2595317 Mon Sep 17 00:00:00 2001 From: fschuett Date: Wed, 4 May 2016 22:08:05 +0200 Subject: [PATCH 12/20] readd missing files Circle* --- .../cabrillo/tracker/CircleFitter.java | 1283 +++++++++++++++++ .../cabrillo/tracker/CircleFitterStep.java | 902 ++++++++++++ 2 files changed, 2185 insertions(+) create mode 100644 src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java create mode 100644 src/org/opensourcephysics/cabrillo/tracker/CircleFitterStep.java diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java new file mode 100644 index 00000000..3ac9b2c9 --- /dev/null +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java @@ -0,0 +1,1283 @@ +/* + * The tracker package defines a set of video/image analysis tools + * built on the Open Source Physics framework by Wolfgang Christian. + * + * Copyright (c) 2015 Douglas Brown + * + * Tracker 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. + * + * Tracker 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 Tracker; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA + * or view the license online at + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.ArrayList; +import java.util.Iterator; +import java.awt.*; +import java.awt.event.*; +import java.awt.geom.Point2D; +import java.beans.PropertyChangeEvent; + +import javax.swing.*; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; +import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.DataPoint; +import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.Slider; +import org.opensourcephysics.controls.*; + +/** + * A CircleFitter track fits and measures circles and their centers. + * + * @author Douglas Brown + */ +public class CircleFitter extends TTrack { + + // instance fields + protected boolean fixedPosition=true, radialLineVisible=false, radialLineEnabled=false; + protected JCheckBoxMenuItem fixedItem; + protected JCheckBox radialLineCheckbox; + protected JLabel clickToMarkLabel; + protected JLabel xDataPointLabel, yDataPointLabel; + protected NumberField xDataField, yDataField; + protected Component xDataPointSeparator, yDataPointSeparator, checkboxSeparator; + protected JMenuItem inspectorItem, originToCenterItem, clearPointsItem; + protected PointMass sourceTrack; + protected int sourceStartStep = 0, sourceEndStep = 100000; + protected CircleFitterInspector inspector; + protected boolean inspectorVisible; + + /** + * Constructs a CircleFitter. + */ + public CircleFitter() { + defaultColors = new Color[] {new Color(0, 140, 40)}; + // assign a default name + setName(TrackerRes.getString("CircleFitter.New.Name")); //$NON-NLS-1$ + // set up footprint choices and color + setFootprints(new Footprint[] + {CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle4"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle7"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle4Bold"), //$NON-NLS-1$ + CircleFitterFootprint.getFootprint("CircleFitterFootprint.Circle7Bold")}); //$NON-NLS-1$ + defaultFootprint = getFootprint(); + setColor(defaultColors[0]); + + // assign default table variables + setProperty("tableVar0", "0"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar1", "1"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("tableVar2", "2"); //$NON-NLS-1$ //$NON-NLS-2$ + // assign default plot variables + String center = TrackerRes.getString("CircleFitter.Data.Center"); //$NON-NLS-1$ + setProperty("xVarPlot0", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot0", "x"+center); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot1", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot1", "y"+center); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("xVarPlot2", "t"); //$NON-NLS-1$ //$NON-NLS-2$ + setProperty("yVarPlot2", "r"); //$NON-NLS-1$ //$NON-NLS-2$ + + // set initial hint + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ + // initialize the autofill step array + CircleFitterStep step = new CircleFitterStep(this, 0); + step.setFootprint(getFootprint()); + steps = new StepArray(step); // autofills + keyFrames.add(0); + fixedItem = new JCheckBoxMenuItem(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.addItemListener(new ItemListener() { + public void itemStateChanged(ItemEvent e) { + setFixed(fixedItem.isSelected()); + } + }); + + clickToMarkLabel = new JLabel(); + clickToMarkLabel.setForeground(Color.red.darker()); + + if (radialLineEnabled) { + radialLineCheckbox = new JCheckBox(); + radialLineCheckbox.setOpaque(false); + radialLineCheckbox.setBorder(BorderFactory.createEmptyBorder()); + radialLineCheckbox.setSelected(isRadialLineVisible()); + radialLineCheckbox.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setRadialLineVisible(radialLineCheckbox.isSelected()); + repaint(); + dataValid = false; + firePropertyChange("data", null, null); //$NON-NLS-1$ + } + }); + checkboxSeparator = Box.createRigidArea(new Dimension(6, 4)); + } + + // create actions, listeners, labels and fields for data points + final Action dataPointAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (trackerPanel==null) return; + if (e!=null && e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; + if (e!=null && e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; + TPoint p = trackerPanel.getSelectedPoint(); + if (!(p instanceof DataPoint)) return; + double xValue = xDataField.getValue(); + double yValue = yDataField.getValue(); + int n = trackerPanel.getFrameNumber(); + ImageCoordSystem coords = trackerPanel.getCoords(); + double x = coords.worldToImageX(n, xValue, yValue); + double y = coords.worldToImageY(n, xValue, yValue); + p.setXY(x, y); + p.showCoordinates(trackerPanel); + if (e!=null && e.getSource() instanceof NumberField) { + ((NumberField)e.getSource()).requestFocusInWindow(); + } + } + }; + // focus listener + FocusListener dataFieldFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + if (e.getSource()==xDataField && xDataField.getBackground()!=Color.yellow) return; + if (e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; + dataPointAction.actionPerformed(null); + } + }; + xDataPointLabel = new JLabel("selected x"); //$NON-NLS-1$ + xDataPointLabel.setBorder(xLabel.getBorder()); + xDataField = new NumberField(5); + xDataField.setBorder(fieldBorder); + xDataField.addActionListener(dataPointAction); + xDataField.addFocusListener(dataFieldFocusListener); + yDataPointLabel = new JLabel("y"); //$NON-NLS-1$ + yDataPointLabel.setBorder(xLabel.getBorder()); + yDataField = new NumberField(5); + yDataField.setBorder(fieldBorder); + yDataField.addActionListener(dataPointAction); + yDataField.addFocusListener(dataFieldFocusListener); + xDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); + yDataPointSeparator = Box.createRigidArea(new Dimension(6, 4)); + + xLabel.setText("center x"); //$NON-NLS-1$ + xField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + xField.setEnabled(false); + yField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + yField.setEnabled(false); + magField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + magField.setEnabled(false); + xDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + yDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ + + // set action for angle field + final Action sliderAction = new AbstractAction() { + public void actionPerformed(ActionEvent e) { + if (angleField.getBackground()!=Color.yellow) { + return; + } + double theta = angleField.getValue(); + int n = trackerPanel.getFrameNumber(); + CircleFitterStep step = (CircleFitterStep)getStep(n); + step.setSliderAngle(theta); + } + }; + angleField.addActionListener(sliderAction); + FocusListener sliderFocusListener = new FocusAdapter() { + public void focusLost(FocusEvent e) { + sliderAction.actionPerformed(null); + } + }; + angleField.addFocusListener(sliderFocusListener); + + // inspector item + inspectorItem = new JMenuItem(); + inspectorItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + getInspector().setVisible(true); + } + }); + + // originToCenter item + originToCenterItem = new JMenuItem(); + originToCenterItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + setCoordsOriginToCenter(); + } + }); + + // clearPoints item + clearPointsItem = new JMenuItem(); + clearPointsItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + XMLControl control = new XMLControlElement(CircleFitter.this); + boolean changed = false; + for (Step step: getSteps()) { + CircleFitterStep next = (CircleFitterStep)step; + if (next.dataPoints.isEmpty()) continue; + changed = true; + next.dataPoints.clear(); + next.refreshCircle(); + } + if (changed) { + repaint(); + dataValid = false; + firePropertyChange("data", null, this); //$NON-NLS-1$ + if (trackerPanel != null) { + trackerPanel.changed = true; + } + TTrackBar.getTrackbar(trackerPanel).refresh(); + Undo.postTrackEdit(CircleFitter.this, control); + } + } + }); + } + + /** + * Sets the fixed property. When fixed, it has the same position at all times. + * + * @param fixed true to fix + */ + public void setFixed(boolean fixed) { + if (fixedPosition == fixed) return; + XMLControl control = new XMLControlElement(this); + if (trackerPanel != null) { + trackerPanel.changed = true; + int n = trackerPanel.getFrameNumber(); + CircleFitterStep source = (CircleFitterStep)getStep(n); + CircleFitterStep target = (CircleFitterStep)getStep(0); + target.copy(source); + trackerPanel.repaint(); + } + fixedPosition = fixed; + if (fixed) { // refresh data and post undo only when fixing + keyFrames.clear(); + keyFrames.add(0); + dataValid = false; + support.firePropertyChange("data", null, null); //$NON-NLS-1$ + Undo.postTrackEdit(this, control); + } + } + + /** + * Gets the fixed property. + * + * @return true if fixed + */ + public boolean isFixed() { + return fixedPosition; + } + + /** + * Sets the visibility of the radial line. + * + * @param vis true to draw a radial line + */ + public void setRadialLineVisible(boolean vis) { + boolean changed = vis!=radialLineVisible; + radialLineVisible = vis; + if (trackerPanel!=null) { + int n = trackerPanel.getFrameNumber(); + steps.getStep(n).repaint(); + if (changed) { + trackerPanel.changed = true; + } + } + } + + /** + * Copies step positions from a point mass source. Source may be null. + * + * @param source a PointMass to copy + */ + public void copySourceStepPositions(PointMass source) { + if (sourceTrack==null && source==null) { + return; + } + sourceTrack = source; + trackerPanel.setSelectedPoint(null); + boolean changed = false; + XMLControl control = new XMLControlElement(this); // for undo (only if changed) + CircleFitterStep circleStep = null; + if (isFixed()) { + circleStep = (CircleFitterStep)getStep(0); + } + else { + int n = trackerPanel.getFrameNumber(); + circleStep = (CircleFitterStep)getStep(n); + } + if (sourceTrack!=null) { + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + ArrayList tempList = new ArrayList(); + tempList.addAll(circleStep.dataPoints); + circleStep.dataPoints.clear(); + // copy step positions as circleStep DataPoints + Step[] steps = sourceTrack.getSteps(); + for (int i=0; i< steps.length; i++) { + // check if frame is included in video clip and falls in specified range + if (!clip.includesFrame(i)) continue; + int stepNumber = clip.frameToStep(i); + if (steps[i]!=null && stepNumber>=sourceStartStep && stepNumber<=sourceEndStep) { + PositionStep p = (PositionStep)steps[i]; + circleStep.addDataPoint(p.getPosition().x, p.getPosition().y, false); + } + } + // determine if number of points have changed + changed = circleStep.dataPoints.size()!=tempList.size(); + if (!changed) { + // determine if point positions have changed + for (DataPoint next: circleStep.dataPoints) { + Iterator it = tempList.iterator(); + while (it.hasNext()) { + DataPoint test = it.next(); + if (next.x==test.x && next.y==test.y) { + it.remove(); + break; + } + } + } + changed = !tempList.isEmpty(); + } + } + Step[] steps = getSteps(); + for (int i=0; i< steps.length; i++) { + if (steps[i]!=null) { + if (!isFixed() && i-1) { + step = (CircleFitterStep)steps.getStep(0); + p = step.dataPoints.get(index); + step.removeDataPoint(p, true); + } + } + return null; + } + + @Override + public Step getStep(int n) { + CircleFitterStep step = (CircleFitterStep)steps.getStep(n); + refreshStep(step); + return step; + } + + @Override + public Step getStep(TPoint point, TrackerPanel trackerPanel) { + if (point == null) return null; + Step[] stepArray = steps.array; + for (Step step: stepArray) { + if (step==null) continue; + TPoint[] points = step.getPoints(); + for (int i = 0; i < points.length; i++) { + if (points[i]==point) return step; + } + CircleFitterStep circleStep = (CircleFitterStep)step; + for (TPoint p: circleStep.dataPoints) { + if (p==point) return step; + } + } + return null; + } + + @Override + public int getStepLength() { + return CircleFitterStep.getLength(); + } + + @Override + public int getFootprintLength() { + return 3; + } + + @Override + public void setFontLevel(int level) { + super.setFontLevel(level); + Object[] objectsToSize = new Object[] + {clickToMarkLabel, xDataPointLabel, yDataPointLabel, + xDataField, yDataField}; + FontSizer.setFonts(objectsToSize, level); + if (radialLineEnabled) { + FontSizer.setFonts(radialLineCheckbox, level); + } + if (inspector!=null) { + inspector.refreshDisplay(); + } + } + + @Override + public JMenu getMenu(TrackerPanel trackerPanel) { + JMenu menu = super.getMenu(trackerPanel); + + inspectorItem.setText(TrackerRes.getString("CircleFitter.MenuItem.Inspector")); //$NON-NLS-1$ + originToCenterItem.setText(TrackerRes.getString("CircleFitter.MenuItem.OriginToCenter")); //$NON-NLS-1$ + originToCenterItem.setEnabled(!trackerPanel.getCoords().isLocked()); + deleteStepItem.setText(TrackerRes.getString("CircleFitter.MenuItem.DeletePoint")); //$NON-NLS-1$ + clearPointsItem.setText(TrackerRes.getString("CircleFitter.MenuItem.ClearPoints")); //$NON-NLS-1$ + clearPointsItem.setEnabled(!isLocked()); + fixedItem.setText(TrackerRes.getString("TapeMeasure.MenuItem.Fixed")); //$NON-NLS-1$ + fixedItem.setSelected(isFixed()); + fixedItem.setEnabled(attachments==null || (attachments[0]==null && attachments[1]==null && attachments[2]==null)); + + // add inspector item and separator at beginning + menu.insert(inspectorItem, 0); + menu.insertSeparator(1); + // add originToCenter item and separator below inspector item + menu.insert(originToCenterItem, 2); + menu.insertSeparator(3); + // remove end items and last separator + menu.remove(deleteTrackItem); + menu.remove(menu.getMenuComponent(menu.getMenuComponentCount()-1)); + menu.add(fixedItem); + + menu.addSeparator(); + menu.add(deleteStepItem); + menu.add(clearPointsItem); + menu.add(deleteTrackItem); + return menu; + } + + @Override + public ArrayList getToolbarTrackComponents(TrackerPanel trackerPanel) { + int n = trackerPanel.getFrameNumber(); + refreshFields(n); + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + list.add(stepSeparator); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (step.dataPoints.size()>2) { + if (radialLineEnabled) { + radialLineCheckbox.setText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine")); //$NON-NLS-1$ + radialLineCheckbox.setToolTipText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine.Tooltip")); //$NON-NLS-1$ + list.add(radialLineCheckbox); + list.add(checkboxSeparator); + } + xField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterX.Tooltip")); //$NON-NLS-1$ + yField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterY.Tooltip")); //$NON-NLS-1$ + magLabel.setText(TrackerRes.getString("CircleFitter.Label.Radius")); //$NON-NLS-1$ + magField.setToolTipText(TrackerRes.getString("CircleFitter.Field.Radius.Tooltip")); //$NON-NLS-1$ + list.add(magLabel); + list.add(magField); + list.add(magSeparator); + list.add(xLabel); + list.add(xField); + list.add(xSeparator); + list.add(yLabel); + list.add(yField); + list.add(ySeparator); + } + else if (trackerPanel.getSelectedPoint()==null) { + clickToMarkLabel.setText(TrackerRes.getString("CircleFitter.Label.MarkPoint")); //$NON-NLS-1$ + list.add(clickToMarkLabel); + } + return list; + } + + @Override + public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, + TPoint point) { + ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + int n = trackerPanel.getFrameNumber(); + refreshFields(n); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (point==step.slider) { + list.add(angleLabel); + list.add(angleField); + list.add(angleSeparator); + } + else { + list.add(xDataPointLabel); + list.add(xDataField); + list.add(xDataPointSeparator); + list.add(yDataPointLabel); + list.add(yDataField); + list.add(yDataPointSeparator); + } + if (step.dataPoints.size()<3) { + clickToMarkLabel.setText(TrackerRes.getString("CircleFitter.Label.MarkPoint")); //$NON-NLS-1$ + list.add(clickToMarkLabel); + } + return list; + } + + @Override + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + if (!(panel instanceof TrackerPanel) || !isVisible()) + return null; + TrackerPanel trackerPanel = (TrackerPanel)panel; + int n = trackerPanel.getFrameNumber(); + CircleFitterStep step = (CircleFitterStep)getStep(n); + if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { + Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); + if (ia == null) { + partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ + if (step.dataPoints.size()<3) { + hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ + } + else { + hint = TrackerRes.getString("CircleFitter.Hint.MarkMore"); //$NON-NLS-1$ + } + return null; + } + if (ia instanceof DataPoint) { + partName = TrackerRes.getString("CircleFitter.DataPoint.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.DataPoint.Hint"); //$NON-NLS-1$ + } + else if (ia instanceof Slider) { + partName = TrackerRes.getString("CircleFitter.Slider.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Slider.Hint"); //$NON-NLS-1$ + } + return ia; + } + return null; + } + + @Override + public String toString() { + return TrackerRes.getString("CircleFitter.Name"); //$NON-NLS-1$ + } + +//__________________________ protected methods ________________________ + + @Override + protected void setTrackerPanel(TrackerPanel panel) { + if (trackerPanel != null) { + trackerPanel.removePropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + if (trackerPanel.getTFrame()!=null) { + trackerPanel.getTFrame().removePropertyChangeListener("tab", this); //$NON-NLS-1$ + } + } + super.setTrackerPanel(panel); + if (trackerPanel != null) { + trackerPanel.addPropertyChangeListener("stepnumber", this); //$NON-NLS-1$ + } + setFixed(isFixed()); + } + + @Override + protected void setAnglesInRadians(boolean radians) { + super.setAnglesInRadians(radians); + CircleFitterStep step = (CircleFitterStep)getStep(trackerPanel.getFrameNumber()); + step.repaint(); // refreshes angle readout + } + + @Override + protected String getTargetDescription(int pointIndex) { + if (pointIndex==0) return TrackerRes.getString("Protractor.Vertex.Name"); //$NON-NLS-1$ + String s = TrackerRes.getString("Protractor.End.Name"); //$NON-NLS-1$ + return s+" "+(pointIndex); //$NON-NLS-1$ + } + + @Override + protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { + if (refreshDataLater || trackerPanel == null || data == null) return; + dataFrames.clear(); + // get the datasets: radius, x_center, y_center, step, frame + int count = 0; + Dataset angle = null; + Dataset x_center = data.getDataset(count++); + Dataset y_center = data.getDataset(count++); + Dataset r = data.getDataset(count++); + Dataset stepNum = data.getDataset(count++); + Dataset frameNum = data.getDataset(count++); + if (radialLineEnabled) { + angle = data.getDataset(count++); + } + // assign column names to the datasets + String time = "t"; //$NON-NLS-1$ + if (!x_center.getColumnName(0).equals(time)) { // not yet initialized + String center = TrackerRes.getString("CircleFitter.Data.Center"); //$NON-NLS-1$ + x_center.setXYColumnNames(time, "x_"+center); //$NON-NLS-1$ + y_center.setXYColumnNames(time, "y_"+center); //$NON-NLS-1$ + r.setXYColumnNames(time, "r"); //$NON-NLS-1$ + stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ + frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ + if (radialLineEnabled) { + angle.setXYColumnNames(time, "$\\theta$"); //$NON-NLS-1$ + } + } + else for (int i = 0; i0 && !trackerPanel.getCoords().getKeyFrames().contains(i)) { + continue; + } + trackerPanel.getCoords().setOriginXY(i, pt.x, pt.y); + } + } + else { + Step[] stepArray = steps.array; + for (Step step: stepArray) { + if (step==null) continue; + CircleFitterStep circleStep = (CircleFitterStep)step; + if (!circleStep.isValidCircle()) continue; + valid = true; + } + if (!valid) return; + trackerPanel.getCoords().setFixedOrigin(false); + for (Step step: stepArray) { + if (step==null) continue; + CircleFitterStep circleStep = (CircleFitterStep)step; + trackerPanel.getCoords().setOriginXY(step.n, circleStep.center.x, circleStep.center.y); + } + } + trackerPanel.getAxes().setVisible(true); + // post undoable edit + Undo.postCoordsEdit(trackerPanel, control); + } + + protected CircleFitterInspector getInspector() { + if (inspector==null) { + inspector = new CircleFitterInspector(); + } + inspector.refreshDisplay(); + return inspector; + } + +//__________________________ inner classes ___________________________ + + /** + * Inner CircleFitterInspector class to control source track and frames. + */ + protected class CircleFitterInspector extends JDialog { + + private JTextArea textPane; + private JComboBox trackDropdown; + private JSpinner startStepSpinner, endStepSpinner; + private JLabel dropdownLabel, startLabel, endLabel; + private JButton copyButton, closeButton; + private boolean refreshing; + + /** + * Constructs the CircleFitterInspector. + */ + public CircleFitterInspector() { + super(trackerPanel.getTFrame(), false); +// setResizable(false); + createGUI(); + refreshDisplay(); + // center on screen + Rectangle rect = getBounds(); + Dimension dim = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (dim.width-rect.width)/2; + int y = (dim.height-rect.height)/2; + setLocation(x, y); + } + + /** + * Creates the visible components. + */ + void createGUI() { + // initialize sourceStartFrame and sourceEndFrame + setSourceStartStep(0); + setSourceEndStep(trackerPanel.getPlayer().getVideoClip().getStepCount()-1); + // create components + + // create text area for hints + textPane = new JTextArea() { + @Override + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + int n = (int)(250*FontSizer.getFactor()); + dim.width = Math.max(n, dim.width); + return dim; + } + }; + textPane.setEditable(false); + textPane.setLineWrap(true); + textPane.setWrapStyleWord(true); + Border etched = BorderFactory.createEtchedBorder(); + Border empty = BorderFactory.createEmptyBorder(2,4,2,4); + textPane.setBorder(BorderFactory.createCompoundBorder(etched, empty)); + textPane.setForeground(Color.blue); + + + trackDropdown = new JComboBox() { + public Dimension getPreferredSize() { + Dimension dim = super.getPreferredSize(); + dim.height-=1; + return dim; + } + }; + trackDropdown.setRenderer(new TrackRenderer()); + + SpinnerModel spinModel = new SpinnerNumberModel(sourceStartStep, 0, sourceEndStep, 1); + startStepSpinner = new JSpinner(spinModel); + ChangeListener listener = new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if (refreshing) return; + int in = (Integer)startStepSpinner.getValue(); + if (in==sourceStartStep) { + return; + } + setSourceStartStep(in); + } + }; + startStepSpinner.addChangeListener(listener); + + int last = trackerPanel.getPlayer().getVideoClip().getStepCount()-1; + spinModel = new SpinnerNumberModel(sourceEndStep, sourceStartStep, last, 1); + endStepSpinner = new JSpinner(spinModel); + listener = new ChangeListener() { + public void stateChanged(ChangeEvent e) { + if (refreshing) return; + int in = (Integer)endStepSpinner.getValue(); + if (in==sourceEndStep) { + return; + } + setSourceEndStep(in); + } + }; + endStepSpinner.addChangeListener(listener); + + dropdownLabel = new JLabel(); + dropdownLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + startLabel = new JLabel(); + startLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + endLabel = new JLabel(); + endLabel.setBorder(BorderFactory.createEmptyBorder(0,4,0,4)); + + copyButton = new JButton(); + copyButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + Object[] item = (Object[])trackDropdown.getSelectedItem(); + if (item!=null) { + for (PointMass next: trackerPanel.getDrawables(PointMass.class)) { + if (item[1].equals(next.getName())) { + copySourceStepPositions(next); + refreshGUI(); + } + } + } + } + }); + + closeButton = new JButton(); + closeButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + inspector.setVisible(false); + } + }); + + JPanel contentPane = new JPanel(new BorderLayout()); + setContentPane(contentPane); + + JPanel centerPanel = new JPanel(new BorderLayout()); + contentPane.add(centerPanel, BorderLayout.CENTER); + + centerPanel.add(textPane, BorderLayout.NORTH); + + JPanel sourcePanel = new JPanel(new BorderLayout()); + centerPanel.add(sourcePanel, BorderLayout.CENTER); + + JPanel dropdownPanel = new JPanel(); + dropdownPanel.setBorder(BorderFactory.createEmptyBorder(8,4,4,4)); + dropdownPanel.add(dropdownLabel); + dropdownPanel.add(trackDropdown); + sourcePanel.add(dropdownPanel, BorderLayout.NORTH); + + JPanel spinnerPanel = new JPanel(); + spinnerPanel.setBorder(BorderFactory.createEmptyBorder(4,4,8,4)); + spinnerPanel.add(startLabel); + spinnerPanel.add(startStepSpinner); + spinnerPanel.add(endLabel); + spinnerPanel.add(endStepSpinner); + sourcePanel.add(spinnerPanel, BorderLayout.SOUTH); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setBorder(etched); + buttonPanel.add(copyButton); + buttonPanel.add(closeButton); + contentPane.add(buttonPanel, BorderLayout.SOUTH); + + refreshGUI(); + } + + /** + * Refreshes the visible components. + */ + public void refreshGUI() { + setTitle(TrackerRes.getString("CircleFitter.Name")+" \""+CircleFitter.this.getName()+"\""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + dropdownLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.SourceTrack")); //$NON-NLS-1$ + startLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.From")); //$NON-NLS-1$ + endLabel.setText(TrackerRes.getString("CircleFitter.Inspector.Label.To")); //$NON-NLS-1$ + String info = TrackerRes.getString("CircleFitter.Inspector.Instructions1") //$NON-NLS-1$ + +" "+TrackerRes.getString("CircleFitter.Inspector.Instructions2"); //$NON-NLS-1$ //$NON-NLS-2$ + textPane.setText(info); + copyButton.setText(TrackerRes.getString("CircleFitter.Inspector.Button.Apply")); //$NON-NLS-1$ + closeButton.setText(TrackerRes.getString("Dialog.Button.Close")); //$NON-NLS-1$ + pack(); + } + + /** + * Updates this inspector to reflect the current settings. + */ + void refreshDisplay() { + ArrayList trackList = trackerPanel.getDrawables(PointMass.class); + copyButton.setEnabled(!trackList.isEmpty() && !isLocked()); + + // update trackDropdown + Object toSelect = null; + refreshing = true; + trackDropdown.removeAllItems(); + + if (trackList.isEmpty()) { + Object[] item = new Object[] {null, TrackerRes.getString("CircleFitter.Inspector.Dropdown.None")}; //$NON-NLS-1$ + trackDropdown.addItem(item); + toSelect = item; + } + else for (PointMass next: trackList) { + Icon icon = next.getFootprint().getIcon(21, 16); + Object[] item = new Object[] {icon, next.getName()}; + trackDropdown.addItem(item); + if (next==sourceTrack) { + toSelect = item; + } + } + // select desired item + if (toSelect!=null) { + trackDropdown.setSelectedItem(toSelect); + } + else { + trackDropdown.setSelectedIndex(0); + } + refreshing = false; + // resize and pack + FontSizer.setFonts(this, FontSizer.getLevel()); + pack(); + } + + @Override + public void setVisible(boolean vis) { + super.setVisible(vis); + inspectorVisible = vis; + } + + } + + + +//__________________________ static methods ___________________________ + + /** + * Returns an ObjectLoader to save and load data for this class. + * + * @return the object loader + */ + public static XML.ObjectLoader getLoader() { + return new Loader(); + } + + /** + * A class to save and load data for this class. + */ + static class Loader implements XML.ObjectLoader { + + /** + * Saves an object's data to an XMLControl. + * + * @param control the control to save to + * @param obj the object to save + */ + public void saveObject(XMLControl control, Object obj) { + CircleFitter circleFitter = (CircleFitter)obj; + // save track data + XML.getLoader(TTrack.class).saveObject(control, obj); + // save fixed property + control.setValue("fixed", circleFitter.isFixed()); //$NON-NLS-1$ + // save steps + Step[] steps = circleFitter.getSteps(); + int count = steps.length; + if (circleFitter.isFixed()) count = 1; + double[][] data = new double[count][]; + for (int n = 0; n < count; n++) { + // save only key frames + if (steps[n] == null || !circleFitter.keyFrames.contains(n)) continue; + CircleFitterStep step = (CircleFitterStep)steps[n]; + int len = step.dataPoints.size(); + if (len==0) { + data[n] = new double[] {n}; + continue; + } + double[] stepData = new double[2*len+3]; + stepData[0] = n; + for (int i=0; i + * + * For additional Tracker information and documentation, please see + * . + */ +package org.opensourcephysics.cabrillo.tracker; + +import java.util.*; +import java.awt.*; +import java.awt.geom.*; + +import javax.swing.SwingUtilities; + +import org.opensourcephysics.controls.XML; +import org.opensourcephysics.controls.XMLControl; +import org.opensourcephysics.controls.XMLControlElement; +import org.opensourcephysics.display.*; +import org.opensourcephysics.media.core.*; +import org.opensourcephysics.tools.FontSizer; + +/** + * This is a Step for a CircleFitter. It is used for measuring and finding centers of circles. + * + * @author Douglas Brown + */ +public class CircleFitterStep extends Step { + + protected static AffineTransform transform = new AffineTransform(); + protected static TPoint endPoint1 = new TPoint(); // used for large radius case + protected static TPoint endPoint2 = new TPoint(); // used for large radius case + + // instance fields + protected CircleFitter circleFitter; + protected ArrayList dataPoints = new ArrayList(); + protected TPoint center, edge; + protected Slider slider; + protected double radius; + protected Map lineHitShapes = new HashMap(); + protected ArrayList> pointHitShapes = new ArrayList>(); + protected Shape selectedShape; + + /** + * Constructs an empty CircleFitterStep. + * + * @param track the track + * @param n the frame number + */ + public CircleFitterStep(CircleFitter track, int n) { + super(track, n); + circleFitter = track; + center = new TPoint(); + edge = new TPoint(); + slider = new Slider(0, 0); + points = new TPoint[] {center, edge, slider}; + screenPoints = new Point[points.length]; + } + + /** + * Adds an data point to this step at the specified image coordinates. + * + * @param x the image x coordinate of the data point + * @param y the image y coordinate of the data point + * @param refreshAndPostEdit true to refresh circle, fire event and post undo edit + * + */ + public void addDataPoint(double x, double y, boolean refreshAndPostEdit) { + XMLControl control = new XMLControlElement(this); + if (!circleFitter.isFixed()) { + circleFitter.keyFrames.add(n); + } + dataPoints.add(new DataPoint(x, y)); + if (refreshAndPostEdit) { + defaultIndex = dataPoints.size()-1; + refreshCircle(); + circleFitter.dataValid = false; + circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ + if (circleFitter.trackerPanel != null) { + circleFitter.trackerPanel.changed = true; + } + TTrackBar.getTrackbar(circleFitter.trackerPanel).refresh(); + Undo.postStepEdit(this, control); + } + } + + /** + * Removes a data point. + * + * @param p the point to remove + */ + public void removeDataPoint(TPoint p, boolean postUndoableEdit) { + boolean found = false; + for (TPoint next: dataPoints) { + if (next==p) { + found = true; + break; + } + } + XMLControl control = new XMLControlElement(this); + if (found) { + if (!circleFitter.isFixed()) { + circleFitter.keyFrames.add(n); + } + dataPoints.remove(p); + if (circleFitter.trackerPanel != null) { + circleFitter.trackerPanel.changed = true; + } + } + refreshCircle(); + if (found && postUndoableEdit) { + Undo.postStepEdit(this, control); + } + if (n==circleFitter.trackerPanel.getFrameNumber()) { + repaint(); + circleFitter.refreshFields(n); + } + circleFitter.dataValid = false; + circleFitter.firePropertyChange("data", null, null); //$NON-NLS-1$ + circleFitter.trackerPanel.setSelectedPoint(null); + TTrackBar.getTrackbar(circleFitter.trackerPanel).refresh(); + repaint(); + } + + @Override + public TPoint getDefaultPoint() { + if (dataPoints.size()>defaultIndex) { + return dataPoints.get(defaultIndex); + } + return slider; + } + + @Override + public Interactive findInteractive( + DrawingPanel panel, int xpix, int ypix) { + TrackerPanel trackerPanel = (TrackerPanel)panel; + setHitRectCenter(xpix, ypix); + Shape hitShape; + Interactive hit = null; + + for (int i=0; i map = pointHitShapes.get(i); + if (map!=null) { + hitShape = map.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = dataPoints.get(i); + } + } + + } + + if (hit==null && circleFitter.isRadialLineVisible()) { + hitShape = lineHitShapes.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = slider; + } + } + + return hit; + } + + @Override + public void draw(DrawingPanel panel, Graphics _g) { + // draw the mark + TrackerPanel trackerPanel = (TrackerPanel)panel; + Graphics2D g = (Graphics2D)_g; + getMark(trackerPanel).draw(g, false); + } + + @Override + protected Mark getMark(TrackerPanel trackerPanel) { + Mark mark = marks.get(trackerPanel); + TPoint selection = null; + if (mark==null) { + selection = trackerPanel.getSelectedPoint(); + // assemble screen points array + if (screenPoints.length!=points.length+dataPoints.size()) { + screenPoints = new Point[points.length+dataPoints.size()]; + } + Point p = null; + for (int i = 0; i1) { + transform.scale(scale, scale); + } + selectedShape = transform.createTransformedShape(selectionShape); + mark = new Mark() { + public void draw(Graphics2D g, boolean highlighted) { + stepMark.draw(g, false); + Paint gpaint = g.getPaint(); + g.setPaint(color); + if (selectedShape != null) + g.fill(selectedShape); + g.setPaint(gpaint); + } + + public Rectangle getBounds(boolean highlighted) { + Rectangle bounds = stepMark.getBounds(false); + if (selectedShape != null) { + bounds.add(selectedShape.getBounds()); + } + return bounds; + } + }; + } + marks.put(trackerPanel, mark); + + // get new hit shapes + Shape[] shapes = footprint.getHitShapes(); + lineHitShapes.put(trackerPanel, shapes[0]); + if (shapes.length-1 newMap = new HashMap(); + pointHitShapes.add(newMap); + } + Map map = pointHitShapes.get(i-1); + map.put(trackerPanel, shapes[i]); + } + + } + return mark; + } + + /** + * Returns the circle radius in world units. + * + * @return the radius in world units + */ + public double getWorldRadius() { + if (dataPoints.size()<3) { + return Double.NaN; + } + return radius/circleFitter.trackerPanel.getCoords().getScaleX(n); + } + + /** + * Returns the circle center coordinates in world units. + * + * @return the center point in world units + */ + public Point2D getWorldCenter() { + if (dataPoints.size()<3 || Double.isInfinite(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { + return null; + } + return center.getWorldPosition(circleFitter.trackerPanel); + } + + /** + * Returns the slider angle relative to the +x-axis. + * + * @return the slider angle + */ + public double getSliderAngle() { + // deal with special cases + if (dataPoints.size()<3 || Double.isNaN(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { + return Double.NaN; + } + double theta = -center.angle(slider); + if (circleFitter.trackerPanel!=null) { + theta -= circleFitter.trackerPanel.getCoords().getAngle(n); + } + return theta; + } + + /** + * Returns the slider angle relative to the horizontal. + * + * @return the slider angle + */ + public void setSliderAngle(double theta) { + double prev = getSliderAngle(); + if (theta==prev || Double.isNaN(prev)) return; + if (circleFitter.trackerPanel!=null) { + theta += circleFitter.trackerPanel.getCoords().getAngle(n); + } + double sin = -Math.sin(theta); + double cos = Math.cos(theta); + slider.setLocation(center.x+radius*cos, center.y+radius*sin); + repaint(); + circleFitter.refreshFields(n); +// circleFitter.dataValid = false; +// circleFitter.firePropertyChange("data", null, null); + } + + /** + * Returns true if the circle is valid (ie if at least 3 data points have been successfuly fit). + * + * @return true if valid + */ + public boolean isValidCircle() { + return dataPoints.size()>2 && !Double.isInfinite(radius) + && radius>0 && radius0 + && radiusCircleFitterFootprint.MAX_RADIUS) { + if (circleFitter.trackerPanel!=null) { + p = circleFitter.trackerPanel.getSelectedPoint(); + } + p0 = dataPoints.get(0); + p1 = dataPoints.get(1); + p2 = dataPoints.get(2); + edge.setLocation(p==p1? p1: p==p2? p2: p0); + } + else { + edge.setLocation(center.x, center.y+radius); + } + } + + boolean isVisible = circleFitter.trackerPanel!=null && n==circleFitter.trackerPanel.getFrameNumber(); + if (radius!=prevR || center.x!=prevX || center.y!=prevY) { + if (!Double.isInfinite(radius) + && radius>0 + && radius pts) { + // check for colinear points + double[] deltax = new double[pts.size()-1]; + double[] deltay = new double[pts.size()-1]; + double[] slope = new double[pts.size()-1]; + DataPoint prev = null; + boolean allDeltaXZero = true, allSameSlope = true; + for (int i=0; i1) { + allDeltaXZero = allDeltaXZero && deltax[i-1]==deltax[i-2]; + allSameSlope = allSameSlope && slope[i-1]==slope[i-2]; + } + } + if (allDeltaXZero || allSameSlope) { + radius = Double.POSITIVE_INFINITY; + return; + } + + // find center + double sumx=0, sumy=0, sumx2=0, sumy2=0, sumx3=0, sumy3=0, sumxy=0, sumxy2=0, sumx2y=0; + double val; + for (DataPoint p: pts) { + val = p.x; + sumx += val; + val *= p.x; + sumx2 += val; + val *= p.x; + sumx3 += val; + val = p.y; + sumy += val; + val *= p.y; + sumy2 += val; + val *= p.y; + sumy3 += val; + val = p.x*p.y; + sumxy += val; + sumxy2 += val*p.y; + sumx2y += val*p.x; + } + double n = pts.size(); + double a = n*sumx2 - sumx*sumx; + double b = n*sumxy - sumx*sumy; + double c = n*sumy2 - sumy*sumy; + double d = 0.5*(n*sumxy2 - sumx*sumy2 +n*sumx3 - sumx*sumx2); + double e = 0.5*(n*sumx2y - sumy*sumx2 +n*sumy3 - sumy*sumy2); + double denom = a*c - b*b; + double x = (d*c - b*e)/denom; // center x-coordinate + double y = (a*e - b*d)/denom; // center y-coordinate + center.setLocation(x, y); + + // find radius + double r = 0, dx, dy; + for (DataPoint p: pts) { + dx = p.x - x; + dy = p.y - y; + r += Math.sqrt(dx*dx + dy*dy); + } + radius = r/n; + } + + /** + * Clones this Step. + * + * @return a clone of this step + */ + public Object clone() { + CircleFitterStep step = (CircleFitterStep)super.clone(); + if (step != null) { + step.points[0] = step.center = new TPoint(center.getX(), center.getY()); + step.points[1] = step.edge = new TPoint(edge.getX(), edge.getY()); + step.points[2] = step.slider = step.new Slider(slider.getX(), slider.getY()); + step.lineHitShapes = new HashMap(); + step.pointHitShapes = new ArrayList>(); + step.dataPoints = new ArrayList(); + for (DataPoint next: dataPoints) { + step.dataPoints.add(new DataPoint(next.x, next.y)); + } + } + return step; + } + + /** + * Copies data points from another step, then refreshes the circle. + * + * @param step the step to copy + */ + public void copy(CircleFitterStep step) { + if (dataPoints.size()!=step.dataPoints.size()) { + dataPoints.clear(); + for (int i=0; iCircleFitterFootprint.MAX_RADIUS) { + if (dataPoints.size()<2) return; + double dx = dataPoints.get(1).getX()-dataPoints.get(0).getX(); + double dy = dataPoints.get(1).getY()-dataPoints.get(0).getY(); + double slope = dy/dx; + double len = CircleFitterFootprint.MAX_RADIUS/100; + if (dx==0) { // vertical line + endPoint1.setLocation(edge.x, edge.y-len); + endPoint2.setLocation(edge.x, edge.y+len); + } + else { + if (Math.abs(dx)>Math.abs(dy)) { + endPoint1.setLocation(edge.x-len, edge.y-slope*len); + endPoint2.setLocation(edge.x+len, edge.y+slope*len); + } + else { + endPoint1.setLocation(edge.x-len/slope, edge.y-len); + endPoint2.setLocation(edge.x+len/slope, edge.y+len); + } + } + setPositionOnLine(xScreen, yScreen, trackerPanel, endPoint1, endPoint2); + return; + } + + // get image coordinates of the screen point + if(screenPt==null) { + screenPt = new Point(); + } + if(worldPt==null) { + worldPt = new Point2D.Double(); + } + screenPt.setLocation(xScreen, yScreen); + AffineTransform toScreen = trackerPanel.getPixelTransform(); + if(!trackerPanel.isDrawingInImageSpace()) { + int n = getFrameNumber(trackerPanel); + toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); + } + try { + toScreen.inverseTransform(screenPt, worldPt); + } catch(NoninvertibleTransformException ex) { + ex.printStackTrace(); + } + // set location to nearest point on circle + double d = center.distance(worldPt); + double dx = worldPt.getX()-center.getX(); + double dy = worldPt.getY()-center.getY(); + double r = center.distance(edge); + double x = center.getX()+r*dx/d; + double y = center.getY()+r*dy/d; + setLocation(x, y); + repaint(); + } + + /** + * Overrides TPoint method. + * + * @param adjusting true if being dragged + */ + public void setAdjusting(boolean adjusting) { + boolean wasAdjusting = isAdjusting(); + super.setAdjusting(adjusting); + if (wasAdjusting && !adjusting) { + circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ + } + } + + + } + + //______________________ inner DataPoint class ________________________ + + class DataPoint extends TPoint { + + /** + * Constructs a DataPoint with specified image coordinates. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public DataPoint(double x, double y) { + super(x, y); + setStepEditTrigger(true); + } + + /** + * Constructs a DataPoint with coordinates equal to those of a TPoint. + * + * @param p the TPoint + */ + public DataPoint(TPoint p) { + this(p.x, p.y); + } + + /** + * Overrides TPoint setXY method. + * + * @param x the x coordinate + * @param y the y coordinate + */ + public void setXY(double x, double y) { + if (track.locked) return; + if (circleFitter.isFixed()) { + int pointIndex = 0; + for (int i=0; i0) { + // add data point(s) + for (int i=0; i Date: Thu, 5 May 2016 13:06:44 +0200 Subject: [PATCH 13/20] fix some problems --- .../cabrillo/tracker/AttachmentDialog.java | 3 - .../cabrillo/tracker/CircleFitter.java | 1325 +++++++++-------- .../cabrillo/tracker/CircleFitterStep.java | 574 ++++--- .../cabrillo/tracker/FileDropHandler.java | 3 +- .../cabrillo/tracker/ParticleDataTrack.java | 5 - .../cabrillo/tracker/Undo.java | 3 - .../cabrillo/tracker/WorldGrid.java | 1 - 7 files changed, 1023 insertions(+), 891 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java index 7951cba8..1196aa7a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/AttachmentDialog.java @@ -255,7 +255,6 @@ public Dimension getPreferredSize() { stepsButton = new JRadioButton(); tracksButton = new JRadioButton(); Action tracksOrStepsAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { if (refreshing) return; CircleFitter fitter = (CircleFitter)measuringTool; @@ -277,7 +276,6 @@ public void actionPerformed(ActionEvent e) { relativeCheckbox = new JCheckBox(); relativeCheckbox.setSelected(false); relativeCheckbox.addActionListener(new ActionListener() { - @Override public void actionPerformed(ActionEvent e) { if (refreshing) return; CircleFitter fitter = (CircleFitter)measuringTool; @@ -290,7 +288,6 @@ public void actionPerformed(ActionEvent e) { // range action, listener and fields final Action frameRangeAction = new AbstractAction() { - @Override public void actionPerformed(ActionEvent e) { CircleFitter fitter = (CircleFitter)measuringTool; fitter.setAttachmentStartFrame(startField.getIntValue()); diff --git a/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java index 3ac9b2c9..865a257d 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java +++ b/src/org/opensourcephysics/cabrillo/tracker/CircleFitter.java @@ -25,7 +25,7 @@ package org.opensourcephysics.cabrillo.tracker; import java.util.ArrayList; -import java.util.Iterator; +import java.util.TreeSet; import java.awt.*; import java.awt.event.*; import java.awt.geom.Point2D; @@ -33,14 +33,12 @@ import javax.swing.*; import javax.swing.border.Border; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; import org.opensourcephysics.display.*; import org.opensourcephysics.media.core.*; import org.opensourcephysics.tools.FontSizer; import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.DataPoint; -import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.Slider; +import org.opensourcephysics.cabrillo.tracker.CircleFitterStep.CenterPoint; import org.opensourcephysics.controls.*; /** @@ -50,19 +48,23 @@ */ public class CircleFitter extends TTrack { + protected static int maxDataPointCount = 20; + // instance fields - protected boolean fixedPosition=true, radialLineVisible=false, radialLineEnabled=false; + protected boolean fixedPosition=true; protected JCheckBoxMenuItem fixedItem; - protected JCheckBox radialLineCheckbox; protected JLabel clickToMarkLabel; protected JLabel xDataPointLabel, yDataPointLabel; protected NumberField xDataField, yDataField; - protected Component xDataPointSeparator, yDataPointSeparator, checkboxSeparator; - protected JMenuItem inspectorItem, originToCenterItem, clearPointsItem; - protected PointMass sourceTrack; - protected int sourceStartStep = 0, sourceEndStep = 100000; - protected CircleFitterInspector inspector; - protected boolean inspectorVisible; + protected Component xDataPointSeparator, yDataPointSeparator; + protected JMenuItem originToCenterItem, clearPointsItem; + protected JMenuItem attachmentItem; + protected JButton pointCountButton; + protected boolean attachToSteps = false, isRelativeFrameNumbers = false; + protected int absoluteStart = 0, relativeStart = -2, attachmentFrameCount = 5; + protected TTrack[] attachmentForSteps; + protected String stepAttachmentName; + private boolean refreshingAttachments, abortRefreshAttachments; /** * Constructs a CircleFitter. @@ -108,24 +110,17 @@ public void itemStateChanged(ItemEvent e) { } }); - clickToMarkLabel = new JLabel(); - clickToMarkLabel.setForeground(Color.red.darker()); - - if (radialLineEnabled) { - radialLineCheckbox = new JCheckBox(); - radialLineCheckbox.setOpaque(false); - radialLineCheckbox.setBorder(BorderFactory.createEmptyBorder()); - radialLineCheckbox.setSelected(isRadialLineVisible()); - radialLineCheckbox.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setRadialLineVisible(radialLineCheckbox.isSelected()); - repaint(); - dataValid = false; - firePropertyChange("data", null, null); //$NON-NLS-1$ - } - }); - checkboxSeparator = Box.createRigidArea(new Dimension(6, 4)); - } + // create attachment dialog item + attachmentItem = new JMenuItem(TrackerRes.getString("MeasuringTool.MenuItem.Attach")); //$NON-NLS-1$ + attachmentItem.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + AttachmentDialog control = trackerPanel.getAttachmentDialog(CircleFitter.this); + control.setVisible(true); + } + }); + + clickToMarkLabel = new JLabel(); + clickToMarkLabel.setForeground(Color.green.darker().darker()); // create actions, listeners, labels and fields for data points final Action dataPointAction = new AbstractAction() { @@ -135,6 +130,8 @@ public void actionPerformed(ActionEvent e) { if (e!=null && e.getSource()==yDataField && yDataField.getBackground()!=Color.yellow) return; TPoint p = trackerPanel.getSelectedPoint(); if (!(p instanceof DataPoint)) return; + if (p.isAttached()) return; + double xValue = xDataField.getValue(); double yValue = yDataField.getValue(); int n = trackerPanel.getFrameNumber(); @@ -181,34 +178,6 @@ public void focusLost(FocusEvent e) { xDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ yDataField.setPatterns(new String[] {"0.000E0", "0.000", "0.00", "0.0", "0.000E0"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ - // set action for angle field - final Action sliderAction = new AbstractAction() { - public void actionPerformed(ActionEvent e) { - if (angleField.getBackground()!=Color.yellow) { - return; - } - double theta = angleField.getValue(); - int n = trackerPanel.getFrameNumber(); - CircleFitterStep step = (CircleFitterStep)getStep(n); - step.setSliderAngle(theta); - } - }; - angleField.addActionListener(sliderAction); - FocusListener sliderFocusListener = new FocusAdapter() { - public void focusLost(FocusEvent e) { - sliderAction.actionPerformed(null); - } - }; - angleField.addFocusListener(sliderFocusListener); - - // inspector item - inspectorItem = new JMenuItem(); - inspectorItem.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - getInspector().setVisible(true); - } - }); - // originToCenter item originToCenterItem = new JMenuItem(); originToCenterItem.addActionListener(new ActionListener() { @@ -225,9 +194,9 @@ public void actionPerformed(ActionEvent e) { boolean changed = false; for (Step step: getSteps()) { CircleFitterStep next = (CircleFitterStep)step; - if (next.dataPoints.isEmpty()) continue; + if (next.dataPoints.length==0) continue; changed = true; - next.dataPoints.clear(); + next.dataPoints = new DataPoint[2][0]; next.refreshCircle(); } if (changed) { @@ -242,10 +211,74 @@ public void actionPerformed(ActionEvent e) { } } }); + + // pointCountButton + pointCountButton = new TButton() { + protected JPopupMenu getPopup() { + // get and save currently selected TPoint to restore if needed + final TPoint selected = trackerPanel.getSelectedPoint(); + JPopupMenu popup = new JPopupMenu(); + // add item for each data point, both marked and attached + int n = trackerPanel.getFrameNumber(); + CircleFitterStep step = (CircleFitterStep)getStep(n); + final ArrayList pts = step.getValidDataPoints(); + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + ActionListener selector = new ActionListener() { + public void actionPerformed(ActionEvent e) { + int i = Integer.parseInt(e.getActionCommand()); + DataPoint p = pts.get(i); + trackerPanel.setSelectedPoint(p); + } + }; + for (int i=0; itrue to fix */ @@ -279,191 +312,12 @@ public boolean isFixed() { return fixedPosition; } - /** - * Sets the visibility of the radial line. - * - * @param vis true to draw a radial line - */ - public void setRadialLineVisible(boolean vis) { - boolean changed = vis!=radialLineVisible; - radialLineVisible = vis; - if (trackerPanel!=null) { - int n = trackerPanel.getFrameNumber(); - steps.getStep(n).repaint(); - if (changed) { - trackerPanel.changed = true; - } - } - } - - /** - * Copies step positions from a point mass source. Source may be null. - * - * @param source a PointMass to copy - */ - public void copySourceStepPositions(PointMass source) { - if (sourceTrack==null && source==null) { - return; - } - sourceTrack = source; - trackerPanel.setSelectedPoint(null); - boolean changed = false; - XMLControl control = new XMLControlElement(this); // for undo (only if changed) - CircleFitterStep circleStep = null; - if (isFixed()) { - circleStep = (CircleFitterStep)getStep(0); - } - else { - int n = trackerPanel.getFrameNumber(); - circleStep = (CircleFitterStep)getStep(n); - } - if (sourceTrack!=null) { - VideoClip clip = trackerPanel.getPlayer().getVideoClip(); - ArrayList tempList = new ArrayList(); - tempList.addAll(circleStep.dataPoints); - circleStep.dataPoints.clear(); - // copy step positions as circleStep DataPoints - Step[] steps = sourceTrack.getSteps(); - for (int i=0; i< steps.length; i++) { - // check if frame is included in video clip and falls in specified range - if (!clip.includesFrame(i)) continue; - int stepNumber = clip.frameToStep(i); - if (steps[i]!=null && stepNumber>=sourceStartStep && stepNumber<=sourceEndStep) { - PositionStep p = (PositionStep)steps[i]; - circleStep.addDataPoint(p.getPosition().x, p.getPosition().y, false); - } - } - // determine if number of points have changed - changed = circleStep.dataPoints.size()!=tempList.size(); - if (!changed) { - // determine if point positions have changed - for (DataPoint next: circleStep.dataPoints) { - Iterator it = tempList.iterator(); - while (it.hasNext()) { - DataPoint test = it.next(); - if (next.x==test.x && next.y==test.y) { - it.remove(); - break; - } - } - } - changed = !tempList.isEmpty(); - } - } - Step[] steps = getSteps(); - for (int i=0; i< steps.length; i++) { - if (steps[i]!=null) { - if (!isFixed() && i-1) { + if (row>-1) { step = (CircleFitterStep)steps.getStep(0); - p = step.dataPoints.get(index); - step.removeDataPoint(p, true); + data = step.dataPoints[column][row]; + step.removeDataPoint(data, true, true); } } return null; @@ -556,8 +428,10 @@ public Step getStep(TPoint point, TrackerPanel trackerPanel) { if (points[i]==point) return step; } CircleFitterStep circleStep = (CircleFitterStep)step; - for (TPoint p: circleStep.dataPoints) { - if (p==point) return step; + for (DataPoint[] pts: circleStep.dataPoints) { + for (DataPoint p: pts) { + if (p==point) return step; + } } } return null; @@ -580,19 +454,392 @@ public void setFontLevel(int level) { {clickToMarkLabel, xDataPointLabel, yDataPointLabel, xDataField, yDataField}; FontSizer.setFonts(objectsToSize, level); - if (radialLineEnabled) { - FontSizer.setFonts(radialLineCheckbox, level); + } + + /** + * Determines if this is attached to one or more tracks. + * + * @return true if attached + */ + public boolean isAttached() { + TTrack[] attachments = getAttachments(); + for (int i = 0; i < attachments.length; i++) { + if (attachments[i]!=null) { + return true; + } + } + return false; + } + + /** + * Determines if this is attached to one or more tracks. + * + * @return true if attached + */ + public boolean isNoPoints(int frameNumber) { + if (!isRelativeFrameNumbers) return false; + int start = frameNumber+relativeStart; + int end = frameNumber+relativeStart+attachmentFrameCount-1; + return end<0 || start>trackerPanel.getPlayer().getVideoClip().getLastFrameNumber(); + } + + /** + * Sets the start frame for single track attachments. + * + * @param n the desired start frame + */ + public void setAttachmentStartFrame(int n) { +// int min = 0; +// int max = trackerPanel.getPlayer().getVideoClip().getFrameCount()-1; + if (isRelativeFrameNumbers) { + int count = trackerPanel.getPlayer().getVideoClip().getFrameCount(); + n = Math.max(n, 1-count); + n = Math.min(n, count-1); + relativeStart = n; + } + else { // absolute frame numbers + int min = trackerPanel.getPlayer().getVideoClip().getFirstFrameNumber(); + int max = trackerPanel.getPlayer().getVideoClip().getLastFrameNumber(); + n = Math.max(n, min); + n = Math.min(n, max); + absoluteStart = n; + } + } + + /** + * Gets the start frame for single track attachments. + * + * @param frameNumber the frame number + * @return the start frame + */ + public int getAttachmentStartFrame(int frameNumber) { + if (isRelativeFrameNumbers) { + int n = Math.max(0, frameNumber+relativeStart); // not less than first frame + n = Math.min(n, trackerPanel.getPlayer().getVideoClip().getLastFrameNumber()); // not more than last frame + return n; } - if (inspector!=null) { - inspector.refreshDisplay(); + return absoluteStart; + } + + /** + * Sets the attachment frame count for single track attachments. + * + * @param n the desired frame count + */ + public void setAttachmentFrameCount(int n) { + n = Math.min(n, maxDataPointCount); + n = Math.max(n, 1); + attachmentFrameCount = n; + } + + /** + * Gets the attachment frame count. + * + * @return the frame count + */ + public int getAttachmentFrameCount() { + return attachmentFrameCount; + } + + /** + * Gets the end frame for single track attachments. + * + * @param frameNumber the current frame number + * @return the end frame + */ + public int getAttachmentEndFrame(int frameNumber) { + int n = Math.max(0, absoluteStart+attachmentFrameCount-1); + if (isRelativeFrameNumbers) { + n = Math.max(0, frameNumber+relativeStart+attachmentFrameCount-1); } + n = Math.min(n, trackerPanel.getPlayer().getVideoClip().getLastFrameNumber()); // not more than last frame + return n; + } + + @Override + public TTrack[] getAttachments() { + // check existing attachments array and modify if necessary + if (attachments==null || attachments.length==0) { + attachments = new TTrack[1]; + } + + if (attachToSteps) { + if (attachmentForSteps==null) { + attachmentForSteps = new TTrack[] {attachments[0]}; + } + return attachmentForSteps; + } + + boolean ready = true; + for (int i=0; i=attachments.length-1 && attachments[i]==null)); + } + if (ready) return attachments; + + // eliminate null attachments + for (int i=attachments.length-1; i>=0; i--) { + if (attachments[i]==null) { + TTrack[] newAttachments = new TTrack[attachments.length-1]; + System.arraycopy(attachments, 0, newAttachments, 0, i); + System.arraycopy(attachments, i+1, newAttachments, i, attachments.length-i-1); + attachments = newAttachments; + } + } + + // include "new" element + if (attachments.length==0) { + attachments = new TTrack[1]; + } + else if (!attachToSteps) { + TTrack[] newAttachments = new TTrack[attachments.length+1]; + System.arraycopy(attachments, 0, newAttachments, 0, attachments.length); + attachments = newAttachments; + } + return attachments; + } + + /** + * Returns the description of a particular attachment point. + * + * @param n the attachment point index + * @return the description + */ + public String getAttachmentDescription(int n) { + if (attachToSteps) { + // attaching to steps + return attachmentForSteps[0]==null? // "new" when attachment is null + TrackerRes.getString("CircleFitter.Label.NewPoint"): //$NON-NLS-1$ + TrackerRes.getString("CircleFitter.Label.Points"); //$NON-NLS-1$ + } + return n==attachments.length-1? // last row is always "new" + TrackerRes.getString("CircleFitter.Label.NewPoint"): //$NON-NLS-1$ + TrackerRes.getString("CircleFitter.Label.Point"); //$NON-NLS-1$ + + } + + /** + * Refreshes the attachments for this track. + * This manages attached data points (dataPoints[1]) and ignores marked data points (dataPoints[0]) + */ + @Override + protected void refreshAttachments() { + if (refreshingAttachments) { + abortRefreshAttachments = true; + while (refreshingAttachments) { + // wait for current thread to abort/finish + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + Runnable runner = new Runnable() { + public void run() { + abortRefreshAttachments = false; + refreshingAttachments = true; + TTrack[] attachments = getAttachments(); + + // look for non-null attachments and if so set fixed to false + boolean hasAttachments = false; + for (int i = 0; i < attachments.length; i++) { + if (attachments[i]!=null) { + hasAttachments = true; + // refresh listeners + attachments[i].removePropertyChangeListener("step", CircleFitter.this); //$NON-NLS-1$ + attachments[i].removePropertyChangeListener("steps", CircleFitter.this); //$NON-NLS-1$ + attachments[i].addPropertyChangeListener("step", CircleFitter.this); //$NON-NLS-1$ + attachments[i].addPropertyChangeListener("steps", CircleFitter.this); //$NON-NLS-1$ + } + } + if (hasAttachments) { + boolean change = trackerPanel.changed; + setFixed(false); + trackerPanel.changed = change; + } + + VideoClip clip = trackerPanel.getPlayer().getVideoClip(); + CircleFitterStep.doRefresh = false; + TreeSet framesToRefresh = new TreeSet(); + if (!attachToSteps) { + for (int n = clip.getStartFrameNumber(); n<=clip.getEndFrameNumber(); n++) { + if (abortRefreshAttachments) { + refreshingAttachments = false; + return; + } + CircleFitterStep step = (CircleFitterStep)steps.getStep(n); + if (step.trimAttachedPointsToLength(attachments.length-1)) { + framesToRefresh.add(n); + } + } + + // each CircleFitter step attaches to same-frame step in attachment tracks + for (int i=0; iout-in+1) { + DataPoint[] newPts = new DataPoint[out-in+1]; + System.arraycopy(existingPts, 0, newPts, 0, newPts.length); + circleStep.dataPoints[1] = newPts; + for (int k=newPts.length; k getToolbarTrackComponents(TrackerPanel trackerPanel) { + // refresh fields int n = trackerPanel.getFrameNumber(); refreshFields(n); + + // refresh pointCountButton + CircleFitterStep step = (CircleFitterStep)getStep(n); + ArrayList pts = step.getValidDataPoints(); + int dataCount=pts.size(); + pointCountButton.setText(dataCount+" "+TrackerRes.getString("CircleFitter.Button.DataPoints")); //$NON-NLS-1$ //$NON-NLS-2$ + // refresh step number label + stepLabel.setText(TrackerRes.getString("TTrack.Label.Step")); //$NON-NLS-1$ + stepValueLabel.setText(trackerPanel.getStepNumber()+":"); //$NON-NLS-1$ + ArrayList list = super.getToolbarTrackComponents(trackerPanel); + list.add(stepLabel); + list.add(stepValueLabel); + list.add(tSeparator); + list.add(pointCountButton); list.add(stepSeparator); - CircleFitterStep step = (CircleFitterStep)getStep(n); - if (step.dataPoints.size()>2) { - if (radialLineEnabled) { - radialLineCheckbox.setText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine")); //$NON-NLS-1$ - radialLineCheckbox.setToolTipText(TrackerRes.getString("CircleFitter.Checkbox.RadialLine.Tooltip")); //$NON-NLS-1$ - list.add(radialLineCheckbox); - list.add(checkboxSeparator); - } + + if (dataCount>2) { xField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterX.Tooltip")); //$NON-NLS-1$ yField.setToolTipText(TrackerRes.getString("CircleFitter.Field.CenterY.Tooltip")); //$NON-NLS-1$ magLabel.setText(TrackerRes.getString("CircleFitter.Label.Radius")); //$NON-NLS-1$ @@ -659,23 +931,23 @@ else if (trackerPanel.getSelectedPoint()==null) { public ArrayList getToolbarPointComponents(TrackerPanel trackerPanel, TPoint point) { ArrayList list = super.getToolbarPointComponents(trackerPanel, point); + if (!(point instanceof DataPoint)) { + return list; + } int n = trackerPanel.getFrameNumber(); refreshFields(n); + stepValueLabel.setText(trackerPanel.getStepNumber()+":"); //$NON-NLS-1$ CircleFitterStep step = (CircleFitterStep)getStep(n); - if (point==step.slider) { - list.add(angleLabel); - list.add(angleField); - list.add(angleSeparator); - } - else { - list.add(xDataPointLabel); - list.add(xDataField); - list.add(xDataPointSeparator); - list.add(yDataPointLabel); - list.add(yDataField); - list.add(yDataPointSeparator); - } - if (step.dataPoints.size()<3) { + list.add(xDataPointLabel); + list.add(xDataField); + list.add(xDataPointSeparator); + list.add(yDataPointLabel); + list.add(yDataField); + list.add(yDataPointSeparator); + // count valid points + ArrayList pts = step.getValidDataPoints(); + int dataCount=pts.size(); + if (dataCount<3) { clickToMarkLabel.setText(TrackerRes.getString("CircleFitter.Label.MarkPoint")); //$NON-NLS-1$ list.add(clickToMarkLabel); } @@ -689,26 +961,26 @@ public Interactive findInteractive( return null; TrackerPanel trackerPanel = (TrackerPanel)panel; int n = trackerPanel.getFrameNumber(); - CircleFitterStep step = (CircleFitterStep)getStep(n); if (trackerPanel.getPlayer().getVideoClip().includesFrame(n)) { + CircleFitterStep step = (CircleFitterStep)steps.getStep(n); Interactive ia = step.findInteractive(trackerPanel, xpix, ypix); if (ia == null) { partName = TrackerRes.getString("TTrack.Selected.Hint"); //$NON-NLS-1$ - if (step.dataPoints.size()<3) { - hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ - } - else { - hint = TrackerRes.getString("CircleFitter.Hint.MarkMore"); //$NON-NLS-1$ - } + hint = TrackerRes.getString("CircleFitter.Hint.Mark3"); //$NON-NLS-1$ return null; } if (ia instanceof DataPoint) { partName = TrackerRes.getString("CircleFitter.DataPoint.Name"); //$NON-NLS-1$ hint = TrackerRes.getString("CircleFitter.DataPoint.Hint"); //$NON-NLS-1$ } - else if (ia instanceof Slider) { - partName = TrackerRes.getString("CircleFitter.Slider.Name"); //$NON-NLS-1$ - hint = TrackerRes.getString("CircleFitter.Slider.Hint"); //$NON-NLS-1$ + else if (ia instanceof CenterPoint) { + partName = TrackerRes.getString("CircleFitter.Center.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Center.Hint"); //$NON-NLS-1$ + } + else if (ia==step.edge) { + partName = TrackerRes.getString("CircleFitter.Circle.Name"); //$NON-NLS-1$ + hint = TrackerRes.getString("CircleFitter.Circle.Hint"); //$NON-NLS-1$ + ia = step.center; } return ia; } @@ -757,15 +1029,11 @@ protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { dataFrames.clear(); // get the datasets: radius, x_center, y_center, step, frame int count = 0; - Dataset angle = null; Dataset x_center = data.getDataset(count++); Dataset y_center = data.getDataset(count++); Dataset r = data.getDataset(count++); Dataset stepNum = data.getDataset(count++); Dataset frameNum = data.getDataset(count++); - if (radialLineEnabled) { - angle = data.getDataset(count++); - } // assign column names to the datasets String time = "t"; //$NON-NLS-1$ if (!x_center.getColumnName(0).equals(time)) { // not yet initialized @@ -775,9 +1043,6 @@ protected void refreshData(DatasetManager data, TrackerPanel trackerPanel) { r.setXYColumnNames(time, "r"); //$NON-NLS-1$ stepNum.setXYColumnNames(time, "step"); //$NON-NLS-1$ frameNum.setXYColumnNames(time, "frame"); //$NON-NLS-1$ - if (radialLineEnabled) { - angle.setXYColumnNames(time, "$\\theta$"); //$NON-NLS-1$ - } } else for (int i = 0; i trackList = trackerPanel.getDrawables(PointMass.class); - copyButton.setEnabled(!trackList.isEmpty() && !isLocked()); - - // update trackDropdown - Object toSelect = null; - refreshing = true; - trackDropdown.removeAllItems(); - - if (trackList.isEmpty()) { - Object[] item = new Object[] {null, TrackerRes.getString("CircleFitter.Inspector.Dropdown.None")}; //$NON-NLS-1$ - trackDropdown.addItem(item); - toSelect = item; - } - else for (PointMass next: trackList) { - Icon icon = next.getFootprint().getIcon(21, 16); - Object[] item = new Object[] {icon, next.getName()}; - trackDropdown.addItem(item); - if (next==sourceTrack) { - toSelect = item; - } - } - // select desired item - if (toSelect!=null) { - trackDropdown.setSelectedItem(toSelect); - } - else { - trackDropdown.setSelectedIndex(0); - } - refreshing = false; - // resize and pack - FontSizer.setFonts(this, FontSizer.getLevel()); - pack(); - } - - @Override - public void setVisible(boolean vis) { - super.setVisible(vis); - inspectorVisible = vis; - } - - } - - - + //__________________________ static methods ___________________________ /** @@ -1199,30 +1303,46 @@ public void saveObject(XMLControl control, Object obj) { control.setValue("fixed", circleFitter.isFixed()); //$NON-NLS-1$ // save steps Step[] steps = circleFitter.getSteps(); - int count = steps.length; - if (circleFitter.isFixed()) count = 1; - double[][] data = new double[count][]; - for (int n = 0; n < count; n++) { + ArrayList dataList = new ArrayList(); + for (int n = 0; n < steps.length; n++) { // save only key frames if (steps[n] == null || !circleFitter.keyFrames.contains(n)) continue; CircleFitterStep step = (CircleFitterStep)steps[n]; - int len = step.dataPoints.size(); + DataPoint[] pts = step.dataPoints[0]; + int len = pts.length; + // data array: first element = frame number, + // remaining elements = (x,y) user-marked data point positions if (len==0) { - data[n] = new double[] {n}; + dataList.add(new double[] {n}); continue; } - double[] stepData = new double[2*len+3]; + double[] stepData = new double[2*len+1]; stepData[0] = n; for (int i=0; i0 + && circleFitter.attachmentForSteps[0]!=null) { + control.setValue("step_attachment", circleFitter.attachmentForSteps[0].getName()); //$NON-NLS-1$ + } } /** @@ -1243,6 +1363,16 @@ public Object createObject(XMLControl control){ * @return the loaded object */ public Object loadObject(XMLControl control, Object obj) { + // check version + double version = 4.91; + XMLProperty parent = control.getParentProperty(); + while (parent!=null) { + if (parent.getPropertyName().equals("TrackerPanel") && parent instanceof XMLControl) { //$NON-NLS-1$ + XMLControl trackerControl = (XMLControl)parent; + version = trackerControl.getDouble("version"); //$NON-NLS-1$ + } + parent = parent.getParentProperty(); + } CircleFitter circleFitter = (CircleFitter)obj; // load track data XML.getLoader(TTrack.class).loadObject(control, obj); @@ -1250,27 +1380,56 @@ public Object loadObject(XMLControl control, Object obj) { circleFitter.setLocked(false); // load fixed property circleFitter.fixedPosition = control.getBoolean("fixed"); //$NON-NLS-1$ - // load step data + // load attachment data + circleFitter.attachToSteps = control.getBoolean("attach_to_steps"); //$NON-NLS-1$ + circleFitter.isRelativeFrameNumbers = control.getBoolean("relative_frames"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("absolute_start")) //$NON-NLS-1$ + circleFitter.absoluteStart = control.getInt("absolute_start"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("attachment_framecount")) //$NON-NLS-1$ + circleFitter.attachmentFrameCount = control.getInt("attachment_framecount"); //$NON-NLS-1$ + if (control.getPropertyNames().contains("relative_start")) //$NON-NLS-1$ + circleFitter.relativeStart = control.getInt("relative_start"); //$NON-NLS-1$ + // load step attachment track + String name = control.getString("step_attachment"); //$NON-NLS-1$ + if (name!=null) { + circleFitter.stepAttachmentName = name; + } + + // load step data for key frames circleFitter.keyFrames.clear(); circleFitter.keyFrames.add(0); double[][] data = (double[][])control.getObject("framedata"); //$NON-NLS-1$ for (int i = 0; i < data.length; i++) { if (data[i] == null || data[i].length<1) continue; + + // first element in the array is the frame number (as double) int n = (int)data[i][0]; - CircleFitterStep step = (CircleFitterStep)circleFitter.getStep(n); - step.dataPoints.clear(); - if (data[i].length==1) { - step.refreshCircle(); + circleFitter.keyFrames.add(n); + if (n>0) { + circleFitter.fixedPosition = false; // must be false + } + CircleFitterStep step = (CircleFitterStep)circleFitter.steps.getStep(n); + + // remaining elements are DataPoint (x, y) pairs + int prevCount = step.dataPoints[0].length; + if (data[i].length==1) { // no data points + step.dataPoints[0] = new DataPoint[0]; + if (prevCount>0) { + step.refreshCircle(); // refresh only if changed + } continue; - } - int pointCount = (data[i].length-3)/2; + } + + // data saved with version 4.91 includes deprecated slider after data points + int pointCount = version<4.92? (data[i].length-3)/2: (data[i].length-1)/2; + DataPoint[] loadedPoints = new DataPoint[pointCount]; for (int j=0; j dataPoints = new ArrayList(); - protected TPoint center, edge; - protected Slider slider; + protected DataPoint[][] dataPoints = new DataPoint[2][0]; + protected CenterPoint center; + protected TPoint edge; protected double radius; - protected Map lineHitShapes = new HashMap(); + protected Map circleHitShapes = new HashMap(); + protected Map centerHitShapes = new HashMap(); protected ArrayList> pointHitShapes = new ArrayList>(); protected Shape selectedShape; @@ -67,32 +70,53 @@ public class CircleFitterStep extends Step { public CircleFitterStep(CircleFitter track, int n) { super(track, n); circleFitter = track; - center = new TPoint(); + center = new CenterPoint(0, 0); edge = new TPoint(); - slider = new Slider(0, 0); - points = new TPoint[] {center, edge, slider}; + points = new TPoint[] {center, edge}; screenPoints = new Point[points.length]; } /** - * Adds an data point to this step at the specified image coordinates. + * Sets the data point at a specified column and row. Replaces existing element, adds null elements if needed. + * Data is stored in array element DataPoints[col][row] * - * @param x the image x coordinate of the data point - * @param y the image y coordinate of the data point + * @param p the data point (may be null) + * @param column the array index + * @param index the array index * @param refreshAndPostEdit true to refresh circle, fire event and post undo edit - * + * @param reduceArrayLengthIfNull true to eliminate null elements */ - public void addDataPoint(double x, double y, boolean refreshAndPostEdit) { - XMLControl control = new XMLControlElement(this); - if (!circleFitter.isFixed()) { + public void setDataPoint(DataPoint p, int column, int row, boolean refreshAndPostEdit, boolean reduceArrayLengthIfNull) { + if (row<0 || column<0 || column>=dataPoints.length) return; + XMLControl control = new XMLControlElement(this); // for undoable edit + + if (!circleFitter.isFixed() && refreshAndPostEdit) { circleFitter.keyFrames.add(n); } - dataPoints.add(new DataPoint(x, y)); + + // make new array if needed + if (row>=dataPoints[column].length) { + int len = dataPoints[column].length; + DataPoint[] newPoints = new DataPoint[row+1]; + System.arraycopy(dataPoints[column], 0, newPoints, 0, len); + dataPoints[column] = newPoints; + } + + // set the array element + dataPoints[column][row] = p; + if (p==null && reduceArrayLengthIfNull) { + DataPoint[] newPoints = new DataPoint[dataPoints[column].length-1]; + System.arraycopy(dataPoints[column], 0, newPoints, 0, row); + System.arraycopy(dataPoints[column], row+1, newPoints, row, dataPoints[column].length-row-1); + dataPoints[column] = newPoints; + } + if (refreshAndPostEdit) { - defaultIndex = dataPoints.size()-1; + defaultIndex = dataPoints[0].length-1; refreshCircle(); circleFitter.dataValid = false; circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ + circleFitter.firePropertyChange("dataPoint", null, circleFitter); //$NON-NLS-1$ if (circleFitter.trackerPanel != null) { circleFitter.trackerPanel.changed = true; } @@ -102,49 +126,122 @@ public void addDataPoint(double x, double y, boolean refreshAndPostEdit) { } /** - * Removes a data point. + * Adds a data point at the end of the array. + * + * @param p the data point + * @param refreshAndPostEdit true to refresh circle, fire event and post undo edit + * + */ + public void addDataPoint(DataPoint p, boolean refreshAndPostEdit) { + setDataPoint(p, 0, dataPoints[0].length, refreshAndPostEdit, p==null); + } + + /** + * Removes a data point from the user-marked array. * * @param p the point to remove + * @param postUndoableEdit true to post an undoable edit + * @param fireEvents true to fire property change events */ - public void removeDataPoint(TPoint p, boolean postUndoableEdit) { - boolean found = false; - for (TPoint next: dataPoints) { - if (next==p) { - found = true; + public void removeDataPoint(DataPoint p, boolean postUndoableEdit, boolean fireEvents) { + if (p==null) return; + int index = -1; + for (int i=0; i-1) { + if (!circleFitter.isFixed() && !p.isAttached()) { circleFitter.keyFrames.add(n); } - dataPoints.remove(p); - if (circleFitter.trackerPanel != null) { - circleFitter.trackerPanel.changed = true; - } + + // make new array + DataPoint[] newPoints = new DataPoint[dataPoints[0].length-1]; + System.arraycopy(dataPoints[0], 0, newPoints, 0, index); + System.arraycopy(dataPoints[0], index+1, newPoints, index, dataPoints[0].length-index-1); + dataPoints[0] = newPoints; + } refreshCircle(); - if (found && postUndoableEdit) { + if (index>-1 && postUndoableEdit) { Undo.postStepEdit(this, control); + if (circleFitter.trackerPanel != null) { + circleFitter.trackerPanel.changed = true; + } } if (n==circleFitter.trackerPanel.getFrameNumber()) { repaint(); circleFitter.refreshFields(n); } circleFitter.dataValid = false; - circleFitter.firePropertyChange("data", null, null); //$NON-NLS-1$ + if (fireEvents) { + circleFitter.firePropertyChange("data", null, null); //$NON-NLS-1$ + circleFitter.firePropertyChange("dataPoint", null, circleFitter); //$NON-NLS-1$ + } circleFitter.trackerPanel.setSelectedPoint(null); TTrackBar.getTrackbar(circleFitter.trackerPanel).refresh(); repaint(); } + /** + * Gets a data point. + * + * @param column the column: 0=marked points, 1=attached points + * @param row the row + * @return the DataPoint, or null if not found + */ + public DataPoint getDataPoint(int column, int row) { + if (row>=0 && column>=0 && columnrow) { + return dataPoints[column][row]; + } + return null; + } + + /** + * Gets the valid data points. A point is valid if non-null. + * This return points from all columns, with user-marked points (column 0) first. + */ + public ArrayList getValidDataPoints() { + ArrayList validPoints = new ArrayList(); + for (int col=0; coldefaultIndex) { - return dataPoints.get(defaultIndex); + if (defaultIndex>=0 && dataPoints[0].length>defaultIndex) { + return dataPoints[0][defaultIndex]; } - return slider; + return null; } @Override @@ -155,24 +252,33 @@ public Interactive findInteractive( Shape hitShape; Interactive hit = null; + hitShape = circleHitShapes.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = edge; + } + + hitShape = centerHitShapes.get(trackerPanel); + if (hitShape!=null && hitShape.intersects(hitRect)) { + hit = center; + } + for (int i=0; i map = pointHitShapes.get(i); if (map!=null) { hitShape = map.get(trackerPanel); - if (hitShape!=null && hitShape.intersects(hitRect)) { - hit = dataPoints.get(i); + if (hitShape!=null && hitShape.intersects(hitRect)) { + ArrayList validPoints = getValidDataPoints(); + if (i pts = getValidDataPoints(); + int dataCount = pts.size(); + if (screenPoints.length!=points.length+dataCount) { + screenPoints = new Point[points.length+dataCount]; } Point p = null; for (int i = 0; i newMap = new HashMap(); pointHitShapes.add(newMap); } - Map map = pointHitShapes.get(i-1); + Map map = pointHitShapes.get(i-2); map.put(trackerPanel, shapes[i]); } @@ -268,7 +377,8 @@ public Rectangle getBounds(boolean highlighted) { * @return the radius in world units */ public double getWorldRadius() { - if (dataPoints.size()<3) { + int dataCount=getValidDataPoints().size(); + if (dataCount<3 || circleFitter.trackerPanel==null) { return Double.NaN; } return radius/circleFitter.trackerPanel.getCoords().getScaleX(n); @@ -280,56 +390,22 @@ public double getWorldRadius() { * @return the center point in world units */ public Point2D getWorldCenter() { - if (dataPoints.size()<3 || Double.isInfinite(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { + int dataCount=getValidDataPoints().size(); + if (dataCount<3 || Double.isInfinite(radius) || radius>CircleFitterFootprint.MAX_RADIUS + || circleFitter.trackerPanel==null) { return null; } return center.getWorldPosition(circleFitter.trackerPanel); } - /** - * Returns the slider angle relative to the +x-axis. - * - * @return the slider angle - */ - public double getSliderAngle() { - // deal with special cases - if (dataPoints.size()<3 || Double.isNaN(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { - return Double.NaN; - } - double theta = -center.angle(slider); - if (circleFitter.trackerPanel!=null) { - theta -= circleFitter.trackerPanel.getCoords().getAngle(n); - } - return theta; - } - - /** - * Returns the slider angle relative to the horizontal. - * - * @return the slider angle - */ - public void setSliderAngle(double theta) { - double prev = getSliderAngle(); - if (theta==prev || Double.isNaN(prev)) return; - if (circleFitter.trackerPanel!=null) { - theta += circleFitter.trackerPanel.getCoords().getAngle(n); - } - double sin = -Math.sin(theta); - double cos = Math.cos(theta); - slider.setLocation(center.x+radius*cos, center.y+radius*sin); - repaint(); - circleFitter.refreshFields(n); -// circleFitter.dataValid = false; -// circleFitter.firePropertyChange("data", null, null); - } - /** * Returns true if the circle is valid (ie if at least 3 data points have been successfuly fit). * * @return true if valid */ public boolean isValidCircle() { - return dataPoints.size()>2 && !Double.isInfinite(radius) + int dataCount=getValidDataPoints().size(); + return dataCount>2 && !Double.isInfinite(radius) && radius>0 && radius0 - && radius pts = getValidDataPoints(); + int len=pts.size(); TPoint p = null; switch (len) { case 0: break; case 1: - DataPoint p0 = dataPoints.get(0); + DataPoint p0 = pts.get(0); center.setLocation(p0); break; case 2: - p0 = dataPoints.get(0); - DataPoint p1 = dataPoints.get(1); + p0 = pts.get(0); + DataPoint p1 = pts.get(1); center.center(p0, p1); edge.setLocation(p0); break; case 3: - p0 = dataPoints.get(0); - p1 = dataPoints.get(1); - DataPoint p2 = dataPoints.get(2); + p0 = pts.get(0); + p1 = pts.get(1); + DataPoint p2 = pts.get(2); refreshCircle(p0, p1, p2); if (circleFitter.trackerPanel!=null) { p = circleFitter.trackerPanel.getSelectedPoint(); @@ -372,14 +442,14 @@ public void refreshCircle() { edge.setLocation(p==p1? p1: p==p2? p2: p0); break; default: - refreshCircle(dataPoints); + refreshCircle(pts); if (Double.isInfinite(radius) || radius>CircleFitterFootprint.MAX_RADIUS) { if (circleFitter.trackerPanel!=null) { p = circleFitter.trackerPanel.getSelectedPoint(); } - p0 = dataPoints.get(0); - p1 = dataPoints.get(1); - p2 = dataPoints.get(2); + p0 = pts.get(0); + p1 = pts.get(1); + p2 = pts.get(2); edge.setLocation(p==p1? p1: p==p2? p2: p0); } else { @@ -389,20 +459,15 @@ public void refreshCircle() { boolean isVisible = circleFitter.trackerPanel!=null && n==circleFitter.trackerPanel.getFrameNumber(); if (radius!=prevR || center.x!=prevX || center.y!=prevY) { - if (!Double.isInfinite(radius) - && radius>0 - && radius pts) { public Object clone() { CircleFitterStep step = (CircleFitterStep)super.clone(); if (step != null) { - step.points[0] = step.center = new TPoint(center.getX(), center.getY()); + step.points[0] = step.center = step.new CenterPoint(center.x, center.y); step.points[1] = step.edge = new TPoint(edge.getX(), edge.getY()); - step.points[2] = step.slider = step.new Slider(slider.getX(), slider.getY()); - step.lineHitShapes = new HashMap(); + step.circleHitShapes = new HashMap(); step.pointHitShapes = new ArrayList>(); - step.dataPoints = new ArrayList(); - for (DataPoint next: dataPoints) { - step.dataPoints.add(new DataPoint(next.x, next.y)); + step.dataPoints = new DataPoint[2][0]; + step.dataPoints[0] = new DataPoint[dataPoints[0].length]; + for (int i=0; iCircleFitterFootprint.MAX_RADIUS) { - if (dataPoints.size()<2) return; - double dx = dataPoints.get(1).getX()-dataPoints.get(0).getX(); - double dy = dataPoints.get(1).getY()-dataPoints.get(0).getY(); - double slope = dy/dx; - double len = CircleFitterFootprint.MAX_RADIUS/100; - if (dx==0) { // vertical line - endPoint1.setLocation(edge.x, edge.y-len); - endPoint2.setLocation(edge.x, edge.y+len); - } - else { - if (Math.abs(dx)>Math.abs(dy)) { - endPoint1.setLocation(edge.x-len, edge.y-slope*len); - endPoint2.setLocation(edge.x+len, edge.y+slope*len); - } - else { - endPoint1.setLocation(edge.x-len/slope, edge.y-len); - endPoint2.setLocation(edge.x+len/slope, edge.y+len); - } - } - setPositionOnLine(xScreen, yScreen, trackerPanel, endPoint1, endPoint2); - return; - } + @Override + public void setScreenPosition(int x, int y, VideoPanel vidPanel, InputEvent e) { + if (this.isAttached()) return; // don't drag or nudge when attached to another point + setScreenPosition(x, y, vidPanel); + } - // get image coordinates of the screen point - if(screenPt==null) { - screenPt = new Point(); - } - if(worldPt==null) { - worldPt = new Point2D.Double(); - } - screenPt.setLocation(xScreen, yScreen); - AffineTransform toScreen = trackerPanel.getPixelTransform(); - if(!trackerPanel.isDrawingInImageSpace()) { - int n = getFrameNumber(trackerPanel); - toScreen.concatenate(trackerPanel.getCoords().getToWorldTransform(n)); - } - try { - toScreen.inverseTransform(screenPt, worldPt); - } catch(NoninvertibleTransformException ex) { - ex.printStackTrace(); - } - // set location to nearest point on circle - double d = center.distance(worldPt); - double dx = worldPt.getX()-center.getX(); - double dy = worldPt.getY()-center.getY(); - double r = center.distance(edge); - double x = center.getX()+r*dx/d; - double y = center.getY()+r*dy/d; - setLocation(x, y); - repaint(); + @Override + public String toString() { + return "DataPoint "+n+": "+super.toString(); //$NON-NLS-1$ //$NON-NLS-2$ } - /** - * Overrides TPoint method. - * - * @param adjusting true if being dragged - */ - public void setAdjusting(boolean adjusting) { - boolean wasAdjusting = isAdjusting(); - super.setAdjusting(adjusting); - if (wasAdjusting && !adjusting) { - circleFitter.firePropertyChange("data", null, circleFitter); //$NON-NLS-1$ - } - } + public Step getAttachedStep() { + if (this.attachedTo!=null && CircleFitterStep.this.track.trackerPanel!=null) { + ArrayList masses = track.trackerPanel.getDrawables(PointMass.class); + for (PointMass next: masses) { + Step step = next.getStep(attachedTo, track.trackerPanel); + if (step!=null) return step; + } + } + return null; + } - } - - //______________________ inner DataPoint class ________________________ - - class DataPoint extends TPoint { - + + class CenterPoint extends TPoint { + /** - * Constructs a DataPoint with specified image coordinates. + * Constructs a CenterPoint with specified image coordinates. * * @param x the x coordinate * @param y the y coordinate */ - public DataPoint(double x, double y) { + public CenterPoint(double x, double y) { super(x, y); - setStepEditTrigger(true); } /** - * Constructs a DataPoint with coordinates equal to those of a TPoint. - * - * @param p the TPoint - */ - public DataPoint(TPoint p) { - this(p.x, p.y); - } - - /** - * Overrides TPoint setXY method. + * Overrides TPoint setXY method to prevent user dragging/nudging. * * @param x the x coordinate * @param y the y coordinate */ public void setXY(double x, double y) { - if (track.locked) return; - if (circleFitter.isFixed()) { - int pointIndex = 0; - for (int i=0; i0) { // add data point(s) for (int i=0; i Date: Tue, 20 Sep 2016 18:02:53 +0200 Subject: [PATCH 14/20] fix some merging errors --- src/org/opensourcephysics/cabrillo/tracker/Tracker.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index e8b7e60d..929cc85a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -144,7 +144,8 @@ public class Tracker { static int requestedMemorySize = -1, originalMemoryRequest = 0; static long lastMillisChecked; static boolean is64BitVM; - protected static Locale[] locales; + static int maxFontLevel = 6; + protected static Locale[] locales; static Locale defaultLocale; static ArrayList checkForUpgradeChoices; static Map checkForUpgradeIntervals; From a780118585ba696aadd7a46148da2ad3860cbba2 Mon Sep 17 00:00:00 2001 From: fschuett Date: Mon, 2 Jan 2017 18:22:25 +0100 Subject: [PATCH 15/20] prevent tracker from restarting on linux --- README.md | 2 +- src/org/opensourcephysics/cabrillo/tracker/TFrame.java | 4 ++-- src/org/opensourcephysics/cabrillo/tracker/Tracker.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d527055..1df24a58 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,6 @@ Video analysis and modeling tool built on the Open Source Physics (OSP) framewor This code requires the OSP Core Library available in the OpenSourcePhysics/osp repository. -Optional video engine support (Xuggle on Win/OSX/linux, QuickTime on Win/OSX) is available in the OpenSourcePhysics/video-engines repository. Without a video engine Tracker will only open images (JPEG, PNG) and animated GIFs. +Optional video engine support (FFMPeg on Win/OSX/linux, QuickTime on Win/OSX) is available in the OpenSourcePhysics/video-engines repository. Without a video engine Tracker will only open images (JPEG, PNG) and animated GIFs. Note: branch "forOSX" includes additional classes to handle apple events when running on OSX. Compiling this branch requires the Apple Java Extensions library (AppleJavaExtensions.jar) which can be downloaded here. diff --git a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java index b65699de..6e4aa065 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TFrame.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TFrame.java @@ -83,7 +83,7 @@ public class TFrame extends OSPFrame implements PropertyChangeListener { protected ArrayList loadedFiles = new ArrayList(); protected boolean anglesInRadians = Tracker.isRadians; protected File tabsetFile; // used when saving tabsets - protected int framesLoaded, prevFramesLoaded; // used when loading xuggle videos + protected int framesLoaded, prevFramesLoaded; // used when loading ffmpeg videos // protected JProgressBar monitor; protected PrefsDialog prefsDialog; protected ClipboardListener clipboardListener; @@ -767,7 +767,7 @@ public void propertyChange(PropertyChangeEvent e) { TrackerPanel trackerPanel = (TrackerPanel)e.getSource(); refreshTab(trackerPanel); } - else if (name.equals("progress")) { // from currently loading (xuggle) video //$NON-NLS-1$ + else if (name.equals("progress")) { // from currently loading (ffmpeg) video //$NON-NLS-1$ Object val = e.getNewValue(); String vidName = XML.forwardSlash((String)e.getOldValue()); try { diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 0f918c60..b7413ae7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -1547,7 +1547,7 @@ public static void main(String[] args) { needsEnvironment = true; } else { - if (ffmpegDir!=null) { + if (ffmpegDir!=null && !OSPRuntime.isLinux()) { String subdir = OSPRuntime.isWindows()? "bin":"lib" ; //$NON-NLS-1$ //$NON-NLS-2$ String ffmpegPath = ffmpegDir+File.separator+subdir; String pathName = OSPRuntime.isWindows()? "Path": //$NON-NLS-1$ From 982d11599d50528b474b0d38530b00f179f7bf91 Mon Sep 17 00:00:00 2001 From: fschuett Date: Thu, 5 Oct 2017 14:54:31 +0200 Subject: [PATCH 16/20] change xuggle to ffmpeg --- .../cabrillo/tracker/Tracker.java | 2 +- .../tracker/analytics/TrackerCountReader.java | 2 +- .../tracker/resources/help/install.html | 12 +-- .../tracker/resources/help/interface.html | 6 +- .../tracker/resources/help/videos.html | 6 +- .../tracker/resources/tracker.properties | 68 ++++++++-------- .../tracker/resources/tracker_ar.properties | 68 ++++++++-------- .../tracker/resources/tracker_cs.properties | 66 +++++++-------- .../tracker/resources/tracker_da.properties | 64 +++++++-------- .../tracker/resources/tracker_de.properties | 2 +- .../resources/tracker_el_GR.properties | 70 ++++++++-------- .../tracker/resources/tracker_es.properties | 64 +++++++-------- .../tracker/resources/tracker_fi.properties | 68 ++++++++-------- .../tracker/resources/tracker_fr.properties | 66 +++++++-------- .../resources/tracker_hu_HU.properties | 68 ++++++++-------- .../tracker/resources/tracker_in.properties | 80 +++++++++---------- .../tracker/resources/tracker_it.properties | 62 +++++++------- .../resources/tracker_iw_IL.properties | 58 +++++++------- .../tracker/resources/tracker_ko.properties | 66 +++++++-------- .../resources/tracker_ms_MY.properties | 4 +- .../resources/tracker_nl_NL.properties | 68 ++++++++-------- .../tracker/resources/tracker_pl.properties | 68 ++++++++-------- .../tracker/resources/tracker_pt.properties | 66 +++++++-------- .../resources/tracker_pt_BR.properties | 66 +++++++-------- .../tracker/resources/tracker_ru.properties | 68 ++++++++-------- .../tracker/resources/tracker_sk.properties | 64 +++++++-------- .../tracker/resources/tracker_sl.properties | 64 +++++++-------- .../tracker/resources/tracker_sr.properties | 68 ++++++++-------- .../tracker/resources/tracker_sv.properties | 64 +++++++-------- .../resources/tracker_th_TH.properties | 64 +++++++-------- .../tracker/resources/tracker_tr.properties | 68 ++++++++-------- .../tracker/resources/tracker_uk.properties | 68 ++++++++-------- .../resources/tracker_vi_VN.properties | 68 ++++++++-------- .../resources/tracker_zh_CN.properties | 64 +++++++-------- .../resources/tracker_zh_TW.properties | 64 +++++++-------- 35 files changed, 947 insertions(+), 947 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index dff860ae..f47b3b4b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -1581,7 +1581,7 @@ public static void main(String[] args) { } boolean needsJavaVM = javaPath!=null && !javaCommand.equals(javaPath); - // update resources like Xuggle & QuickTime + // update resources like FFMPeg & QuickTime boolean updated = updateResources(); // compare memory with requested size(s) diff --git a/src/org/opensourcephysics/cabrillo/tracker/analytics/TrackerCountReader.java b/src/org/opensourcephysics/cabrillo/tracker/analytics/TrackerCountReader.java index 621df816..3de75dca 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/analytics/TrackerCountReader.java +++ b/src/org/opensourcephysics/cabrillo/tracker/analytics/TrackerCountReader.java @@ -50,7 +50,7 @@ public class TrackerCountReader extends JFrame { private String[] versions = {"all", "4.9.8", "4.97", "4.96", "4.95", "4.94", "4.93", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ "4.92", "4.91", "4.90"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ private String[] OSs = {"all", "windows", "osx", "linux"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ - private String[] engines = {"all", "Xuggle", "QT", "none"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ + private String[] engines = {"all", "FFMPeg", "QT", "none"}; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ JComboBox actionDropdown, versionDropdown, osDropdown, engineDropdown; JLabel actionLabel, versionLabel, osLabel, engineLabel; diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/install.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/install.html index 9330e597..fef17688 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/install.html +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/install.html @@ -10,18 +10,18 @@

Installation

-

Tracker requires Java but now supplies its own open-source video engine Xuggle. QuickTime is also supported on Windows and OS X.

+

Tracker requires Java but now supplies its own open-source video engine FFMPeg. QuickTime is also supported on Windows and OS X.

1. Verify and/or install Java

    -
  1. See if Java version 1.6 or higher is installed on the host computer. Note: Windows users must run Tracker in a 32-bit Java VM to use Xuggle or QuickTime, even on a 64-bit computer. If unsure, or Java is not installed, continue with the next step.
  2. +
  3. See if Java version 1.6 or higher is installed on the host computer. Note: Windows users must run Tracker in a 32-bit Java VM to use FFMPeg or QuickTime, even on a 64-bit computer. If unsure, or Java is not installed, continue with the next step.
  4. Download the most recent Java installer from http://www.oracle.com/technetwork/java/javase/downloads/. The JRE (Java Runtime Environment) is all you need unless you're a Java developer. Note: Windows users should download the file described as "Windows x86 Offline" or "Windows x86 Online."
  5. Double-click the installer and follow the instructions.
-

2. Install Tracker (with Xuggle)

+

2. Install Tracker (with FFMPeg)

  1. Download the tracker installer for your platform (Windows, Mac OS X, or Linux) from Tracker's home page at http://www.cabrillo.edu/~dbrown/tracker/.
  2. -
  3. Follow the Installer Help instructions at http://www.cabrillo.edu/~dbrown/tracker/installers/installer_help.html. Be sure to include Xuggle in the installation for maximum functionality.
  4. +
  5. Follow the Installer Help instructions at http://www.cabrillo.edu/~dbrown/tracker/installers/installer_help.html. Be sure to include FFMPeg in the installation for maximum functionality.

3. Install QuickTime if desired (not available for Linux)

@@ -32,7 +32,7 @@

3. Install QuickTime if desired (not available for Linux)

4. Upgrade Tracker when new versions are released

    -
  1. Download the tracker installer for your platform, choose the Upgrade option and follow the instructions. Upgrades may include Tracker, Xuggle and/or other components.
  2. +
  3. Download the tracker installer for your platform, choose the Upgrade option and follow the instructions. Upgrades may include Tracker, FFMPeg and/or other components.

5. Launch Tracker

@@ -48,7 +48,7 @@

6. Run Tracker from a USB drive (optional)

  • Plug the USB drive into a host computer with Java installed.
  • Open the Tracker-X.XX folder on the USB drive and double-click tracker_starter.jar (not tracker.jar) to launch Tracker.
  • No additional software is needed to open still images and animated GIFs on the host.
  • -
  • If Xuggle is installed on the host then it can be used to open videos.
  • +
  • If FFMPeg is installed on the host then it can be used to open videos.
  • If QuickTime is installed on the host then it can be used to open videos.
  • diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/interface.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/interface.html index c90a9a0a..618fb887 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/interface.html +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/interface.html @@ -164,9 +164,9 @@

    13. Tracker Preferences

  • Video tab
      -
    • Select a preferred video engine (Xuggle, QuickTime or none). Unavailable engines on your machine are grayed out.
    • -
    • Select the fast (may be jerky) or smooth (may be slow) playback option for videos opened with Xuggle.
    • -
    • Check the boxes to display warning dialogs when no video engine is found, non-fatal Xuggle errors occur, or frame durations are not constant.
    • +
    • Select a preferred video engine (FFMPeg, QuickTime or none). Unavailable engines on your machine are grayed out.
    • +
    • Select the fast (may be jerky) or smooth (may be slow) playback option for videos opened with FFMPeg.
    • +
    • Check the boxes to display warning dialogs when no video engine is found, non-fatal FFMPeg errors occur, or frame durations are not constant.
  • Tracks tab diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html index b51a36dd..23c6d559 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html @@ -18,10 +18,10 @@

    Videos

    In addition, two different video engines are now supported:

      -
    1. Xuggle (Windows, Mac, Linux) opens most digital video files including .mov, .avi and .mp4.
    2. +
    3. FFMPeg (Windows, Mac, Linux) opens most digital video files including .mov, .avi and .mp4.
    4. QuickTime (Windows, Mac) opens .mov, .avi and .mp4 files only.
    -

    If both Xuggle and QuickTime are installed you can specify a preferred video engine in the Video tab of the preferences dialog. Xuggle is preferred by default.

    +

    If both FFMPeg and QuickTime are installed you can specify a preferred video engine in the Video tab of the preferences dialog. FFMPeg is preferred by default.

    1. Opening or importing a video from a local drive

    To open a video into a new tab, use the Open button or File|Open File menu item. To import a video into an existing tab, use the Video|Import, Video|Replace or File|Import|Video menu item.

    @@ -32,7 +32,7 @@

    1. Opening or importing a video from a local drive

    Video menu

    -

    Select the desired video in the file chooser to open it. If the file can be opened with both Xuggle and QuickTime you will be given a choice as shown.

    +

    Select the desired video in the file chooser to open it. If the file can be opened with both FFMPeg and QuickTime you will be given a choice as shown.

    Open dialog

    2. Opening a video from the web

    diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties index cf40170a..c74b8cf4 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -907,13 +907,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1187,17 +1187,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1213,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1282,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties index c09b94bc..8b4ca1d5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ar.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u06 PrefsDialog.Checkbox.HintsOn=\u0625\u0638\u0647\u0627\u0631 \u0627\u0644\u062a\u0644\u0645\u064a\u062d\u0627\u062a \u0628\u0634\u0643\u0644 \u0627\u0641\u062a\u0631\u0627\u0636\u064a PrefsDialog.Tab.Video.Title=\u0641\u064a\u062f\u064a\u0648 PrefsDialog.VideoPref.BorderTitle=\u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=\u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645 PrefsDialog.Dialog.WebStart.Message=\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631 \u0639\u0646\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645 "\u0648\u064a\u0628 \u0633\u062a\u0627\u0631\u062a". PrefsDialog.Dialog.WebStart.Title=\u0648\u0636\u0639 \u0648\u064a\u0628 \u0633\u062a\u0627\u0631\u062a @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=\u0623\u0633\u0628\u0648\u0639\u064a PrefsDialog.Upgrades.Monthly=\u0634\u0647\u0631\u064a PrefsDialog.Upgrades.Never=\u0623\u0628\u062f\u0627\u064b PrefsDialog.Button.CheckForUpgrade=\u062a\u062d\u0642\u0642 \u0627\u0644\u0622\u0646 -PrefsDialog.Xuggle.Speed.BorderTitle=\u062a\u0634\u063a\u064a\u0644 \u0641\u064a\u062f\u064a\u0648 Xuggle -PrefsDialog.Xuggle.Slow=\u0627\u0645\u0644\u0633 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0628\u0637\u064a\u0626) -PrefsDialog.Xuggle.Fast=\u0633\u0631\u064a\u0639 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0645\u062a\u0634\u0646\u062c) +PrefsDialog.FFMPeg.Speed.BorderTitle=\u062a\u0634\u063a\u064a\u0644 \u0641\u064a\u062f\u064a\u0648 FFMPeg +PrefsDialog.FFMPeg.Slow=\u0627\u0645\u0644\u0633 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0628\u0637\u064a\u0626) +PrefsDialog.FFMPeg.Fast=\u0633\u0631\u064a\u0639 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0645\u062a\u0634\u0646\u062c) PrefsDialog.CalibrationTool.BorderTitle=\u0623\u062f\u0627\u0629 \u0627\u0644\u0645\u0639\u0627\u064a\u0631\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 Protractor.Name=\u0645\u0646\u0642\u0644\u0629 Protractor.New.Name=\u0645\u0646\u0642\u0644\u0629 @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=\u0623\u062f\u0648\u0627\u062a \u0642\u064a\u0627\u TMenuBar.Menu.AngleUnits=\u0648\u062d\u062f\u0629 \u0627\u0644\u0632\u0627\u0648\u064a\u0629 TMenuBar.MenuItem.Degrees=\u062f\u0631\u062c\u0627\u062a TMenuBar.MenuItem.Radians=\u0631\u0627\u062f\u064a\u0627\u0646 -Tracker.Dialog.NoXuggle.Title=Xuggle \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f -Tracker.Dialog.NoXuggle.Message1=Xuggle (\u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u062a\u0639\u062f\u062f \u0627\u0644\u0646\u0638\u0645) \u063a\u064a\u0631 \u0645\u062b\u0628\u062a -Tracker.Dialog.NoXuggle.Message2=\u062a\u062d\u0645\u064a\u0644 Xuggle \u0645\u0646 http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u062d\u0648\u0644 Xuggle ... -Tracker.Dialog.AboutXuggle.Title=\u062d\u0648\u0644 Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=\u0625\u0635\u062f\u0627\u0631 Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=\u0625\u0635\u0641\u062d\u0629 :Xuggle -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle \u0645\u0633\u0627\u0631 \u062c\u0627\u0631: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (\u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u062a\u0639\u062f\u062f \u0627\u0644\u0646\u0638\u0645) \u063a\u064a\u0631 \u0645\u062b\u0628\u062a +Tracker.Dialog.NoFFMPeg.Message2=\u062a\u062d\u0645\u064a\u0644 FFMPeg \u0645\u0646 http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=\u062d\u0648\u0644 FFMPeg ... +Tracker.Dialog.AboutFFMPeg.Title=\u062d\u0648\u0644 FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=\u0625\u0635\u062f\u0627\u0631 FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=\u0625\u0635\u0641\u062d\u0629 :FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg \u0645\u0633\u0627\u0631 \u062c\u0627\u0631: Tracker.Dialog.NoVideoEngine.Message1=\u0644\u0627 \u0645\u0634\u063a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u062b\u0628\u062a \u0645\u0633\u0628\u0642\u0627\u064b. \u062f\u0648\u0646 \u0648\u0627\u062d\u062f\u060c \u064a\u0645\u0643\u0646\u0643 Tracker.Dialog.NoVideoEngine.Message2=\u0641\u0642\u0637 \u0641\u062a\u062d \u0627\u0644\u0635\u0648\u0631 (JPEG, PNG) \u0648\u0645\u0644\u0641\u0627\u062a Gif \u0627\u0644\u0645\u062a\u062d\u0631\u0643\u0629. -Tracker.Dialog.NoVideoEngine.Message3=\u0627\u0644\u0645\u0648\u0635\u0649 \u0628\u0647\u0627: \u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a \u062a\u0631\u0627\u0643\u0631\u0645\u0639 \u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 Xuggle. +Tracker.Dialog.NoVideoEngine.Message3=\u0627\u0644\u0645\u0648\u0635\u0649 \u0628\u0647\u0627: \u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a \u062a\u0631\u0627\u0643\u0631\u0645\u0639 \u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 FFMPeg. Tracker.Dialog.NoVideoEngine.Title=\u0644\u0627 \u064a\u0648\u062c\u062f \u0645\u062d\u0631\u0643 \u0641\u064a\u062f\u064a\u0648 -Tracker.Dialog.NoXuggle.Message1=\u0644\u0627 \u064a\u0639\u0645\u0644 Xuggle \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f -Tracker.Dialog.NoXuggle.Message2=\u0645\u0646 \u0645\u0644\u0641\u0627\u062a \u062c\u0627\u0631 xuggle \u0641\u064a \u0627\u0644\u0645\u062c\u0644\u062f \u0627\u0644\u0631\u0626\u064a\u0633\u064a \u0644\u062a\u0631\u0627\u0643\u0631. \u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644\u060c -Tracker.Dialog.NoXuggle.Message3=\u0627\u0646\u0638\u0631 README.txt \u0644\u062a\u0631\u0627\u0643\u0631 \u0641\u064a \u0627\u0644\u0645\u062c\u0644\u062f \u0627\u0644\u0631\u0626\u064a\u0633\u064a. -Tracker.Dialog.NoXuggle.Message4=\u0644\u062a\u062b\u0628\u064a\u062a Xuggle\u060c \u0642\u0645 \u0628\u062a\u062d\u0645\u064a\u0644 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0644\u062a\u0631\u0627\u0643\u0631. -Tracker.Dialog.NoXuggle.Title=Xuggle \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631 +Tracker.Dialog.NoFFMPeg.Message1=\u0644\u0627 \u064a\u0639\u0645\u0644 FFMPeg \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f +Tracker.Dialog.NoFFMPeg.Message2=\u0645\u0646 \u0645\u0644\u0641\u0627\u062a \u062c\u0627\u0631 ffmpeg \u0641\u064a \u0627\u0644\u0645\u062c\u0644\u062f \u0627\u0644\u0631\u0626\u064a\u0633\u064a \u0644\u062a\u0631\u0627\u0643\u0631. \u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644\u060c +Tracker.Dialog.NoFFMPeg.Message3=\u0627\u0646\u0638\u0631 README.txt \u0644\u062a\u0631\u0627\u0643\u0631 \u0641\u064a \u0627\u0644\u0645\u062c\u0644\u062f \u0627\u0644\u0631\u0626\u064a\u0633\u064a. +Tracker.Dialog.NoFFMPeg.Message4=\u0644\u062a\u062b\u0628\u064a\u062a FFMPeg\u060c \u0642\u0645 \u0628\u062a\u062d\u0645\u064a\u0644 \u0623\u062d\u062f\u062b \u0625\u0635\u062f\u0627\u0631 \u0644\u062a\u0631\u0627\u0643\u0631. +Tracker.Dialog.NoFFMPeg.Title=FFMPeg \u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631 Tracker.About.DefaultLocale=\u0627\u0644\u0644\u063a\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 Tracker.About.CurrentLanguage=\u0627\u0644\u0644\u063a\u0629 Tracker.Dialog.InsufficientMemory.Title=\u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u063a\u064a\u0631 \u0643\u0627\u0641\u064a\u0629 @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=\u062a\u0639\u064a\u064a\u0646 \u062d\u062c\u0645 TTrackBar.Button.Version=\u0645\u062a\u0648\u0641\u0631 \u0627\u0644\u0622\u0646: \u0627\u0644\u0625\u0635\u062f\u0627\u0631 TTrackBar.Popup.MenuItem.Upgrade=\u0627\u0644\u062a\u0631\u0642\u064a\u0629 \u0627\u0644\u0622\u0646... TTrackBar.Popup.MenuItem.Ignore=\u062a\u062c\u0627\u0647\u0644 -XuggleVideo.MenuItem.SmoothPlay=\u0627\u0644\u062a\u062d\u0631\u064a\u0643 \u0627\u0644\u0633\u0644\u0633 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0628\u0637\u064a\u0626) +FFMPegVideo.MenuItem.SmoothPlay=\u0627\u0644\u062a\u062d\u0631\u064a\u0643 \u0627\u0644\u0633\u0644\u0633 (\u0642\u062f \u064a\u0643\u0648\u0646 \u0628\u0637\u064a\u0626) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\u0634\u0631\u064a\u0637 \u0627\u0644\u0645\u0639\u0627\u064a\u0631\u0629 @@ -907,13 +907,13 @@ WorldTView.Button.World=\u0627\u0644\u0639\u0627\u0644\u0645 # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u062a\u062d\u0630\u064a\u0631\u0627\u062a PrefsDialog.Checkbox.WarnIfNoEngine=\u0644\u0627 \u064a\u0648\u062c\u062f \u0645\u062d\u0631\u0643 \u0641\u064a\u062f\u064a\u0648 -PrefsDialog.Checkbox.WarnIfXuggleError=\u0623\u062e\u0637\u0627\u0621 Xuggle \u063a\u064a\u0631 \u0641\u0627\u062f\u062d\u0629 +PrefsDialog.Checkbox.WarnIfFFMPegError=\u0623\u062e\u0637\u0627\u0621 FFMPeg \u063a\u064a\u0631 \u0641\u0627\u062f\u062d\u0629 PropertiesDialog.Title=\u062e\u0635\u0627\u0626\u0635 PropertiesDialog.Label.Author=\u0645\u0624\u0644\u0641 PropertiesDialog.Label.Contact=\u0639\u0646\u0648\u0627\u0646 TActions.Action.Properties=\u062e\u0635\u0627\u0626\u0635... TActions.Action.OpenBrowser=\u0641\u062a\u062d \u0645\u062a\u0635\u0641\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u0629... -TFrame.Progress.Xuggle=Xuggle \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0644\u0642\u0637\u0629 +TFrame.Progress.FFMPeg=FFMPeg \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0644\u0642\u0637\u0629 TFrame.Progress.ClickToCancel=(\u0627\u0646\u0642\u0631 \u0644\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u0623\u0645\u0631) TFrame.Dialog.StalledVideo.Title=\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 TFrame.Dialog.StalledVideo.Message0=\u062a\u0648\u0642\u0641 \u0623\u062b\u0646\u0627\u0621 \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648. \u0648\u0647\u0630\u0627 \u0642\u062f \u064a\u0643\u0648\u0646 \u0645\u0624\u0642\u062a\u0627\u064b. @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=\u062a\u0648\u0642\u0641 TFrame.Dialog.StalledVideo.Button.Wait=\u0627\u0646\u062a\u0638\u0631 Tracker.Dialog.NoVideoEngine.Checkbox=\u0644\u0627 \u062a\u0638\u0647\u0631 \u0647\u0630\u0627 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 TrackerIO.ZipFileFilter.Description=ZIP \u0645\u0644\u0641 (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle \u0648\u0627\u062c\u0647 \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u062a\u0627\u0644\u064a \u0623\u062b\u0646\u0627\u0621 \u0641\u062a\u062d \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg \u0648\u0627\u062c\u0647 \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u062a\u0627\u0644\u064a \u0623\u062b\u0646\u0627\u0621 \u0641\u062a\u062d \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648: TrackerIO.Dialog.ErrorFFMPEG.Message2=\u0644\u064a\u0633\u062a \u0643\u0627\u0641\u0629 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0641\u0627\u062f\u062d\u0629. \u0644\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0631\u0633\u0627\u0626\u0644 \u0627\u0644\u0623\u062e\u0637\u0627\u0621 \u0643\u0627\u0645\u0644\u0629\u060c \u0627\u062e\u062a\u0631 Help|\u0633\u062c\u0644 \u0627\u0644\u0623\u062d\u062f\u0627\u062b. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0625\u0630\u0627 \u0641\u0634\u0644 Xuggle\u060c \u0642\u062f \u062a\u0643\u0648\u0646 \u0642\u0627\u062f\u0631\u0627 \u0639\u0644\u0649 \u0641\u062a\u062d \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u0639 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0625\u0630\u0627 \u0641\u0634\u0644 FFMPeg\u060c \u0642\u062f \u062a\u0643\u0648\u0646 \u0642\u0627\u062f\u0631\u0627 \u0639\u0644\u0649 \u0641\u062a\u062d \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u0639 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u0645\u0644\u0627\u062d\u0638\u0629: \u0641\u064a \u0646\u0638\u0627\u0645 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 Mac OSX \u0647\u0630\u0627 \u064a\u062a\u0637\u0644\u0628 \u062a\u0634\u063a\u064a\u0644 \u062a\u0631\u0627\u0643\u0631\u0641\u064a \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \u062e\u0637\u0623 -TrackerIO.ErrorFFMPEG.LogMessage=\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644\u060c \u0642\u0645 \u0628\u062a\u0634\u063a\u064a\u0644 \u062a\u0646\u0628\u064a\u0647\u0627\u062a Xuggle \u0641\u064a \u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062a\u0641\u0636\u064a\u0644\u0627\u062a (\u062a\u062d\u0631\u064a\u0631 | \u062a\u0641\u0636\u064a\u0644\u0627\u062a). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg \u062e\u0637\u0623 +TrackerIO.ErrorFFMPEG.LogMessage=\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644\u060c \u0642\u0645 \u0628\u062a\u0634\u063a\u064a\u0644 \u062a\u0646\u0628\u064a\u0647\u0627\u062a FFMPeg \u0641\u064a \u0646\u0627\u0641\u0630\u0629 \u0627\u0644\u062a\u0641\u0636\u064a\u0644\u0627\u062a (\u062a\u062d\u0631\u064a\u0631 | \u062a\u0641\u0636\u064a\u0644\u0627\u062a). TToolBar.Button.OpenBrowser.Tooltip=\u0641\u062a\u062d \u0645\u062a\u0635\u0641\u062d \u0627\u0644\u0645\u0643\u062a\u0628\u0629 \u0627\u0644\u0631\u0642\u0645\u064a\u0629 \u0644 OSP # Additions by Doug Brown 2011-07-20 @@ -1187,17 +1187,17 @@ PrefsDialog.Checkbox.32BitVM=32 \u0628\u062a PrefsDialog.Checkbox.WarnVariableDuration=\u0632\u0645\u0646 \u0627\u0644\u0644\u0642\u0637\u0629 \u0645\u062a\u063a\u064a\u064a\u0631 PrefsDialog.Button.NoEngine=\u0644\u0627 \u0634\u064a\u0626 PrefsDialog.Dialog.SwitchToQT.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645 \u064a\u063a\u064a\u064a\u0631 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a. -PrefsDialog.Dialog.SwitchToXuggle32.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 Xuggle \u064a\u063a\u064a\u064a\u0631 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a. -PrefsDialog.Dialog.SwitchToXuggle64.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 Xuggle \u064a\u063a\u064a\u064a\u0631 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 FFMPeg \u064a\u063a\u064a\u064a\u0631 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 FFMPeg \u064a\u063a\u064a\u064a\u0631 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a. PrefsDialog.Dialog.SwitchVM.Title= \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0642\u062f \u062a\u063a\u064a\u064a\u0631\u062a PrefsDialog.Dialog.SwitchTo32.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a \u0623\u064a\u0636\u0627 \u064a\u063a\u064a\u064a\u0631 \u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0625\u0644\u0649 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645, -PrefsDialog.Dialog.SwitchTo64.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a \u0623\u064a\u0636\u0627 \u064a\u063a\u064a\u064a\u0631 \u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0625\u0644\u0649 Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a \u0623\u064a\u0636\u0627 \u064a\u063a\u064a\u064a\u0631 \u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0625\u0644\u0649 FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=\u0645\u062d\u0631\u0643 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u062a\u063a\u064a\u064a\u0631 PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=\u0644\u0627\u064a\u0648\u062c\u062f \u0645\u062d\u0631\u0643 \u0641\u064a\u062f\u064a\u0648 \u0644\u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a. \u064a\u0645\u0643\u0646\u0643 PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=\u0641\u062a\u062d \u0627\u0644\u0635\u0648\u0631 (JPEG\u060c PNG) \u0648\u0635\u0648\u0631 GIF \u0627\u0644\u0645\u062a\u062d\u0631\u0643\u0629. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 64 \u0628\u062a\u061f PrefsDialog.Dialog.NoEngineIn64bitVM.Title=\u0644\u0627 \u064a\u0648\u062c\u062f 64 \u0628\u062a \u0645\u062d\u0631\u0643 \u0641\u064a\u062f\u064a\u0648 -PrefsDialog.Dialog.No32bitVMXuggle.Message=\u064a\u062c\u0628 \u062a\u062b\u0628\u064a\u062a \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a \u0642\u0628\u0644 \u0625\u0645\u0643\u0627\u0646\u064a\u0629 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=\u064a\u062c\u0628 \u062a\u062b\u0628\u064a\u062a \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a \u0642\u0628\u0644 \u0625\u0645\u0643\u0627\u0646\u064a\u0629 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=\u064a\u062c\u0628 \u062a\u062b\u0628\u064a\u062a \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a \u0642\u0628\u0644 \u0625\u0645\u0643\u0627\u0646\u064a\u0629 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645. PrefsDialog.Dialog.No32bitVM.Message=\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a\u060c \u0631\u0627\u062c\u0639 \u062a\u0639\u0644\u064a\u0645\u0627\u062a \u0628\u0631\u0646\u0627\u0645\u062c \u062a\u0631\u0627\u0643\u0631: \u062a\u062b\u0628\u064a\u062a. PrefsDialog.Dialog.No32bitVM.Title=\u0645\u0637\u0644\u0648\u0628 \u0622\u0644\u0629 \u062c\u0627\u0641\u0627 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 32 \u0628\u062a @@ -1213,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=\u0646\u0639\u0645\u060c \u0623\u0639\u062f \u Tracker.Dialog.Button.ShowPrefs=\u0644\u0627\u060c \u0648 \u0644\u0643\u0646 \u0623\u0638\u0647\u0631 \u0627\u0644\u062e\u064a\u0627\u0631\u0627\u062a Tracker.Dialog.Button.ContinueWithoutEngine=\u0644\u0627\u060c \u0625\u0633\u062a\u0645\u0631 \u062f\u0648\u0646 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 Tracker.Dialog.EngineProblems.Message1=\u0648\u0627\u062d\u062f \u0623\u0648 \u0623\u0643\u062b\u0631 \u0645\u0646 \u0645\u062d\u0631\u0643\u0627\u062a \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0645\u062b\u0628\u062a\u0629 \u0648\u0644\u0643\u0646 \u0644\u0627 \u064a\u0639\u0645\u0644. -Tracker.Dialog.EngineProblems.Message2=\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0631\u0627\u062c\u0639 \u062a\u0639\u0644\u064a\u0645\u0627\u062a | \u062a\u0634\u062e\u064a\u0635 | \u0639\u0646 Xuggle \u0623\u0648 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645. -Tracker.Dialog.ReplaceXuggle.Message1=\u0646\u062d\u0646 \u0646\u0646\u0635\u062d \u0628\u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0645\u062d\u0631\u0643\u0643 \u0627\u0644\u062d\u0627\u0644\u064a Xuggle \u0644\u0644\u0641\u064a\u062f\u064a\u0648 -Tracker.Dialog.ReplaceXuggle.Message2=\u0645\u0639 Xuggle \u0627\u0644\u0625\u0635\u062f\u0627\u0631 3.4 \u0639\u0646 \u0637\u0631\u064a\u0642 \u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a \u0628\u0631\u0646\u0627\u0645\u062c \u062a\u0631\u0627\u0643\u0631(\u0627\u0644\u0625\u0635\u062f\u0627\u0631 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=\u0623\u0648 \u0623\u0639\u0644\u0627\u0647) \u062b\u0645 \u062a\u062d\u062f\u064a\u062f Xuggle \u0641\u064a \u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u062b\u0628\u064a\u062a. +Tracker.Dialog.EngineProblems.Message2=\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0631\u0627\u062c\u0639 \u062a\u0639\u0644\u064a\u0645\u0627\u062a | \u062a\u0634\u062e\u064a\u0635 | \u0639\u0646 FFMPeg \u0623\u0648 \u0643\u0648\u064a\u0643 \u062a\u0627\u064a\u0645. +Tracker.Dialog.ReplaceFFMPeg.Message1=\u0646\u062d\u0646 \u0646\u0646\u0635\u062d \u0628\u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0645\u062d\u0631\u0643\u0643 \u0627\u0644\u062d\u0627\u0644\u064a FFMPeg \u0644\u0644\u0641\u064a\u062f\u064a\u0648 +Tracker.Dialog.ReplaceFFMPeg.Message2=\u0645\u0639 FFMPeg \u0627\u0644\u0625\u0635\u062f\u0627\u0631 3.4 \u0639\u0646 \u0637\u0631\u064a\u0642 \u0625\u0639\u0627\u062f\u0629 \u062a\u062b\u0628\u064a\u062a \u0628\u0631\u0646\u0627\u0645\u062c \u062a\u0631\u0627\u0643\u0631(\u0627\u0644\u0625\u0635\u062f\u0627\u0631 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=\u0623\u0648 \u0623\u0639\u0644\u0627\u0647) \u062b\u0645 \u062a\u062d\u062f\u064a\u062f FFMPeg \u0641\u064a \u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062a\u062b\u0628\u064a\u062a. TrackerIO.Dialog.DurationIsConstant.Message=\u062c\u0645\u064a\u0639 \u0641\u062a\u0631\u0627\u062a \u0627\u0644\u0644\u0642\u0637\u0627\u062a \u0645\u062a\u0633\u0627\u0648\u064a\u0629(\u0644\u0642\u0637\u0629 \u0641\u064a \u0627\u0644\u062b\u0627\u0646\u064a\u0629 \u062b\u0627\u0628\u062a\u0629). TrackerIO.ZIPResourceFilter.Description= \u0645\u0644\u0641 \u0645\u0636\u063a\u0648\u0637 \u0644\u0628\u0631\u0646\u0627\u0645\u062c \u062a\u0631\u0627\u0643\u0631(. TRZ) TToolbar.Button.Desktop.Tooltip=\u0639\u0631\u0636 \u0645\u0633\u062a\u0646\u062f\u0627\u062a HTML \u0648/\u0623\u0648 \u0648\u062b\u0627\u0626\u0642 PDF @@ -1282,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties index 98817762..6623da49 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_cs.properties @@ -718,7 +718,7 @@ PrefsDialog.Checkbox.DefaultSize=Pou\u009e\u00edt v\u00fdchoz\u00ed PrefsDialog.Checkbox.HintsOn=Zobrazit tipy ve v\u00fdchoz\u00edm nastaven\u00ed PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Spr\u00e1va pam\u011bti nen\u00ed k dispozici p\u0159i pou\u009eit\u00ed Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -733,9 +733,9 @@ PrefsDialog.Upgrades.Weekly=t\u00fddn\u011b PrefsDialog.Upgrades.Monthly=M\u011bs\u00ed\u010dn\u011b PrefsDialog.Upgrades.Never=Nikdy PrefsDialog.Button.CheckForUpgrade=Zkontrolovat Nyn\u00ed -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (m\u016f\u009ee b\u00fdt pomal\u00e9) -PrefsDialog.Xuggle.Fast=Fast (m\u016f\u009ee b\u00fdt trhan\u00e9) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (m\u016f\u009ee b\u00fdt pomal\u00e9) +PrefsDialog.FFMPeg.Fast=Fast (m\u016f\u009ee b\u00fdt trhan\u00e9) PrefsDialog.CalibrationTool.BorderTitle=V\u00fdchoz\u00ed Kalibra\u010dn\u00ed N\u00e1stroj Protractor.Name=\u00dahlom\u011br Protractor.New.Name=\u00fahlom\u011br @@ -815,23 +815,23 @@ TMenuBar.Menu.MeasuringTools=M\u011b\u0159\u00edc\u00ed N\u00e1stroje TMenuBar.Menu.AngleUnits=\u00dahlov\u00e9 Jednotky TMenuBar.MenuItem.Degrees=Stupn\u011b TMenuBar.MenuItem.Radians=Radi\u00e1ny -Tracker.Dialog.NoXuggle.Title=Xuggle nenalezen -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) nen\u00ed nainstalov\u00e1n. -Tracker.Dialog.NoXuggle.Message2=St\u00e1hnout Xuggle z http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=O Xuggle... -Tracker.Dialog.AboutXuggle.Title=O Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Verze Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar cesta: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg nenalezen +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) nen\u00ed nainstalov\u00e1n. +Tracker.Dialog.NoFFMPeg.Message2=St\u00e1hnout FFMPeg z http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=O FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=O FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Verze FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar cesta: Tracker.Dialog.NoVideoEngine.Message1=Video engine nen\u00ed naistalov\u00e1n. Bez toho m\u016f\u009eete Tracker.Dialog.NoVideoEngine.Message2=otev\u00edrat obr\u00e1zky (JPEG, PNG) a animovan\u00e9 GIFy. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstalovat Tracker s Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstalovat Tracker s FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=\u008e\u00e1dn\u00fd Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle nepracuje spr\u00e1vn\u011b. Pros\u00edm, ujist\u011bte se, \u009ee po\u009eadovan\u00e9 -Tracker.Dialog.NoXuggle.Message2=xuggle jar soubory jsou v Tracker domovsk\u00e9m adres\u00e1\u0159i. Pro v\u00edce informac\u00ed -Tracker.Dialog.NoXuggle.Message3=p\u0159e\u010dt\u011bte Tracker_README.txt v Tracker domovsk\u00e9m adres\u00e1\u0159i. -Tracker.Dialog.NoXuggle.Message4=Pro instalaci Xuggle, st\u00e1hn\u011bte posledn\u00ed Tracker instalaci z -Tracker.Dialog.NoXuggle.Title=Xuggle Nen\u00ed k dispozici +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg nepracuje spr\u00e1vn\u011b. Pros\u00edm, ujist\u011bte se, \u009ee po\u009eadovan\u00e9 +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar soubory jsou v Tracker domovsk\u00e9m adres\u00e1\u0159i. Pro v\u00edce informac\u00ed +Tracker.Dialog.NoFFMPeg.Message3=p\u0159e\u010dt\u011bte Tracker_README.txt v Tracker domovsk\u00e9m adres\u00e1\u0159i. +Tracker.Dialog.NoFFMPeg.Message4=Pro instalaci FFMPeg, st\u00e1hn\u011bte posledn\u00ed Tracker instalaci z +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Nen\u00ed k dispozici Tracker.About.DefaultLocale=V\u00fdchoz\u00ed prost\u0159ed\u00ed Tracker.About.CurrentLanguage=Jazyk Tracker.Dialog.InsufficientMemory.Title=Nedostatek Pam\u011bti @@ -877,7 +877,7 @@ TTrackBar.Memory.Menu.SetSize=Nastavit velikost pam\u011bti... TTrackBar.Button.Version=Nyn\u00ed je k dispozici: verze TTrackBar.Popup.MenuItem.Upgrade=Aktualizovat te\u010f ... TTrackBar.Popup.MenuItem.Ignore=Ignorovat -XuggleVideo.MenuItem.SmoothPlay=Plynul\u00e9 p\u0159ehr\u00e1v\u00e1n\u00ed (m\u016f\u009ee b\u00fdt pomal\u00e9) +FFMPegVideo.MenuItem.SmoothPlay=Plynul\u00e9 p\u0159ehr\u00e1v\u00e1n\u00ed (m\u016f\u009ee b\u00fdt pomal\u00e9) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibra\u010dn\u00ed P\u00e1ska @@ -906,13 +906,13 @@ WorldTView.Button.World=Celkov\u00fd pohled # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Upozorn\u011bn\u00ed PrefsDialog.Checkbox.WarnIfNoEngine=\u008e\u00e1dn\u00fd video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Vlastnosti PropertiesDialog.Label.Author=Auto\u0159i PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Vlastnosti... TActions.Action.OpenBrowser=Otev\u0159\u00edt Prohl\u00ed\u009ee\u010d Knihovny... -TFrame.Progress.Xuggle=Xuggle na\u010d\u00edt\u00e1 sn\u00edmek +TFrame.Progress.FFMPeg=FFMPeg na\u010d\u00edt\u00e1 sn\u00edmek TFrame.Progress.ClickToCancel=(klikn\u011bte pro zru\u009aen\u00ed) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=Video bylo zastaveno p\u0159i na\u010d\u00edt\u00e1n\u00ed. To m\u016f\u009ee b\u00fdt do\u010dasn\u00e9. @@ -925,12 +925,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=\u010cekat Tracker.Dialog.NoVideoEngine.Checkbox=Znovu nezobrazovat TrackerIO.ZipFileFilter.Description=ZIP soubor (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=V Xuggle do\u009alo k n\u00e1sleduj\u00edc\u00ed chyb\u011b p\u0159i otev\u00edr\u00e1n\u00ed tohoto video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=V FFMPeg do\u009alo k n\u00e1sleduj\u00edc\u00ed chyb\u011b p\u0159i otev\u00edr\u00e1n\u00ed tohoto video: TrackerIO.Dialog.ErrorFFMPEG.Message2=V\u009aechny chyby nejsou z\u00e1sadn\u00ed. Pro celkov\u00fd seznam chyb, zvol N\u00e1pov\u011bdu|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Pokud Xuggle nefunguje, m\u016f\u009eete otev\u0159\u00edt video v QuickTimu. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Pokud FFMPeg nefunguje, m\u016f\u009eete otev\u0159\u00edt video v QuickTimu. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: Na Mac OSX pot\u0159ebuje Tracker pro b\u011bh 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=Pro v\u00edce informac\u00ed, klikn\u011bte na Xuggle warnings v dialogu nastaven\u00ed (\u00dapravy|Nastaven\u00ed). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=Pro v\u00edce informac\u00ed, klikn\u011bte na FFMPeg warnings v dialogu nastaven\u00ed (\u00dapravy|Nastaven\u00ed). TToolBar.Button.OpenBrowser.Tooltip=Otev\u0159\u00edt OSP Digit\u00e1ln\u00ed knihovnu # Additions by Doug Brown 2011-07-20 @@ -1186,17 +1186,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variabiln\u00ed doba trv\u00e1n\u00ed sn\u00edmku PrefsDialog.Button.NoEngine=\u008e\u00e1dn\u00fd PrefsDialog.Dialog.SwitchToQT.Message=Zm\u011bna na QuickTime tak\u00e9 zm\u011bn\u00ed Java VM na 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Zm\u011bna na Xuggle tak\u00e9 zm\u011bn\u00ed Java VM na 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Zm\u011bna na Xuggle tak\u00e9 zm\u011bn\u00ed Java VM na 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Zm\u011bna na FFMPeg tak\u00e9 zm\u011bn\u00ed Java VM na 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Zm\u011bna na FFMPeg tak\u00e9 zm\u011bn\u00ed Java VM na 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Zm\u011bn\u011bn PrefsDialog.Dialog.SwitchTo32.Message=Zm\u011bna na 32-bitov\u00e9 Java VM tak\u00e9 zm\u011bn\u00ed video engine na QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Zm\u011bna na 64-bitov\u00e9 Java VM tak\u00e9 zm\u011bn\u00ed video engine na Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Zm\u011bna na 64-bitov\u00e9 Java VM tak\u00e9 zm\u011bn\u00ed video engine na FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Zm\u011bn\u011bn PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=\u008e\u00e1dn\u00fd video engine nen\u00ed k dispozici pro 64-bit Java VM. M\u016f\u009eete PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=st\u00e1le otev\u00edrat obr\u00e1zky (JPEG, PNG) a animovan\u00e9 obr\u00e1zky ve form\u00e1tu GIF. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Jste si jisti s p\u0159epnut\u00edm do 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ne 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=Mus\u00ed b\u00fdt naistalov\u00e1n 32-bit VM p\u0159ed pou\u009eit\u00edm Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Mus\u00ed b\u00fdt naistalov\u00e1n 32-bit VM p\u0159ed pou\u009eit\u00edm FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=Mus\u00ed b\u00fdt naistalov\u00e1n 32-bit VM p\u0159ed pou\u009eit\u00edm QuickTimu. PrefsDialog.Dialog.No32bitVM.Message=Dal\u009a\u00ed informace naleznete v n\u00e1pov\u011bd\u011b k Trackeru: instalace. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Vy\u009eadov\u00e1n @@ -1213,9 +1213,9 @@ Tracker.Dialog.Button.ShowPrefs=Ne, ale zobrazit p\u0159edvolby Tracker.Dialog.Button.ContinueWithoutEngine=Ne,pokra\u010dovat bez videa Tracker.Dialog.EngineProblems.Message1=Jeden nebo v\u00edce video engin\u016f je nainstalov\u00e1n, ale nepracuje. Tracker.Dialog.EngineProblems.Message2=Pro v\u00edce informac\u00ed viz N\u00e1pov\u011bda|Diagnostika|O Xugglu nebo QuickTimu. -Tracker.Dialog.ReplaceXuggle.Message1=Doporu\u010dujeme vym\u011bnit st\u00e1vaj\u00edc\u00ed Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=za Xuggle verzi 3.4 pomoc\u00ed reinstalace Trackeru (verze 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=nebo vy\u009a\u009a\u00ed) a v\u00fdb\u011brem Xuggle v mo\u009enostech instalace. +Tracker.Dialog.ReplaceFFMPeg.Message1=Doporu\u010dujeme vym\u011bnit st\u00e1vaj\u00edc\u00ed FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=za FFMPeg verzi 3.4 pomoc\u00ed reinstalace Trackeru (verze 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=nebo vy\u009a\u009a\u00ed) a v\u00fdb\u011brem FFMPeg v mo\u009enostech instalace. TrackerIO.Dialog.DurationIsConstant.Message=V\u009aechny doby trv\u00e1n\u00ed sn\u00edmk\u016f jsou stejn\u00e9 (konstantn\u00ed fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP Soubor (.trz) TToolbar.Button.Desktop.Tooltip=Zobrazit dopl\u0148kov\u00e9 HTML nebo dokumenty ve form\u00e1tu PDF @@ -1281,7 +1281,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties index 94667a71..1157fccf 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_da.properties @@ -725,7 +725,7 @@ PrefsDialog.Checkbox.DefaultSize=Benyt standardindstillinger PrefsDialog.Checkbox.HintsOn=Vis hints som standard PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Videomotor -PrefsDialog.Button.Xuggle=Xuggle (anbefalet) +PrefsDialog.Button.FFMPeg=FFMPeg (anbefalet) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Hukommelsesstyring er ikke tilgængelig, når du benytter 'Web Start'. PrefsDialog.Dialog.WebStart.Title='Web Start'-tilstand @@ -740,9 +740,9 @@ PrefsDialog.Upgrades.Weekly=Ugentligt PrefsDialog.Upgrades.Monthly=Månedligt PrefsDialog.Upgrades.Never=Aldrig PrefsDialog.Button.CheckForUpgrade=Tjek nu -PrefsDialog.Xuggle.Speed.BorderTitle=Video Playback -PrefsDialog.Xuggle.Slow=Udjævnet (kan være langsom) -PrefsDialog.Xuggle.Fast=Hurtig (kan være hakkende) +PrefsDialog.FFMPeg.Speed.BorderTitle=Video Playback +PrefsDialog.FFMPeg.Slow=Udjævnet (kan være langsom) +PrefsDialog.FFMPeg.Fast=Hurtig (kan være hakkende) PrefsDialog.CalibrationTool.BorderTitle=Standardkaliberingsværktøj Protractor.Name=Vinkelmåler Protractor.New.Name=vinkelmåler @@ -822,22 +822,22 @@ TMenuBar.Menu.MeasuringTools=M TMenuBar.Menu.AngleUnits=Vinkelenheder TMenuBar.MenuItem.Degrees=Grader TMenuBar.MenuItem.Radians=Radianer -Tracker.Dialog.NoXuggle.Title=Xuggle blev ikke fundet -Tracker.Dialog.NoXuggle.Message1=Xuggle (platformsuafhængig videomotor) er ikke installeret. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle fra http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Om Xuggle... -Tracker.Dialog.AboutXuggle.Title=Om Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle sti: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg blev ikke fundet +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (platformsuafhængig videomotor) er ikke installeret. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg fra http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Om FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Om FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg sti: Tracker.Dialog.NoVideoEngine.Message1=Ingen videomotor blev fundet! Uden en sådan kan Tracker Tracker.Dialog.NoVideoEngine.Message2=kun åbne billeder, billedsekvenser og animerede gifs. -Tracker.Dialog.NoVideoEngine.Message3=For at installere Xuggle, som er Tracker's foretrukne videomotor på +Tracker.Dialog.NoVideoEngine.Message3=For at installere FFMPeg, som er Tracker's foretrukne videomotor på Tracker.Dialog.NoVideoEngine.Message4=alle platforme, skal du downloade den seneste version af Tracker fra Tracker.Dialog.NoVideoEngine.Title=Mangler videomotor -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's foretrukne videomotor er endnu ikke installeret. -Tracker.Dialog.NoXuggle.Message2=For at installere Xuggle skal du downloade den seneste version af Tracker fra -Tracker.Dialog.NoXuggle.Title=Mangler Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's foretrukne videomotor er endnu ikke installeret. +Tracker.Dialog.NoFFMPeg.Message2=For at installere FFMPeg skal du downloade den seneste version af Tracker fra +Tracker.Dialog.NoFFMPeg.Title=Mangler FFMPeg Tracker.About.DefaultLocale=Standardsprog Tracker.About.CurrentLanguage=Sprog Tracker.Dialog.InsufficientMemory.Title=Utilstrækkelig hukommelse @@ -883,7 +883,7 @@ TTrackBar.Memory.Menu.SetSize=Indstil hukommelsest TTrackBar.Button.Version=Tilgængelig nu: version TTrackBar.Popup.MenuItem.Upgrade=Opgrader nu... TTrackBar.Popup.MenuItem.Ignore=Ignorer -XuggleVideo.MenuItem.SmoothPlay=Jævn afspilning (kan være langsom) +FFMPegVideo.MenuItem.SmoothPlay=Jævn afspilning (kan være langsom) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibreringspind @@ -912,13 +912,13 @@ WorldTView.Button.World=Omverden # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Advarsler PrefsDialog.Checkbox.WarnIfNoEngine=Ingen video-motor -PrefsDialog.Checkbox.WarnIfXuggleError=Ikke-fatale Xuggle-fejl +PrefsDialog.Checkbox.WarnIfFFMPegError=Ikke-fatale FFMPeg-fejl PropertiesDialog.Title=Egenskaber PropertiesDialog.Label.Author=Forfatter PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Egenskaber... TActions.Action.OpenBrowser=Åbn bibioteks-browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(klik for at afbryde) TFrame.Dialog.StalledVideo.Title=Fejl ved hentning af video TFrame.Dialog.StalledVideo.Message0=Videoen standsede under hentning. Dette kan være midlertidigt. @@ -931,12 +931,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Vent Tracker.Dialog.NoVideoEngine.Checkbox=Vis ikke dette igen TrackerIO.ZipFileFilter.Description=ZIP-filer -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle oplevede følgende fejl i forbindelse med åbning af denne video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg oplevede følgende fejl i forbindelse med åbning af denne video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Ikke alle fejl er fatale. For en fuldstændig fejlliste vælg Hjælp|Besked-log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Hvis Xuggle fejler, så kan du muligvis åbne videoen med QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Hvis FFMPeg fejler, så kan du muligvis åbne videoen med QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Bemærk: På Mac OSX kræver dette, at Tracker kører i en 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle-fejl -TrackerIO.ErrorFFMPEG.LogMessage=For flere detaljer, sæt Xuggle-advarsler til i indstillingsvinduet (Rediger|Indstillinger). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg-fejl +TrackerIO.ErrorFFMPEG.LogMessage=For flere detaljer, sæt FFMPeg-advarsler til i indstillingsvinduet (Rediger|Indstillinger). TToolBar.Button.OpenBrowser.Tooltip=Åbn OSP's digitale biblioteks-browser # Additions by Doug Brown 2011-07-20 @@ -1193,17 +1193,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variabel frame-varighed PrefsDialog.Button.NoEngine=Ingen PrefsDialog.Dialog.SwitchToQT.Message=Et skift til QuickTime ændrer også Java VM til 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Et skift til Xuggle ændrer også Java VM til 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Et skift til Xuggle ændrer også Java VM til 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Et skift til FFMPeg ændrer også Java VM til 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Et skift til FFMPeg ændrer også Java VM til 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM ændret PrefsDialog.Dialog.SwitchTo32.Message=Et skift til en 32-bit Java VM ændrer også videomotoren til QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Et skift til en 64-bit Java VM ændrer også videomotoren til Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Et skift til en 64-bit Java VM ændrer også videomotoren til FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Videomotor ændret PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Ingen videomotor er installeret for en 64-bit Java VM. Du vil PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=stadig have mulighed for at åbne billeder (JPEG, PNG) og animerede GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Er du sikker på, at du vil skifte til en 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ingen 64-bit videomotor -PrefsDialog.Dialog.No32bitVMXuggle.Message=En 32-bit Java VM skal installeres før Xuggle kan benyttes. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=En 32-bit Java VM skal installeres før FFMPeg kan benyttes. PrefsDialog.Dialog.No32bitVMQT.Message=En 32-bit Java VM skal installeres før QuickTime kan benyttes. PrefsDialog.Dialog.No32bitVM.Message=For mere information, se Tracker-hjælp: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM påkrævet @@ -1219,10 +1219,10 @@ Tracker.Dialog.Button.RelaunchNow=Ja, genstart nu Tracker.Dialog.Button.ShowPrefs=Nej, men vis indstillinger Tracker.Dialog.Button.ContinueWithoutEngine=Nej, fortsæt uden video Tracker.Dialog.EngineProblems.Message1=En eller flere videomotorer er installeret, men de virker ikke. -Tracker.Dialog.EngineProblems.Message2=For mere information se Hjælp|Diagnose|Om Xuggle eller QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Vi anbefaler, at du erstatter din nuværende Xuggle videomotor -Tracker.Dialog.ReplaceXuggle.Message2=med Xuggle version 3.4 ved at geninstallere Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=eller senere) og vælge Xuggle i installationsmulighederne. +Tracker.Dialog.EngineProblems.Message2=For mere information se Hjælp|Diagnose|Om FFMPeg eller QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Vi anbefaler, at du erstatter din nuværende FFMPeg videomotor +Tracker.Dialog.ReplaceFFMPeg.Message2=med FFMPeg version 3.4 ved at geninstallere Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=eller senere) og vælge FFMPeg i installationsmulighederne. TrackerIO.Dialog.DurationIsConstant.Message=Alle frame-varigheder er lige store (konstant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP Fil (.trz) TToolbar.Button.Desktop.Tooltip=Vis associerede HTML- og/eller PDF-dokumenter @@ -1288,7 +1288,7 @@ TableTrackView.Dialog.NameColumn.Title=Tekstkolonne TToolBar.MenuItem.StretchOff=Nulstil # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle-Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg-Version PrefsDialog.Checkbox.WarnCopyFailed=Videomotor-filkopieringsfejl Tracker.Dialog.FailedToCopy.Title=Filkopieringsfejl Velocity.Dialog.Color.Title=Vælg lodret farve diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties index 06dd703b..3e859d37 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_de.properties @@ -821,7 +821,7 @@ TMenuBar.MenuItem.Degrees=Grad TMenuBar.MenuItem.Radians=Bogenmaß Tracker.Dialog.NoFFMPeg.Title=FFMPeg nicht gefunden Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (betriebssytemunabhängige Video Engine) nicht installiert -Tracker.Dialog.NoFFMPeg.Message2=Laden Sie FFMPeg von http://www.ffmpeg.org herunter. +Tracker.Dialog.NoFFMPeg.Message2=Laden Sie FFMPeg von http://www.ffmpeg.org/download.html. Tracker.Action.AboutFFMPeg=Über FFMPeg... Tracker.Dialog.AboutFFMPeg.Title=Über FFMPeg Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg Version diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties index 6b6b2e40..26f9236c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_el_GR.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=\u03a7\u03c1\u03ae\u03c3\u03b7 \u03c0\u03c1\u03 PrefsDialog.Checkbox.HintsOn=\u0395\u03bc\u03c6\u03ac\u03bd\u03b9\u03c3\u03b7 \u03c5\u03c0\u03bf\u03b4\u03b5\u03af\u03be\u03b5\u03c9\u03bd \u03c9\u03c2 \u03c0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae PrefsDialog.Tab.Video.Title=\u0392\u03af\u03bd\u03c4\u03b5\u03bf PrefsDialog.VideoPref.BorderTitle=\u039c\u03b7\u03c7\u03b1\u03bd\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf -PrefsDialog.Button.Xuggle=Xuggle (\u03c3\u03c5\u03c3\u03c4\u03ae\u03bd\u03b5\u03c4\u03b1\u03b9) +PrefsDialog.Button.FFMPeg=FFMPeg (\u03c3\u03c5\u03c3\u03c4\u03ae\u03bd\u03b5\u03c4\u03b1\u03b9) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\u039f \u03b4\u03b9\u03b1\u03c7\u03b5\u03b9\u03c1\u03b9\u03c3\u03c4\u03ae\u03c2 \u03bc\u03bd\u03ae\u03bc\u03b7\u03c2 \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2 \u03cc\u03c4\u03b1\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03b5\u03af\u03c4\u03b1\u03b9 \u03bf Web Start. PrefsDialog.Dialog.WebStart.Title=\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 Web Start @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=\u0395\u03b2\u03b4\u03bf\u03bc\u03b1\u03b4\u03b9\u03 PrefsDialog.Upgrades.Monthly=\u039c\u03b7\u03bd\u03b9\u03b1\u03af\u03b1 PrefsDialog.Upgrades.Never=\u03a0\u03bf\u03c4\u03ad PrefsDialog.Button.CheckForUpgrade=\u0388\u03bb\u03b5\u03b3\u03c7\u03bf\u03c2 \u03c4\u03ce\u03c1\u03b1 -PrefsDialog.Xuggle.Speed.BorderTitle=\u0395\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b1\u03c0\u03cc Xuggle -PrefsDialog.Xuggle.Slow=\u03a3\u03c4\u03c1\u03c9\u03c4\u03ae (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b3\u03ae) -PrefsDialog.Xuggle.Fast=\u0393\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b7 \u03bf\u03bc\u03b1\u03bb\u03ae) +PrefsDialog.FFMPeg.Speed.BorderTitle=\u0395\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b1\u03c0\u03cc FFMPeg +PrefsDialog.FFMPeg.Slow=\u03a3\u03c4\u03c1\u03c9\u03c4\u03ae (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b3\u03ae) +PrefsDialog.FFMPeg.Fast=\u0393\u03c1\u03ae\u03b3\u03bf\u03c1\u03b7 (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03bc\u03b7 \u03bf\u03bc\u03b1\u03bb\u03ae) PrefsDialog.CalibrationTool.BorderTitle=\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf \u03b5\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03bf \u03b2\u03b1\u03b8\u03bc\u03bf\u03bd\u03cc\u03bc\u03b7\u03c3\u03b7\u03c2 Protractor.Name=\u039c\u03bf\u03b9\u03c1\u03bf\u03b3\u03bd\u03c9\u03bc\u03cc\u03bd\u03b9\u03bf Protractor.New.Name=\u03bc\u03bf\u03b9\u03c1\u03bf\u03b3\u03bd\u03c9\u03bc\u03cc\u03bd\u03b9\u03bf @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools=\u0395\u03c1\u03b3\u03b1\u03bb\u03b5\u03af\u03b1 \u TMenuBar.Menu.AngleUnits=\u039c\u03bf\u03bd\u03ac\u03b4\u03b5\u03c2 \u03b3\u03c9\u03bd\u03af\u03b1\u03c2 TMenuBar.MenuItem.Degrees=\u039c\u03bf\u03af\u03c1\u03b5\u03c2 TMenuBar.MenuItem.Radians=\u0391\u03ba\u03c4\u03af\u03bd\u03b9\u03b1 -Tracker.Dialog.NoXuggle.Title=\u03a4\u03bf Xuggle \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 -Tracker.Dialog.NoXuggle.Message1=\u03a4\u03bf Xuggle (\u03b1\u03bd\u03b5\u03be\u03ac\u03c1\u03c4\u03b7\u03c4\u03bf\u03c2 \u03c0\u03bb\u03b1\u03c4\u03c6\u03cc\u03c1\u03bc\u03b1\u03c2 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf) \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b5\u03c3\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf. -Tracker.Dialog.NoXuggle.Message2=\u039a\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf Xuggle \u03b1\u03c0\u03cc http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u0393\u03b9\u03b1 \u03c4\u03bf Xuggle... -Tracker.Dialog.AboutXuggle.Title=\u0393\u03b9\u03b1 \u03c4\u03bf Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae \u03b3\u03b9\u03b1 \u03c4\u03bf Xuggle jar: -Tracker.Dialog.NoVideoEngine.Message1=\u039f \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf Xuggle \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b5\u03c3\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2, \u03b5\u03c4\u03c3\u03b9 \u03c4\u03bf Tracker +Tracker.Dialog.NoFFMPeg.Title=\u03a4\u03bf FFMPeg \u03b4\u03b5\u03bd \u03b2\u03c1\u03ad\u03b8\u03b7\u03ba\u03b5 +Tracker.Dialog.NoFFMPeg.Message1=\u03a4\u03bf FFMPeg (\u03b1\u03bd\u03b5\u03be\u03ac\u03c1\u03c4\u03b7\u03c4\u03bf\u03c2 \u03c0\u03bb\u03b1\u03c4\u03c6\u03cc\u03c1\u03bc\u03b1\u03c2 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf) \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b5\u03c3\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf. +Tracker.Dialog.NoFFMPeg.Message2=\u039a\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf FFMPeg \u03b1\u03c0\u03cc http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=\u0393\u03b9\u03b1 \u03c4\u03bf FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=\u0393\u03b9\u03b1 \u03c4\u03bf FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=\u0394\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=\u0394\u03b9\u03b1\u03b4\u03c1\u03bf\u03bc\u03ae \u03b3\u03b9\u03b1 \u03c4\u03bf FFMPeg jar: +Tracker.Dialog.NoVideoEngine.Message1=\u039f \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf FFMPeg \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b5\u03c3\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf\u03c2, \u03b5\u03c4\u03c3\u03b9 \u03c4\u03bf Tracker Tracker.Dialog.NoVideoEngine.Message2=\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b1\u03bd\u03bf\u03af\u03be\u03b5\u03b9 \u03bc\u03cc\u03bd\u03bf \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 (JPEG, PNG) \u03ba\u03b1\u03b9 \u03ba\u03b9\u03bd\u03bf\u03cd\u03bc\u03b5\u03bd\u03b5\u03c2 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 GIF. -Tracker.Dialog.NoVideoEngine.Message3=\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf Xuggle, \u03ba\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c4\u03b7 \u03c4\u03bf\u03c5 Tracker \u03b1\u03c0\u03cc +Tracker.Dialog.NoVideoEngine.Message3=\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf FFMPeg, \u03ba\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c4\u03b7 \u03c4\u03bf\u03c5 Tracker \u03b1\u03c0\u03cc Tracker.Dialog.NoVideoEngine.Title=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf -Tracker.Dialog.NoXuggle.Message1=\u03a4\u03bf Xuggle \u03b4\u03b5\u03bd \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03c3\u03c9\u03c3\u03c4\u03ac. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03b1 -Tracker.Dialog.NoXuggle.Message2=\u03b1\u03c1\u03c7\u03b5\u03af\u03b1 xuggle jar \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker. \u0393\u03b9\u03b1 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2, -Tracker.Dialog.NoXuggle.Message3=\u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf Tracker_README.txt \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker. -Tracker.Dialog.NoXuggle.Message4=\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf Xuggle, \u03ba\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c4\u03b7 \u03c4\u03bf\u03c5 Tracker \u03b1\u03c0\u03cc -Tracker.Dialog.NoXuggle.Title=\u03a4\u03bf Xuggle \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf +Tracker.Dialog.NoFFMPeg.Message1=\u03a4\u03bf FFMPeg \u03b4\u03b5\u03bd \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03b5\u03af \u03c3\u03c9\u03c3\u03c4\u03ac. \u0392\u03b5\u03b2\u03b1\u03b9\u03c9\u03b8\u03b5\u03af\u03c4\u03b5 \u03cc\u03c4\u03b9 \u03c4\u03b1 \u03b1\u03c0\u03b1\u03b9\u03c4\u03bf\u03cd\u03bc\u03b5\u03bd\u03b1 +Tracker.Dialog.NoFFMPeg.Message2=\u03b1\u03c1\u03c7\u03b5\u03af\u03b1 ffmpeg jar \u03b5\u03af\u03bd\u03b1\u03b9 \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker. \u0393\u03b9\u03b1 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2, +Tracker.Dialog.NoFFMPeg.Message3=\u03b4\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf \u03b1\u03c1\u03c7\u03b5\u03af\u03bf Tracker_README.txt \u03c3\u03c4\u03b7 \u03b4\u03b9\u03b5\u03cd\u03b8\u03c5\u03bd\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker. +Tracker.Dialog.NoFFMPeg.Message4=\u0393\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf FFMPeg, \u03ba\u03b1\u03c4\u03b5\u03b2\u03ac\u03c3\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03b5\u03bb\u03b5\u03c5\u03c4\u03b1\u03af\u03bf \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03ac\u03c4\u03b7 \u03c4\u03bf\u03c5 Tracker \u03b1\u03c0\u03cc +Tracker.Dialog.NoFFMPeg.Title=\u03a4\u03bf FFMPeg \u03b4\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf Tracker.About.DefaultLocale=\u03a0\u03c1\u03bf\u03b5\u03c0\u03b9\u03bb\u03b5\u03b3\u03bc\u03ad\u03bd\u03bf \u03c0\u03b5\u03b4\u03af\u03bf Tracker.About.CurrentLanguage=\u0393\u03bb\u03ce\u03c3\u03c3\u03b1 Tracker.Dialog.InsufficientMemory.Title=\u0391\u03bd\u03b5\u03c0\u03b1\u03c1\u03ba\u03ae\u03c2 \u03bc\u03bd\u03ae\u03bc\u03b7 @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=\u039f\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03bc\ TTrackBar.Button.Version=\u0394\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b7 \u03c4\u03ce\u03c1\u03b1: \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 TTrackBar.Popup.MenuItem.Upgrade=\u0391\u03bd\u03b1\u03b2\u03ac\u03b8\u03bc\u03b9\u03c3\u03b7 \u03c4\u03ce\u03c1\u03b1... TTrackBar.Popup.MenuItem.Ignore=\u0391\u03b3\u03bd\u03bf\u03ae\u03c3\u03c4\u03b5 -XuggleVideo.MenuItem.SmoothPlay=\u03a3\u03c4\u03c1\u03c9\u03c4\u03ae \u03b5\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b3\u03ae) +FFMPegVideo.MenuItem.SmoothPlay=\u03a3\u03c4\u03c1\u03c9\u03c4\u03ae \u03b5\u03ba\u03c4\u03ad\u03bb\u03b5\u03c3\u03b7 (\u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03c1\u03b3\u03ae) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\u03a4\u03b1\u03b9\u03bd\u03af\u03b1 \u03b2\u03b1\u03b8\u03bc\u03bf\u03bd\u03cc\u03bc\u03b7\u03c3\u03b7\u03c2 @@ -908,13 +908,13 @@ WorldTView.Button.World=\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03a3\u03c4\ # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u03a0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2 PrefsDialog.Checkbox.WarnIfNoEngine=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf -PrefsDialog.Checkbox.WarnIfXuggleError=\u039c\u03b7 \u03ba\u03c1\u03af\u03c3\u03b9\u03bc\u03b1 \u03bb\u03ac\u03b8\u03b7 \u03c4\u03bf\u03c5 Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=\u039c\u03b7 \u03ba\u03c1\u03af\u03c3\u03b9\u03bc\u03b1 \u03bb\u03ac\u03b8\u03b7 \u03c4\u03bf\u03c5 FFMPeg PropertiesDialog.Title=\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2 PropertiesDialog.Label.Author=\u0394\u03b7\u03bc\u03b9\u03bf\u03c5\u03c1\u03b3\u03bf\u03af PropertiesDialog.Label.Contact=\u0395\u03c0\u03b9\u03ba\u03bf\u03b9\u03bd\u03c9\u03bd\u03af\u03b1 TActions.Action.Properties=\u0399\u03b4\u03b9\u03cc\u03c4\u03b7\u03c4\u03b5\u03c2... TActions.Action.OpenBrowser=\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03a0\u03b5\u03c1\u03b9\u03b7\u03b3\u03b7\u03c4\u03ae \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2... -TFrame.Progress.Xuggle=\u03a4\u03bf Xuggle \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03c4\u03bf \u03ba\u03b1\u03c1\u03ad +TFrame.Progress.FFMPeg=\u03a4\u03bf FFMPeg \u03c6\u03bf\u03c1\u03c4\u03ce\u03bd\u03b5\u03b9 \u03c4\u03bf \u03ba\u03b1\u03c1\u03ad TFrame.Progress.ClickToCancel=(\u03ba\u03bb\u03b9\u03ba \u03b3\u03b9\u03b1 \u03b1\u03ba\u03cd\u03c1\u03c9\u03c3\u03b7) TFrame.Dialog.StalledVideo.Title=\u039b\u03ac\u03b8\u03bf\u03c2 \u03c3\u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf TFrame.Dialog.StalledVideo.Message0=\u03a4\u03bf \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03ad\u03c7\u03b5\u03b9 "\u03ba\u03bf\u03bb\u03bb\u03ae\u03c3\u03b5\u03b9" \u03ba\u03b1\u03c4\u03ac \u03c4\u03b7 \u03c6\u03cc\u03c1\u03c4\u03c9\u03c3\u03b7. \u0391\u03c5\u03c4\u03cc \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03c0\u03c1\u03bf\u03c3\u03c9\u03c1\u03b9\u03bd\u03cc. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=\u03a0\u03b1\u03cd\u03c3\u03b7 TFrame.Dialog.StalledVideo.Button.Wait=\u0391\u03bd\u03b1\u03bc\u03bf\u03bd\u03ae Tracker.Dialog.NoVideoEngine.Checkbox=\u039d\u03b1 \u03bc\u03b7\u03bd \u03b5\u03bc\u03c6\u03b1\u03bd\u03b9\u03c3\u03c4\u03b5\u03af \u03b1\u03c5\u03c4\u03cc \u03be\u03b1\u03bd\u03ac TrackerIO.ZipFileFilter.Description=\u0391\u03c1\u03c7\u03b5\u03af\u03b1 ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=\u03a4\u03bf Xuggle \u03b1\u03bd\u03c4\u03b9\u03bc\u03b5\u03c4\u03ce\u03c0\u03b9\u03c3\u03b5 \u03c4\u03bf \u03b5\u03be\u03ae\u03c2 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf: +TrackerIO.Dialog.ErrorFFMPEG.Message1=\u03a4\u03bf FFMPeg \u03b1\u03bd\u03c4\u03b9\u03bc\u03b5\u03c4\u03ce\u03c0\u03b9\u03c3\u03b5 \u03c4\u03bf \u03b5\u03be\u03ae\u03c2 \u03c0\u03c1\u03cc\u03b2\u03bb\u03b7\u03bc\u03b1 \u03ba\u03b1\u03c4\u03ac \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf: TrackerIO.Dialog.ErrorFFMPEG.Message2=\u0394\u03b5\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03cc\u03bb\u03b1 \u03c4\u03b1 \u03bb\u03ac\u03b8\u03b7 \u03ba\u03c1\u03af\u03c3\u03b9\u03bc\u03b1. \u0393\u03b9\u03b1 \u03c0\u03bb\u03ae\u03c1\u03b7 \u03bc\u03b7\u03bd\u03cd\u03bc\u03b1\u03c4\u03b1 \u03bb\u03b1\u03b8\u03ce\u03bd \u03b5\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u0392\u03bf\u03ae\u03b8\u03b5\u03b9\u03b1|\u0391\u03c1\u03c7\u03b5\u03af\u03bf \u03bc\u03b7\u03bd\u03c5\u03bc\u03ac\u03c4\u03c9\u03bd. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0391\u03bd \u03c4\u03bf Xuggle \u03b1\u03c0\u03bf\u03c4\u03cd\u03c7\u03b5\u03b9 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03bc\u03b5 \u03c4\u03bf QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0391\u03bd \u03c4\u03bf FFMPeg \u03b1\u03c0\u03bf\u03c4\u03cd\u03c7\u03b5\u03b9 \u03bc\u03c0\u03bf\u03c1\u03b5\u03af \u03bd\u03b1 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b4\u03c5\u03bd\u03b1\u03c4\u03cc \u03c4\u03bf \u03ac\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03bc\u03b5 \u03c4\u03bf QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: \u03a3\u03b5 Mac OSX \u03b1\u03c5\u03c4\u03cc \u03b1\u03c0\u03b1\u03b9\u03c4\u03b5\u03af \u03c4\u03bf \u03c4\u03c1\u03ad\u03be\u03b9\u03bc\u03bf \u03c4\u03bf\u03c5 Tracker \u03c3\u03b5 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=\u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03bf\u03c5 Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=\u0393\u03b9\u03b1 \u03c0\u03b9\u03bf \u03c0\u03bf\u03bb\u03bb\u03ad\u03c2 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2, \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 Xuggle \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03c9\u03bd (\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1|\u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2). +TrackerIO.Dialog.ErrorFFMPEG.Title=\u03bb\u03ac\u03b8\u03bf\u03c2 \u03c4\u03bf\u03c5 FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=\u0393\u03b9\u03b1 \u03c0\u03b9\u03bf \u03c0\u03bf\u03bb\u03bb\u03ad\u03c2 \u03bb\u03b5\u03c0\u03c4\u03bf\u03bc\u03ad\u03c1\u03b5\u03b9\u03b5\u03c2, \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03c4\u03b5 \u03c4\u03b9\u03c2 \u03c0\u03c1\u03bf\u03b5\u03b9\u03b4\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03b9\u03c2 \u03c4\u03bf\u03c5 FFMPeg \u03c3\u03c4\u03bf \u03c0\u03b1\u03c1\u03ac\u03b8\u03c5\u03c1\u03bf \u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03c9\u03bd (\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1|\u03a0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2). TToolBar.Button.OpenBrowser.Tooltip=\u0386\u03bd\u03bf\u03b9\u03b3\u03bc\u03b1 \u03c4\u03bf\u03c5 \u03a0\u03b5\u03c1\u03b9\u03b7\u03b3\u03b7\u03c4\u03ae \u03c4\u03b7\u03c2 \u03a8\u03b7\u03c6\u03b9\u03b1\u03ba\u03ae\u03c2 \u0392\u03b9\u03b2\u03bb\u03b9\u03bf\u03b8\u03ae\u03ba\u03b7\u03c2 OSP # Additions by Doug Brown 2011-07-20 @@ -1189,17 +1189,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=\u039c\u03b5\u03c4\u03b1\u03b2\u03bb\u03b7\u03c4\u03ae \u03b4\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 \u03c4\u03c9\u03bd \u03ba\u03b1\u03c1\u03ad PrefsDialog.Button.NoEngine=\u039a\u03b1\u03bd\u03ad\u03bd\u03b1\u03c2 PrefsDialog.Dialog.SwitchToQT.Message=\u0397 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf QuickTime \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd Java VM \u03c3\u03b5 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=\u0397 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf Xuggle \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd Java VM \u03c3\u03b5 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=\u0397 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf Xuggle \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd Java VM \u03c3\u03b5 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=\u0397 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf FFMPeg \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd Java VM \u03c3\u03b5 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=\u0397 \u03bc\u03b5\u03c4\u03ac\u03b2\u03b1\u03c3\u03b7 \u03c3\u03c4\u03bf FFMPeg \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03b7\u03bd Java VM \u03c3\u03b5 64-bit. PrefsDialog.Dialog.SwitchVM.Title=\u0397 Java VM \u03ac\u03bb\u03bb\u03b1\u03be\u03b5 PrefsDialog.Dialog.SwitchTo32.Message=\u0397 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c3\u03b5 32-bit Java VM \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03c3\u03b5 QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=\u0397 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c3\u03b5 64-bit Java VM \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03c3\u03b5 Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=\u0397 \u03b1\u03bb\u03bb\u03b1\u03b3\u03ae \u03c3\u03b5 64-bit Java VM \u03b1\u03bb\u03bb\u03ac\u03b6\u03b5\u03b9 \u03b5\u03c0\u03af\u03c3\u03b7\u03c2 \u03ba\u03b1\u03b9 \u03c4\u03bf\u03bd \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03c3\u03b5 FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=\u039f \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03ad\u03c7\u03b5\u03b9 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03b9 PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03bf\u03c2 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b3\u03b9\u03b1 64-bit Java VM. \u0398\u03b1 \u03b5\u03af\u03c3\u03c4\u03b5 PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=\u03c3\u03b5 \u03b8\u03ad\u03c3\u03b7 \u03bd\u03b1 \u03b1\u03bd\u03bf\u03af\u03be\u03b5\u03c4\u03b5 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 (JPEG, PNG) \u03ba\u03b1\u03b9 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b5\u03c2 \u03bc\u03b5 \u03ba\u03af\u03bd\u03b7\u03c3\u03b7 (GIF). PrefsDialog.Dialog.NoEngineIn64bitVM.Question=\u03a3\u03af\u03b3\u03bf\u03c5\u03c1\u03b1 \u03b8\u03ad\u03bb\u03b5\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03bb\u03bb\u03ac\u03be\u03b5\u03c4\u03b5 \u03c3\u03b5 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=\u0394\u03b5\u03bd \u03c5\u03c0\u03ac\u03c1\u03c7\u03b5\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=\u039c\u03b9\u03b1 32-bit Java VM \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03b1\u03b8\u03b5\u03af \u03c0\u03c1\u03b9\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=\u039c\u03b9\u03b1 32-bit Java VM \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03b1\u03b8\u03b5\u03af \u03c0\u03c1\u03b9\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=\u039c\u03b9\u03b1 32-bit Java VM \u03c0\u03c1\u03ad\u03c0\u03b5\u03b9 \u03bd\u03b1 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b1\u03c3\u03c4\u03b1\u03b8\u03b5\u03af \u03c0\u03c1\u03b9\u03bd \u03c7\u03c1\u03b7\u03c3\u03b9\u03bc\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf QuickTime. PrefsDialog.Dialog.No32bitVM.Message=\u0393\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2, \u03b4\u03b5\u03af\u03c4\u03b5 Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=\u0391\u03c0\u03b1\u03b9\u03c4\u03b5\u03af\u03c4\u03b1\u03b9 32-bit VM @@ -1215,10 +1215,10 @@ Tracker.Dialog.Button.RelaunchNow=\u039d\u03b1\u03b9, \u03b5\u03c0\u03b1\u03bd\u Tracker.Dialog.Button.ShowPrefs=\u038c\u03c7\u03b9, \u03b1\u03bb\u03bb\u03ac \u03bd\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bb\u03b7\u03b8\u03bf\u03cd\u03bd \u03bf\u03b9 \u03c0\u03c1\u03bf\u03c4\u03b9\u03bc\u03ae\u03c3\u03b5\u03b9\u03c2 Tracker.Dialog.Button.ContinueWithoutEngine=\u038c\u03c7\u03b9, \u03c3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1 \u03c7\u03c9\u03c1\u03af\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf Tracker.Dialog.EngineProblems.Message1=\u0388\u03bd\u03b1\u03c2 \u03ae \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03bf\u03b9 \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ad\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf \u03b5\u03af\u03bd\u03b1\u03b9 \u03b5\u03b3\u03ba\u03b1\u03c4\u03b5\u03c3\u03c4\u03b7\u03bc\u03ad\u03bd\u03bf\u03b9 \u03b1\u03bb\u03bb\u03ac \u03b4\u03b5\u03bd \u03bb\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03bf\u03cd\u03bd. -Tracker.Dialog.EngineProblems.Message2=\u0393\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03b4\u03b5\u03af\u03c4\u03b5 Help|Diagnostics|About Xuggle \u03ae QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=\u0395\u03b9\u03c3\u03b7\u03b3\u03bf\u03cd\u03bc\u03b1\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03b1 Xuggle \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf -Tracker.Dialog.ReplaceXuggle.Message2=\u03bc\u03b5 \u03c4\u03bf\u03bd Xuggle \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 3.4 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b1\u03bd\u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker (\u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=\u03ae \u03bd\u03b5\u03ce\u03c4\u03b5\u03c1\u03b7) \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03bb\u03ad\u03b3\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf\u03bd Xuggle \u03c3\u03c4\u03b9\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 \u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2. +Tracker.Dialog.EngineProblems.Message2=\u0393\u03b9\u03b1 \u03c0\u03b5\u03c1\u03b9\u03c3\u03c3\u03cc\u03c4\u03b5\u03c1\u03b5\u03c2 \u03c0\u03bb\u03b7\u03c1\u03bf\u03c6\u03bf\u03c1\u03af\u03b5\u03c2 \u03b4\u03b5\u03af\u03c4\u03b5 Help|Diagnostics|About FFMPeg \u03ae QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=\u0395\u03b9\u03c3\u03b7\u03b3\u03bf\u03cd\u03bc\u03b1\u03c3\u03c4\u03b5 \u03bd\u03b1 \u03b1\u03bd\u03c4\u03b9\u03ba\u03b1\u03c4\u03b1\u03c3\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03bf\u03bd \u03c4\u03c1\u03ad\u03c7\u03bf\u03bd\u03c4\u03b1 FFMPeg \u03b5\u03ba\u03c4\u03b5\u03bb\u03b5\u03c3\u03c4\u03ae \u03b2\u03af\u03bd\u03c4\u03b5\u03bf +Tracker.Dialog.ReplaceFFMPeg.Message2=\u03bc\u03b5 \u03c4\u03bf\u03bd FFMPeg \u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 3.4 \u03bc\u03b5 \u03c4\u03b7\u03bd \u03b5\u03c0\u03b1\u03bd\u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7 \u03c4\u03bf\u03c5 Tracker (\u03ad\u03ba\u03b4\u03bf\u03c3\u03b7 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=\u03ae \u03bd\u03b5\u03ce\u03c4\u03b5\u03c1\u03b7) \u03ba\u03b1\u03b9 \u03b5\u03c0\u03b9\u03bb\u03ad\u03b3\u03bf\u03bd\u03c4\u03b1\u03c2 \u03c4\u03bf\u03bd FFMPeg \u03c3\u03c4\u03b9\u03c2 \u03b5\u03c0\u03b9\u03bb\u03bf\u03b3\u03ad\u03c2 \u03b5\u03b3\u03ba\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7\u03c2. TrackerIO.Dialog.DurationIsConstant.Message=\u0397 \u03b4\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1 \u03cc\u03bb\u03c9\u03bd \u03c4\u03c9\u03bd \u03ba\u03b1\u03c1\u03ad \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03af\u03b4\u03b9\u03b1 (\u03c3\u03c4\u03b1\u03b8\u03b5\u03c1\u03cc fps). TrackerIO.ZIPResourceFilter.Description=\u0391\u03c1\u03c7\u03b5\u03af\u03bf Tracker (.trz) TToolbar.Button.Desktop.Tooltip=\u03a0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae \u03c0\u03c1\u03cc\u03c3\u03b8\u03b5\u03c4\u03c9\u03bd \u03b1\u03c1\u03c7\u03b5\u03af\u03c9\u03bd HTML \u03ba\u03b1\u03b9/\u03ae PDF @@ -1284,7 +1284,7 @@ TableTrackView.Dialog.NameColumn.Title=\u03a3\u03c4\u03ae\u03bb\u03b7 \u03ba\u03 TToolBar.MenuItem.StretchOff=\u0395\u03c0\u03b1\u03bd\u03b1\u03c6\u03bf\u03c1\u03ac # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=\u0388\u03ba\u03b4\u03bf\u03c3\u03b7 FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1\u03c4\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 \u03bc\u03b7\u03c7\u03b1\u03bd\u03ae\u03c2 \u03b2\u03af\u03bd\u03c4\u03b5\u03bf Tracker.Dialog.FailedToCopy.Title=\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1 \u03c3\u03c4\u03b7\u03bd \u03b1\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae \u03b1\u03c1\u03c7\u03b5\u03af\u03bf\u03c5 Velocity.Dialog.Color.Title=\u0395\u03c0\u03b9\u03bb\u03bf\u03b3\u03ae \u03c7\u03c1\u03ce\u03bc\u03b1\u03c4\u03bf\u03c2 \u03b3\u03b9\u03b1 \u03c4\u03b7\u03bd \u03c4\u03b1\u03c7\u03cd\u03c4\u03b7\u03c4\u03b1 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties index a18294d1..f73c7fb0 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_es.properties @@ -722,7 +722,7 @@ PrefsDialog.Checkbox.DefaultSize=Usar valores por defecto PrefsDialog.Checkbox.HintsOn=Mostrar pistas por defecto PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Motor de Video -PrefsDialog.Button.Xuggle=Xuggle (recomendado) +PrefsDialog.Button.FFMPeg=FFMPeg (recomendado) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=El manejo de memoria no está accesible cuando se usa Web Start. PrefsDialog.Dialog.WebStart.Title=Modo Web Start @@ -737,9 +737,9 @@ PrefsDialog.Upgrades.Weekly=Semanalmente PrefsDialog.Upgrades.Monthly=Mensualmente PrefsDialog.Upgrades.Never=Nunca PrefsDialog.Button.CheckForUpgrade=Buscar Ahora -PrefsDialog.Xuggle.Speed.BorderTitle=Reproducción de Video -PrefsDialog.Xuggle.Slow=Suave (puede ser lenta) -PrefsDialog.Xuggle.Fast=Rápida (Puede mostrar saltos) +PrefsDialog.FFMPeg.Speed.BorderTitle=Reproducción de Video +PrefsDialog.FFMPeg.Slow=Suave (puede ser lenta) +PrefsDialog.FFMPeg.Fast=Rápida (Puede mostrar saltos) PrefsDialog.CalibrationTool.BorderTitle=Herramienta de Calibración por Defecto Protractor.Name=Transportador Protractor.New.Name=transportador @@ -819,22 +819,22 @@ TMenuBar.Menu.MeasuringTools=Herramientad de Medida TMenuBar.Menu.AngleUnits=Unidades de Ángulo TMenuBar.MenuItem.Degrees=Grados TMenuBar.MenuItem.Radians=Radianes -Tracker.Dialog.NoXuggle.Title=No se encontró Xuggle -Tracker.Dialog.NoXuggle.Message1=No está instalado Xuggle (motor de video multiplataforma). -Tracker.Dialog.NoXuggle.Message2=Descargue Xuggle de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Sobre Xuggle... -Tracker.Dialog.AboutXuggle.Title=Sobre Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle versión -Tracker.Dialog.AboutXuggle.Message.Home=Sitio de Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Camino de Xuggle: +Tracker.Dialog.NoFFMPeg.Title=No se encontró FFMPeg +Tracker.Dialog.NoFFMPeg.Message1=No está instalado FFMPeg (motor de video multiplataforma). +Tracker.Dialog.NoFFMPeg.Message2=Descargue FFMPeg de http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Sobre FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Sobre FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg versión +Tracker.Dialog.AboutFFMPeg.Message.Home=Sitio de FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=Camino de FFMPeg: Tracker.Dialog.NoVideoEngine.Message1=¡No se ha encontrado ningún motor de video! Sin uno, Tracker solo Tracker.Dialog.NoVideoEngine.Message2=puede abrir imágenes, secuencias de imágenes y gifs animados. -Tracker.Dialog.NoVideoEngine.Message3=Para instalar Xuggle, el motor de video preferido por Tracker para todas +Tracker.Dialog.NoVideoEngine.Message3=Para instalar FFMPeg, el motor de video preferido por Tracker para todas Tracker.Dialog.NoVideoEngine.Message4=las plataformas, descargue el último instalador de Tracker desde Tracker.Dialog.NoVideoEngine.Title=Falta Motor de Video -Tracker.Dialog.NoXuggle.Message1=Xuggle, el motor de video preferido por Tracker, no está instalado todavía. -Tracker.Dialog.NoXuggle.Message2=Para instalar Xuggle, descargue el último instalador de Tracker desde -Tracker.Dialog.NoXuggle.Title=Falta Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, el motor de video preferido por Tracker, no está instalado todavía. +Tracker.Dialog.NoFFMPeg.Message2=Para instalar FFMPeg, descargue el último instalador de Tracker desde +Tracker.Dialog.NoFFMPeg.Title=Falta FFMPeg Tracker.About.DefaultLocale=Local por Defecto Tracker.About.CurrentLanguage=Idioma Tracker.Dialog.InsufficientMemory.Title=Memoria Insuficiente @@ -880,7 +880,7 @@ TTrackBar.Memory.Menu.SetSize=Fijar tama TTrackBar.Button.Version=Ahora disponible: versión TTrackBar.Popup.MenuItem.Upgrade=Actalizar Ahora... TTrackBar.Popup.MenuItem.Ignore=Ignorar -XuggleVideo.MenuItem.SmoothPlay=Reproducir Suavemente (puede ser lento) +FFMPegVideo.MenuItem.SmoothPlay=Reproducir Suavemente (puede ser lento) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -909,13 +909,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -928,12 +928,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1190,17 +1190,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1216,10 +1216,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1285,7 +1285,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties index 0929378b..6aafd4b2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fi.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=K PrefsDialog.Checkbox.HintsOn=Näytä aina vinkit PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video-ohjelma -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Muistinhallintaa ei käytetä, kun Tracker käynnistetään "Web Start":illa. PrefsDialog.Dialog.WebStart.Title=Web Start-tila @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=Viikoittain PrefsDialog.Upgrades.Monthly=Kuukausittain PrefsDialog.Upgrades.Never=Ei koskaan PrefsDialog.Button.CheckForUpgrade=Tarkista nyt -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle-videon Toisto -PrefsDialog.Xuggle.Slow=Pehmeästi (voi olla hidasta) -PrefsDialog.Xuggle.Fast=Nopeasti (voi olla nykivää) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg-videon Toisto +PrefsDialog.FFMPeg.Slow=Pehmeästi (voi olla hidasta) +PrefsDialog.FFMPeg.Fast=Nopeasti (voi olla nykivää) PrefsDialog.CalibrationTool.BorderTitle=Oletuksena oleva kalibrointityökalu Protractor.Name=Astemitta Protractor.New.Name=astemitta @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=Mittausv TMenuBar.Menu.AngleUnits=Kulmayksikkö TMenuBar.MenuItem.Degrees=Asteet TMenuBar.MenuItem.Radians=Radiaanit -Tracker.Dialog.NoXuggle.Title=Xuggle ei löydy -Tracker.Dialog.NoXuggle.Message1=Xuggle (video-ohjelma) ei ole asennettu. -Tracker.Dialog.NoXuggle.Message2=Lataa Xuggle osoitteesta http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Tietoa Xuggle'sta... -Tracker.Dialog.AboutXuggle.Title=Tietoa Xuggle'sta -Tracker.Dialog.AboutXuggle.Message.Version=Xugglen versio -Tracker.Dialog.AboutXuggle.Message.Home=Xugglen kotisivu: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle'n jar-polku: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg ei löydy +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (video-ohjelma) ei ole asennettu. +Tracker.Dialog.NoFFMPeg.Message2=Lataa FFMPeg osoitteesta http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Tietoa FFMPeg'sta... +Tracker.Dialog.AboutFFMPeg.Title=Tietoa FFMPeg'sta +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPegn versio +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPegn kotisivu: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg'n jar-polku: Tracker.Dialog.NoVideoEngine.Message1=Video-ohjelmia ei ole asennettuna. Ilman niitä voit Tracker.Dialog.NoVideoEngine.Message2=avata vain kuvia (JPEG, PNG) ja GIF-animaatioita. -Tracker.Dialog.NoVideoEngine.Message3=Suositus: Asenna Tracker Xuggle-ohjelman kanssa. +Tracker.Dialog.NoVideoEngine.Message3=Suositus: Asenna Tracker FFMPeg-ohjelman kanssa. Tracker.Dialog.NoVideoEngine.Title=Ei video-ohjelmaa -Tracker.Dialog.NoXuggle.Message1=Xuggle ei toimi oikein. Varmista, että -Tracker.Dialog.NoXuggle.Message2=Xugglen jar-tiedosto on Trackerin kotikansiossa. Lisäohjeita saat -Tracker.Dialog.NoXuggle.Message3=lukemalla tiedosto Tracker_README.txt Trackerin kotikansiossa. -Tracker.Dialog.NoXuggle.Message4=Asentaaksesi Xuggle, lataa viimeisin Tracker-asennustiedosto -Tracker.Dialog.NoXuggle.Title=Xuggle ei käytettävissä +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg ei toimi oikein. Varmista, että +Tracker.Dialog.NoFFMPeg.Message2=FFMPegn jar-tiedosto on Trackerin kotikansiossa. Lisäohjeita saat +Tracker.Dialog.NoFFMPeg.Message3=lukemalla tiedosto Tracker_README.txt Trackerin kotikansiossa. +Tracker.Dialog.NoFFMPeg.Message4=Asentaaksesi FFMPeg, lataa viimeisin Tracker-asennustiedosto +Tracker.Dialog.NoFFMPeg.Title=FFMPeg ei käytettävissä Tracker.About.DefaultLocale=Oletuspaikka Tracker.About.CurrentLanguage=Kieli Tracker.Dialog.InsufficientMemory.Title=Riittämätön muisti @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=Aseta muistin koko... TTrackBar.Button.Version=Nyt saatavissa: versio TTrackBar.Popup.MenuItem.Upgrade=Päivitä nyt... TTrackBar.Popup.MenuItem.Ignore=Ohita -XuggleVideo.MenuItem.SmoothPlay=Pehmeä toisto (voi olla hidas) +FFMPegVideo.MenuItem.SmoothPlay=Pehmeä toisto (voi olla hidas) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibrointinauha @@ -907,13 +907,13 @@ WorldTView.Button.World=Maailma # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Varoituksia PrefsDialog.Checkbox.WarnIfNoEngine=Ei video-ohjelmaa -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle-virheitä +PrefsDialog.Checkbox.WarnIfFFMPegError=FFMPeg-virheitä PropertiesDialog.Title=Ominaisuudet PropertiesDialog.Label.Author=Tekijät PropertiesDialog.Label.Contact=Ota yhteyttä TActions.Action.Properties=Ominaisuudet... TActions.Action.OpenBrowser=Avaa Kirjastoselain... -TFrame.Progress.Xuggle=Xuggle'in latauskehys +TFrame.Progress.FFMPeg=FFMPeg'in latauskehys TFrame.Progress.ClickToCancel=(peruuta klikkaamalla) TFrame.Dialog.StalledVideo.Title=Virhe ladatessa videota TFrame.Dialog.StalledVideo.Message0=Video on pysähtynyt latautuessaan. Se voi olla väliaikaista. @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Pys TFrame.Dialog.StalledVideo.Button.Wait=Odota Tracker.Dialog.NoVideoEngine.Checkbox=Älä näytä tätä enää TrackerIO.ZipFileFilter.Description=ZIP-tiedosto (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle on kohdannut seuraavan virheen avatessaan videota: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg on kohdannut seuraavan virheen avatessaan videota: TrackerIO.Dialog.ErrorFFMPEG.Message2=Kaikki virheet eivät ole vakavia. Tutki virheilmoitusta komennolla Ohje|Viestiloki. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Ellet pysty avaamaan videota Xuggle'illa, voit avata sen vielä QuickTime'illa. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Ellet pysty avaamaan videota FFMPeg'illa, voit avata sen vielä QuickTime'illa. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Huomaa: Macillä tämä onnistuu suorittamalla Tracker 32-bitin Javalla. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle-virhe -TrackerIO.ErrorFFMPEG.LogMessage=Lisätietoa saat, kun kytket Xuggle-varoitukset päälle Asetuksia-komennolla (Muokkaa|Asetuksia). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg-virhe +TrackerIO.ErrorFFMPEG.LogMessage=Lisätietoa saat, kun kytket FFMPeg-varoitukset päälle Asetuksia-komennolla (Muokkaa|Asetuksia). TToolBar.Button.OpenBrowser.Tooltip=Avaa OSP Digital Library'n selain # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bittinen PrefsDialog.Checkbox.WarnVariableDuration=Muuttuvat kehysviiveet PrefsDialog.Button.NoEngine=Ei video-ohjelmaa PrefsDialog.Dialog.SwitchToQT.Message=Vaihtamalla QuickTime'iin vaihtuu myös Java VM 32-bittiseksi. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 32-bittiseksi. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Vaihtamalla Xuggleen vaihtuu myös Java VM 64-bittiseksi. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Vaihtamalla FFMPegen vaihtuu myös Java VM 32-bittiseksi. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Vaihtamalla FFMPegen vaihtuu myös Java VM 64-bittiseksi. PrefsDialog.Dialog.SwitchVM.Title=Java VM vaihtui PrefsDialog.Dialog.SwitchTo32.Message=Vaihtamalla Java VM 32-bittiseksi vaihtuu myös video-ohjelma QuickTime'iksi. -PrefsDialog.Dialog.SwitchTo64.Message=Vaihtamalla Java VM 64-bittiseksi vaihtuu myös video-ohjelma Xuggleksi. +PrefsDialog.Dialog.SwitchTo64.Message=Vaihtamalla Java VM 64-bittiseksi vaihtuu myös video-ohjelma FFMPegksi. PrefsDialog.Dialog.SwitchEngine.Title=Video-ohjelma vaihtui PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Yhtään video-ohjlmaa ei ole käytettävissä 64-bittiselle Javalle. Voit PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=kuitenkin vielä avata kuvia (JPEG, PNG) and GIF-animatioita. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Oletko varma, että haluat vaihtaa 64-bittiseen Javaan? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ei 64-bittistä Video-ohjelmaa -PrefsDialog.Dialog.No32bitVMXuggle.Message=Ennen kuin Xugglea voi käyttää tulee ensin asentaa 32-bittinen Java VM. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Ennen kuin FFMPega voi käyttää tulee ensin asentaa 32-bittinen Java VM. PrefsDialog.Dialog.No32bitVMQT.Message=Ennen kuin QuickTime'ia voi käyttää tulee ensin asentaa 32-bittinen Java VM. PrefsDialog.Dialog.No32bitVM.Message=Lisätietoa saa Trackerin ohjeista: Asennus. PrefsDialog.Dialog.No32bitVM.Title=Tarvitaan 32-bittinen Java VM @@ -1212,10 +1212,10 @@ Tracker.Dialog.SwitchTo32BitVM.Message2=ne tarvitsevat 32-bittisen Javan ja sin Tracker.Dialog.SwitchTo32BitVM.Message3=Muuttaaksesi tämän, avaa Asetuksia-ikkuna (Muokkaa|Asetuksia...) Tracker.Dialog.SwitchTo32BitVM.Message4=ja valitse 64-bittinen Java VM Suoritus-välilehdellä. Tracker.Dialog.EngineProblems.Message1=Yksi tai useampi video-ohjelma on asennettuna, mutta niitä ei voi käyttää. -Tracker.Dialog.EngineProblems.Message2=Lisätietoa saa: Ohje|Diagnostiikka|Tietoa Xugglesta or QuickTime'ista. -Tracker.Dialog.ReplaceXuggle.Message1=Suosittelemme nykyisen Xugglen korvaamista -Tracker.Dialog.ReplaceXuggle.Message2=uudella Xuggle-versiolla 3.4 asentamalla Tracker (versio 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=tai uudempi) ja valitsemalla Xuggle-asennusvaihtoehto. +Tracker.Dialog.EngineProblems.Message2=Lisätietoa saa: Ohje|Diagnostiikka|Tietoa FFMPegsta or QuickTime'ista. +Tracker.Dialog.ReplaceFFMPeg.Message1=Suosittelemme nykyisen FFMPegn korvaamista +Tracker.Dialog.ReplaceFFMPeg.Message2=uudella FFMPeg-versiolla 3.4 asentamalla Tracker (versio 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=tai uudempi) ja valitsemalla FFMPeg-asennusvaihtoehto. TrackerIO.Dialog.DurationIsConstant.Message=Kaikki kehyksien kestot ovat samat (vakio-fps). TrackerIO.ZIPResourceFilter.Description=Trackerin ZIP-tiedosto (.trz) TToolbar.Button.Desktop.Tooltip=Näytä täydentäviä HTML- tai/ja PDF-dokumentteja @@ -1281,7 +1281,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties index 8f3907ba..b5328554 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_fr.properties @@ -735,7 +735,7 @@ PrefsDialog.Checkbox.DefaultSize=Utiliser la valeur par d PrefsDialog.Checkbox.HintsOn=Par défaut, montrer les conseils PrefsDialog.Tab.Video.Title=Vidéo PrefsDialog.VideoPref.BorderTitle=Décrypteur Vidéo -PrefsDialog.Button.Xuggle=Xuggle (recommandé) +PrefsDialog.Button.FFMPeg=FFMPeg (recommandé) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Le contrôle de la mémoire est impossible lorsque le démarrage se fait par le Web. PrefsDialog.Dialog.WebStart.Title=Mode de démarrage Web @@ -750,9 +750,9 @@ PrefsDialog.Upgrades.Weekly= PrefsDialog.Upgrades.Monthly=À chaque mois PrefsDialog.Upgrades.Never=Jamais PrefsDialog.Button.CheckForUpgrade=Vérifier maintenant -PrefsDialog.Xuggle.Speed.BorderTitle=Lecture de Vidéo -PrefsDialog.Xuggle.Slow=Continue (peut être lente) -PrefsDialog.Xuggle.Fast=Rapide (peut être saccadée) +PrefsDialog.FFMPeg.Speed.BorderTitle=Lecture de Vidéo +PrefsDialog.FFMPeg.Slow=Continue (peut être lente) +PrefsDialog.FFMPeg.Fast=Rapide (peut être saccadée) PrefsDialog.CalibrationTool.BorderTitle=Outil de Calibration par défaut Protractor.Name=Rapporteur d'angle Protractor.New.Name=rapporteur d'angle @@ -832,22 +832,22 @@ TMenuBar.Menu.MeasuringTools=Outils de mesure TMenuBar.Menu.AngleUnits=Unités des angles TMenuBar.MenuItem.Degrees=Degrés TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle n'a pas été trouvé -Tracker.Dialog.NoXuggle.Message1=Xuggle (un moteur d'analyse de vidéos pour toutes plateformes) n'est pas installé. -Tracker.Dialog.NoXuggle.Message2=Télécharger Xuggle à partir de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=À propos de Xuggle... -Tracker.Dialog.AboutXuggle.Title=À propos de Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Version de Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Emplacement de Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Chemin d'accès Xuggle +Tracker.Dialog.NoFFMPeg.Title=FFMPeg n'a pas été trouvé +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (un moteur d'analyse de vidéos pour toutes plateformes) n'est pas installé. +Tracker.Dialog.NoFFMPeg.Message2=Télécharger FFMPeg à partir de http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=À propos de FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=À propos de FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Version de FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=Emplacement de FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=Chemin d'accès FFMPeg Tracker.Dialog.NoVideoEngine.Message1=Aucun analyseur vidéo n'a été trouvé! Sans cet analyseur, Tracker ne peut Tracker.Dialog.NoVideoEngine.Message2=qu'ouvrir des images, des séquences d'images et des GIF animés. -Tracker.Dialog.NoVideoEngine.Message3=Pour installer Xuggle, qui est l'analyseur vidéo préféré de Tracker sur toutes les plateformes, +Tracker.Dialog.NoVideoEngine.Message3=Pour installer FFMPeg, qui est l'analyseur vidéo préféré de Tracker sur toutes les plateformes, Tracker.Dialog.NoVideoEngine.Message4=télécharger la plus récente version du fichier d'installation de Tracker à partir de Tracker.Dialog.NoVideoEngine.Title=Aucun analyseur vidéo -Tracker.Dialog.NoXuggle.Message1=Xuggle, l'analyseur vidéo préféré de Tracker n'est pas encore installé. -Tracker.Dialog.NoXuggle.Message2=Pour installer Xuggle, télécharger la plus récente version du fichier d'installation de Tracker à partir de -Tracker.Dialog.NoXuggle.Title=Xuggle manquant +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, l'analyseur vidéo préféré de Tracker n'est pas encore installé. +Tracker.Dialog.NoFFMPeg.Message2=Pour installer FFMPeg, télécharger la plus récente version du fichier d'installation de Tracker à partir de +Tracker.Dialog.NoFFMPeg.Title=FFMPeg manquant Tracker.About.DefaultLocale=Locale par défaut Tracker.About.CurrentLanguage=Langue Tracker.Dialog.InsufficientMemory.Title=Mémoire insuffisante @@ -893,7 +893,7 @@ TTrackBar.Memory.Menu.SetSize=D TTrackBar.Button.Version=Maintenant disponible: version TTrackBar.Popup.MenuItem.Upgrade=Mettre à niveau maintenant... TTrackBar.Popup.MenuItem.Ignore=Ignorer -XuggleVideo.MenuItem.SmoothPlay=Lecture graduelle (peut être lente) +FFMPegVideo.MenuItem.SmoothPlay=Lecture graduelle (peut être lente) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Ruban de Calibration @@ -922,13 +922,13 @@ WorldTView.Button.World=Globale # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Avertissements PrefsDialog.Checkbox.WarnIfNoEngine=Aucun analyseur vidéo -PrefsDialog.Checkbox.WarnIfXuggleError=Erreurs non fatales de Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=Erreurs non fatales de FFMPeg PropertiesDialog.Title=Propriétés PropertiesDialog.Label.Author=Auteur PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Propriétés... TActions.Action.OpenBrowser=Ouvrir le fureteur de librairie... -TFrame.Progress.Xuggle=Xuggle est en train de charger les images +TFrame.Progress.FFMPeg=FFMPeg est en train de charger les images TFrame.Progress.ClickToCancel=(cliquer pour annuler) TFrame.Dialog.StalledVideo.Title=Il y a eu une erreur en chargeant la vidéo TFrame.Dialog.StalledVideo.Message0=La vidéo s'est bloquée en chargeant. Ceci est peut-être temporaire. @@ -941,12 +941,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Arr TFrame.Dialog.StalledVideo.Button.Wait=Attendre Tracker.Dialog.NoVideoEngine.Checkbox=Ne plus afficher ce message TrackerIO.ZipFileFilter.Description=Fichiers ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle a recontré cette erreur en tentant d'ouvrir cette vidéo: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg a recontré cette erreur en tentant d'ouvrir cette vidéo: TrackerIO.Dialog.ErrorFFMPEG.Message2=Toutes les erreurs ne sont pas fatales. Pour obtenir les messages d'erreur complets, choisissez Aide|Historique des messages. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Si Xuggle ne peut y parvenir, vous pourriez peut-être ouvrir la vidéo avec QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Si FFMPeg ne peut y parvenir, vous pourriez peut-être ouvrir la vidéo avec QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: Sur Mac OSX, Tracker fonctionne avec Java VM 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Erreur Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Pour plus de détails, lancer les messages d'alerte Xuggle dans les préférences (Édition|Préférences). +TrackerIO.Dialog.ErrorFFMPEG.Title=Erreur FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Pour plus de détails, lancer les messages d'alerte FFMPeg dans les préférences (Édition|Préférences). TToolBar.Button.OpenBrowser.Tooltip=Ouvrir le fureteur de la librairie digitale OSP # Additions by Doug Brown 2011-07-20 @@ -1071,7 +1071,7 @@ AlgorithmDialog.FiniteDifference.Message2=Vitesse: v[i] = (x[i+1] - x[i-1]) / ( AlgorithmDialog.FiniteDifference.Message3=Accélération: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) AlgorithmDialog.BounceDetect.Message1=Cette algorithme améliore le calcul des vitesses et des accélérations tout en détectant les variations soudaines de vitesse. AlgorithmDialog.BounceDetect.Message2=Attention: peut produire des artéfacts. Pour plus d'informations, voir: -AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ +AlgorithmDialog.BounceDetect.Message3=http://www.ffmpeg.org/download.html. TMenuBar.Menu.Diagnostics=Diagnostics # Additions by Doug Brown 2012-02-12 @@ -1204,17 +1204,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Durées de séquences variables PrefsDialog.Button.NoEngine=Aucun PrefsDialog.Dialog.SwitchToQT.Message=La bascule vers QuickTime change aussi la VM Java à 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=La bascule vers Xuggle change aussi la VM Java à 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=La bascule vers Xuggle change aussi la VM Java à 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=La bascule vers FFMPeg change aussi la VM Java à 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=La bascule vers FFMPeg change aussi la VM Java à 64-bit. PrefsDialog.Dialog.SwitchVM.Title=VM Java changée PrefsDialog.Dialog.SwitchTo32.Message=La bascule vers une VM Java de 32-bit change aussi le moteur vidéo pour QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=La bascule vers une VM Java de 64-bit change aussi le moteur vidéo pour Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=La bascule vers une VM Java de 64-bit change aussi le moteur vidéo pour FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Moteur vidéo changé PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Aucun moteur vidéo n'est disponible pour une VM de 64-bit Java. Vous pourrez PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=tout de même ouvrir des images (JPEG, PNG) et des GIFs animés. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Êtes-vous sûr de vouloir basculer vers une VM Java de 64-bit ? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Aucun moteur vidéo de 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=Une VM Java de 32-bit doit être installée pour utiliser Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Une VM Java de 32-bit doit être installée pour utiliser FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=Une VM Java de 32-bit doit être installée pour utiliser QuickTime. PrefsDialog.Dialog.No32bitVM.Message=Pour plus d'infos, voir l'Aide Tracker sous : Installation. PrefsDialog.Dialog.No32bitVM.Title=Une VM de 32-bit nécessaire @@ -1230,10 +1230,10 @@ Tracker.Dialog.Button.RelaunchNow=Oui, relancer maintenant Tracker.Dialog.Button.ShowPrefs=Non, mais afficher les préférences Tracker.Dialog.Button.ContinueWithoutEngine=Non, continuer sans vidéo Tracker.Dialog.EngineProblems.Message1=Au moins un ou plusieurs moteurs vidéos sont détectés mais ne semblent pas en état de marche. -Tracker.Dialog.EngineProblems.Message2=Pour plus d'infos voir Aide|Diagnostics|À propos de Xuggle ou QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Nous vous recommandons de remplacer votre moteur vidéo actuel Xuggle -Tracker.Dialog.ReplaceXuggle.Message2=par le Xuggle version 3.4 en réinstallant Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=ou mieux) et en sélectionnant Xuggle dans les options d'installation. +Tracker.Dialog.EngineProblems.Message2=Pour plus d'infos voir Aide|Diagnostics|À propos de FFMPeg ou QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Nous vous recommandons de remplacer votre moteur vidéo actuel FFMPeg +Tracker.Dialog.ReplaceFFMPeg.Message2=par le FFMPeg version 3.4 en réinstallant Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=ou mieux) et en sélectionnant FFMPeg dans les options d'installation. TrackerIO.Dialog.DurationIsConstant.Message=Les durées d'images sont identiques (ips constantes). TrackerIO.ZIPResourceFilter.Description=Fichier ZIP Tracker (.trz) TToolbar.Button.Desktop.Tooltip=Afficher les fichiers HTML et/ou PDF liés @@ -1299,7 +1299,7 @@ TableTrackView.Dialog.NameColumn.Title=Colonne de texte TToolBar.MenuItem.StretchOff=Réinitialiser # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Version Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=Version FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=Erreurs de copie de fichier du moteur vidéo Tracker.Dialog.FailedToCopy.Title=Erreur de copie de fichier Velocity.Dialog.Color.Title=Choisir la couleur de la vélocité diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_hu_HU.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_hu_HU.properties index a947a339..f0c0b76b 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_hu_HU.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_hu_HU.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=Alap\u00e9rtelmezett PrefsDialog.Checkbox.HintsOn=Mutasd a tippeket PrefsDialog.Tab.Video.Title=Vide\u00f3 PrefsDialog.VideoPref.BorderTitle=Vide\u00f3lej\u00e1tsz\u00f3 -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Web Start haszn\u00e1lata eset\u00e9n nincs mem\u00f3riakezel\u00e9s. PrefsDialog.Dialog.WebStart.Title=Web Start m\u00f3d @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=Hetente PrefsDialog.Upgrades.Monthly=Havonta PrefsDialog.Upgrades.Never=Soha PrefsDialog.Button.CheckForUpgrade=Friss\u00edt\u00e9sek keres\u00e9se most -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle vide\u00f3lej\u00e1tsz\u00f3 -PrefsDialog.Xuggle.Slow=Folytonos (lass\u00fa lehet) -PrefsDialog.Xuggle.Fast=Gyors (ugr\u00e1lhat) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg vide\u00f3lej\u00e1tsz\u00f3 +PrefsDialog.FFMPeg.Slow=Folytonos (lass\u00fa lehet) +PrefsDialog.FFMPeg.Fast=Gyors (ugr\u00e1lhat) PrefsDialog.CalibrationTool.BorderTitle=Alap\u00e9rtelmezett kalibr\u00e1ci\u00f3s eszk\u00f6z Protractor.Name=Sz\u00f6gm\u00e9r\u0151 Protractor.New.Name=sz\u00f6gm\u00e9r\u0151 @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools=M\u00e9r\u0151eszk\u00f6z\u00f6k TMenuBar.Menu.AngleUnits=Sz\u00f6g m\u00e9rt\u00e9kegys\u00e9gek TMenuBar.MenuItem.Degrees=Fok TMenuBar.MenuItem.Radians=Radi\u00e1n -Tracker.Dialog.NoXuggle.Title=A Xuggle nem tal\u00e1lhat\u00f3 -Tracker.Dialog.NoXuggle.Message1=A Xuggle (platformf\u00fcggetlen vide\u00f3lej\u00e1tsz\u00f3) nincs telep\u00edtve. -Tracker.Dialog.NoXuggle.Message2=T\u00f6ltsd le a Xuggle-t innen http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=A Xuggle-r\u00f3l... -Tracker.Dialog.AboutXuggle.Title=A Xuggle-r\u00f3l -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle verzi\u00f3 -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle k\u00f6nyvt\u00e1r: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar \u00fatvonal: +Tracker.Dialog.NoFFMPeg.Title=A FFMPeg nem tal\u00e1lhat\u00f3 +Tracker.Dialog.NoFFMPeg.Message1=A FFMPeg (platformf\u00fcggetlen vide\u00f3lej\u00e1tsz\u00f3) nincs telep\u00edtve. +Tracker.Dialog.NoFFMPeg.Message2=T\u00f6ltsd le a FFMPeg-t innen http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=A FFMPeg-r\u00f3l... +Tracker.Dialog.AboutFFMPeg.Title=A FFMPeg-r\u00f3l +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg verzi\u00f3 +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg k\u00f6nyvt\u00e1r: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar \u00fatvonal: Tracker.Dialog.NoVideoEngine.Message1=Nincs vide\u00f3lej\u00e1tsz\u00f3 telep\u00edtve. Vide\u00f3lej\u00e1tsz\u00f3 n\u00e9lk\u00fcl Tracker.Dialog.NoVideoEngine.Message2=csak k\u00e9pek (JPEG, PNG) \u00e9s anim\u00e1lt GIF-ek megjelen\u00edt\u00e9se lehets\u00e9ges. -Tracker.Dialog.NoVideoEngine.Message3=Javaslat: telep\u00edtsd \u00fajra a Tracker-t a Xuggle vide\u00f3lej\u00e1tsz\u00f3val. +Tracker.Dialog.NoVideoEngine.Message3=Javaslat: telep\u00edtsd \u00fajra a Tracker-t a FFMPeg vide\u00f3lej\u00e1tsz\u00f3val. Tracker.Dialog.NoVideoEngine.Title=Nincs vide\u00f3lej\u00e1tsz\u00f3 -Tracker.Dialog.NoXuggle.Message1=A Xuggle nem m\u0171k\u00f6dik megfelel\u0151en. Gy\u0151z\u0151dj meg r\u00f3la, hogy a sz\u00fcks\u00e9ges -Tracker.Dialog.NoXuggle.Message2=xuggle jar f\u00e1jlok a Tracker k\u00f6nyvt\u00e1r\u00e1ban vannak. R\u00e9szleteket -Tracker.Dialog.NoXuggle.Message3=a Tracker_README.txt f\u00e1jlban tal\u00e1lsz a Tracker k\u00f6nyt\u00e1r\u00e1ban. -Tracker.Dialog.NoXuggle.Message4=A Xuggle telep\u00edt\u00e9s\u00e9hez t\u00f6ltsd le a legfrissebb Tracker telep\u00edt\u0151t innen -Tracker.Dialog.NoXuggle.Title=A Xuggle nem el\u00e9rhet\u0151 +Tracker.Dialog.NoFFMPeg.Message1=A FFMPeg nem m\u0171k\u00f6dik megfelel\u0151en. Gy\u0151z\u0151dj meg r\u00f3la, hogy a sz\u00fcks\u00e9ges +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar f\u00e1jlok a Tracker k\u00f6nyvt\u00e1r\u00e1ban vannak. R\u00e9szleteket +Tracker.Dialog.NoFFMPeg.Message3=a Tracker_README.txt f\u00e1jlban tal\u00e1lsz a Tracker k\u00f6nyt\u00e1r\u00e1ban. +Tracker.Dialog.NoFFMPeg.Message4=A FFMPeg telep\u00edt\u00e9s\u00e9hez t\u00f6ltsd le a legfrissebb Tracker telep\u00edt\u0151t innen +Tracker.Dialog.NoFFMPeg.Title=A FFMPeg nem el\u00e9rhet\u0151 Tracker.About.DefaultLocale=Alap\u00e9rtelmezett lokaliz\u00e1ci\u00f3 Tracker.About.CurrentLanguage=Nyelv Tracker.Dialog.InsufficientMemory.Title=Mem\u00f3ria nem elegend\u0151 @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Mem\u00f3riam\u00e9ret megad\u00e1sa... TTrackBar.Button.Version=El\u00e9rhet\u0151 verzi\u00f3 TTrackBar.Popup.MenuItem.Upgrade=Friss\u00edt\u00e9s most... TTrackBar.Popup.MenuItem.Ignore=Mell\u0151z\u00e9s -XuggleVideo.MenuItem.SmoothPlay=Folytonos lej\u00e1tsz\u00e1s (lass\u00fa lehet) +FFMPegVideo.MenuItem.SmoothPlay=Folytonos lej\u00e1tsz\u00e1s (lass\u00fa lehet) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibr\u00e1ci\u00f3s m\u00e9r\u0151szalag @@ -908,13 +908,13 @@ WorldTView.Button.World=Fizikai n\u00e9zet # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Figyelmeztet\u00e9sek PrefsDialog.Checkbox.WarnIfNoEngine=Nincs vide\u00f3lej\u00e1tsz\u00f3 -PrefsDialog.Checkbox.WarnIfXuggleError=Nem v\u00e9gzetes Xuggle hib\u00e1k +PrefsDialog.Checkbox.WarnIfFFMPegError=Nem v\u00e9gzetes FFMPeg hib\u00e1k PropertiesDialog.Title=Tulajdons\u00e1gok PropertiesDialog.Label.Author=Szerz\u0151k PropertiesDialog.Label.Contact=Kapcsolat TActions.Action.Properties=Tulajdons\u00e1gok... TActions.Action.OpenBrowser=K\u00f6nyvt\u00e1rb\u00f6ng\u00e9sz\u0151 megnyit\u00e1sa... -TFrame.Progress.Xuggle=A Xuggle bet\u00f6lti a k\u00e9pkock\u00e1t +TFrame.Progress.FFMPeg=A FFMPeg bet\u00f6lti a k\u00e9pkock\u00e1t TFrame.Progress.ClickToCancel=(megszak\u00edt\u00e1s kattint\u00e1ssal) TFrame.Dialog.StalledVideo.Title=Vide\u00f3bet\u00f6lt\u00e9s nem siker\u00fclt TFrame.Dialog.StalledVideo.Message0=A vide\u00f3 elakadt bet\u00f6lt\u00e9s k\u00f6zben. El\u0151fordulhat, hogy csak ideiglenesen. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Meg\u00e1ll\u00edt TFrame.Dialog.StalledVideo.Button.Wait=V\u00e1rakozik Tracker.Dialog.NoVideoEngine.Checkbox=Ne jelen\u00edtse meg \u00fajra ezt az \u00fczenetet TrackerIO.ZipFileFilter.Description=ZIP f\u00e1jl (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=A Xuggle a k\u00f6vetkez\u0151 hib\u00e1t \u00e9szlelte a vide\u00f3 megnyit\u00e1sa k\u00f6zben: +TrackerIO.Dialog.ErrorFFMPEG.Message1=A FFMPeg a k\u00f6vetkez\u0151 hib\u00e1t \u00e9szlelte a vide\u00f3 megnyit\u00e1sa k\u00f6zben: TrackerIO.Dialog.ErrorFFMPEG.Message2=Nem minden hiba v\u00e9gzetes. A hiba\u00fczenetek megtekint\u00e9s\u00e9hez v\u00e1laszd a S\u00fag\u00f3|Napl\u00f3zott \u00fczenetek men\u00fcpontot. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Ha a Xuggle-el nem siker\u00fcl megnyitni a vide\u00f3t, QuickTime-al m\u00e9g siker\u00fclhet. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Ha a FFMPeg-el nem siker\u00fcl megnyitni a vide\u00f3t, QuickTime-al m\u00e9g siker\u00fclhet. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Megjegyz\u00e9s: Mac OSX alatt ehhez a Trackert 32 bites Java VM alatt kell futtatni. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle hiba -TrackerIO.ErrorFFMPEG.LogMessage=R\u00e9szletek\u00e9rt kapcsold be a Xuggle figyelmeztet\u00e9seket a be\u00e1ll\u00edt\u00e1sok men\u00fcpontban (Szerkeszt\u00e9s|Be\u00e1ll\u00edt\u00e1sok). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg hiba +TrackerIO.ErrorFFMPEG.LogMessage=R\u00e9szletek\u00e9rt kapcsold be a FFMPeg figyelmeztet\u00e9seket a be\u00e1ll\u00edt\u00e1sok men\u00fcpontban (Szerkeszt\u00e9s|Be\u00e1ll\u00edt\u00e1sok). TToolBar.Button.OpenBrowser.Tooltip=OSP digit\u00e1lis-k\u00f6nyvt\u00e1r b\u00f6ng\u00e9sz\u0151 megnyit\u00e1sa # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=V\u00e1ltoz\u00f3 k\u00e9pkocka id\u0151tartam PrefsDialog.Button.NoEngine=Nincs PrefsDialog.Dialog.SwitchToQT.Message=Ha QuickTime-ra v\u00e1ltasz, a Java VM 32-bites verzi\u00f3ra v\u00e1ltozik. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Ha Xuggle-ra v\u00e1ltasz, a Java VM 32-bites verzi\u00f3ra v\u00e1ltozik. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Ha Xuggle-ra v\u00e1ltasz, a Java VM 64-bites verzi\u00f3ra v\u00e1ltozik. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Ha FFMPeg-ra v\u00e1ltasz, a Java VM 32-bites verzi\u00f3ra v\u00e1ltozik. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Ha FFMPeg-ra v\u00e1ltasz, a Java VM 64-bites verzi\u00f3ra v\u00e1ltozik. PrefsDialog.Dialog.SwitchVM.Title=Java VM megv\u00e1ltozott PrefsDialog.Dialog.SwitchTo32.Message=Ha 32-bites Java VM-re v\u00e1ltasz, a vide\u00f3lej\u00e1tsz\u00f3 QuickTime-ra v\u00e1ltozik. -PrefsDialog.Dialog.SwitchTo64.Message=Ha 64-bites Java VM-re v\u00e1ltasz, a vide\u00f3lej\u00e1tsz\u00f3 Xuggle-re v\u00e1ltozik. +PrefsDialog.Dialog.SwitchTo64.Message=Ha 64-bites Java VM-re v\u00e1ltasz, a vide\u00f3lej\u00e1tsz\u00f3 FFMPeg-re v\u00e1ltozik. PrefsDialog.Dialog.SwitchEngine.Title=Vide\u00f3lej\u00e1tsz\u00f3 megv\u00e1ltozott PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Nem tal\u00e1lhat\u00f3 vide\u00f3lej\u00e1tsz\u00f3 a 64-bit Java VM-hez. PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=K\u00e9peket (JPEG, PNG) and anim\u00e1lt GIF-eket tov\u00e1bbra is meg lehet majd nyitni. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Biztosan 64-bites Java VM-re v\u00e1ltasz? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Nincs 64-bites vide\u00f3lej\u00e1tsz\u00f3 -PrefsDialog.Dialog.No32bitVMXuggle.Message=A Xuggle haszn\u00e1lat\u00e1hoz sz\u00fcks\u00e9ges egy 32-bites Java VM telep\u00edt\u00e9se. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A FFMPeg haszn\u00e1lat\u00e1hoz sz\u00fcks\u00e9ges egy 32-bites Java VM telep\u00edt\u00e9se. PrefsDialog.Dialog.No32bitVMQT.Message=A QuickTime haszn\u00e1lat\u00e1hoz sz\u00fcks\u00e9ges egy 32-bites Java VM telep\u00edt\u00e9se. PrefsDialog.Dialog.No32bitVM.Message=Tov\u00e1bbi inform\u00e1ci\u00f3t a Tracker S\u00fag\u00f3: Telep\u00edt\u00e9s tartalmaz. PrefsDialog.Dialog.No32bitVM.Title=32-bites VM sz\u00fcks\u00e9ges @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=Igen, \u00fajraind\u00edt\u00e1s most Tracker.Dialog.Button.ShowPrefs=Nem, de mutasd meg a be\u00e1ll\u00edt\u00e1sokat Tracker.Dialog.Button.ContinueWithoutEngine=Nem, tov\u00e1bb vide\u00f3 n\u00e9lk\u00fcl Tracker.Dialog.EngineProblems.Message1=Egy vagy t\u00f6bb vide\u00f3lej\u00e1tsz\u00f3 telep\u00edtve van, de nem m\u0171k\u00f6dik. -Tracker.Dialog.EngineProblems.Message2=Tov\u00e1bbi inform\u00e1ci\u00f3\u00e9rt l\u00e1sd S\u00fag\u00f3|Diagnosztika|N\u00e9vjegy Xuggle vagy QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Azt javasoljuk, hogy cser\u00e9ld ki a jelenlegi Xuggle vide\u00f3lej\u00e1tsz\u00f3t -Tracker.Dialog.ReplaceXuggle.Message2=a Xuggle 3.4-es verzi\u00f3val a Tracker \u00fajratelep\u00edt\u00e9s\u00e9vel (4.75-es verzi\u00f3 -Tracker.Dialog.ReplaceXuggle.Message3=vagy frissebb) \u00e9s a telep\u00edt\u00e9s opci\u00f3iban a Xuggle kiv\u00e1laszt\u00e1s\u00e1val. +Tracker.Dialog.EngineProblems.Message2=Tov\u00e1bbi inform\u00e1ci\u00f3\u00e9rt l\u00e1sd S\u00fag\u00f3|Diagnosztika|N\u00e9vjegy FFMPeg vagy QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Azt javasoljuk, hogy cser\u00e9ld ki a jelenlegi FFMPeg vide\u00f3lej\u00e1tsz\u00f3t +Tracker.Dialog.ReplaceFFMPeg.Message2=a FFMPeg 3.4-es verzi\u00f3val a Tracker \u00fajratelep\u00edt\u00e9s\u00e9vel (4.75-es verzi\u00f3 +Tracker.Dialog.ReplaceFFMPeg.Message3=vagy frissebb) \u00e9s a telep\u00edt\u00e9s opci\u00f3iban a FFMPeg kiv\u00e1laszt\u00e1s\u00e1val. TrackerIO.Dialog.DurationIsConstant.Message=Minden k\u00e9pkocka id\u0151tartam egyenl\u0151 TrackerIO.ZIPResourceFilter.Description=Tracker ZIP f\u00e1jl (.trz) TToolbar.Button.Desktop.Tooltip=Mutasd az ezzel kapcsolatos HTML \u00e9s/vagy PDF dokumentumokat @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=Sz\u00f6vegoszlop TToolBar.MenuItem.StretchOff=Vissza\u00e1ll\u00edt\u00e1s # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Verzi\u00f3 +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Verzi\u00f3 PrefsDialog.Checkbox.WarnCopyFailed=F\u00e1jlm\u00e1sol\u00e1si hiba a vide\u00f3lej\u00e1tsz\u00f3ban Tracker.Dialog.FailedToCopy.Title=F\u00e1jlm\u00e1sol\u00e1si hiba Velocity.Dialog.Color.Title=Sebess\u00e9g sz\u00edn\u00e9nek kiv\u00e1laszt\u00e1sa diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties index 03a8d8b3..5cc70b62 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_in.properties @@ -164,25 +164,25 @@ Tracker.Cursor.Crosshair.Description=Krusor salib untuk menandai titik Tracker.Action.AboutTracker=Perihal Tracker Tracker.Dialog.AboutTracker.Title=Tracker Tracker.Dialog.AboutTracker.Copyright=Alih Bahasa Tampilan Tracker oleh Wachid Qomaruddin, atas ijin Douglas Brown -Tracker.Dialog.AboutTracker.URL=http://physlets.org/tracker/ +Tracker.Dialog.AboutTracker.URL=http://www.ffmpeg.org/download.html. Tracker.Action.AboutJava=Perihal JAVA VM Tracker.Dialog.AboutTrackerOSPorg=Open Source Physics (OSP) Project -Tracker.Dialog.AboutTrackerOSPurl=http://www.opensourcephysics.org/ +Tracker.Dialog.AboutTrackerOSPurl=http://www.ffmpeg.org/download.html. Tracker.Dialog.AboutJava.Title=Perihal JAVA VM Tracker.Dialog.AboutJava.UnknownVersion=Versi Tidak Diketahui Tracker.Dialog.AboutJava.Message=Versi JAVA VM -Tracker.Dialog.AboutJava.URL=Update JAVA di http://java.sun.com/javase/downloads/ +Tracker.Dialog.AboutJava.URL=Update JAVA di http://www.ffmpeg.org/download.html. Tracker.Action.AboutQT=Perihal QuickTime Tracker.Dialog.AboutQT.Title=Perihal QuickTime Tracker.Dialog.AboutQT.Message.QTVersion=Versi QuickTime Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versi QTJava Tracker.Dialog.AboutQT.Message.QTJavaPath=Alokasi path QTJava: Tracker.Dialog.NoQT.Title=Tidak Ditemukan QTJava.zip -Tracker.Dialog.NoQT.Message1=QuickTime untuk Java tidak terlihat telah terinstal atau bukan versi yang diinginkan, Instal QuickTime v7 keatas, atau download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.NoQT.Message1=QuickTime untuk Java tidak terlihat telah terinstal atau bukan versi yang diinginkan, Instal QuickTime v7 keatas, atau download di http://www.ffmpeg.org/download.html. Tracker.Dialog.NoQT.Message2=Jika anda ingin menganalisis QuickTime movie, silakan instal ulang QuickTime v7 keatas atau Instal iTunes v7 keatas. Tracker.Dialog.NoQT.Message3=PENTING: QuickTime untuk JAVA Sun Microsystem harus dipilih ketika anda menginstal QuickTime. Tracker.Dialog.UpdateQT.Title=Update QTJava.zip -Tracker.Dialog.UpdateQT.Message1=Ditemukan Versi terbaru QuickTime.zip, silakan download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.UpdateQT.Message1=Ditemukan Versi terbaru QuickTime.zip, silakan download di http://www.ffmpeg.org/download.html. Tracker.Dialog.UpdateQT.Message2=Anda ingin memperbaharui berkas keluaran? Tracker.Dialog.CopyQT.Title=Salin QTJava.zip Tracker.Dialog.CopyQT.Message1=QuickTime telah terinstal, tetapi sebelum menggunakan Tracker dan anda harus : @@ -191,7 +191,7 @@ Tracker.Dialog.CopyQT.Message3= ke Tracker.Dialog.CopyQT.Message4= 2. Tracker harus direstart ulang. Tracker.Dialog.CopyQT.Message5=Ada ingin menyalin QTJava.zip sekarang? Tracker.Dialog.CopyFailed.Title=Penyalinan gagal. Periksa versi QuickTime anda. -Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Periksa QuickTime anda sekali lagi atau gunakan iTunes v7. Silakan download di http://www.apple.com/quicktime/download/ +Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Periksa QuickTime anda sekali lagi atau gunakan iTunes v7. Silakan download di http://www.ffmpeg.org/download.html. Tracker.Dialog.CopiedTo.Title=Proses penyalinan berhasil. Selamat!. Tracker.Dialog.CopiedTo.Message1=QTJava.zip telah sukses di salin Tracker.Dialog.CopiedTo.Message2=Tracker harus direstart ulang dan akan keluar sekarang. @@ -738,7 +738,7 @@ PrefsDialog.Checkbox.DefaultSize=Gunakan default PrefsDialog.Checkbox.HintsOn=Tampilkan petunjuk secara default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Mesin Video -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Pengaturan memori tidak tersedia saat menggunakan Web Start . PrefsDialog.Dialog.WebStart.Title=Mode Web Start @@ -753,9 +753,9 @@ PrefsDialog.Upgrades.Weekly=Mingguan PrefsDialog.Upgrades.Monthly=Bulanan PrefsDialog.Upgrades.Never=Tidak pernah PrefsDialog.Button.CheckForUpgrade=Periksa Sekarang -PrefsDialog.Xuggle.Speed.BorderTitle=Putar Ulang Video Xuggle -PrefsDialog.Xuggle.Slow=Halus (mungkin lambat) -PrefsDialog.Xuggle.Fast=Cepat (mungkin cepat) +PrefsDialog.FFMPeg.Speed.BorderTitle=Putar Ulang Video FFMPeg +PrefsDialog.FFMPeg.Slow=Halus (mungkin lambat) +PrefsDialog.FFMPeg.Fast=Cepat (mungkin cepat) PrefsDialog.CalibrationTool.BorderTitle=Alat Kalibrasi Standar Protractor.Name=Busur Derajat Protractor.New.Name=busur derajat @@ -835,23 +835,23 @@ TMenuBar.Menu.MeasuringTools=Perangkat Pengukur TMenuBar.Menu.AngleUnits=Satuan Sudut TMenuBar.MenuItem.Degrees=Derajat TMenuBar.MenuItem.Radians=Radian -Tracker.Dialog.NoXuggle.Title=Xuggle tidak ditemukan -Tracker.Dialog.NoXuggle.Message1=Xuggle (mesin video cross-platform) tidak diinstal . -Tracker.Dialog.NoXuggle.Message2=Download Xuggle dari http://www.xuggle.com/xuggler/downloads/ . -Tracker.Action.AboutXuggle=Perihal Xuggle -Tracker.Dialog.AboutXuggle.Title=Perihal Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle versi -Tracker.Dialog.AboutXuggle.Message.Home=Home Xuggle : -Tracker.Dialog.AboutXuggle.Message.Path=Jalur Xuggle.jar : +Tracker.Dialog.NoFFMPeg.Title=FFMPeg tidak ditemukan +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (mesin video cross-platform) tidak diinstal . +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg dari http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Perihal FFMPeg +Tracker.Dialog.AboutFFMPeg.Title=Perihal FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg versi +Tracker.Dialog.AboutFFMPeg.Message.Home=Home FFMPeg : +Tracker.Dialog.AboutFFMPeg.Message.Path=Jalur FFMPeg.jar : Tracker.Dialog.NoVideoEngine.Message1=mesin video terinstal . Tanpa satu, Anda Tracker.Dialog.NoVideoEngine.Message2=hanya dapat membuka gambar (JPEG , PNG) dan animasi GIF . -Tracker.Dialog.NoVideoEngine.Message3=Direkomendasikan: instal ulang Tracker dengan mesin video Xuggle . +Tracker.Dialog.NoVideoEngine.Message3=Direkomendasikan: instal ulang Tracker dengan mesin video FFMPeg . Tracker.Dialog.NoVideoEngine.Title=Tidak Ada Mesin Video -Tracker.Dialog.NoXuggle.Message1=Xuggle tidak bekerja dengan benar. Pastikan yang diperlukan -Tracker.Dialog.NoXuggle.Message2=Berkas xuggle.jar berada di folder Tracker. Untuk rincian , -Tracker.Dialog.NoXuggle.Message3=lihat Tracker_README.txt di folder Tracker -Tracker.Dialog.NoXuggle.Message4=Untuk menginstal Xuggle, download installer Tracker terbaru dari -Tracker.Dialog.NoXuggle.Title=Xuggle Tidak Tersedia +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg tidak bekerja dengan benar. Pastikan yang diperlukan +Tracker.Dialog.NoFFMPeg.Message2=Berkas ffmpeg.jar berada di folder Tracker. Untuk rincian , +Tracker.Dialog.NoFFMPeg.Message3=lihat Tracker_README.txt di folder Tracker +Tracker.Dialog.NoFFMPeg.Message4=Untuk menginstal FFMPeg, download installer Tracker terbaru dari +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Tidak Tersedia Tracker.About.DefaultLocale=Bahasa default Tracker.About.CurrentLanguage=Bahasa Tracker.Dialog.InsufficientMemory.Title=Memori tidak cukup @@ -897,7 +897,7 @@ TTrackBar.Memory.Menu.SetSize=Atur ukuran memori TTrackBar.Button.Version=Sekarang tersedia: versi TTrackBar.Popup.MenuItem.Upgrade=Tingkatkan Sekarang TTrackBar.Popup.MenuItem.Ignore=Abaikan -XuggleVideo.MenuItem.SmoothPlay=Bermain Halus (mungkin lambat) +FFMPegVideo.MenuItem.SmoothPlay=Bermain Halus (mungkin lambat) # Penambahan oleh Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Pita Kalibrasi @@ -926,13 +926,13 @@ WorldTView.Button.World=Dunia # Penambahan oleh Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Peringatan PrefsDialog.Checkbox.WarnIfNoEngine=Tidak ada mesin video yang -PrefsDialog.Checkbox.WarnIfXuggleError=kesalahan non-fatal Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=kesalahan non-fatal FFMPeg PropertiesDialog.Title=Properti PropertiesDialog.Label.Author=Penulis PropertiesDialog.Label.Contact=Kontak TActions.Action.Properties=Properti TActions.Action.OpenBrowser=Buka Peramban Pustaka -TFrame.Progress.Xuggle=Xuggle pemuatan frame +TFrame.Progress.FFMPeg=FFMPeg pemuatan frame TFrame.Progress.ClickToCancel=(klik untuk membatalkan ) TFrame.Dialog.StalledVideo.Title=Error Saat Memuat Video TFrame.Dialog.StalledVideo.Message0=video telah terhenti saat dimuat. Ini mungkin sementara. @@ -945,12 +945,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Berhenti TFrame.Dialog.StalledVideo.Button.Wait=Tunggu Tracker.Dialog.NoVideoEngine.Checkbox=Jangan tampilkan ini lagi TrackerIO.ZipFileFilter.Description=Berkas ZIP (*.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle telah mengalami kesalahan saat membuka video ini : +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg telah mengalami kesalahan saat membuka video ini : TrackerIO.Dialog.ErrorFFMPEG.Message2=Tidak semua kesalahan adalah fatal. Untuk pesan kesalahan penuh, pilih Panduan | Log Pesan . -TrackerIO.Dialog.ErrorFFMPEG.Message3=Jika Xuggle gagal, Anda mungkin dapat membuka video dengan QuickTime . +TrackerIO.Dialog.ErrorFFMPEG.Message3=Jika FFMPeg gagal, Anda mungkin dapat membuka video dengan QuickTime . TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Catatan: Pada Mac OSX ini membutuhkan menjalankan Tracker dala Java VMm 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Kesalahan Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Untuk lebih jelasnya, aktifkan peringatan Xuggle dalam preferensi dialog (Pembenahan | Preferensi ) . +TrackerIO.Dialog.ErrorFFMPEG.Title=Kesalahan FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Untuk lebih jelasnya, aktifkan peringatan FFMPeg dalam preferensi dialog (Pembenahan | Preferensi ) . TToolBar.Button.OpenBrowser.Tooltip=Buka Peramban Pustaka Digital OSP # Penambahan oleh Doug Brown 2011-07-20 @@ -1206,17 +1206,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variabel durasi frame PrefsDialog.Button.NoEngine=Tidak ada PrefsDialog.Dialog.SwitchToQT.Message=Beralih ke QuickTime juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Beralih ke Xuggle juga perubahan VM Java untuk 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Beralih ke Xuggle juga perubahan VM Java untuk 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Beralih ke FFMPeg juga perubahan VM Java untuk 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Beralih ke FFMPeg juga perubahan VM Java untuk 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Berubah PrefsDialog.Dialog.SwitchTo32.Message=Beralih ke 32-bit Java VM juga mengubah mesin video QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Beralih ke 64-bit Java VM juga mengubah mesin video Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Beralih ke 64-bit Java VM juga mengubah mesin video FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Mesin Berubah PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=mesin ada video yang tersedia untuk 64-bit Java VM. Anda akan PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=masih dapat gambar terbuka (JPEG , PNG) dan animasi GIF. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Anda yakin ingin beralih ke VM 64-bit? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Tidak ada 64-bit Video Mesin -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM harus diinstal sebelum Xuggle dapat digunakan. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM harus diinstal sebelum FFMPeg dapat digunakan. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM harus diinstal sebelum QuickTime dapat digunakan. PrefsDialog.Dialog.No32bitVM.Message=Untuk informasi lebih lanjut, lihat Bantuan Tracker: Instalasi. PrefsDialog.Dialog.No32bitVM.Title=Diperlukan VM 32-bit @@ -1232,10 +1232,10 @@ Tracker.Dialog.Button.RelaunchNow=Ya, peluncuran kembali sekarang Tracker.Dialog.Button.ShowPrefs=Tidak, tapi melalui preferensi Tracker.Dialog.Button.ContinueWithoutEngine=Tidak, lanjutkan tanpa video Tracker.Dialog.EngineProblems.Message1=Satu atau lebih mesin video terinstal tapi tidak bekerja . -Tracker.Dialog.EngineProblems.Message2=Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang Xuggle atau QuickTime . -Tracker.Dialog.ReplaceXuggle.Message1=Kami sarankan anda mengganti mesin video Xuggle anda saat ini -Tracker.Dialog.ReplaceXuggle.Message2=Xuggle dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=atau di atasnya) dan memilih Xuggle dalam pilihan instalasi. +Tracker.Dialog.EngineProblems.Message2=Untuk informasi lebih lanjut lihat Bantuan | Diagnostik | Tentang FFMPeg atau QuickTime . +Tracker.Dialog.ReplaceFFMPeg.Message1=Kami sarankan anda mengganti mesin video FFMPeg anda saat ini +Tracker.Dialog.ReplaceFFMPeg.Message2=FFMPeg dengan versi 3.4 dengan menginstall ulang Tracker (versi 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=atau di atasnya) dan memilih FFMPeg dalam pilihan instalasi. TrackerIO.Dialog.DurationIsConstant.Message=Semua durasi frame sama (fps konstan) . TrackerIO.ZIPResourceFilter.Description=Tracker Berkas ZIP (*.TRZ) TToolbar.Button.Desktop.Tooltip=Tampilan tambahan HTML dan atau dokumen PDF @@ -1301,7 +1301,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties index b9edcc6a..57ed16e2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_it.properties @@ -737,7 +737,7 @@ PrefsDialog.Checkbox.DefaultSize=Usa i predefiniti PrefsDialog.Checkbox.HintsOn=Mostra i suggerimenti come predefinito PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Motore video -PrefsDialog.Button.Xuggle=Xuggle (raccomandato) +PrefsDialog.Button.FFMPeg=FFMPeg (raccomandato) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=La gestione della memoria non è disponibile usando Web Start. PrefsDialog.Dialog.WebStart.Title=Modalità Web Start @@ -752,9 +752,9 @@ PrefsDialog.Upgrades.Weekly=Settimanalmente PrefsDialog.Upgrades.Monthly=Mensilmente PrefsDialog.Upgrades.Never=Mai PrefsDialog.Button.CheckForUpgrade=Controlla ora -PrefsDialog.Xuggle.Speed.BorderTitle=Esecuzione video -PrefsDialog.Xuggle.Slow=Preciso (potrebbe essere lento) -PrefsDialog.Xuggle.Fast=Veloce (potrebbe andare a scatti) +PrefsDialog.FFMPeg.Speed.BorderTitle=Esecuzione video +PrefsDialog.FFMPeg.Slow=Preciso (potrebbe essere lento) +PrefsDialog.FFMPeg.Fast=Veloce (potrebbe andare a scatti) PrefsDialog.CalibrationTool.BorderTitle=Strumento di calibrazione predefinito Protractor.Name=Goniometro Protractor.New.Name=goniometro @@ -834,22 +834,22 @@ TMenuBar.Menu.MeasuringTools=Strumenti di misura TMenuBar.Menu.AngleUnits=Unità angolari TMenuBar.MenuItem.Degrees=Gradi TMenuBar.MenuItem.Radians=Radianti -Tracker.Dialog.NoXuggle.Title=Xuggle non trovato -Tracker.Dialog.NoXuggle.Message1=Xuggle (motore vide multi piattaforma) non è installato. -Tracker.Dialog.NoXuggle.Message2=Scaricare Xuggle da http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Info su Xuggle... -Tracker.Dialog.AboutXuggle.Title=Info su Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Vesrione Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Home di Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Percorso di Xuggle: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg non trovato +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (motore vide multi piattaforma) non è installato. +Tracker.Dialog.NoFFMPeg.Message2=Scaricare FFMPeg da http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Info su FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Info su FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Vesrione FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=Home di FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=Percorso di FFMPeg: Tracker.Dialog.NoVideoEngine.Message1=Nessun motore video trovato! Senza, Tracker può solo aprire immagini, -Tracker.Dialog.NoVideoEngine.Message2=sequenze di immagini, e gif animate. Per installare Xuggle, il motore +Tracker.Dialog.NoVideoEngine.Message2=sequenze di immagini, e gif animate. Per installare FFMPeg, il motore Tracker.Dialog.NoVideoEngine.Message3=video preferito di Tracker per tutte le piattaforme, scaricare Tracker.Dialog.NoVideoEngine.Message4=l'ultima versione dell'installatore di Tracker da Tracker.Dialog.NoVideoEngine.Title=Motore video mancante -Tracker.Dialog.NoXuggle.Message1=Xuggle, il motore video preferito di Tracker, non è installato. -Tracker.Dialog.NoXuggle.Message2=Per installare Xuggle, scaricare l'ultimo installatore di Tracker da -Tracker.Dialog.NoXuggle.Title=Xuggle mancante +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, il motore video preferito di Tracker, non è installato. +Tracker.Dialog.NoFFMPeg.Message2=Per installare FFMPeg, scaricare l'ultimo installatore di Tracker da +Tracker.Dialog.NoFFMPeg.Title=FFMPeg mancante Tracker.About.DefaultLocale=Locale predefinito Tracker.About.CurrentLanguage=Lingua Tracker.Dialog.InsufficientMemory.Title=Memoria insufficiente @@ -895,7 +895,7 @@ TTrackBar.Memory.Menu.SetSize=Imposta la dimensione della memoria... TTrackBar.Button.Version=Disponibile: versione TTrackBar.Popup.MenuItem.Upgrade=Aggiorna ora... TTrackBar.Popup.MenuItem.Ignore=Ignora -XuggleVideo.MenuItem.SmoothPlay=Esecuzione precisa (più essere lenta) +FFMPegVideo.MenuItem.SmoothPlay=Esecuzione precisa (più essere lenta) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Nastro di calibrazione @@ -926,22 +926,22 @@ LibraryBrowser.Title=Navigatore della libreria digitale di Tracker LibraryBrowser.Label.Select=Selezionare una libreria o inserire un percorso: PrefsDialog.NoVideoWarning.BorderTitle=Avvertimenti PrefsDialog.Checkbox.WarnIfNoEngine=Nessun motore video -PrefsDialog.Checkbox.WarnIfXuggleError=Errore Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=Errore FFMPeg PropertiesDialog.Title=Proprietà PropertiesDialog.Label.Author=Autore PropertiesDialog.Label.Contact=Contatto TActions.Action.Properties=Proprietà... TActions.Action.OpenCatalog=Apri libreria... -TFrame.Progress.Xuggle=Apertura quadro Xuggle +TFrame.Progress.FFMPeg=Apertura quadro FFMPeg TFrame.Progress.ClickToCancel=(clic per annullare) Tracker.Catalog.Default=La mia libreria locale Tracker.Dialog.NoVideoEngine.Checkbox=Non mostrarlo più TrackerIO.ZipFileFilter.Description=File ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle ha riportato il seguente errore durante l'apertura di questo video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg ha riportato il seguente errore durante l'apertura di questo video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Non tutti gli errori sono gravi. Per consultare la segnalazione completa degli errori, selezionare Aiuto|Registro messaggi. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Se Xuggle fallisce, si potrebbe poter aprire il video con QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Se FFMPeg fallisce, si potrebbe poter aprire il video con QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Nota: su Mac OSX ciò richiede l'esecuzione di Tracker in una Java VM a 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Errore Xuggle +TrackerIO.Dialog.ErrorFFMPEG.Title=Errore FFMPeg TToolBar.Button.OpenCatalog.Tooltip=Apre un catalogo di librerie digitali # Additions by Doug Brown 2011-07-20 @@ -1198,17 +1198,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1224,10 +1224,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1293,7 +1293,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties index eb0afb93..8e9aa3f2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_iw_IL.properties @@ -733,7 +733,7 @@ PrefsDialog.Checkbox.DefaultSize=\u05d4\u05e9\u05ea\u05de\u05e9 \u05d1\u05d1\u05 PrefsDialog.Checkbox.HintsOn=\u05d4\u05e8\u05d0\u05d4 \u05e8\u05de\u05d6\u05d9\u05dd \u05db\u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc PrefsDialog.Tab.Video.Title=\u05e1\u05e8\u05d8 PrefsDialog.VideoPref.BorderTitle=\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -PrefsDialog.Button.Xuggle=\u05e9\u05d5\u05d2\u05dc +PrefsDialog.Button.FFMPeg=\u05e9\u05d5\u05d2\u05dc PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\u05e0\u05d9\u05d4\u05d5\u05dc \u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05d6\u05de\u05d9\u05df \u05db\u05d0\u05e9\u05e8 \u05de\u05e9\u05ea\u05de\u05e9\u05d9\u05dd \u05d1- Web Start. PrefsDialog.Dialog.WebStart.Title=\u05de\u05e6\u05d1 Web Start @@ -748,9 +748,9 @@ PrefsDialog.Upgrades.Weekly=\u05e9\u05d1\u05d5\u05e2\u05d9 PrefsDialog.Upgrades.Monthly=\u05d7\u05d5\u05d3\u05e9\u05d9 PrefsDialog.Upgrades.Never=\u05d0\u05e3-\u05e4\u05e2\u05dd PrefsDialog.Button.CheckForUpgrade=\u05d1\u05d3\u05d5\u05e7 \u05e2\u05db\u05e9\u05d9\u05d5 -PrefsDialog.Xuggle.Speed.BorderTitle=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc -PrefsDialog.Xuggle.Slow=\u05d4\u05d7\u05dc\u05e7 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) -PrefsDialog.Xuggle.Fast=\u05de\u05d4\u05e8 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05e7\u05d5\u05e4\u05e6\u05e0\u05d9) +PrefsDialog.FFMPeg.Speed.BorderTitle=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05de\u05d7\u05d3\u05e9 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc +PrefsDialog.FFMPeg.Slow=\u05d4\u05d7\u05dc\u05e7 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) +PrefsDialog.FFMPeg.Fast=\u05de\u05d4\u05e8 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05e7\u05d5\u05e4\u05e6\u05e0\u05d9) PrefsDialog.CalibrationTool.BorderTitle=\u05db\u05dc\u05d9 \u05db\u05d9\u05d5\u05dc \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc Protractor.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea Protractor.New.Name=\u05de\u05d3-\u05d6\u05d5\u05d9\u05ea @@ -830,23 +830,23 @@ TMenuBar.Menu.MeasuringTools=\u05db\u05dc\u05d9 \u05de\u05d3\u05d9\u05d3\u05d4 TMenuBar.Menu.AngleUnits=\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d6\u05d5\u05d9\u05ea TMenuBar.MenuItem.Degrees=\u05de\u05e2\u05dc\u05d5\u05ea TMenuBar.MenuItem.Radians=\u05e8\u05d3\u05d9\u05d0\u05e0\u05d9\u05dd -Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 -Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc (\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05e6\u05d5\u05de\u05d3) \u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df. -Tracker.Dialog.NoXuggle.Message2=\u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05de- http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc... -Tracker.Dialog.AboutXuggle.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc -Tracker.Dialog.AboutXuggle.Message.Version=\u05d2\u05e8\u05e1\u05ea \u05e9\u05d5\u05d2\u05dc -Tracker.Dialog.AboutXuggle.Message.Home=\u05de\u05d9\u05e7\u05d5\u05dd \u05e9\u05d5\u05d2\u05dc: -Tracker.Dialog.AboutXuggle.Message.Path=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d1\u05e6\u05d9 jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc: +Tracker.Dialog.NoFFMPeg.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05de\u05e6\u05d0 +Tracker.Dialog.NoFFMPeg.Message1=\u05e9\u05d5\u05d2\u05dc (\u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 \u05de\u05e6\u05d5\u05de\u05d3) \u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df. +Tracker.Dialog.NoFFMPeg.Message2=\u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05de- http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc... +Tracker.Dialog.AboutFFMPeg.Title=\u05d0\u05d5\u05d3\u05d5\u05ea \u05e9\u05d5\u05d2\u05dc +Tracker.Dialog.AboutFFMPeg.Message.Version=\u05d2\u05e8\u05e1\u05ea \u05e9\u05d5\u05d2\u05dc +Tracker.Dialog.AboutFFMPeg.Message.Home=\u05de\u05d9\u05e7\u05d5\u05dd \u05e9\u05d5\u05d2\u05dc: +Tracker.Dialog.AboutFFMPeg.Message.Path=\u05de\u05d9\u05e7\u05d5\u05dd \u05e7\u05d1\u05e6\u05d9 jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc: Tracker.Dialog.NoVideoEngine.Message1=\u05dc\u05d0 \u05de\u05d5\u05ea\u05e7\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5. \u05dc\u05dc\u05d0 \u05de\u05e0\u05d5\u05e2 \u05d0\u05ea\u05d4 Tracker.Dialog.NoVideoEngine.Message2=\u05d9\u05db\u05d5\u05dc \u05dc\u05e4\u05ea\u05d5\u05d7 \u05e8\u05e7 \u05ea\u05de\u05d5\u05e0\u05d5\u05ea (JPEG, PNG) \u05d5\u05d4\u05e0\u05e4\u05e9\u05ea GIFs. Tracker.Dialog.NoVideoEngine.Message3=\u05de\u05d5\u05de\u05dc\u05e5: \u05d4\u05ea\u05e7\u05df \u05de\u05d7\u05d3\u05e9 \u05d0\u05ea \u05d8\u05e8\u05e7\u05e8 \u05e2\u05dd \u05e9\u05d5\u05d2\u05dc. Tracker.Dialog.NoVideoEngine.Title=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -Tracker.Dialog.NoXuggle.Message1=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e2\u05d5\u05d1\u05d3 \u05db\u05e9\u05d5\u05e8\u05d4. \u05d1\u05d1\u05e7\u05e9\u05d4 \u05d1\u05d3\u05d5\u05e7 \u05e9\u05e7\u05d1\u05e6\u05d9 -Tracker.Dialog.NoXuggle.Message2=jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc \u05e0\u05de\u05e6\u05d0\u05d9\u05dd \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. \u05dc\u05e4\u05e8\u05d8\u05d9\u05dd, -Tracker.Dialog.NoXuggle.Message3=\u05e8\u05d0\u05d4 Tracker_README.txt \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. -Tracker.Dialog.NoXuggle.Message4=\u05dc\u05d4\u05ea\u05e7\u05e0\u05ea \u05e9\u05d5\u05d2\u05dc, \u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05de\u05ea\u05e7\u05d9\u05df \u05d8\u05e8\u05e7\u05e8 \u05d4\u05d0\u05d7\u05e8\u05d5\u05df -Tracker.Dialog.NoXuggle.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05d2\u05d9\u05e9 +Tracker.Dialog.NoFFMPeg.Message1=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e2\u05d5\u05d1\u05d3 \u05db\u05e9\u05d5\u05e8\u05d4. \u05d1\u05d1\u05e7\u05e9\u05d4 \u05d1\u05d3\u05d5\u05e7 \u05e9\u05e7\u05d1\u05e6\u05d9 +Tracker.Dialog.NoFFMPeg.Message2=jar \u05e9\u05dc \u05e9\u05d5\u05d2\u05dc \u05e0\u05de\u05e6\u05d0\u05d9\u05dd \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. \u05dc\u05e4\u05e8\u05d8\u05d9\u05dd, +Tracker.Dialog.NoFFMPeg.Message3=\u05e8\u05d0\u05d4 Tracker_README.txt \u05d1\u05ea\u05d9\u05e7\u05d9\u05d9\u05ea \u05d4\u05d1\u05d9\u05ea \u05e9\u05dc \u05d8\u05e8\u05e7\u05e8. +Tracker.Dialog.NoFFMPeg.Message4=\u05dc\u05d4\u05ea\u05e7\u05e0\u05ea \u05e9\u05d5\u05d2\u05dc, \u05d4\u05d5\u05e8\u05d3 \u05d0\u05ea \u05de\u05ea\u05e7\u05d9\u05df \u05d8\u05e8\u05e7\u05e8 \u05d4\u05d0\u05d7\u05e8\u05d5\u05df +Tracker.Dialog.NoFFMPeg.Title=\u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e0\u05d2\u05d9\u05e9 Tracker.About.DefaultLocale=\u05de\u05d9\u05e7\u05d5\u05dd \u05d1\u05e8\u05d9\u05e8\u05ea \u05de\u05d7\u05d3\u05dc Tracker.About.CurrentLanguage=\u05e9\u05e4\u05d4 Tracker.Dialog.InsufficientMemory.Title=\u05d6\u05d9\u05db\u05e8\u05d5\u05df \u05d0\u05d9\u05e0\u05d5 \u05de\u05e1\u05e4\u05e7 @@ -892,7 +892,7 @@ TTrackBar.Memory.Menu.SetSize=\u05d4\u05d2\u05d3\u05e8 \u05d2\u05d5\u05d3\u05dc TTrackBar.Button.Version=\u05e2\u05db\u05e9\u05d9\u05d5 \u05d6\u05de\u05d9\u05df, \u05d2\u05e8\u05e1\u05d4 TTrackBar.Popup.MenuItem.Upgrade=\u05e9\u05d3\u05e8\u05d2 \u05e2\u05db\u05e9\u05d9\u05d5... TTrackBar.Popup.MenuItem.Ignore=\u05d4\u05ea\u05e2\u05dc\u05dd -XuggleVideo.MenuItem.SmoothPlay=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05d7\u05dc\u05e7\u05d4 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) +FFMPegVideo.MenuItem.SmoothPlay=\u05d4\u05e7\u05e8\u05e0\u05d4 \u05d7\u05dc\u05e7\u05d4 (\u05e2\u05dc\u05d5\u05dc \u05dc\u05d4\u05d9\u05d5\u05ea \u05d0\u05d9\u05d8\u05d9) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\u05e1\u05e8\u05d8 \u05db\u05d9\u05d5\u05dc @@ -921,13 +921,13 @@ WorldTView.Button.World=\u05d1\u05d9\u05d7\u05d9\u05d3\u05d5\u05ea \u05d0\u05de\ # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u05d4\u05d6\u05d4\u05e8\u05d5\u05ea PrefsDialog.Checkbox.WarnIfNoEngine=\u05d0\u05d9\u05df \u05de\u05e0\u05d5\u05e2 \u05d5\u05d9\u05d3\u05d0\u05d5 -PrefsDialog.Checkbox.WarnIfXuggleError=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e7\u05d8\u05dc\u05e0\u05d9\u05ea +PrefsDialog.Checkbox.WarnIfFFMPegError=\u05e9\u05d2\u05d9\u05d0\u05ea \u05e9\u05d5\u05d2\u05dc \u05dc\u05d0 \u05e7\u05d8\u05dc\u05e0\u05d9\u05ea PropertiesDialog.Title=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd PropertiesDialog.Label.Author=\u05d9\u05d5\u05e6\u05e8\u05d9\u05dd PropertiesDialog.Label.Contact=\u05e7\u05e9\u05e8 TActions.Action.Properties=\u05de\u05d0\u05e4\u05d9\u05d9\u05e0\u05d9\u05dd... TActions.Action.OpenBrowser=\u05e4\u05ea\u05d7 \u05d3\u05e4\u05d3\u05e4\u05df \u05e1\u05e4\u05e8\u05d9\u05d5\u05ea... -TFrame.Progress.Xuggle=\u05e9\u05d5\u05d2\u05dc \u05d8\u05d5\u05e2\u05df \u05ea\u05de\u05d5\u05e0\u05d4 +TFrame.Progress.FFMPeg=\u05e9\u05d5\u05d2\u05dc \u05d8\u05d5\u05e2\u05df \u05ea\u05de\u05d5\u05e0\u05d4 TFrame.Progress.ClickToCancel=(\u05dc\u05d7\u05e5 \u05dc\u05d1\u05d9\u05d8\u05d5\u05dc) TFrame.Dialog.StalledVideo.Title=\u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d8\u05e2\u05d9\u05e0\u05ea \u05d4\u05e1\u05e8\u05d8 TFrame.Dialog.StalledVideo.Message0=\u05d4\u05e1\u05e8\u05d8 \u05e0\u05e2\u05e6\u05e8 \u05d1\u05d6\u05de\u05df \u05d4\u05d8\u05e2\u05d9\u05e0\u05d4. \u05d6\u05d4 \u05e2\u05e9\u05d5\u05d9 \u05dc\u05d4\u05d9\u05d5\u05ea \u05d6\u05de\u05e0\u05d9. @@ -1201,17 +1201,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=\u05de\u05e9\u05da \u05ea\u05de\u05d5\u05e0\u05d4 \u05de\u05e9\u05ea\u05e0\u05d4 PrefsDialog.Button.NoEngine=\u05d0\u05e3-\u05d0\u05d7\u05d3 PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1227,10 +1227,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents @@ -1296,7 +1296,7 @@ TableTrackView.Dialog.NameColumn.Title=\u05e2\u05de\u05d5\u05d3\u05ea \u05d8\u05 TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties index 8d99a8d6..dda7ef70 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ko.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=\uae30\ubcf8 \uc124\uc815\uc73c\ub85c PrefsDialog.Checkbox.HintsOn=\ud48d\uc120 \ub3c4\uc6c0\ub9d0 \ubcf4\uae30 PrefsDialog.Tab.Video.Title=\ube44\ub514\uc624 PrefsDialog.VideoPref.BorderTitle=\ube44\ub514\uc624 \uc5d4\uc9c4 -PrefsDialog.Button.Xuggle=Xuggle (\uad8c\uc7a5) +PrefsDialog.Button.FFMPeg=FFMPeg (\uad8c\uc7a5) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc\uc77c \uacbd\uc6b0 \uba54\ubaa8\ub9ac \uad00\ub9ac\uac00 \ubd88\uac00\ub2a5\ud569\ub2c8\ub2e4. PrefsDialog.Dialog.WebStart.Title=\uc6f9 \uc2dc\uc791 \ubaa8\ub4dc @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=1\uc8fc\uc77c \uac04\uaca9 PrefsDialog.Upgrades.Monthly=1\ub2ec \uac04\uaca9 PrefsDialog.Upgrades.Never=\ud655\uc778\ud558\uc9c0 \uc54a\uc74c PrefsDialog.Button.CheckForUpgrade=\uc9c0\uae08 \ud655\uc778 -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle \ube44\ub514\uc624 \uc7ac\uc0dd -PrefsDialog.Xuggle.Slow=\ubd80\ub4dc\ub7fd\uac8c (\ub290\ub9bc) -PrefsDialog.Xuggle.Fast=\uac70\uce60\uac8c (\ube60\ub984) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg \ube44\ub514\uc624 \uc7ac\uc0dd +PrefsDialog.FFMPeg.Slow=\ubd80\ub4dc\ub7fd\uac8c (\ub290\ub9bc) +PrefsDialog.FFMPeg.Fast=\uac70\uce60\uac8c (\ube60\ub984) PrefsDialog.CalibrationTool.BorderTitle=\uae30\ubcf8 \uad50\uc815 \ub3c4\uad6c Protractor.Name=\uac01\ub3c4\uae30 Protractor.New.Name=\uac01\ub3c4\uae30 @@ -817,24 +817,24 @@ TMenuBar.Menu.MeasuringTools=\uce21\uc815 \ub3c4\uad6c TMenuBar.Menu.AngleUnits=\uac01 TMenuBar.MenuItem.Degrees=\ub3c4 TMenuBar.MenuItem.Radians=\ub77c\ub514\uc548 -Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message1=Xuggle \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message2=Xuggle \ub2e4\uc6b4\ub85c\ub4dc: http://www.xuggle.com/xuggler/downloads/ -Tracker.Action.AboutXuggle=Xuggle \uc815\ubcf4... -Tracker.Dialog.AboutXuggle.Title=Xuggle \uc815\ubcf4 -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \ubc84\uc804 -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \uc124\uce58 \uacbd\ub85c: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar \uacbd\ub85c: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg \uc744 \ucc3e\uc744 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc124\uce58\ub418\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoFFMPeg.Message2=FFMPeg \ub2e4\uc6b4\ub85c\ub4dc: http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=FFMPeg \uc815\ubcf4... +Tracker.Dialog.AboutFFMPeg.Title=FFMPeg \uc815\ubcf4 +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg \ubc84\uc804 +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg \uc124\uce58 \uacbd\ub85c: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar \uacbd\ub85c: Tracker.Dialog.NoVideoEngine.Message1=Tracker \ub294 \uae30\ubcf8 \ud615\uc2dd\uc758 \uc560\ub2c8\uba54\uc774\uc158 GIF, \uadf8\ub9bc\uacfc \ub3d9\uc601\uc0c1\uc744 \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. Tracker.Dialog.NoVideoEngine.Message2=\uadf8\ub7ec\ub098 \ub2e4\ub978 \ube44\ub514\uc624 \ud615\uc2dd\uc744 \ubd88\ub7ec\uc624\ub824\uba74 \ubcc4\ub3c4\uc758 \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. -Tracker.Dialog.NoVideoEngine.Message3=\uacf5\uac1c \ucf54\ub4dc\uc774\uba70 \uacf5\ud1b5 \ud615\uc2dd\uc73c\ub85c \uad8c\uc7a5\ub41c \ube44\ub514\uc624 \uc5d4\uc9c4\uc778 Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c +Tracker.Dialog.NoVideoEngine.Message3=\uacf5\uac1c \ucf54\ub4dc\uc774\uba70 \uacf5\ud1b5 \ud615\uc2dd\uc73c\ub85c \uad8c\uc7a5\ub41c \ube44\ub514\uc624 \uc5d4\uc9c4\uc778 FFMPeg \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c Tracker.Dialog.NoVideoEngine.Message4=\uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: Tracker.Dialog.NoVideoEngine.Title=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c -Tracker.Dialog.NoXuggle.Message1=Xuggle \uc744 \uc62c\ubc14\ub974\uac8c \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message2=xuggle jar \ud30c\uc77c\uc774 \uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -Tracker.Dialog.NoXuggle.Message3=\uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\ub294 Tracker_README.txt \ub97c \ucc38\uace0\ud558\uc138\uc694. -Tracker.Dialog.NoXuggle.Message4=Xuggle \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: -Tracker.Dialog.NoXuggle.Title=Xuggle \uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg \uc744 \uc62c\ubc14\ub974\uac8c \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar \ud30c\uc77c\uc774 \uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. +Tracker.Dialog.NoFFMPeg.Message3=\uc124\uce58 \uacbd\ub85c\uc5d0 \uc788\ub294 Tracker_README.txt \ub97c \ucc38\uace0\ud558\uc138\uc694. +Tracker.Dialog.NoFFMPeg.Message4=FFMPeg \uc744 \uc124\uce58\ud558\uae30 \uc704\ud55c \uac00\uc7a5 \ucd5c\uadfc\uc758 Tracker \uc124\uce58 \ud30c\uc77c \ub2e4\uc6b4\ub85c\ub4dc: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg \uc744 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c Tracker.About.DefaultLocale=\uae30\ubcf8 \uc124\uc815 Tracker.About.CurrentLanguage=\uc5b8\uc5b4 Tracker.Dialog.InsufficientMemory.Title=\uba54\ubaa8\ub9ac \ubd80\uc871 @@ -880,7 +880,7 @@ TTrackBar.Memory.Menu.SetSize=\uba54\ubaa8\ub9ac \ud06c\uae30 \uc124\uc815... TTrackBar.Button.Version=\uc9c0\uae08 \ud65c\uc6a9 \uac00\ub2a5: \ubc84\uc804 TTrackBar.Popup.MenuItem.Upgrade=\uc9c0\uae08 \uc5c5\uadf8\ub808\uc774\ub4dc... TTrackBar.Popup.MenuItem.Ignore=\ubb34\uc2dc -XuggleVideo.MenuItem.SmoothPlay=\ubd80\ub4dc\ub7ec\uc6b4 \uc7ac\uc0dd (\ub290\ub9bc) +FFMPegVideo.MenuItem.SmoothPlay=\ubd80\ub4dc\ub7ec\uc6b4 \uc7ac\uc0dd (\ub290\ub9bc) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\uad50\uc815 \uc904\uc790 @@ -909,13 +909,13 @@ WorldTView.Button.World=\uc6d4\ub4dc \ubdf0 # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\uc8fc\uc758 PrefsDialog.Checkbox.WarnIfNoEngine=\ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle \uc624\ub958 +PrefsDialog.Checkbox.WarnIfFFMPegError=FFMPeg \uc624\ub958 PropertiesDialog.Title=\uc18d\uc131 PropertiesDialog.Label.Author=\uc9c0\uc740\uc774 PropertiesDialog.Label.Contact=\uc5f0\ub77d\ucc98 TActions.Action.Properties=\uc18d\uc131... TActions.Action.OpenBrowser=\ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac... -TFrame.Progress.Xuggle=Xuggle \ud504\ub808\uc784 \ubd88\ub7ec\uc624\ub294 \uc911 +TFrame.Progress.FFMPeg=FFMPeg \ud504\ub808\uc784 \ubd88\ub7ec\uc624\ub294 \uc911 TFrame.Progress.ClickToCancel=(\ucde8\uc18c\ud558\ub824\uba74 \ub204\ub984) TFrame.Dialog.StalledVideo.Title=\ube44\ub514\uc624 \ubd88\ub7ec\uc624\uae30 \uc624\ub958 TFrame.Dialog.StalledVideo.Message0=\ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \uc911\uc5d0 \uc77c\uc2dc\uc801\uc73c\ub85c \uba48\ucd94\uc5c8\uc2b5\ub2c8\ub2e4. @@ -928,11 +928,11 @@ TFrame.Dialog.StalledVideo.Button.Stop=\uba48\ucda4 TFrame.Dialog.StalledVideo.Button.Wait=\uae30\ub2e4\ub9bc Tracker.Dialog.NoVideoEngine.Checkbox=\ub2e4\uc2dc \ubcf4\uc9c0 \uc54a\uae30 TrackerIO.ZipFileFilter.Description=\uc555\ucd95 (zip) \ud30c\uc77c -TrackerIO.Dialog.ErrorFFMPEG.Message1=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \ub3d9\uc548 Xuggle \uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uc624\ub958 \ubc1c\uc0dd: +TrackerIO.Dialog.ErrorFFMPEG.Message1=\uc774 \ube44\ub514\uc624\ub97c \ubd88\ub7ec\uc624\ub294 \ub3d9\uc548 FFMPeg \uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uc624\ub958 \ubc1c\uc0dd: TrackerIO.Dialog.ErrorFFMPEG.Message2=\ubaa8\ub4e0 \uc624\ub958\uac00 \uce58\uba85\uc801\uc778 \uac83\uc740 \uc544\ub2c8\uba70 \uc624\ub958 \uba54\uc2dc\uc2dc\ub97c \ubcf4\ub824\uba74 [\ub3c4\uc6c0\ub9d0|\uba54\uc2dc\uc9c0 \ub85c\uadf8]\ub97c \ubd05\ub2c8\ub2e4. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Xuggle \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74, QuickTime \uc73c\ub85c \ube44\ub514\uc624\ub97c \uc5f4\uc5b4 \ubcfc \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. +TrackerIO.Dialog.ErrorFFMPEG.Message3=FFMPeg \uc624\ub958\uac00 \ubc1c\uc0dd\ud55c\ub2e4\uba74, QuickTime \uc73c\ub85c \ube44\ub514\uc624\ub97c \uc5f4\uc5b4 \ubcfc \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\ub178\ud2b8: Mac OSX \uc5d0\uc11c\ub294 32-\ube44\ud2b8 Java VM \uc5d0\uc11c Tracker \ub97c \uc5f4\uc5b4\uc57c \ud569\ub2c8\ub2e4. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \uc624\ub958 +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg \uc624\ub958 TrackerIO.ErrorFFMPEG.LogMessage=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc744 \ubcf4\uae30 \uc704\ud574, \ud658\uacbd \uc124\uc815 \ub300\ud654 \uc0c1\uc790 [\ud3b8\uc9d1|\ud658\uacbd \uc124\uc815]\uc5d0\uc11c [\ube44\ub514\uc624|\uc8fc\uc758] \ud56d\ubaa9\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. TToolBar.Button.OpenBrowser.Tooltip=OSP \ub514\uc9c0\ud138 \ub77c\uc774\ube0c\ub7ec\ub9ac @@ -1203,17 +1203,17 @@ PrefsDialog.Checkbox.32BitVM=32 \ube44\ud2b8 PrefsDialog.Checkbox.WarnVariableDuration=\uc77c\uc815\ud558\uc9c0 \uc54a\uc740 \ud504\ub808\uc784 \uae38\uc774 PrefsDialog.Button.NoEngine=\uc5c6\uc74c PrefsDialog.Dialog.SwitchToQT.Message=QuickTime \uc73c\ub85c \uc124\uc815\ud558\uace0 Java VM \uc744 32 \ube44\ud2b8\ub85c \ubcc0\uacbd -PrefsDialog.Dialog.SwitchToXuggle32.Message=Xuggle \ub85c \uc124\uc815\ud558\uace0 Java VM \uc744 32 \ube44\ud2b8\ub85c \ubcc0\uacbd -PrefsDialog.Dialog.SwitchToXuggle64.Message=Xuggle \ub85c \uc124\uc815\ud558\uace0 Java VM \uc744 64 \ube44\ud2b8\ub85c \ubcc0\uacbd +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=FFMPeg \ub85c \uc124\uc815\ud558\uace0 Java VM \uc744 32 \ube44\ud2b8\ub85c \ubcc0\uacbd +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=FFMPeg \ub85c \uc124\uc815\ud558\uace0 Java VM \uc744 64 \ube44\ud2b8\ub85c \ubcc0\uacbd PrefsDialog.Dialog.SwitchVM.Title=Java VM \ubcc0\uacbd PrefsDialog.Dialog.SwitchTo32.Message=32 \ube44\ud2b8 Java VM \uc73c\ub85c \uc124\uc815\ud558\uace0 \ube44\ub514\uc624 \uc5d4\uc9c4\uc744 QuickTime \uc73c\ub85c \ubcc0\uacbd -PrefsDialog.Dialog.SwitchTo64.Message=64 \ube44\ud2b8 Java VM \uc73c\ub85c \uc124\uc815\ud558\uace0 \ube44\ub514\uc624 \uc5d4\uc9c4\uc744 Xuggle \ub85c \ubcc0\uacbd +PrefsDialog.Dialog.SwitchTo64.Message=64 \ube44\ud2b8 Java VM \uc73c\ub85c \uc124\uc815\ud558\uace0 \ube44\ub514\uc624 \uc5d4\uc9c4\uc744 FFMPeg \ub85c \ubcc0\uacbd PrefsDialog.Dialog.SwitchEngine.Title=\ube44\ub514\uc624 \uc5d4\uc9c4 \ubcc0\uacbd PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=64 \ube44\ud2b8 Java VM\uc5d0 \uc801\ud569\ud55c \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=\uadf8\ub9bc \ud30c\uc77c (JPEG, PNG) \uacfc \uc560\ub2c8\uba54\uc774\uc158 GIR \ud30c\uc77c\uc740 \ubd88\ub7ec\uc62c \uc218 \uc788\uc2b5\ub2c8\ub2e4. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=\uadf8\ub798\ub3c4 64 \ube44\ud2b8 VM \uc73c\ub85c \uc124\uc815\ud560\uae4c\uc694? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=64 \ube44\ud2b8 \ube44\ub514\uc624 \uc5d4\uc9c4 \uc5c6\uc74c -PrefsDialog.Dialog.No32bitVMXuggle.Message=Xuggle \uc744 \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 32 \ube44\ud2b8 Java VM \uc744 \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=FFMPeg \uc744 \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 32 \ube44\ud2b8 Java VM \uc744 \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. PrefsDialog.Dialog.No32bitVMQT.Message=QuickTime \uc744 \uc0ac\uc6a9\ud558\uae30 \uc804\uc5d0 32 \ube44\ud2b8 Java VM \uc744 \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4. PrefsDialog.Dialog.No32bitVM.Message=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 Tracker \ub3c4\uc6c0\ub9d0\uc744 \ucc38\uace0\ud558\uc138\uc694. PrefsDialog.Dialog.No32bitVM.Title=32 \ube44\ud2b8 VM \ud544\uc694 @@ -1229,10 +1229,10 @@ Tracker.Dialog.Button.RelaunchNow=\uc608 (\ub2e4\uc2dc \uc2dc\uc791\ud558\uae30) Tracker.Dialog.Button.ShowPrefs=\uc544\ub2c8\uc624 (\uc124\uc815 \ubcf4\uae30) Tracker.Dialog.Button.ContinueWithoutEngine=\uc544\ub2c8\uc624 (\ube44\ub514\uc624 \uc5c6\uc774 \uacc4\uc18d \ud558\uae30) Tracker.Dialog.EngineProblems.Message1=\ud558\ub098 \ub610\ub294 \uadf8 \uc774\uc0c1\uc758 \ube44\ub514\uc624 \uc5d4\uc9c4\uc774 \uc124\uce58\ub418\uc5c8\uc73c\ub098 \ub3d9\uc791\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. -Tracker.Dialog.EngineProblems.Message2=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub3c4\uc6c0\ub9d0>\ud504\ub85c\uadf8\ub7a8 \uc815\ubcf4> Xuggle \ub610\ub294 QuickTime \uc815\ubcf4\ub97c \ucc38\uace0\ud558\uc138\uc694. -Tracker.Dialog.ReplaceXuggle.Message1=Tracker (\ubc84\uc804 4.75 \ub610\ub294 \uadf8 \uc774\uc0c1) \uc744 \ub2e4\uc2dc \uc124\uce58\ud558\uc5ec -Tracker.Dialog.ReplaceXuggle.Message2=Xuggle \ube44\ub514\uc624 \uc5d4\uc9c4\uc744 \ubc84\uc804 3.4 (\ub610\ub294 \uadf8 \uc774\uc0c1) \uc73c\ub85c \ubcc0\uacbd\ud558\uae30\ub97c \uad8c\uc7a5\ud569\ub2c8\ub2e4. -Tracker.Dialog.ReplaceXuggle.Message3=Xuggle \uc744 \uc124\uce58 \uc635\uc158\uc5d0\uc11c \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. +Tracker.Dialog.EngineProblems.Message2=\ubcf4\ub2e4 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \ub3c4\uc6c0\ub9d0>\ud504\ub85c\uadf8\ub7a8 \uc815\ubcf4> FFMPeg \ub610\ub294 QuickTime \uc815\ubcf4\ub97c \ucc38\uace0\ud558\uc138\uc694. +Tracker.Dialog.ReplaceFFMPeg.Message1=Tracker (\ubc84\uc804 4.75 \ub610\ub294 \uadf8 \uc774\uc0c1) \uc744 \ub2e4\uc2dc \uc124\uce58\ud558\uc5ec +Tracker.Dialog.ReplaceFFMPeg.Message2=FFMPeg \ube44\ub514\uc624 \uc5d4\uc9c4\uc744 \ubc84\uc804 3.4 (\ub610\ub294 \uadf8 \uc774\uc0c1) \uc73c\ub85c \ubcc0\uacbd\ud558\uae30\ub97c \uad8c\uc7a5\ud569\ub2c8\ub2e4. +Tracker.Dialog.ReplaceFFMPeg.Message3=FFMPeg \uc744 \uc124\uce58 \uc635\uc158\uc5d0\uc11c \uc120\ud0dd\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. TrackerIO.Dialog.DurationIsConstant.Message=\ubaa8\ub4e0 \ud504\ub808\uc784 \uae38\uc774\ub294 \uac19\uc544\uc57c \ud569\ub2c8\ub2e4 (\uc77c\uc815\ud55c \ud504\ub808\uc784 \uc18d\ub3c4). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP \ud30c\uc77c(.trz) TToolbar.Button.Desktop.Tooltip=HTML \ub610\ub294 PDF \ubb38\uc11c\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4. @@ -1298,7 +1298,7 @@ TableTrackView.Dialog.NameColumn.Title=\ub370\uc774\ud130 \ud589 TToolBar.MenuItem.StretchOff=\uc6d0\ub798\ub300\ub85c # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle \ubc84\uc804 +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg \ubc84\uc804 PrefsDialog.Checkbox.WarnCopyFailed=\ube44\ub514\uc624 \uc5d4\uc9c4 \ud30c\uc77c \ubcf5\uc0ac \uc2e4\ud328 Tracker.Dialog.FailedToCopy.Title=\ud30c\uc77c \ubcf5\uc0ac \uc2e4\ud328 Velocity.Dialog.Color.Title=\uc18d\ub3c4 \uc0c9 \uc120\ud0dd diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ms_MY.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ms_MY.properties index 229a80ba..7554ca59 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ms_MY.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ms_MY.properties @@ -1,3 +1,3 @@ # This is the Malaysian tracker.properties file Calibration.Name=Titik Penentukuran Calibration.New.Name=titik penentukuran CenterOfMass.Name=Pusat Jisim CenterOfMass.New.Name=cm CenterOfMass.MenuItem.Inspector=Pilih Jisim... CenterOfMassInspector.Title=Pusat Jisim CenterOfMassInspector.Border.Title=Pilih Jisim ConfigInspector.Border.Title=Ciri Dikehendaki ConfigInspector.Title=Keutamaan ConfigInspector.Button.SaveAsDefault=Simpan Sebagai Lalai CoordAxes.Name=Paksi CoordAxes.New.Name=paksi Dialog.Button.Cancel=Batal Dialog.Button.OK=OK Dialog.Button.Close=Tutup Dialog.Button.All=Semua Dialog.Button.None=Tiada Dialog.Button.Copy=Salin Dialog.Button.Update=Kemas kini Dialog.Button.SelectAll=Pilih Semua Footprint.Diamond=intan Footprint.BoldDiamond=intan tebal Footprint.SolidDiamond=intan padu Footprint.Triangle=segi tiga Footprint.BoldTriangle=segi tiga tebal Footprint.SolidTriangle=segi tiga padu Footprint.Circle=bulatan Footprint.BoldCircle=bulatan tebal Footprint.SolidCircle=bulatan padu Footprint.VerticalLine=garis tegak Footprint.BoldVerticalLine=garis tegak tebal Footprint.HorizontalLine=garis ufuk Footprint.BoldHorizontalLine=garis ufuk tebal Footprint.Crosshair=rerambut silang Footprint.BoldCrosshair=rerambut silang tebal Footprint.SimpleAxes=paksi mudah Footprint.BoldSimpleAxes=paksi mudah tebal Footprint.Spot=titik Footprint.Line=garis Footprint.BoldLine=garis tebal Footprint.Outline=rangka Footprint.BoldOutline=rangka tebal Footprint.Arrow=anak panah Footprint.BoldArrow=anak panah tebal Footprint.DoubleArrow=anak panah berganda Footprint.BoldDoubleArrow=anak panah berganda tebal Footprint.2xArrow=anak panah 2x Footprint.Bold2xArrow=anak panah tebal 2x Footprint.4xArrow=anak panah 4x Footprint.Bold4xArrow=anak panah tebal 4x Footprint.DashArrow=anak panah putus-putus Footprint.BoldDashArrow=anak panah putus-putus tebal Footprint.BigArrow=anak panah besar Footprint.BigDashArrow=anak panah besar putus-putus LineProfile.Name=Profil Garis LineProfile.New.Name=profil LineProfile.Data.Brightness=kecerahan LineProfile.Data.Pixel=piksel LineProfile.Data.Red=merah LineProfile.Data.Green=hijau LineProfile.Data.Blue=biru LineProfile.Data.Weighting=kiraan MainTView.Popup.MenuItem.QTPlayer=Pemain QuickTime MainTView.Popup.MenuItem.Zoom=Zum MainTView.Popup.MenuItem.ToFit=Untuk Padanan OffsetOrigin.Name=Asalan Ofset OffsetOrigin.New.Name=asalan ofset PlotTrackView.Button.PlotCount=Plot PlotTrackView.Button.PlotCount.ToolTip=Set kiraan plot PointMass.Name=Titik Jisim PointMass.New.Name=jisim PointMass.MenuItem.VectorsToPosition=Ke Kedudukan PointMass.MenuItem.Velocity=Halaju PointMass.MenuItem.Acceleration=Pecutan Star.Name=Bintang Star.New.Name=bintang TableTrackView.Action.CopyData=Salin Data TableTrackView.Button.SelectTableData=Jadual TableTrackView.Button.SelectTableData.ToolTip=Pilih lajur jadual TableTrackView.Popup.MenuItem.Analyze=Analisis... TableTrackView.Dialog.Border.Title=Tampak: TActions.Action.Description=Nota TActions.Action.ClearTracks=Semua Trek TActions.Action.NewTab=Tab Baharu TActions.Action.Copy=Salin TActions.Action.Paste=Tampal TActions.Action.Open=Buka Fail... TActions.Action.Close=Tutup Tab TActions.Action.Import=Import... TActions.Action.Save=Simpan Tab TActions.Action.SaveAs=Simpan Tab Sebagai... TActions.Action.Export=Export... TActions.Action.CaptureVideo=Ambil Video... TActions.Action.Delete=Buang TActions.Action.Config=Keutamaan... TActions.Action.AxesVisible=Tampak TActions.Action.TapeVisible=Tampak TActions.Action.Print=Cetak... TActions.Action.ClearFilters=Bersih TActions.Action.ImportVideo=Import... TActions.Action.CloseVideo=Tutup TActions.Action.CloseAll=Tutup Semua Tab TActions.Action.Exit=Keluar TActions.Dialog.PrintError.Message=Ralat cetakan berlaku. TActions.Dialog.PrintError.Title=Ralat Cetakan TActions.Dialog.Description.Title=Nota: TActions.Dialog.DeleteLockedTracks.Message=Sebahagian trek berkunci. Buang sahaja? TActions.Dialog.DeleteLockedTracks.Title=Buang trek Berkunci? TActions.Dialog.NewPointMass.Title=Titik Jisim Baharu TapeMeasure.Name=Pita Ukur TapeMeasure.New.Name=pita TapeMeasure.MenuItem.Fixed=Tetap TFrame.View.Plot=Pandangan Plot TFrame.View.Table=Pandangan Jadual TFrame.View.World=Pandangan Dunia TFrame.View.Video=Pandangan Video TFrame.Dialog.Help.Title=Bantuan Tracker TMenuBar.Menu.File=Fail TMenuBar.Menu.Edit=Sunting TMenuBar.Menu.Video=Video TMenuBar.Menu.Tracks=Trek TMenuBar.Menu.Coords=Sistem Koordinat TMenuBar.Menu.Window=Pandangan TMenuBar.Menu.Help=Bantuan TMenuBar.MenuItem.EditProperties=Sifat... TMenuBar.MenuItem.VideoVisible=Tampak TMenuBar.MenuItem.VideoFilters=Penapis TMenuBar.MenuItem.NewVideoFilter=Baharu TMenuBar.MenuItem.NewTrack=Baharu TMenuBar.MenuItem.CoordsLocked=Berkunci TMenuBar.MenuItem.CoordsFixedOrigin=Asalan Tetap TMenuBar.MenuItem.CoordsFixedAngle=Sudut Tetap TMenuBar.MenuItem.CoordsFixedScale=Skala Tetap TMenuBar.MenuItem.CoordsRefFrame=Bingkai Rujukan TMenuBar.MenuItem.CoordsDefault=Lalai TMenuBar.MenuItem.WindowRight=Pandangan Kanan TMenuBar.MenuItem.WindowBottom=Pandangan Bawah TMenuBar.MenuItem.PlayAllSteps=Main Semua Langkah TMenuBar.MenuItem.Record=Rakam TMenuBar.MenuItem.MatSize=Saiz Alas TMenuBar.MenuItem.Language=Bahasa TMenuBar.MenuItem.DeleteTrack=Buang TMenuBar.MenuItem.TrackerHelp=Bantuan Tracker... TMenuBar.MenuItem.MessageLog=Log Mesej... TrackControl.Name=Pengawal trek TrackControl.Button.NewTrack=Cipta TrackControl.Button.NewTrack.ToolTip=Cipta trek baharu TrackControl.Button.Trails.ToolTip=Set panjang trek TrackControl.Button.Labels.ToolTip=Tunjuk atau sembunyi penomboran TrackControl.Button.StretchVectors.ToolTip=Vektor regang TrackControl.Button.Accelerations.ToolTip=Tunjuk atau sembunyi vektor pecutan TrackControl.Button.Xmass.ToolTip=Darab vektor dengan jisim TrackControl.Button.Vectors.ToolTip=Vektor TrackControl.Button.Velocities.ToolTip=Tunjuk atau sembunyi vektor halaju TrackControl.Button.Properties.ToolTip=Klik untuk pilih TrackControl.Button.Positions.ToolTip=Tunjuk atau sembunyi kedudukan Tracker.Popup.MenuItem.Snapshot=Petikan... Tracker.Popup.MenuItem.Help=Bantuan... Tracker.Cursor.Crosshair.Description=Kursor rerambut silang Tracker.Action.AboutTracker=Tentang Tracker... Tracker.Dialog.AboutTracker.Title=Tentang Tracker Tracker.Action.AboutJava=Tentang Java... Tracker.Dialog.AboutJava.Title=Tentang Java Tracker.Dialog.AboutJava.UnknownVersion=tak diketahui Tracker.Dialog.AboutJava.Message=Versi Java Tracker.Action.AboutQT=Tentang QuickTime... Tracker.Dialog.AboutQT.Title=Tentang QuickTime Tracker.Dialog.AboutQT.Message.QTVersion=Versi QuickTime Tracker.Dialog.AboutQT.Message.QTJavaVersion=Versi QTJava Tracker.Dialog.AboutQT.Message.QTJavaPath=Laluan QTJava: Tracker.Dialog.NoQT.Title=QTJava.zip tidak ditemui Tracker.Dialog.NoQT.Message1=QuickTime untuk Java tidak muncul untuk dipasang Tracker.Dialog.NoQT.Message2=Jika anda ingin analisis wayang QuickTime, sila pasang semula QuickTime. Tracker.Dialog.NoQT.Message3=NOTA: QuickTime untuk Java MESTI DIPILIH apabila memasang QuickTime. Tracker.Dialog.UpdateQT.Title=Kemas kini QTJava.zip Tracker.Dialog.UpdateQT.Message1=Versi baru QTJava.zip telah ditemui di Tracker.Dialog.UpdateQT.Message2=Adakah anda ingin kemas kini fail yang sedia ada? Tracker.Dialog.CopyQT.Title=Salin QTJava.zip Tracker.Dialog.CopyQT.Message1=QuickTime telah terpasang, tetapi sebelum Tracker boleh gunakannya: Tracker.Dialog.CopyQT.Message2=1. QTJava.zip mesti disalin dari Tracker.Dialog.CopyQT.Message3=ke Tracker.Dialog.CopyQT.Message4= 2. Tracker mesti dimulakan semula. Tracker.Dialog.CopyQT.Message5=Adakah anda ingin salin QTJava.zip sekarang? Tracker.Dialog.CopyFailed.Title=Salinan Gagal Tracker.Dialog.CopyFailed.Message=QTJava.zip tidak dapat disalin. Tracker.Dialog.CopiedTo.Title=Salinan Berjaya Tracker.Dialog.CopiedTo.Message1=QTJava.zip telah berjaya disalin ke Tracker.Dialog.CopiedTo.Message2=Tracker perlu dimulakan semula dan akan keluar sekarang. Tracker.Splash.Loading=Pemuatan TrackerIO.Dialog.Import.Title=Import Fail Tracker TrackerIO.Dialog.Import.Message=Pilih butir untuk import TrackerIO.Dialog.ImportVideo.Title=Import Video TrackerIO.Dialog.Export.Title=Eksport TrackerIO.Dialog.Export.Message=Pilih butir untuk eksport TrackerIO.Dialog.ReplaceFile.Title=Ganti Fail Sedia Ada? TrackerIO.Dialog.ReplaceFile.Message=telah wujud. Adakah anda ingin menggantikannya? TrackerIO.Dialog.NotTrackerXML.Title=XML tak sepadan TrackerIO.Dialog.NotTrackerXML.Message=mengandungi data xml untuk aplikasi berbeza. TrackerIO.Dialog.BadVideo.MessageFile is not a recognized video type: Fail bukan jenis video yang dikenali: TrackerIO.Dialog.BadVideo.Title=Fail Video Tidak Dikenali TrackerPanel.NewTab.Name=Tak Bertajuk TrackerPanel.DragToMark.Hint=Shift-seret untuk tanda TrackerPanel.ClickToMark.Hint=Shift-klik untuk tanda TrackerPanel.Dialog.LoadFailed.Title=Fail Tracker Tidak Sah TrackerPanel.Dialog.LoadFailed.Message=Fail bukan fail Tracker yang sah: TrackerPanel.Dialog.SaveChanges.Title=Simpan Perubahan TrackerPanel.Dialog.SaveChanges.Message=Simpan perubahan ke TrackPlottingPanel.Popup.MenuItem.Lines=Garis TrackPlottingPanel.Popup.MenuItem.Points=Titik TrackPlottingPanel.Popup.MenuItem.Scale=Skala... TrackPlottingPanel.Popup.MenuItem.Print=Cetak... TrackPlottingPanel.Popup.MenuItem.Measure=Skala untuk Muat TrackPlottingPanel.Popup.MenuItem.Analyze=Analisis... TrackPlottingPanel.Popup.MenuItem.ZoomIn=Zum masuk TrackPlottingPanel.Popup.MenuItem.ZoomOut=Zum keluar TrackPlottingPanel.Popup.MenuItem.ZoomToFit=Skala Automatik TrackPlottingPanel.Popup.MenuItem.ZoomToBox=Zum Ke Kotak TrackPlottingPanelInspector.Title=Skala TrackPlottingPanelInspector.Label.Min=Min TrackPlottingPanelInspector.Label.Max=Maks TrackPlottingPanelInspector.Label.Auto=Auto TToolBar.Button.Footprint.Tooltip=Set trek TToolBar.Dropdown.SelectedTrack.Tooltip=Pilih Trek TToolBar.Dropdown.SelectedTrack.None=Tiada TTrack.MenuItem.Delete=Buang TTrack.MenuItem.Color=Warna... TTrack.Dialog.Color.Title=Pilih Warna Trek TTrack.MenuItem.Name=Nama... TTrack.MenuItem.Footprint=Trek TTrack.MenuItem.Description=Nota... TTrack.MenuItem.Visible=Tampak TTrack.MenuItem.TrailVisible=Trek Tampak TTrack.MenuItem.Autostep=Autolangkah TTrack.MenuItem.MarkByDefault=Tanda dengan Lalai TTrack.MenuItem.Locked=Berkunci TTrack.MenuItem.Delete=Buang TTrack.Name.None=tiada nama TTrack.Dialog.Description.Title=Nota: TTrack.Dialog.Name.Title=Set Nama TTrack.Dialog.Name.Label=Nama: TViewChooser.Button.Choose.Tooltip=Pilih pandangan Vector.Name=Vektor Vector.New.Name=vektor Vector.MenuItem.ToOrigin=Ke Asalan Vector.MenuItem.Label=Label Tampak VectorSum.Name=Hasil Tambah Vektor VectorSum.New.Name=hasil tambah VectorSum.MenuItem.Inspector=Pilih Vektor... VectorSumInspector.Title=Hasil Tambah Vektor VectorSumInspector.Border.Title=ilih Vektor WorldTView.Popup.MenuItem.Projectile=Model Peluncur # Additions by Doug Brown 2006-11-01 AnalyticParticle.Name=Model Zarah Kinematik AnalyticParticle.Inspector.Title=Model Zarah Kinematik AnalyticParticle.Property.FunctionX=x AnalyticParticle.Property.FunctionY=y CircleFootprint.Circle_4=jejari 4 CircleFootprint.Circle_6=jejari 6 CircleFootprint.Circle_8=jejari 8 DynamicParticle.Name=Model Zarah Dinamik (Cartes) DynamicParticle.Inspector.Title=odel Zarah Dinamik DynamicParticle.Property.ForceX=daya x DynamicParticle.Property.ForceY=daya y DynamicParticle.Property.InitialX=x DynamicParticle.Property.InitialY=y DynamicParticle.Property.InitialVelocityX=vx DynamicParticle.Property.InitialVelocityY=vy LineProfile.MenuItem.Fixed=Kedudukan Tetap ParticleModel.New.Name=model ParticleModel.MenuItem.InspectModel=Pembinaan Model... ParticleModel.Inspector.Button.Undo=Buat Asal ParticleModel.Inspector.Button.Redo=Buat Semula ParticleModel.Inspector.Button.Close=Tutup ParticleModel.Inspector.Button.Help=Bantuan # Additions by Doug Brown 2006-12-29 Calibration.Axes.XOnly=Hanya X Calibration.Axes.YOnly=Hanya Y Calibration.Axes.XY=XY Calibration.Spinner.Axes.Tooltip=Pilih paksi penentukuran Calibration.Label.Axes=paksi Calibration.Dialog.InvalidCoordinates.Title=Koordinat Tak Sah Calibration.Dialog.InvalidCoordinates.Message=Titik tidak boleh mempunyai koordinat dunia yang sama. Calibration.Dialog.InvalidXCoordinates.Message=Titik tidak boleh mempunyai koordinat-x dunia yang sama. Calibration.Dialog.InvalidYCoordinates.Message=Titik tidak boleh mempunyai koordinat-y dunia yang sama. SpectralLineFilter.Title=Spektrum Gas SpectralLineFilter.H=Hidrogen SpectralLineFilter.He=Helium SpectralLineFilter.Ne=Neon SpectralLineFilter.Hg=Merkuri TFrame.View.Unknown=Pandangan TMenuBar.MenuItem.Undo=Buat Asal TMenuBar.MenuItem.Redo=Buat Semula TMenuBar.MenuItem.Replace=Ganti... TMenuBar.Menu.AddImage=Import Imej TMenuBar.MenuItem.AddBefore=Sebelum Bingkai Ini... TMenuBar.MenuItem.AddAfter=Selepas Bingkai Ini... TMenuBar.MenuItem.RemoveImage=Singkir Bingkai Ini... TMenuBar.Menu.Tools=Alat TMenuBar.MenuItem.DataFunctionTool=Pembina Data TMenuBar.MenuItem.DatasetTool=Alat Data TMenuBar.Menu.CopyImage=Salin Imej TMenuBar.MenuItem.CopyMainView=Pandangan Utama TMenuBar.MenuItem.CopyFrame=Bingkai TMenuBar.MenuItem.PrintFrame=Cetak... TrackerIO.Dialog.AddImage.Title=Import Imej (pilih satu atau lebih) TTrack.Dialog.Name.BadName=sedang digunakan. Sila pilih nama lain. VectorStep.Label.Momentum=p VectorStep.Label.Velocity=v VectorStep.Label.NetForce=daya bersih VectorStep.Label.Acceleration=a # Additions by Doug Brown 2007-02-19 PlotTView.Label.NoData=Pandangan plot data trek akan terpapar di sini. TableTView.Label.NoData=Pandangan jadual data trek akan terpapar di sini. TrackerPanel.Message.NoData0=Pandangan utama video dan trek akan terpapar di sini. TrackerPanel.Message.NoData1=Pilih Fail|Buka atau Trek|Baharu untuk mula. WorldTView.Label.NoData=Pandangan dunia video dan trek akan terpapar di sini. # Additions by Doug Brown 2007-03-03 DynamicParticle.Label.Solver=Penyelesai: DynamicParticle.Solver.Euler=Euler DynamicParticle.Solver.Verlet=Verlet DynamicParticle.Solver.RK4=Runge-Kutta DynamicParticle.Solver.ODEMultistep=Multilangkah Mudah Suai DynamicParticle.Table.Force.Border.Title=Fungsi Daya (t, x, y, vx, vy) AnalyticParticle.Table.Functions.Border.Title=Fungsi Kedudukan (t) ParticleModel.Table.Initial.Border.Title=Nilai Awal ParticleModel.Property.InitialT=t # Additions by Doug Brown 2007-04-25 TMenuBar.MenuItem.PasteImage=Tampal Imej TMenuBar.MenuItem.PasteAfter=Selepas Bingkai Ini TMenuBar.MenuItem.PasteBefore=Sebelum Bingkai Ini TMenuBar.MenuItem.PasteReplace=Ganti Video # Additions by Doug Brown 2007-07-01 TMenuBar.MenuItem.GettingStarted=Panduan Mula... Tracker.Splash.HelpMessage=Pengguna baharu? Lihat # Additions by Doug Brown 2007-08-12 CoordAxes.Label.Angle=sudut dari ufuk LineProfile.Checkbox.Rotates=putar LineProfile.Label.Spread=sebar RGBRegion.Name=Rantau MHB RGBRegion.New.Name=rantau RGBRegion.MenuItem.Fixed=Posisi Tetap RGBRegion.Label.Radius=jejari piksel TTrack.Label.Step=langkah # Additions by Doug Brown 2007-10-24 LineProfile.Data.Description.0=nombor kedudukan LineProfile.Data.Description.1=kedudukan komponen-x LineProfile.Data.Description.2=kedudukan komponen-y LineProfile.Data.Description.3=merah LineProfile.Data.Description.4=hijau LineProfile.Data.Description.5=biru LineProfile.Data.Description.6=kecerahan diamati LineProfile.Data.Description.7=lebar garis ParticleModel.MenuItem.TraceVisible=Surih Tampak ParticleModel.MenuItem.StepsVisible=Langkah Tampak PointMass.Data.Description.0=masa PointMass.Data.Description.1=kedudukan komponen-x PointMass.Data.Description.2=kedudukan komponen-y PointMass.Data.Description.3=kedudukan magnitud PointMass.Data.Description.4=kedudukan sudut PointMass.Data.Description.5=halaju komponen-x PointMass.Data.Description.6=halaju komponen-y PointMass.Data.Description.7=halaju magnitud PointMass.Data.Description.8=halaju sudut PointMass.Data.Description.9=pecutan komponen-x PointMass.Data.Description.10=pecutan komponen-y PointMass.Data.Description.11=pecutan magnitud PointMass.Data.Description.12=pecutan sudut PointMass.Data.Description.13=sudut putaran PointMass.Data.Description.14=halaju sudut PointMass.Data.Description.15=pecutan sudut PointMass.Data.Description.16=nombor langakh PointMass.Data.Description.17=nombor bingkai PointMass.Data.Description.18=momentum komponen-x PointMass.Data.Description.19=momentum komponen-y PointMass.Data.Description.20=momentum magnitud PointMass.Data.Description.21=momentum sudut PointMass.Data.Description.22=tenaga kinetik RGBRegion.Data.Description.0=masa RGBRegion.Data.Description.1=kedudukan komponen-x RGBRegion.Data.Description.2=kedudukan komponen-y RGBRegion.Data.Description.3=merah RGBRegion.Data.Description.4=hijau RGBRegion.Data.Description.5=biru RGBRegion.Data.Description.6=pamatan kecerahan diamati RGBRegion.Data.Description.7=kiraan piksel RGBRegion.Data.Description.8=nombor langkah RGBRegion.Data.Description.9=nombor bingkai TView.Menuitem.Define=Takrif... Vector.Data.Description.0=masa Vector.Data.Description.1=komponen-x Vector.Data.Description.2=komponen-y Vector.Data.Description.3=magnitud Vector.Data.Description.4=sudut Vector.Data.Description.5=kedudukan ekor komponen-x Vector.Data.Description.6=kedudukan ekor komponen-y Vector.Data.Description.7=nombor langkah Vector.Data.Description.8=nombor bingkai # Additions by Doug Brown 2008-01-02 ParticleModel.Parameter.Mass.Description=Jisim zarah ini ParticleModel.Parameter.InitialTime.Description=Masa awal AnalyticParticle.PositionFunction.X.Description=Kedudukan komponen-x AnalyticParticle.PositionFunction.Y.Description=Kedudukan komponen-y DynamicParticle.ForceFunction.X.Description=Daya komponen-x DynamicParticle.ForceFunction.Y.Description=Daya komponen-y DynamicParticle.Parameter.InitialX.Description=Kedudukan awal komponen-x DynamicParticle.Parameter.InitialY.Description=Kedudukan awal komponen-y DynamicParticle.Parameter.InitialVelocityX.Description=Halaju awal komponen-x DynamicParticle.Parameter.InitialVelocityY.Description=Halaju awal komponen-y TrackerPanel.ModelBuilder.Title=Pembina Model TrackerPanel.DataBuilder.Title=Pembina Data TrackControl.TrailMenu.NoTrail=Tiada Trek. TrackControl.TrailMenu.ShortTrail=Trek pendek TrackControl.TrailMenu.LongTrail=Trek panjang TrackControl.TrailMenu.FullTrail=Semua langkah TrackerPanel.ModelBuilder.Spinner.Tooltip=Model yang sedang dipilih TrackerPanel.ModelBuilder.LineButton.Text=Gaya Garis TrackerPanel.ModelBuilder.LineButton.Tooltip=Set gaya garis ParticleModel.LineStyle.None=Tiada garis ParticleModel.LineStyle.Connect=Sambung langkah ParticleModel.LineStyle.Smooth=Garis licin ModelFunctionPanel.Label=Model AnalyticFunctionPanel.FunctionEditor.Border.Title=Fungsi Kedudukan DynamicFunctionPanel.FunctionEditor.Border.Title=Fungsi Daya # Additions by Doug Brown 2008-11-14 TableTView.Dialog.TableColumns.Title=Lajur Jadual Tampak Tracker.About.ProjectOf=Projek: Tracker.About.TranslationBy=Terjemahan oleh # following entry (Tracker.About.Translator) should contain name(s) of translator(s) Tracker.About.Translator=Shahrul Kadri Ayop (UPSI) & Nik Syaharudin Nik Daud (KPM) TMenuBar.Menu.SaveVideoAs=Simpan Klip Sebagai TActions.SaveClipAs.ProgressMonitor.Message=Simpan klip sebagai TActions.SaveClipAs.ProgressMonitor.Progress=Lengkap # Additions by Doug Brown 2008-12-07 PlotTrackView.Checkbox.Synchronize=Segerak PlotTrackView.Checkbox.Synchronize.Tooltip=Synchronize horizontal axes Segerakkan paksi ufuk RGBRegion.MenuItem.FixedRadius=Jejari Tetap Tracker.VideoZoom.Hint=klik untuk zum dekat atau jauh, klik berganda untuk zum muat Tracker.PlotZoomIn.Hint=seret untuk zum dekat, klik berganda untuk autoskala Tracker.PlotZoomOut.Hint=klik untuk zum jauh Tracker.MenuItem.Hints=Tunjuk Petua TapeMeasure.Label.Length=panjang TapeMeasure.Label.TapeAngle=sudut dari paksi-x TapeMeasure.Label.ArcAngle=sudut jangka sudut TrackerIO.Dialog.NotAnImage.Title=Jenis Fail Salah TrackerIO.Dialog.NotAnImage.Message1=adalah bukan imej JPG atau GIF. TrackerIO.Dialog.NotAnImage.Message2=Adakah anda ingin teruskan? TToolBar.Button.Zoom.Tooltip=Set aras zum TrackChooserTView.DropDown.Tooltip=Pilih trek TapeMeasure.Field.TapeAngle.Tooltip=Sudut dari paksi-x positif ke pita TapeMeasure.Field.Magnitude.Tooltip=Panjang dalam unit dunia berskala TapeMeasure.Readout.Magnitude.Name=panjang TapeMeasure.Readout.Magnitude.Hint=unit dunia TapeMeasure.Readout.Angle.Name=bacaan sudut TapeMeasure.Readout.Angle.Hint=sudut diukur dari paksi-x+ TapeMeasure.End.Name=hujung TapeMeasure.End.Hint=seret untuk ukur jarak dan sudut, shift-klik untuk tanda semula TapeMeasure.Handle.Name=pemegang TapeMeasure.Handle.Hint=seret untuk alih Vector.Tip.Name=petua Vector.Tip.Hint=klik untuk pilih, seret untuk alih Vector.Handle.Name=pemegang Vector.Handle.Hint=klik untuk pilih, seret untuk alih Vector.ShortHandle.Hint=klik untuk pilih, seret untuk alih, alt-klik untuk pilih petua PointMass.Position.Name=kedudukan PointMass.Position.Hint=seret untuk alih PointMass.Velocity.Name=halaju PointMass.Acceleration.Name=pecutan PointMass.Vector.Hint=klik untuk pilih, seret untuk alih PointMass.Position.Locked.Hint=klik untuk pilih--tidak boleh diseret CoordAxes.Handle.Name=paksi +x CoordAxes.Handle.Hint=seret untuk ubah condong CoordAxes.Origin.Name=asalan CoordAxes.Origin.Hint=seret untuk ubah kedudukan OffsetOrigin.Position.Name=kedudukan OffsetOrigin.Position.Hint=seret atau masukkan koordinat untuk alihkan asalan Calibration.Point.Name=titik Calibration.Point.Hint=seret atau masukkan koordinat untuk ubah paksi dan skala RGBRegion.Position.Name=kedudukan RGBRegion.Position.Hint=seret atau masukkan koordinat untuk ubah kedudukan LineProfile.End.Name=akhir LineProfile.End.Hint=seret untuk laras panjang garis LineProfile.Handle.Name=pemegang LineProfile.Handle.Hint=seret untuk alihkan garis PointMass.Hint=set jisim pada bar alat PointMass.Unmarked.Hint=, shift-klik untuk tanda TTrack.Unselected.Hint=lik untuk pilih dan/atau set ciri Vector.Unmarked.Hint=shift-seret untuk tanda OffsetOrigin.Unmarked.Hint=hift-klik untuk tanda semula Calibration.Unmarked.Hint=shift-klik untuk tanda titik pertama Calibration.Halfmarked.Hint=shift-klik untuk tanda semula CenterOfMass.Empty.Hint=pilih jisim untuk takrif sistem VectorSum.Empty.Hint=pilih vector untuk takrif hasil tambah TapeMeasure.Hint=seret hujung untuk tentukan jarak dan sudut CoordAxes.Hint=set sudut untuk ubah condong ParticleModel.Hint=set jisim pada bar alat, masukkan ungkapan dalam Pembina Model untuk hidupkannya RGBRegion.Hint=masukan jejari untuk ubah saiz RGBRegion.Unmarked.Hint=shift-klik untuk tanda kedudukan TTrack.ImportVideo.Hint=import video atau imej untuk ukur MHB TTrack.Selected.Hint=terpilih LineProfile.Hint=masukkan sebaran untuk ubah lebar garis LineProfile.Unmarked.Hint=shift-seret untuk lukis garis LineProfile.Menu.Orientation=Orentasi LineProfile.MenuItem.Horizontal=Ufuk LineProfile.MenuItem.XAxis=Sepanjang Paksi-X Footprint.PositionVector=vektor Footprint.BoldPositionVector=vektor tebal Tracker.Startup.Hint=lihat di sini untuk petua (atau pilih petua di menu Bantuan), tekan kekunci F1 pada bila-bila masa untuk bantuan TrackerPanel.NoVideo.Hint=buka atau import video untuk analisis TrackerPanel.CalibrateVideo.Hint=tentu ukur video menggunakan alat penentukuran TrackerPanel.NoTracks.Hint=cipta trek baru untuk ukur ciri yang dikehendaki TrackerPanel.SetClip.Hint=set atau semak tetapan klip video TrackerPanel.ShowAxes.Hint=set asalan dan sudut paksi koordinat VideoPlayer.Step.Hint=langkah ke depan (pintas: kekunci PageDown) VideoPlayer.Back.Hint=langkah ke belakang (pintas: kekunci PageUp) TrackerPanel.DVVideo.Hint=guna penapis saiz semula untuk betulkan herotan dalam video format-DV TrackerIO.DataFileFilter.Description=Fail Tracker(.trk) Tracker.Button.PDFHelp=Versi Boleh Cetak PDF TToolbar.Button.TapeVisible.Tooltip=Tunjuk, sembunyi atau cipta alat penentukuran # Additions by Doug Brown 2009-03-06 TMenuBar.MenuItem.TrackControl=Pengawal Trek TMenuBar.MenuItem.Description=Nota TrackPlottingPanel.RightDrag.Hint=seret-kanan untuk pilihan TMenuBar.MenuItem.DeleteSelectedPoint=Langkah Terpilih TFrame.InfoDialog.SaveChanges.Title=Simpan Perubahan TFrame.InfoDialog.SaveChanges.Message=Adakah anda ingin menyimpan perubahan? # Additions by Doug Brown 2009-04-27 DynamicParticle.Editor.Button.Cartesian=Cartes DynamicParticle.Editor.Button.Polar=Kutub DynamicParticle.Parameter.InitialR.Description=Jejari awal DynamicParticle.Parameter.InitialTheta.Description=Sudut awal DynamicParticle.Parameter.InitialVelocityR.Description=Halaju jejarian awal DynamicParticle.Parameter.InitialOmega.Description=Halaju sudut awal DynamicParticle.ForceFunction.R.Description=Daya komponen jejarian DynamicParticle.ForceFunction.Theta.Description=Daya komponen tangen DynamicParticlePolar.Name=Model Zarah Dinamik (Kutub) TMenuBar.Menu.DynamicParticle=Model Zarah Dinamik TMenuBar.MenuItem.Cartesian=Cartes TMenuBar.MenuItem.Polar=Kutub # Additions by Doug Brown 2009-08-24 PointMass.MenuItem.Autotrack=Autotrek… Dialog.Button.Help=Bantuan AutoTracker.Wizard.Button.Reset=Set Semula AutoTracker.Wizard.Button.Back=Undur AutoTracker.Wizard.Button.Next=Maju AutoTracker.Wizard.Button.Accept=Terima AutoTracker.Wizard.Button.Search=Carian AutoTracker.Wizard.Button.Pause=Jeda AutoTracker.Wizard.Button.Skip=Langkau AutoTracker.Label.Mask=Templat AutoTracker.Label.AcceptLevel=Ambang AutoTracker.TabbedPane.TabTitle.Mask=Templat AutoTracker.TabbedPane.TabTitle.Target=Sasaran AutoTracker.TabbedPane.TabTitle.Settings=Terima AutoTracker.TabbedPane.TabTitle.Search=Carian AutoTracker.Info.GetStarted=Untuk cipta bingkai kekunci baharu, shift-control-klik ciri video yang dikehendaki. AutoTracker.Info.Mask1=Templat mentakrifkan imej yang hendak dipadankan dalam setiap bingkai video. AutoTracker.Info.Mask2=Ia berevolusi untuk disesuaikan dengan bentuk dan perubahan warna dari masa ke masa. Kadar evolusi tinggi mengesan perubahan yang lebih cepat, tetapi kurang tepat dalam jangka masa panjang. AutoTracker.Info.MaskLocked1=Templat ini sedang digunakan dan berkunci. AutoTracker.Info.MaskLocked2=Klik butang Set Semula untuk bersihkankan semua langkah dan mula dari awal. AutoTracker.Info.Target1=Sasaran ditanda secara automatik untuk skor padanan melebihi aras autotanda. AutoTracker.Info.Target2=Petua: Anda boleh laras kedudukan sasaran walaupun selepas langkah telah ditanda. Langkah sedia ada akan beralih secara automatik bersama-sama dengan sasaran. AutoTracker.Info.TargetLocked=Sasaran sedang digunakan dan terikat kepada kedudukan langkah sedia ada. Mengalihkan sasaran akan menyebabkan langkah juga beralih. AutoTracker.Info.Settings1=Skor padanan melebihi aras autotanda akan ditanda secara automatik. AutoTracker.Info.Settings2=Petua: mengurangkan aras autotanda berkemungkinan meningkatkan penandaan padanan salah. Sebaliknya cuba tingkatkan kadar evolusi. -AutoTracker.Info.Search1=Rantau carian diimbas untuk mendapatkan padanan terbaik. Alih atau ubah saiz rantau carian dengan menyeret tepi atau pemegangnya. AutoTracker.Info.Search2=Petua: Rantau carian tidak semestinya besar dalam banyak kes. Pilihan lihat-ke-depan mengalihkan rantau carian secara automatik ke kedudukan padanan yang diramalkan. AutoTracker.Info.Frame=Bingkai AutoTracker.Info.Match=Padanan telah ditanda secara automatik. AutoTracker.Info.Possible=Satu padanan mungkin ditemui dalam kawasan carian ditunjukkan. Pilihan anda adalah: AutoTracker.Info.NoMatch=Tiada padanan ditemui di kawasan carian ditunjukkan. Pilihan anda adalah: AutoTracker.Info.Outside=Kawasan carian berada di luar imej. Pilihan anda adalah: AutoTracker.Info.Accepted=Padanan diterima. AutoTracker.Info.MarkedByUser=Langkah ditanda secara manual oleh pengguna. AutoTracker.Info.NoVideo=Autotrek memerlukan video. AutoTracker.Info.Height=tinggi AutoTracker.Info.Width=lebar AutoTracker.Info.Accept=--terima padanan AutoTracker.Info.Retry=--ubah suai kawasan carian dan cari semula AutoTracker.Info.Mark=--shift-klik untuk tandaan secara manual AutoTracker.Info.Skip=--langkau bingkai ini dan teruskan dengan yang berikutnya AutoTracker.Info.Reset=-- undur untuk bingkai yang ditanda dengan betul dan shift-control-klik untuk mentakrifkan bingkai kekunci baharu AutoTracker.Info.MatchScore=skor padanan AutoTracker.Dialog.MaskLocked.Title=Templat Berkunci PointMass.Cursor.Autotrack.Description=Kursor autotrek VideoPlayer.StartFrame.Hint=seret untuk menetapkan bingkai mula VideoPlayer.EndFrame.Hint=seret untuk menetapkan bingkai akhir VideoPlayer.Slider.Hint=seret untuk imbas video FileDropHandler.Dialog.BadFile.Message=tidak dapat dimuatkan. FileDropHandler.Dialog.BadFile.Title=Fail Tak Dikenali # Additions by Doug Brown 2009-10-27 Dialog.Button.Apply=Guna DynamicParticle.Dialog.Delete.Message=Membuang zarah ini akan mengeluarkannya dari sistem. Buang sahaja? DynamicParticle.Dialog.Delete.Title=Sistem Dinamik DynamicParticle.System.In=masuk DynamicSystem.Empty=kosong DynamicSystem.Force.Name.Internal=dalaman DynamicSystem.ForceFunction.R.Description=Daya dalaman komponen jejarian DynamicSystem.ForceFunction.Theta.Description=Daya dalaman komponen tangen DynamicSystem.MenuItem.Inspector=Pilih Zarah... DynamicSystem.Name=Dinamik Sistem Dua Jasad DynamicSystem.New.Name=sistem DynamicSystem.Parameter.Of=daripada DynamicSystem.Parameter.RelativeTo=relatif terhadap DynamicSystem.Parameter.Name.Relative=relatif DynamicSystem.Parameter.ParticleMass.Description=Jisim DynamicSystem.Parameter.Mass.Description=Jumlah jisim sistem ini DynamicSystemInspector.Border.Title=Zarah DynamicSystemInspector.Title=TSistem Dua Jasad DynamicSystemInspector.Button.Change=Ubah Ke... DynamicSystemInspector.ParticleName.None=(tiada) TMenuBar.MenuItem.Clone=Klon TMenuBar.MenuItem.TwoBody=Sistem Dua Jasad TrackerPanel.DataBuilder.Dropdown.Tooltip=Trek yang sedang dipilih TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Segerakkan Paksi Tegak TrackControl.Button.Trace.ToolTip=Tunjuk atau sembunyi laluan TToolBar.Button.Open.Tooltip=Buka video atau fail tracker dalam tab baharu TToolBar.Button.Save.Tooltip=Simpan tab semasa dalam fail TToolBar.Button.SelectTrack=Pilih TToolBar.Button.SelectTrack.Tooltip=Pilih trek sedia ada TTrack.MenuItem.ClearSteps=Bersih Langkah PointMass.MenuItem.Position=Kedudukan TMenuBar.MenuItem.Empty=(Kosong) TTrackBar.Button.Memory=memori digunakan: TTrackBar.Button.Memory.Tooltip=Pantau dan urus memori TTrackBar.Memory.PopupItem.Launch1=Lancar TTrackBar.Memory.PopupItem.Launch2=dengan memori TButton.Track.ToolTip=Set ciri-ciri bagi Tracker.Dialog.OutOfMemory.Message1=Tracker telah kehabisan memori. Tracker.Dialog.OutOfMemory.Message2=Klik butang memori untuk pilihan. Tracker.Dialog.OutOfMemory.Title=Memori habis # Additions by Doug Brown 2010-12-27 AutoTracker.Wizard.Checkbox.LookAhead=Lihat Ke Depan AutoTracker.Label.Original=Bingkai Kekunci AutoTracker.Label.NoMask=tiada AutoTracker.Label.Rate=Kadar: AutoTracker.Info.Mask3=Petua: templat tidak semestinya besar mahupun terkandung keseluruhan objek. Ciri yang unik dengan piggir berkontras tinggi biasanya memberikan hasil terbaik. AutoTracker.Wizard.Checkbox.XAxis=Hanya paksi-X AutoTracker.Info.SearchOnAxis1= Paksi-x di kawasan carian diimbas untuk padanan terbaik. Alih atau ubah saiz kawasan carian dengan menyeret pusat atau pemegangnya, AutoTracker.Info.PossibleOnAxis=Satu padanan mungkin telah ditemui sepanjang paksi-x dalam kawasan carian yang ditunjukkan. Pilihan anda adalah: AutoTracker.Info.NoMatchOnAxis=Tiada padanan ditemui sepanjang paksi-x dalam rantau carian yang ditunjukkan. Pilihan anda adalah: AutoTracker.Info.RetryOnAxis=-—alih kawasan carian atau paksi-x dan carian semula AutoTracker.Wizard.Button.Delete=Buang AutoTracker.Wizard.Button.DeleteMoreDelete Later Points Buang Titik-titik Kemudian Button.Define.Tooltip=Mentakrif fungsi pembolehubah lajur sedia ada Calibration.Label.Point=titik CalibrationStick.Hint=set panjang atau seret hujung untuk ubah skala, set sudut untuk ubah condong CalibrationStick.End.Hint=seret untuk ubah skala, shift-klik untuk tanda semula CalibrationStick.New.Name=kayu tentu ukur CalibrationTapeMeasure.New.Name=pita tentu ukur CalibrationTapeMeasure.Readout.Magnitude.Hint=klik untuk memasukkan panjang yang diketahui dalam unit dunia CalibrationTapeMeasure.Hint=set panjang untuk ubah skala, set sudut untuk ubah condong DynamicSystem.Data.Description.0=jarak relatif di antara zarah DynamicSystem.Data.Description.1=sudut relatif DynamicSystem.Data.Description.2=halaju jejarian relatif DynamicSystem.Data.Description.3=halaju sudut relatif ExportDataDialog.Subtitle.Table=Jadual Data ExportDataDialog.Subtitle.Content=Sel ExportDataDialog.Subtitle.Format=Format Nombor ExportDataDialog.Subtitle.Delimiter=Pembatas ExportDataDialog.Title=Eksport Data ExportDataDialog.Delimiter.Add=Tambah... ExportDataDialog.Delimiter.Remove=Singkir... ExportDataDialog.Content.AllCells= Sel ExportDataDialog.Content.SelectedCells=Sel terpilih ExportDataDialog.MenuItem.RemoveDelimiter=Padam pembatas tersuai ExportDataDialog.Chooser.SaveData.Title=Simpan Data Sebagai ExportVideoDialog.Button.SaveAs=Simpan Sebagai... ExportVideoDialog.Button.FullSize=Saiz penuh ExportVideoDialog.Button.DrawnSize=Seperti yang terlukis ExportVideoDialog.Content.VideoOnly=Video sahaja ExportVideoDialog.Content.VideoAndGraphics=Video dan grafik ExportVideoDialog.Content.GraphicsOnly=Grafik sahaja ExportVideoDialog.Title=Eksport Klip video ExportVideoDialog.Label.ClipSettings=Tetapan klip ExportVideoDialog.Subtitle.Size=Saiz ExportVideoDialog.Subtitle.Content=Kandungan ExportVideoDialog.Subtitle.View=Pandangan ExportVideoDialog.Subtitle.Format=Format ExportVideoDialog.Complete.Message1=Video ini telah disimpan sebagai ExportVideoDialog.Complete.Message2=Adakah anda ingin membukanya dalam Tracker sekarang? ExportVideoDialog.Complete.Title=Eksport Selesai ExportVideoDialog.VideoSize=saiz video ExportVideoDialog.MatSize=saiz alas ExportVideo.Dialog.HiddenPlots.Message=Plot mestilah tampak keseluruhannya untuk dieksport. ExportVideo.Dialog.HiddenPlots.Title=Paparan Tak Lengkap Footprint.DoubleTarget=rerambut silang berganda Footprint.BoldDoubleTarget=rerambut silang tebal OffsetOrigin.MenuItem.Fixed=Koordinat Dunia Tetap ParticleModel.Dialog.Offscreen.Message1=Beberapa langkah model adalah kosong kerana terlalu jauh tersasar dari skrin. ParticleModel.Dialog.Offscreen.Message2=Untuk membaikinya, ubah model atau skala semula video. ParticleModel.Dialog.Offscreen.Title=Luar Sempadan PrefsDialog.Tab.Configuration.Title=Konfigurasi PrefsDialog.Memory.BorderTitle=Saiz Memori PrefsDialog.Tab.General.Title=Umum PrefsDialog.RecentFiles.BorderTitle=Buka Menu Terakhir PrefsDialog.Label.RecentSize=Kiraan fail PrefsDialog.Hints.BorderTitle=Panduan PrefsDialog.Button.Relaunch=Lancar Semula Sekarang PrefsDialog.Button.ClearRecent=Bersih PrefsDialog.Checkbox.DefaultSize=Guna lalai PrefsDialog.Checkbox.HintsOn=Tunjukkan panduan dengan lalai PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Enjin Video PrefsDialog.Button.Xuggle=Xuggle PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Pengurusan ingatan tak tersedia apabila menggunakan Web Start PrefsDialog.Dialog.WebStart.Title=Mod Web Start PrefsDialog.LookFeel.BorderTitle=Lihat dan Rasa PrefsDialog.Language.BorderTitle=Language Bahasa PrefsDialog.Upgrades.BorderTitle=Periksa Penaik Taraf PrefsDialog.Tab.Runtime.Title=Runtime Waktu Jalan PrefsDialog.Tab.Display.Title=Paparan PrefsDialog.Language.Default=lalai PrefsDialog.Upgrades.Always=Setiap hari PrefsDialog.Upgrades.Weekly=Setiap minggu PrefsDialog.Upgrades.Monthly=Setiap bulan PrefsDialog.Upgrades.Never=Tak perlu PrefsDialog.Button.CheckForUpgrade=Periksa Sekarang PrefsDialog.Xuggle.Speed.BorderTitle=Main Semula Video Xuggle PrefsDialog.Xuggle.Slow=Licin (mungkin perlahan) PrefsDialog.Xuggle.Fast=Laju (mungkin tersekat-sekat) PrefsDialog.CalibrationTool.BorderTitle=Tool Alat Tentu Ukur Lalai Protractor.Name=Jangka Sudut Protractor.New.Name=jangka sudut Protractor.Hint=seret lengan untuk ukur sudut Protractor.Label.Angle=sudut Protractor.Field.Angle.Tooltip=Sudut di antara lengan jangka sudut Protractor.Vertex.Name=bucu Protractor.Vertex.Hint=seret untuk alih bucu Protractor.End.Name=hujung lengan Protractor.End.Hint=drag to rotate the arm seret untuk putar lengan Protractor.Handle.Name=pemegang Protractor.Handle.Hint=seret untuk alihkan jangka sudut Protractor.Rotator.Name=pemutar Protractor.Rotator.Hint=seret untuk putarkan jangka sudut Protractor.Readout.Name=bacaan Protractor.Readout.Hint=sudut di antara lengan jangka sudut ProtractorFootprint.Circle3=bulatan kecil ProtractorFootprint.Circle5=bulatan besar ProtractorFootprint.Circle3Bold=bulatan kecil tebal ProtractorFootprint.Circle5Bold=bulatan besar tebal Stick.Name=Kayu Tentu Ukur Stick.New.Name=kayu tentu ukur TableTrackView.MenuItem.Unformatted=Kepersisan Penuh TableTrackView.MenuItem.Formatted=Seperti yang Terformat TableTrackView.Menu.SetDelimiter=Set Penghehad TableTrackView.MenuItem.AddDelimiter=Tambah... TableTrackView.MenuItem.RemoveDelimiter=Singkir... TableTrackView.Dialog.CustomDelimiter.Message=Masukkan tetali pembatas baharu: TableTrackView.Dialog.CustomDelimiter.Title=Tambah Pembatas TableTrackView.Header.Tooltip=Klik untuk sisih atau klik-berganda untuk pilih lajur TableTrackView.MenuItem.CopySelectedData=Salin Sel Terpilih TableTrackView.Dialog.RemoveDelimiter.Message=Pilih pembatas untuk singkir: TableTrackView.Dialog.RemoveDelimiter.Title=Singkkir Pembatas TableTrackView.Radians.Tooltip=dalam radian TableTrackView.Degrees.Tooltip=dalam darjah TableTrackView.RadiansPerSecond.Tooltip=dalam radian/s TableTrackView.DegreesPerSecond.Tooltip=dalam darjah/s TableTrackView.RadiansPerSecondSquared.Tooltip=dalam radian/s^2 TableTrackView.DegreesPerSecondSquared.Tooltip=dalam darjah/s^2 TableTrackView.MenuItem.DeleteDataFunction=DBuang Fungsi Data TActions.Action.SaveFrame=Simpan Tabset Sebagai... TActions.AboutVideo=Sifat... TActions.Dialog.AboutVideo.Title=Sifat Video TActions.Dialog.AboutVideo.Type=Jenis TActions.Dialog.AboutVideo.SizeDimensi TActions.Dialog.AboutVideo.Length=Panjang TActions.Dialog.AboutVideo.Frames=bingkai TActions.Dialog.AboutVideo.Seconds=saat TActions.Dialog.AboutVideo.FrameRate=Kadar Bingkai TActions.Dialog.AboutVideo.FramesPerSecond=fps TActions.Dialog.AboutVideo.Path=Laluan TActions.Action.ImportTRK=Fail Tracker… TActions.Action.ProtractorVisible=Tampak TapeMeasure.MenuItem.FixedLength=Panjang Tetap TextTView.Label.NoTab=Klik “Halaman†untuk tambah teks dan halaman HTML di sini. TextTView.NewTab.Text1=Klik-berganda untuk sunting teks atau judul. Klik-kanan untuk lebih pilihan. TextTView.NewTab.Text2=Untuk papar halaman HTML, masukkan url atau klik-kanan untuk buka fail. TextTView.NewTab.Title=Tak Bertajuk TextTView.Dialog.TabTitle.Title=Set Judul TextTView.MenuItem.OpenHTML=Buka HTML... TextTView.MenuItem.SetTitle=Set Judul... TextTView.Button.NewTab=Baharu TextTView.TextEdit.Description=Teks TFrame.Dialog.FileNotFound.Message=Fail tak dapat ditemui. TFrame.Dialog.FileNotFound.Title=Fail Tak Ditemui. TFrame.View.Text=Pandangan Halaman TFrame.View.Main=Pandangan Utama TMenuBar.Menu.OpenRecent=Buka Terakhir TMenuBar.Menu.Import=Import TMenuBar.Menu.Export=Eksport TMenuBar.MenuItem.Video=Video... TMenuBar.MenuItem.Data=Fail Data... TMenuBar.Menu.CopyObject=Salin Objek TMenuBar.MenuItem.Coords=Sistem Koordinat TMenuBar.MenuItem.VideoClip=Klip video TMenuBar.Menu.MeasuringTools=Alat Pengukuran TMenuBar.Menu.AngleUnits=Unit Sudut TMenuBar.MenuItem.Degrees=Darjah TMenuBar.MenuItem.Radians=Radian Tracker.Dialog.NoXuggle.Title=Xuggle tak ditemui Tracker.Dialog.NoXuggle.Message1=Xuggle (enjin video rentas platform) tak terpasang. Tracker.Dialog.NoXuggle.Message2=Muat turun Xuggle daripada http://www.xuggle.com/xuggler/downloads/. Tracker.Action.AboutXuggle=Tentang Xuggle... Tracker.Dialog.AboutXuggle.Title=Tentang Xuggle Tracker.Dialog.AboutXuggle.Message.Version=Versi Xuggle Tracker.Dialog.AboutXuggle.Message.Home=Rumah Xuggle: Tracker.Dialog.AboutXuggle.Message.Path=Laluan jar Xuggle: Tracker.Dialog.NoVideoEngine.Message1=Tiada enjin video terpasang. Tanpanya, anda Tracker.Dialog.NoVideoEngine.Message2=hanya boleh buka imej (JPEG, PNG) dan GIF bergerak. Tracker.Dialog.NoVideoEngine.Message3=Disyorkan: pasang semula Tracker dengan enjin video Xuggle. Tracker.Dialog.NoVideoEngine.Title=Tiada Engin Video Tracker.Dialog.NoXuggle.Message1=Xuggle tidak berfungsi dengan betul. Sila pastikan keperluan Tracker.Dialog.NoXuggle.Message2=fail jar xuggle berada dalam direktori rumah Tracker. Untuk butiran lanjut, Tracker.Dialog.NoXuggle.Message3=lihat Tracker_README.txt dalam direktori rumah Tracker. Tracker.Dialog.NoXuggle.Message4=Untuk pasang Xuggle, muat turun pemasang Tracker terkini daripada Tracker.Dialog.NoXuggle.Title=Xuggle Tak Tersedia Tracker.About.DefaultLocale=Penempatan lalai Tracker.About.CurrentLanguage=ahasa Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory Ingatan Tak Cukup Tracker.Dialog.InsufficientMemory.Message=Saiz ingatan yang dikehendaki terlalu besar. TrackerIO.Dialog.TabMustBeSaved.Message1=Tab TrackerIO.Dialog.TabMustBeSaved.Message2=mesti disimpan sebagai fail tracker untuk dimasukkan dalam tabset. TrackerIO.Dialog.TabMustBeSaved.Message3=Adakah anda ingin menyimpannya? TrackerIO.Dialog.TabMustBeSaved.Title=Tab Belum Simpan TrackerIO.Dialog.NoTabs.Message=Tiada tab untuk disimpan! TrackerIO.Dialog.NoTabs.Title=Tabset Kosong TrackerIO.Dialog.SaveTabset.Title=Simpan Tabset TrackerIO.Dialog.SaveTab.TitleSimpan Tab TrackerIO.Delimiter.Tab=Tab TrackerIO.Delimiter.Space=Jarak TrackerIO.Delimiter.Comma=Koma TrackerIO.Delimiter.Semicolon=Koma bernoktah TrackerIO.VideoAndDataFileFilter.Description=Fail Video dan Tracker TrackerPanel.Dialog.Version.Message1=Anda sedang membuka fail yang dihasilkan dengan Tracker TrackerPanel.Dialog.Version.Message2=yang mungkin merujuk kepada TrackerPanel.Dialog.Version.Message3=ciri-ciri yang tiada dalam versi yang sedang anda gunakan TrackerPanel.Dialog.Version.Message4=Versi terkini tersedia di TrackerPanel.Dialog.Version.Title=Ketaksepadanan Versi TrackerPanel.Label.ModelStart=Bingkai mula TrackerPanel.Label.ModelEnd=Bingkai akhir TrackerPanel.Spinner.ModelStart.Tooltip=Set bingkai mula untuk model ini TrackerPanel.Spinner.ModelEnd.Tooltip=Set bingkai akhir untuk model ini TToolbar.Button.ProtractorVisible.Tooltip=Tunjuk atau sembunyi jangka sudut TToolbar.Button.AxesVisible.Tooltip=Tunjuk atau sembunyi paksi koordinat TToolBar.Button.TrackControl.Tooltip=Tunjuk atau sembunyi kawalan trek TTrack.Dialog.StepSizeWarning.Message1=Awas: sesetengah trek ditandai pada saiz langkah besar daripada satu, membiarkan bingkai yang dilangkau tak bertanda. TTrack.Dialog.StepSizeWarning.Message2=Perubahan saiz langkah akan menyebabkan sela dalam set data. TTrack.Dialog.StepSizeWarning.Message3=Halaju dan pecutan sekitar sela tak boleh ditentukan sehingga semua langkah ditandai. TTrack.Dialog.StepSizeWarning.Title=Awas TTrack.Dialog.SkippedStepWarning.Message1=Awas: langkau langkah ketika menandai kedudukan menghasilkan sela dalam set data. TTrack.Dialog.SkippedStepWarning.Title=Awas TTrack.Dialog.SkippedStepWarning.Checkbox=Jangan tunjuk ini lagi TTrack.Locked.Hint=berkunci TTrack.AngleField.Radians.Tooltip=Sudut dalam radian TTrack.AngleField.Degrees.Tooltip=Sudut dalam darjah TTrack.AngleField.Popup.Radians=Tukar Ke Radian TTrack.AngleField.Popup.Degrees=Tukar Ke Darjah TTrackBar.Memory.Menu.SetSize=Set saiz ingatan… TTrackBar.Button.Version=ekarang tersedia: versi TTrackBar.Popup.MenuItem.Upgrade=Naik taraf sekarang... TTrackBar.Popup.MenuItem.Ignore=Abai XuggleVideo.MenuItem.SmoothPlay=Main Licin (mungkin perlahan) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Pita Tentu Ukur CircleFootprint.Circle=bulatan CircleFootprint.FilledCircle=bulatan berisi CircleFootprint.Dialog.Title=Trek Bulatan CircleFootprint.Dialog.Label.Radius=Jejari CircleFootprint.Dialog.Checkbox.Bold=Tebal CircleFootprint.Dialog.Checkbox.CenterSpot=Titik Pusat LineProfile.Hint.Marking=seret tetikus untuk menanda profil garis PageTView.Button.Page=Halaman PageTView.MenuItem.ClosePage=Tutup Halaman PointMass.Hint.Marking=klik tetikus untuk menanda, tekan kekunci Enter untuk klon langkah sebelumnya PrefsDialog.Dialog.NewVersion.Title=Penaik taraf PrefsDialog.Dialog.NewVersion.Message1Versi PrefsDialog.Dialog.NewVersion.Message2=sekarang tersedia di PrefsDialog.Dialog.NewVersion.None.Message=Tiada versi baharu tersedia pada masa ini. RGBRegion.Hint.Marking=klik tetikus untuk menanda pusat rantau TMenuBar.MenuItem.Restore=Kembalikan Pandangan TrackControl.StretchVectors.None=Tiada regangan TViewChooser.Maximize.Tooltip=Maksimumkan pandangan ini TViewChooser.Restore.Tooltip=Kembalikan pandangan Vector.Hint.Marking=seret tetikus untuk menanda, tekan Enter untuk klon langkah sebelumnya WorldTView.Button.World=Dunia # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Amaran PrefsDialog.Checkbox.WarnIfNoEngine=Tiada enjin video PrefsDialog.Checkbox.WarnIfXuggleError=Ralat tak maut Xuggle PropertiesDialog.Title=Sifat PropertiesDialog.Label.Author=Pengarang PropertiesDialog.Label.Contact=Contact Hubungi TActions.Action.Properties=Sifat... TActions.Action.OpenBrowser=Buka Pelayar Pustaka... TFrame.Progress.Xuggle=bingkai pemuatan Xuggle TFrame.Progress.ClickToCancel=(klik untuk batal) TFrame.Dialog.StalledVideo.Title=Ralat Pemuatan Videa TFrame.Dialog.StalledVideo.Message0=Video tersekat ketika pemuatan. Ini mungkin sementara. TFrame.Dialog.StalledVideo.Message1=Anda boleh pilih untuk hentikan pemuatan sekarang atau terus menunggu. TFrame.Dialog.StalledVideo.Message2=Pilihan lain untuk membuka video ini termasuklah: TFrame.Dialog.StalledVideo.Message3=1. Gunakan perisian penukaran video untuk menukarkannya ke format lain. TFrame.Dialog.StalledVideo.Message4=2. Pilih QuickTime dalam pemilih fail atau dialog keutamaan. TFrame.Dialog.StalledVideo.MessageMac=2. Buka Tracker dalam Java JM 32-bit dan bukanya dengan QuickTime. TFrame.Dialog.StalledVideo.Button.Stop=Henti TFrame.Dialog.StalledVideo.Button.Wait=Tunggu Tracker.Dialog.NoVideoEngine.Checkbox=Jangan tunjuk ini lagi TrackerIO.ZipFileFilter.Description=fail ZIP (.zip) TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle mengalami ralat berikut apabila membuka video ini: TrackerIO.Dialog.ErrorFFMPEG.Message2=Tidak semua ralat adalah maut. Untuk mesej ralat penuh, pilih Bantuan|Log Mesej TrackerIO.Dialog.ErrorFFMPEG.Message3=Jika Xuggle gagal, anda boleh buka video dengan QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Nota: Pada Mac OSX, ini memerlukan Tracker digunakan dalam Java JM 32-bit. TrackerIO.Dialog.ErrorFFMPEG.Title=Ralat Xuggle TrackerIO.ErrorFFMPEG.LogMessage=Untuk butiran lanjut, aktifkan amaran Xuggle dalam dialog keutamaan (Sunting/Keutamaan). TToolBar.Button.OpenBrowser.Tooltip=Buka Pelayar Pustaka Digital OSP # Additions by Doug Brown 2011-07-20 TFrame.Dialog.NoTRKInComPADRE.Title=Fail Tak Ditemui TFrame.Dialog.NoTRKInComPADRE.Message=No Tracker file was found for node Tiada fail Tracker ditemui untuk nod # Additions by Doug Brown 2011-08-08 AnalyticParticle.Builder.Title=Zarah Kinematik DynamicParticle.Builder.Title=Zarah Dinamik (Cartes) DynamicParticlePolar.Builder.Title=Zarah Dinamik (Kutub) DynamicSystem.Builder.Title=Sistem Dinamik (Dalaman) PropertiesDialog.Button.CopyFilePath=Salin Laluan Fail PropertiesDialog.Button.CopyVideoPath=Salin Laluan Video PropertiesDialog.Tab.TrackerFile=Fail Tracker PropertiesDialog.Tab.Metadata=Metadata PropertiesDialog.Header.Property=Sifat PropertiesDialog.Header.Value=Nilai TActions.Action.OpenURL=Buka URL... TActions.Dialog.OpenURL.Title=Buka URL TActions.Dialog.OpenURL.Message=Masukkan URL video berasaskan web, fail Tracker atau fail zip Tracker TActions.Dialog.AboutVideo.Name=Nama # Additions by Doug Brown 2011-08-25 PrefsDialog.CacheFiles.BorderTitle=Fail Web Tercache? PrefsDialog.Button.ClearCache=Bersih Semua # Additions by Doug Brown 2011-10-07 PointMass.Remark.Hint=, shift-klik untuk tanda semula kedudukan yang diserlahkan PointMass.Remarking.Hint=klik tetikus untuk tanda semula kedudukan PointMass.PositionSelected.Hint=seret atau masukkan kedudukan pada bar alat PointMass.VectorSelected.Hint=seret untuk alih Vector.Remark.Hint=hift-klik untuk tanda semula tip yang diserlahkan Vector.TipSelected.Hint=seret atau masukkan komponen pada bar alat Vector.HandleSelected.Hint=seret untuk alih Vector.Remarking.Hint=klik tetikus untuk tanda semula tip AutoTracker.Label.Search=Cari AutoTracker.Label.Target=Sasaran AutoTracker.Label.Frame=Bingkai AutoTracker.Label.Point=Titik AutoTracker.Label.Template=Templat AutoTracker.Label.Track=Trek AutoTracker.Label.Match=Padan AutoTracker.Label.NoTemplate=Tiada Templat AutoTracker.Label.EvolutionRate=Kadar Evolusi AutoTracker.Label.Automark=Autotanda AutoTracker.Info.Instructions=Klik butang Cari untuk mendapatkan padanan dalam kawasan carian yang ditunjukkan. AutoTracker.Info.KeyFrame.Instructions1=Bingkai kekunci ini mentakrifkan templat dan sasaran yang ditunjukkan. Klik butang Cari untuk mendapatkan padanan pada templat. AutoTracker.Info.KeyFrame.Instructions2=Anda boleh seret sasaran, template atau kawasan carian untuk alihkan atau saizkannya semula. AutoTracker.Info.MouseOver.Instructions=Lalukan tetikus pada kawalan di atas untuk ketahui lebih lanjut tentang tetapan dan pelarasan. AutoTracker.Info.Mask1=Templat adalah imej yang ingin dipadankan. Ia bermula dengan bingkai kekunci dan berubah ansur dengan penyesuaian terhadap perubahan bentuk dan warna. AutoTracker.Info.Mask2=Aras autotanda adalah skor padanan minimum yang diperlukan untuk penandaan automatik, AutoTracker.Info.Mask.Instructions=Alih atau saizkan semula templat dengan menyeret tepi atau bucu pemegang (bingkai kekunci sahaja). Laraskan kada evolusi dan aras autotanda menggunakan gelegar. AutoTracker.Info.Mask.Tip=Aras autotanda rendah akan menghasilkan padanan yang salah--cuba tinggikan kadar evolusi pula. AutoTracker.Info.Search=Kawasan carian diimbas untuk padanan terbaik. AutoTracker.Info.SearchOnAxis=Paksi-x dalam kawasan carian diimbas untuk padanan terbaik. AutoTracker.Info.Search.Instructions=Alih atau saizkan semula kawasan carian dengan menyeret tepi atau bucu pemegang. Set paksi-x dan pilihan lihat-ke-depan dengan menyemak kotaknya. AutoTracker.Info.Search.Tip=Kawasan carian tidak perlu besar dalam kebanyakan kes. Pilihan lihat-ke-depan mengalihkan kawasan carian ke kedudukan padanan yang diramalkan secara automatik. AutoTracker.Info.Target=The target is where the targeted track point is marked. Sasaran ialah tanda pada titik trek yang disasarkan. AutoTracker.Info.Target.Instructions=Alih sasaran dengan menyeretnya (bingkai kekunci sahaja). Pilih trek dan titik yang disasarkan daripada senarai ke bawah. AutoTracker.Info.Title.Settings=Tetapan AutoTracker.Info.Title.Tip=Petua AutoTracker.Info.SelectTrack=Sila pilih atau cipta trek dan titik yang anda ingin autotrektrek AutoTracker.Info.OutsideXAxis=Paksi-x tidak melalui kawasan carian. Pilihan anda adalah: AutoTracker.Info.NewKeyFrame=--undur langkah dan ubah kadar evolusi atau shift-control-klik untuk mentakrifkan bingkai kekunci baharu AutoTracker.Info.Replace=--terima padanan AutoTracker.Info.Keep=--langkau bingkai ini dan biarkan tak berubah AutoTracker.Info.PossibleReplace=Padanan sesuai ditunjukkan. Pilihan anda adalah: AutoTracker.Wizard.Button.Accept=Terima AutoTracker.Wizard.Button.Stop=Henti AutoTracker.Wizard.Button.Skip=Langkau AutoTracker.Wizard.Button.Replace=Ganti AutoTracker.Wizard.Button.Keep=Tolak AutoTracker.Wizard.Button.Search=Cari AutoTracker.Wizard.Button.SearchThis=Cari Ini AutoTracker.Wizard.Button.SearchNext=Cari Berikutnya AutoTracker.Wizard.Button.Delete=Buang AutoTracker.Wizard.Button.ShowKeyFrame=unjuk Bingkai Kekunci AutoTracker.Wizard.Button.DeleteKeyFrame=Buang Bingkai Kekunci AutoTracker.Wizard.Checkbox.LookAhead=Lihat Ke Depan AutoTracker.Wizard.Checkbox.XAxis=Paksi-X Sahaja AutoTracker.Wizard.Menuitem.DeleteThis=Titik Ini AutoTracker.Wizard.Menuitem.DeleteLater=Titik Kemudian AutoTracker.Wizard.Menuitem.DeleteAll=Bersih Semua TToolBar.Button.AutoTracker.Tooltip=Tunjuk atau sembunyi autotrek MainTView.Popup.MenuItem.ZoomIn=Zum Dekat MainTView.Popup.MenuItem.ZoomOut=Zum Jauh MainTView.Popup.MenuItem.ZoomToFit=Zum Penuh TrackerIO.Dialog.DurationVaries.Title=Jangka Masa Bingkai TrackerIO.Dialog.DurationVaries.Message1=Sesetengah jangka masa menyisih daripada purata dengan lebih daripada TrackerIO.Dialog.DurationVaries.Message2=Untuk halaju dan pecutan yang tepat, anda perlu sisihkan bingkai ini daripada TrackerIO.Dialog.DurationVaries.Message3=pengiraan dengan mengesetkan bingkai mula dan bingkai akhir klip video. TrackerIO.Dialog.DurationVaries.Message4=Bingkai untuk disisihkan: TrackerIO.Dialog.DurationVaries.Message5=Jangka masa purata dan kadar bingkai jika disisihkan: TFrame.Dialog.LibraryError.Title=ralat TFrame.Dialog.LibraryError.Message=Tiada sumber boleh dimuatkan untuk nod # Additions by Doug Brown 2011-12-01 TTrack.Label.Unmarked=shift-klik untuk tanda PrefsDialog.Label.Path=Laluan PrefsDialog.Checkbox.ClearCacheOnExit=Bersih apabila keluar PrefsDialog.FileChooser.Title.Cache=Set Cache PrefsDialog.FileFilter.Directories=Direktori Tracker.Action.AboutThreads=Tentang Jalur... PrefsDialog.JRE.BorderTitle=Mesin Maya Java PrefsDialog.FileChooser.Title.JRE=Set Java VM PrefsDialog.FileFilter.JRE=Direktori dan Java VM PrefsDialog.Version.BorderTitle=Versi Tracker PrefsDialog.Version.Default=lalai PrefsDialog.Tab.ClearCacheOnExit=Bersih apabila keluar PrefsDialog.Run.BorderTitle=Program Dilaksanakan pada Permulaan PrefsDialog.FileChooser.Title.Run=Pilih Fail Boleh Laku PrefsDialog.Button.Save=Simpan Tracker.Readme=README Tracker Tracker.Readme.NotFound=Fail README tak ditemui Popup.MenuItem.Algorithm=Algoritma... AlgorithmDialog.Button.FiniteDifference=Beza Terhingga AlgorithmDialog.Button.BounceDetect=Bounce Detection Pengesanan Lantun AlgorithmDialog.TitledBorder.Choose=Pilih algoritma yang digunakan untuk mengira halaju dan pecutan: AlgorithmDialog.Title=Algoritma AlgorithmDialog.FiniteDifference.Message1=Ini ialah algoritma lalai. AlgorithmDialog.FiniteDifference.Message2=Halaju: v[i] = (x[i+1] - x[i-1]) / (2*dt) AlgorithmDialog.FiniteDifference.Message3=Pecutan: v[i] = a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt^2) AlgorithmDialog.BounceDetect.Message1=Algoritma ini melicinkan halaju dan pecutan tetapi juga mengesan perubahan tiba-tiba dalam halaju. AlgorithmDialog.BounceDetect.Message2=Awas: boleh menghasilkan artifak. Untuk maklumat tambahan, lihat: TMenuBar.Menu.Diagnostics=Diagnostik # Additions by Doug Brown 2012-02-12 Tracker.Dialog.Invalid.Title=XML Tak Sah Tracker.Dialog.Invalid.Message=Fail tak boleh dibaca. TrackPlottingPanel.Popup.Menu.CompareWith=Bandingkan Dengan TrackerPanel.DataBuilder.TrackType.Unknown=anu TrackerPanel.DataBuilder.Button.Load.Tooltip=Muat fungsi data daripada fail XML TrackerPanel.DataBuilder.Button.Save.Tooltip=Simpan fungsi data dalam fail XML TrackerPanel.DataBuilder.Load.Title=Muat Fungsi Data TrackerPanel.DataBuilder.Load.Message=Pilih fungsi untuk pemuatan: TrackerPanel.DataBuilder.Save.Title=Simpan Fungsi Data TrackerPanel.DataBuilder.Save.Message=Pilih fungsi untuk simpan: TrackerPanel.DataBuilder.Dialog.Load.Button.All=Muatkan dalam semua TrackerPanel.DataBuilder.Dialog.Load.Button.Only=Muatkan hanya dalam TrackerPanel.DataBuilder.Dialog.Load.Title=Pilihan Trek TrackerPanel.DataBuilder.Dialog.Load.Message=Adakah anda ingin memuatkan fungsi ke dalam semua trek jenis TrackerPanel.DataBuilder.Dialog.WrongTrackType.Title=Jenis Trek Tak Betul TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message1=Fail ini mentakrifkan fungsi data untuk jenis trek TrackerPanel.DataBuilder.Dialog.WrongTrackType.Message2=Ia tak boleh dimuatkan ke dalam jenis TrackerPanel.DataBuilder.Dialog.WrongType.Title=Jenis Tak Betul TrackerPanel.DataBuilder.Dialog.WrongType.Message=Fail ini tidak mentakrifkan fungsi data. # Additions by Doug Brown 2012-04-22 ExportTRKDialog.Complete.Message1=Klip Tracker telah disimpan sebagai ExportTRKDialog.Complete.Message2=Adakah anda ingin membukanya dalam Tracker sekarang? ExportTRKDialog.Complete.Title=Selesai Eksport ExportTRKDialog.Title=Eksport Klip Tracker ExportTRKDialog.Message1=Ia (1) mengeksport video klip, (2) menukar data tab untuk kesesuaian video yang dieksport dan (3) menyimpan tab yang ditukarkan sebagai fail Tracker yang baharu. ExportTRKDialog.Message2=Fail Tracker dan video disimpan dalam direktori yang sama dengan nama yang sama tetapi sambungan berbeza. TMenuBar.MenuItem.TabClip=Klip Tracker TMenuBar.Menu.CalibrationTools=Alat Tentu Ukur TrackerIO.Dialog.DurationVaries.Button.SetClip=Set Klip Disyorkan TrackerIO.Dialog.DurationVaries.Start=mula TrackerIO.Dialog.DurationVaries.End=tamat TrackerIO.Dialog.DurationVaries.Recommended=Klip Disyorkan # Additions by Doug Brown 2012-05-07 AttachmentInspector.Title=Sambung Hujung AttachmentInspector.Label.End=Hujung AttachmentInspector.Label.Vertex=Bucu AttachmentInspector.Header.PointName=Nama AttachmentInspector.Header.AttachedTo=Sambung Pada ExportTRKDialog.Label.VideoFormat=Format Video MeasuringTool.MenuItem.Attach=Sambung Hujung... PerspectiveTrack.Corner=selekoh PrefsDialog.LogLevel.BorderTitle=Aras Log Mesej Permulaan Protractor.Data.Description.0=masa Protractor.Data.Description.1=sudut jangka sudut Protractor.Data.Description.2=panjang lengan 1 Protractor.Data.Description.3=panjang lengan 2 Protractor.Data.Description.4=nombor langkah Protractor.Data.Description.5=nombor bingkai TapeMeasure.Data.Description.0=masa TapeMeasure.Data.Description.1=panjang TapeMeasure.Data.Description.2=sudut diukur dari paksi +x TapeMeasure.Data.Description.3=nombor langkah TapeMeasure.Data.Description.4=nombor bingkai # Additions by Doug Brown 2012-06-07 AutoTracker.Info.Unsearched=tak tercari AutoTracker.Info.KeyFrame=Bingkai Kekunci AutoTracker.Wizard.Menuitem.DeleteThisKeyFrame=Bingkai Kekunci Ini AutoTracker.Wizard.Menuitem.DeleteThisMatch=Padanan Ini AutoTracker.Wizard.Menuitem.DeleteLaterMatches=Padanan Berikutnya PrefsDialog.Checkbox.64BitVM=64-bit # Additions by Doug Brown 2012-11-20 AutoTracker.Wizard.Title=Autotrek Dialog.Button.Add=Tambah Dialog.Button.Remove=Alih PrefsDialog.Button.ClearHost=Bersih Hos PrefsDialog.Button.ClearHost.Tooltip=buang semua fail berkaitan dengan hos web yang dipilih daripada cache OSP PrefsDialog.Button.ClearCache.Tooltip=buang semua fail daripada cache OSP TActions.Action.SaveZip=Eksport ZIP Tracker ThumbnailDialog.Title=Eksport Imej Lakaran ThumbnailDialog.Settings.Title=Pilihan Lakaran ThumbnailDialog.Label.CurrentImage=Imej semasa ThumbnailDialog.Label.FrameNumber=bingkai ThumbnailDialog.Label.StepNumber=langkah ThumbnailDialog.View.VideoOnly=Video Sahaja ThumbnailDialog.View.MainView=Pandangan Utama ThumbnailDialog.View.WholeFrame=Keseluruhan Bingkai ThumbnailDialog.Format.PNG=Imej PNG ThumbnailDialog.Format.JPG=Imej JPEG ThumbnailDialog.Chooser.SaveThumbnail.Title=Simpan Lakaran ThumbnailDialog.Subtitle.Image=Imej TMenuBar.MenuItem.Thumbnail=Imej Lakaran TToolBar.Button.SaveZip.Tooltip=Eksport fail ZIP Tracker TTrack.MenuItem.DeletePoint=Buang Langkah Terpilih ZipResourceDialog.Title=Eksport ZIP Tracker ZipResourceDialog.Label.Format=Format ZipResourceDialog.Label.Title=Nama ZipResourceDialog.Label.Description=Pernyataan ZipResourceDialog.Label.Keywords=Kata kunci ZipResourceDialog.Label.Link=Pautan Luar ZipResourceDialog.Label.HTML=Sumber HTML ZipResourceDialog.Complete.Message1=Fail ZIP Tracker telah disimpan sebagai ZipResourceDialog.Complete.Message2=Adakah anda ingin membukanya dengan Tracker sekarang? ZipResourceDialog.Complete.Title=Berjaya ZipResourceDialog.Border.Title.Documentation=Dokumentasi HTML ZipResourceDialog.Border.Title.Video=Video ZipResourceDialog.Border.Title.Thumbnail=Lakaran ZipResourceDialog.FileChooser.SaveZip.Title=Eksport ZIP Tracker ZipResourceDialog.FileChooser.AddFile.Title=Tambah Fail kepada ZIP Tracker ZipResourceDialog.FileChooser.OpenHTML.Title=Buka Fail HTML ZipResourceDialog.Button.AddFiles=ATambah Fail ZipResourceDialog.Button.ThumbnailSettings=Tetapan -ZipResourceDialog.Checkbox.TrimVideo=Pangkas Klip ZipResourceDialog.AddHTMLInfo.Title=Tambah HTML Ke Dalam Fail ZipResourceDialog.AddHTMLInfo.Message1=Adakah anda ingin tambah HTML ke dalam fail ZipResourceDialog.AddHTMLInfo.Message2=ke ZIP Tracker? ZipResourceDialog.HTMLField.DefaultText=Jika tiada dikhususkan, fail kosong yang baharu akan dicipta. ZipResourceDialog.Dialog.AddFiles.Title=Tambah Fail HTML dan PDF ZipResourceDialog.Tooltip.HTML=Laluan ke fail sumber HTML (jika tiada, fail kosong yang baharu akan dibuat.) ZipResourceDialog.Tooltip.Author=Pengarang bagi sumber ini. ZipResourceDialog.Tooltip.Title=Papar nama sumber ini (bukan nama fail) ZipResourceDialog.Tooltip.Description=Pernyataan berguna sumber ini ZipResourceDialog.Tooltip.Keywords=Senarai kata kunci untuk carian dalam pelayar DL ZipResourceDialog.Tooltip.Contact=Maklumat perhubungan pengarang (institusi, e-mel, laman web, dsb.) ZipResourceDialog.Tooltip.Link=URL fail HTML luaran dengan maklumat lanjut tentang sumber ini ZipResourceDialog.Tooltip.ThumbnailSettings=Ubah pandangan, saiz atau jenis fail lakaran ZipResourceDialog.Tooltip.AddFiles=Tambah fail HTML dan PDF ke ZIP Tracker ZipResourceDialog.Tooltip.TrimVideo=Semak untuk eksport klip video, biarkan untuk guna video asal ZipResourceDialog.Tooltip.LoadHTML=Gunakan pemilih fail untuk muatkan HTML ke dalam fail # Additions by Doug Brown 2012-12-10 PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Jangka masa bingkai boleh ubah PrefsDialog.Button.NoEngine=Tiada PrefsDialog.Dialog.SwitchToQT.Message=Penukaran kepada QuickTime juga mengubah Java VM kepada 32-bit. PrefsDialog.Dialog.SwitchToXuggle32.Message=Penukaran kepada Xuggle juga mengubah Java VM kepada 32-bit. PrefsDialog.Dialog.SwitchToXuggle64.Message=Penukaran kepada Xuggle juga mengubah Java VM kepada 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Telah Berubah PrefsDialog.Dialog.SwitchTo32.Message=Penukaran ke Java VM 32-bit juga mengubah enjin video ke QuickTime PrefsDialog.Dialog.SwitchTo64.Message=Penukaran ke Java VM 64-bit juga mengubah enjin video ke Xuggle PrefsDialog.Dialog.SwitchEngine.Title=Enjin Video Telah Berubah PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Tiada enjin video tersedia untuk Java VM 64-bit. Anda PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=masih boleh buka imej (JPEG, PNG) dan GIF beranimasi. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Adakah anda pasti ingin bertukar ke VM 64-bit? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Tiada Enjin Video 64-bit. PrefsDialog.Dialog.No32bitVMXuggle.Message=Java VM 32-bit mesti dipasang sebelum Xuggle boleh digunakan. PrefsDialog.Dialog.No32bitVMQT.Message=Java VM 32-bit mesti dipasang sebelum QuickTime boleh digunakan. PrefsDialog.Dialog.No32bitVM.Message=Untuk maklumat lanjut, lihat Bantuan Tracker: Pemasangan PrefsDialog.Dialog.No32bitVM.Title=VM 32-bit Diperlukan PrefsDialog.Button.ShowHelpNow=Tunjuk Bantuan Sekarang TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=BUKAN PEMALAR TMenuBar.MenuItem.CheckFrameDurations=Jangka Masa Bingkai TMenuBar.MenuItem.ExportZIP=Zip Tracker Tracker.Dialog.Install32BitVM.Message=Anda mesti pasang Java VM 32-bit sebelum enjin video boleh digunakan. Tracker.Dialog.SwitchTo32BitVM.Message1=Satu atau lebih enjin video sudah terpasang tetapi tak tersedia kerana ia Tracker.Dialog.SwitchTo32BitVM.Message2=memerlukan Java VM 32-bit dan anda sedang menggunakan VM 64-bit. Tracker.Dialog.SwitchTo32BitVM.Question=Adakah anda ingin melancar semula dengan VM 32-bit dan enjin lalai? Tracker.Dialog.Button.RelaunchNow=Ya, lancar semula sekarang Tracker.Dialog.Button.ShowPrefs=Tidak, tetapi tunjukkan keutamaan Tracker.Dialog.Button.ContinueWithoutEngine=Tidak, teruskan tanpa video Tracker.Dialog.EngineProblems.Message1=Satu atau lebih enjin video sudah terpasang namun tidak berfungsi. Tracker.Dialog.EngineProblems.Message2=Untuk maklumat lanjut lihat Bantuan|Diagnostik|Tentang Xuggle atau QuickTime. Tracker.Dialog.ReplaceXuggle.Message1=Kami cadangkan anda gantikan enjin video Xuggle anda sekarang Tracker.Dialog.ReplaceXuggle.Message2=dengan Xuggle versi 3.4 melalui pemasangan semula Tracker (versi 4.75 Tracker.Dialog.ReplaceXuggle.Message3=atau lebih tinggi) dan pilih Xuggle dalam pilihan pemasangan. TrackerIO.Dialog.DurationIsConstant.Message=Semua jangka masa bingkai adalah sama (fps tetap). TrackerIO.ZIPResourceFilter.Description=Fail ZIP Tracker (.trz) TToolbar.Button.Desktop.Tooltip=Paparan berkaitan dokumen HTML dan/atau PDF ZipResourceDialog.BadModels.Message1=Klip video tidak mengandungi bingkai mula ZipResourceDialog.BadModels.Message2=Modul Zarah berikut. Jika anda pangkas video ZipResourceDialog.BadModels.Message3=model tersebut TIDAK akan termasuk dalam ZIP Tracker yang diimport. ZipResourceDialog.BadModels.Question=dakah anda ingin teruskan atau abaikan model tersebut? ZipResourceDialog.BadModels.Title=Konflik Klip-Model TMenuBar.MenuItem.EditVideoFrames=Tambah/Singkir Bingkai TMenuBar.Dialog.RequiresMemory.Message1=Semua imej mesti dimuatkan ke dalam ingatan untuk suntingan bingkai. Ini akan meningkatkan laju main semula. TMenuBar.Dialog.RequiresMemory.Message2=Sila semak ingatan tersedia dan lancarkan semula dengan lebih ingatan jika diperlukan. TMenuBar.Dialog.RequiresMemory.Title=Ingatan # Additions by Doug Brown 2013-01-25 PointMass.Data.Description.PixelX=piksel komponen-x PointMass.Data.Description.PixelY=piksel komponen-y ExportVideoDialog.Content.DeinterlacedVideo=Video ternyahjalin ExportVideoDialog.Deinterlace.OddFirst=Medan ganjil dahulu ExportVideoDialog.Deinterlace.EvenFirst=Medan genap dahulu ExportVideoDialog.Deinterlace.Dialog.Title=Tertib Medan Ternyahjalin TFrame.Dialog.LibraryError.FileNotFound.Title=Fail Tak Ditemui TFrame.Dialog.LibraryError.FileNotFound.Message=Tak boleh menjumpai fail TrackerPanel.DataBuilder.Button.Autoload=Automuat TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Urus fungsi data terautomuat TrackerPanel.DataBuilder.Autoload.Title=Automuat fungsi data TrackerPanel.DataBuilder.Autoload.Message=Pilih fungsi untuk automuat: TrackerPanel.DataBuilder.Chooser.XMLFiles=Fail XML TrackerIO.Dialog.Open.Title=Buka TToolbar.Button.Refresh.Popup.RefreshNow=Segar semula TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh Autosegar semula TToolbar.Button.Refresh.Tooltip=Segar semula data dan pandangan # Additions by Doug Brown 2013-05-10 CoordAxes.Origin.Label=kedudukan piksel asalan CoordAxes.Origin.Field.Tooltip=kedudukan asalan diukur dari pepenjuru kiri atas video # Additions by Doug Brown 2013-08-24 MainTView.Popup.MenuItem.Select=Pilih Titik MainTView.Popup.MenuItem.Deselect=Nyahpilih Titik ZipResourceDialog.Checkbox.PreviewThumbnail=Pratonton ZipResourceDialog.Dialog.BadFileName.Message=Nama fail tidak boleh mengandungi aksara berikut: ZipResourceDialog.Dialog.BadFileName.Title=Nama Fail Yang Tak Dibenarkan ZipResourceDialog.Dialog.ExportFailed.Message=Fail ZIP tak boleh dieksport. ZipResourceDialog.Dialog.ExportFailed.Title=Eksport Gagal PrefsDialog.Button.SetCache=Set Cache # Additions by Doug Brown 2013-12-17 Tracker.StartLog=Log Mula Tracker.StartLog.NotFound=Fail log mula tak ditemui Tracker.Dialog.MemoryReduced.Title=Ingatan Yang Dikehendaki Dikurangkan Tracker.Dialog.MemoryReduced.Message1=Tracker tak boleh dimulakan dengan ingatan Tracker.Dialog.MemoryReduced.Message2=jadi ingatan yang dikehendaki telah dikurangkan ke Tracker.Dialog.MemoryReduced.Message3=Untuk maklumat lanjut lihat Bantuan|Diagnostik|Log Mula... TrackPlottingPanel.Popup.MenuItem.ShowZero=Tunjuk TableTrackView.Menu.TextColumn.Text=Lajur Teks TableTrackView.Menu.TextColumn.Tooltip=Urus lajur teks boleh sunting TableTrackView.Action.CreateTextColumn.Text=Cipta... TableTrackView.Action.DeleteTextColumn.Text=Buang TableTrackView.Action.RenameTextColumn.Text=Nama Semula TableTrackView.Dialog.NameColumn.Message=Sila masukkan nama lajur. TableTrackView.Dialog.NameColumn.TryAgain=Nama tersebut sudah digunakan. TableTrackView.Dialog.NameColumn.Title=Lajur Teks TToolBar.MenuItem.StretchOff=Set Semula # Additions by Doug Brown 2014-02-20 PrefsDialog.Checkbox.WarnXuggleVersion=Versi Xuggle PrefsDialog.Checkbox.WarnCopyFailed=Ralat Salin Fail Enjin Video Tracker.Dialog.FailedToCopy.Title=Ralat Salin Fail Velocity.Dialog.Color.Title=Pilih Warna Halaju Acceleration.Dialog.Color.Title=Pilih Warna Pecutan TMenuBar.Menu.FontSize=Aras Fon TMenuBar.MenuItem.DefaultFontSize=Lalai PrefsDialog.FontSize.BorderTitle=Aras Fon TrackerPanel.Label.Booster=Pelancar TrackerPanel.Booster.None=(tiada) TrackerPanel.Dropdown.Booster.Tooltip=Jisim titik yang menetapkan keadaan awal model ini. CoordAxes.Checkbox.Grid=Grid CoordAxes.Checkbox.Grid.Tooltip=Papar tindihan grid CoordAxes.Button.Grid.Tooltip=Set warna dan kelegapan grid CoordAxes.Dialog.GridColor.Title=Pilih Warna Grid CoordAxes.MenuItem.GridColor=Warna Grid... CoordAxes.MenuItem.GridOpacity=Kelegapan.. CoordAxes.Dialog.GridOpacity.Title=Set Kelegapan Grid DynamicSystem.Dialog.RemoveBooster.Title=Konflik Pelancar DynamicSystem.Dialog.RemoveBooster.Message1=Zarah dalam sistem juga tidak boleh melancarkan satu yang lain. DynamicSystem.Dialog.RemoveBooster.Message2=Pelancar yang berkonfik akan dialihkan daripada DynamicSystem.Dialog.RemoveBooster.Message3=sebelum pengubahsuaian sistem. # Additions by Doug Brown 2014-05-09 PageTView.MenuItem.OpenInBrowser=Buka Halaman dalam Pelayar TToolbar.Button.Desktop.Menu.OpenPage=Halaman TToolbar.Button.Desktop.Menu.OpenFile=Fail # Additions by Doug Brown 2014-10-24 Tracker.Prefs.MenuItem.Text=Fail Keutamaan Tracker.Prefs.NotFound=Fail keutamaan tak ditemui TapeMeasure.Alert.UnfixScale.Message1=Skala Sistem Koordinat mesti dilonggarkan untuk diletakkan hujung. TapeMeasure.Alert.UnfixScale.Message2=Adakah anda ingin longgarkannya sekarang? TapeMeasure.Alert.UnfixScale.Title=Skala telah ditetapkan. Tracker.Dialog.StarterWarning.Title=Pelancaran Tak-Piawai # Additions by Doug Brown 2014-12-26 TrackDataBuilder.Dialog.NoFunctionsFound.Message=iada fungsi data yang ditemui untuk jenis trek TrackDataBuilder.Dialog.NoFunctionsFound.Title=Fungsi Tak Ditemui TrackDataBuilder.Instructions.SelectToAutoload=Pilih fungsi data untuk automuat daripada senarai di bawah. TrackDataBuilder.Instructions.WhereDefined=Fungsi ditakrifkan dalam fail XML Pembina Data yang ditemui dalam direktori yang ditunjukkan. TrackDataBuilder.Instructions.HowToAddFunction=Untuk tambah fungsi baru, ciptanya dalam Pembina Data, simpannya dalam fail XML, dan salin fail ke salah satu direktori. TrackDataBuilder.Instructions.HowToAddDirectory=TUntuk ubah laluan carian, klik butang Carian Laluan. TrackDataBuilder.Dialog.ConvertAutoload.Message1=Sesetengah fungsi terautomuat disimpan dalam format terdahulu. TrackDataBuilder.Dialog.ConvertAutoload.Message2=Adakah anda ingin menukarnya ke dalam format mudah alih baharu? TrackDataBuilder.Dialog.ConvertAutoload.Message3=Nota: format baharu tak boleh dibaca oleh Tracker versi terdahulu. TrackDataBuilder.Dialog.ConvertAutoload.Title=Tukar Fungsi Automuat? TrackDataBuilder.MenuItem.SaveAll.Text=Simpan semua TrackDataBuilder.MenuItem.SaveAll.Tooltip=Simpan semua fungsi dalam format mudah alih, boleh automuat (tak boleh dibaca oleh Tracker versi terdahulu). TrackDataBuilder.MenuItem.SaveOnly.Text=Simpan sahaja TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Simpan fungsi trek terpilih dalam format boleh baca oleh semua versi Tracker (tak boleh automuat) ParticleDataTrack.Name=Trek Data ParticleDataTrack.Builder.Title=Trek Data ParticleDataTrack.New.Name=trek data TActions.Action.ImportData=Sumber Data... TrackerIO.TextFileFilter.Description=Fail Teks (.txt) TrackerIO.JarFileFilter.Description=Fail Jar (.jar) TrackerIO.Dialog.OpenData.Title=Sumber Data Terbuka DataTrackClipControl.Label.Data=Data DataTrackClipControl.Label.Video=Video DataTrackClipControl.Border.Title=Klip Data DataTrackClipControl.Label.VideoStart=Bingkai Mula DataTrackClipControl.Label.FrameCount=Kiraan Bingkai DataTrackClipControl.Label.DataStart=Mula Data DataTrackClipControl.Label.Stride=Langkah Data ParticleDataTrackFunctionPanel.Border.Title=Kawalan Sumber Data DataTrackTimeControl.Button.Video=Masa Video DataTrackTimeControl.Button.Data=Masa Data DataTrackTimeControl.Border.Title=Basis Masa TActions.Action.DataTrack.Unsupported.JarFile=Fail Jar TActions.Action.DataTrack.Unsupported.Message=tak dapat hantar data ke Tracker TActions.Action.DataTrack.Unsupported.Title=Bukan Sumber Data # Additions by Doug Brown 2015-04-17 to 2015-05-30 DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video Tak dapat menemui video DataTrackTool.Dialog.VideoNotFound.Message2=Adakah anda mahu mencarinya? DataTrackTool.Dialog.VideoNotFound.Title=VVideo Tak Ditemui DataTrackTool.Dialog.FileNotFound.Message1=Tak boleh menemui fail DataTrackTool.Dialog.FileNotFound.Title=Fail Tak Ditemui DataTrackTool.Dialog.InvalidTRK.Message=Fail bukan fail TRK yang sah DataTrackTool.Dialog.InvalidTRK.Title=Fail Tak Sah DataTrackTool.Dialog.InvalidData.Message=Data tidak mengandungi kedudukan (x, y) DataTrackTool.Dialog.InvalidData.Title=Data Tak Sah ParticleDataTrack.Dialog.NoNewData.Message=Data dihantar tak melanjutkan data sedia ada. ParticleDataTrack.Dialog.NoNewData.Title=Tiada Data Baharu ParticleDataTrackFunctionPanel.Instructions.General=Klik-berganda masa awal untuk sunting atau guna gelegar untuk ubah tetapan video dan data. TrackerPanel.Dialog.NoData.Message=Tiada data ditemui TrackerPanel.Dialog.NoData.Title=Tiada Data TrackerPanel.Dialog.Exception.Message=Data tak boleh diimport kerana pengecualian berikut berlaku TrackerPanel.Dialog.Exception.Title=Import Data Gagal TActions.Dialog.URLResourceNotFound.Message=Tiada sumber ditemui pada URL TActions.Dialog.URLResourceNotFound.Title=Sumber Tak Ditemui CircleFitter.Name=Penyesuai Bulatan CircleFitter.New.Name=bulatan CircleFitter.Label.Radius=jejari CircleFitter.Checkbox.RadialLine=Garis jejarian CircleFitter.Checkbox.RadialLine.Tooltip=Tunjuk atau sembunyi garis jejarian CircleFitter.Field.Radius.Tooltip=Jejari bulatan penyesuaian terbaik CircleFitter.Field.CenterX.Tooltip=komponen-x pusat penyesuaian terbaik CircleFitter.Field.CenterY.Tooltip=komponen-y pusat penyesuaian terbaik CircleFitter.Label.MarkPoint=Penyesuaian bulatan memerlukan 3 atau lebih titik data CircleFitter.Hint.MarkMore=shift-klik untuk tanda lebih titik jika mahu CircleFitter.Hint.Mark3=shift-klik untuk tanda titik data CircleFitter.Data.Center=pusat CircleFitter.Data.Description.0=masa CircleFitter.Data.Description.1=pusat komponen-x CircleFitter.Data.Description.2=pusat komponen-y CircleFitter.Data.Description.3=jejari CircleFitter.Data.Description.4=nombor langkah CircleFitter.Data.Description.5=nombor bingkai CircleFitter.Data.Description.6=sudut garis jejarian CircleFitter.DataPoint.Name=titik perimeter CircleFitter.DataPoint.Hint=seret untuk alih CircleFitter.Slider.Name=garis jejarian CircleFitter.Slider.Hint=seret untuk putar CircleFitterFootprint.Circle4=titik kecil CircleFitterFootprint.Circle7=titik besar CircleFitterFootprint.Circle4Bold=titik kecil tebal CircleFitterFootprint.Circle7Bold=titik besar tebal CircleFitter.MenuItem.OriginToCenter=Alih Asalan ke Pusat CircleFitter.MenuItem.Inspector=Salin Langkah Jisim Titik... CircleFitter.MenuItem.ClearPoints=Bersih Titik CircleFitter.MenuItem.DeletePoint=Buang Titik Terpilih CircleFitter.Inspector.Instructions1=Ini menyesuaikan bulatan pada 3 atau lebih titik data. CircleFitter.Inspector.Instructions2=Anda boleh tanda titik secara manual atau salinnya daripada sumber titik jisim. CircleFitter.Inspector.Label.SourceTrack=Trek sumber CircleFitter.Inspector.Label.From=Langkah CircleFitter.Inspector.Label.To=ke CircleFitter.Inspector.Dropdown.None=Tiada CircleFitter.Inspector.Button.Apply=Salin Langkah TActions.Action.SaveVideoAs=Simpan Video Sebagai... TrackerIO.Export.Option.WithVideo=dengan video TrackerIO.Export.Option.WithoutVideo=tanpa video ParticleModel.MenuItem.UseDefaultReferenceFrame=Sentiasa Relatif Kepada Bingkai Rujukan Lalai TFrame.NotesDialog.Checkbox.ShowByDefault=Tunjuk nota dengan lalai \ No newline at end of file +AutoTracker.Info.Search1=Rantau carian diimbas untuk mendapatkan padanan terbaik. Alih atau ubah saiz rantau carian dengan menyeret tepi atau pemegangnya. AutoTracker.Info.Search2=Petua: Rantau carian tidak semestinya besar dalam banyak kes. Pilihan lihat-ke-depan mengalihkan rantau carian secara automatik ke kedudukan padanan yang diramalkan. AutoTracker.Info.Frame=Bingkai AutoTracker.Info.Match=Padanan telah ditanda secara automatik. AutoTracker.Info.Possible=Satu padanan mungkin ditemui dalam kawasan carian ditunjukkan. Pilihan anda adalah: AutoTracker.Info.NoMatch=Tiada padanan ditemui di kawasan carian ditunjukkan. Pilihan anda adalah: AutoTracker.Info.Outside=Kawasan carian berada di luar imej. Pilihan anda adalah: AutoTracker.Info.Accepted=Padanan diterima. AutoTracker.Info.MarkedByUser=Langkah ditanda secara manual oleh pengguna. AutoTracker.Info.NoVideo=Autotrek memerlukan video. AutoTracker.Info.Height=tinggi AutoTracker.Info.Width=lebar AutoTracker.Info.Accept=--terima padanan AutoTracker.Info.Retry=--ubah suai kawasan carian dan cari semula AutoTracker.Info.Mark=--shift-klik untuk tandaan secara manual AutoTracker.Info.Skip=--langkau bingkai ini dan teruskan dengan yang berikutnya AutoTracker.Info.Reset=-- undur untuk bingkai yang ditanda dengan betul dan shift-control-klik untuk mentakrifkan bingkai kekunci baharu AutoTracker.Info.MatchScore=skor padanan AutoTracker.Dialog.MaskLocked.Title=Templat Berkunci PointMass.Cursor.Autotrack.Description=Kursor autotrek VideoPlayer.StartFrame.Hint=seret untuk menetapkan bingkai mula VideoPlayer.EndFrame.Hint=seret untuk menetapkan bingkai akhir VideoPlayer.Slider.Hint=seret untuk imbas video FileDropHandler.Dialog.BadFile.Message=tidak dapat dimuatkan. FileDropHandler.Dialog.BadFile.Title=Fail Tak Dikenali # Additions by Doug Brown 2009-10-27 Dialog.Button.Apply=Guna DynamicParticle.Dialog.Delete.Message=Membuang zarah ini akan mengeluarkannya dari sistem. Buang sahaja? DynamicParticle.Dialog.Delete.Title=Sistem Dinamik DynamicParticle.System.In=masuk DynamicSystem.Empty=kosong DynamicSystem.Force.Name.Internal=dalaman DynamicSystem.ForceFunction.R.Description=Daya dalaman komponen jejarian DynamicSystem.ForceFunction.Theta.Description=Daya dalaman komponen tangen DynamicSystem.MenuItem.Inspector=Pilih Zarah... DynamicSystem.Name=Dinamik Sistem Dua Jasad DynamicSystem.New.Name=sistem DynamicSystem.Parameter.Of=daripada DynamicSystem.Parameter.RelativeTo=relatif terhadap DynamicSystem.Parameter.Name.Relative=relatif DynamicSystem.Parameter.ParticleMass.Description=Jisim DynamicSystem.Parameter.Mass.Description=Jumlah jisim sistem ini DynamicSystemInspector.Border.Title=Zarah DynamicSystemInspector.Title=TSistem Dua Jasad DynamicSystemInspector.Button.Change=Ubah Ke... DynamicSystemInspector.ParticleName.None=(tiada) TMenuBar.MenuItem.Clone=Klon TMenuBar.MenuItem.TwoBody=Sistem Dua Jasad TrackerPanel.DataBuilder.Dropdown.Tooltip=Trek yang sedang dipilih TrackPlottingPanel.Popup.MenuItem.MergeYAxes=Segerakkan Paksi Tegak TrackControl.Button.Trace.ToolTip=Tunjuk atau sembunyi laluan TToolBar.Button.Open.Tooltip=Buka video atau fail tracker dalam tab baharu TToolBar.Button.Save.Tooltip=Simpan tab semasa dalam fail TToolBar.Button.SelectTrack=Pilih TToolBar.Button.SelectTrack.Tooltip=Pilih trek sedia ada TTrack.MenuItem.ClearSteps=Bersih Langkah PointMass.MenuItem.Position=Kedudukan TMenuBar.MenuItem.Empty=(Kosong) TTrackBar.Button.Memory=memori digunakan: TTrackBar.Button.Memory.Tooltip=Pantau dan urus memori TTrackBar.Memory.PopupItem.Launch1=Lancar TTrackBar.Memory.PopupItem.Launch2=dengan memori TButton.Track.ToolTip=Set ciri-ciri bagi Tracker.Dialog.OutOfMemory.Message1=Tracker telah kehabisan memori. Tracker.Dialog.OutOfMemory.Message2=Klik butang memori untuk pilihan. Tracker.Dialog.OutOfMemory.Title=Memori habis # Additions by Doug Brown 2010-12-27 AutoTracker.Wizard.Checkbox.LookAhead=Lihat Ke Depan AutoTracker.Label.Original=Bingkai Kekunci AutoTracker.Label.NoMask=tiada AutoTracker.Label.Rate=Kadar: AutoTracker.Info.Mask3=Petua: templat tidak semestinya besar mahupun terkandung keseluruhan objek. Ciri yang unik dengan piggir berkontras tinggi biasanya memberikan hasil terbaik. AutoTracker.Wizard.Checkbox.XAxis=Hanya paksi-X AutoTracker.Info.SearchOnAxis1= Paksi-x di kawasan carian diimbas untuk padanan terbaik. Alih atau ubah saiz kawasan carian dengan menyeret pusat atau pemegangnya, AutoTracker.Info.PossibleOnAxis=Satu padanan mungkin telah ditemui sepanjang paksi-x dalam kawasan carian yang ditunjukkan. Pilihan anda adalah: AutoTracker.Info.NoMatchOnAxis=Tiada padanan ditemui sepanjang paksi-x dalam rantau carian yang ditunjukkan. Pilihan anda adalah: AutoTracker.Info.RetryOnAxis=-—alih kawasan carian atau paksi-x dan carian semula AutoTracker.Wizard.Button.Delete=Buang AutoTracker.Wizard.Button.DeleteMoreDelete Later Points Buang Titik-titik Kemudian Button.Define.Tooltip=Mentakrif fungsi pembolehubah lajur sedia ada Calibration.Label.Point=titik CalibrationStick.Hint=set panjang atau seret hujung untuk ubah skala, set sudut untuk ubah condong CalibrationStick.End.Hint=seret untuk ubah skala, shift-klik untuk tanda semula CalibrationStick.New.Name=kayu tentu ukur CalibrationTapeMeasure.New.Name=pita tentu ukur CalibrationTapeMeasure.Readout.Magnitude.Hint=klik untuk memasukkan panjang yang diketahui dalam unit dunia CalibrationTapeMeasure.Hint=set panjang untuk ubah skala, set sudut untuk ubah condong DynamicSystem.Data.Description.0=jarak relatif di antara zarah DynamicSystem.Data.Description.1=sudut relatif DynamicSystem.Data.Description.2=halaju jejarian relatif DynamicSystem.Data.Description.3=halaju sudut relatif ExportDataDialog.Subtitle.Table=Jadual Data ExportDataDialog.Subtitle.Content=Sel ExportDataDialog.Subtitle.Format=Format Nombor ExportDataDialog.Subtitle.Delimiter=Pembatas ExportDataDialog.Title=Eksport Data ExportDataDialog.Delimiter.Add=Tambah... ExportDataDialog.Delimiter.Remove=Singkir... ExportDataDialog.Content.AllCells= Sel ExportDataDialog.Content.SelectedCells=Sel terpilih ExportDataDialog.MenuItem.RemoveDelimiter=Padam pembatas tersuai ExportDataDialog.Chooser.SaveData.Title=Simpan Data Sebagai ExportVideoDialog.Button.SaveAs=Simpan Sebagai... ExportVideoDialog.Button.FullSize=Saiz penuh ExportVideoDialog.Button.DrawnSize=Seperti yang terlukis ExportVideoDialog.Content.VideoOnly=Video sahaja ExportVideoDialog.Content.VideoAndGraphics=Video dan grafik ExportVideoDialog.Content.GraphicsOnly=Grafik sahaja ExportVideoDialog.Title=Eksport Klip video ExportVideoDialog.Label.ClipSettings=Tetapan klip ExportVideoDialog.Subtitle.Size=Saiz ExportVideoDialog.Subtitle.Content=Kandungan ExportVideoDialog.Subtitle.View=Pandangan ExportVideoDialog.Subtitle.Format=Format ExportVideoDialog.Complete.Message1=Video ini telah disimpan sebagai ExportVideoDialog.Complete.Message2=Adakah anda ingin membukanya dalam Tracker sekarang? ExportVideoDialog.Complete.Title=Eksport Selesai ExportVideoDialog.VideoSize=saiz video ExportVideoDialog.MatSize=saiz alas ExportVideo.Dialog.HiddenPlots.Message=Plot mestilah tampak keseluruhannya untuk dieksport. ExportVideo.Dialog.HiddenPlots.Title=Paparan Tak Lengkap Footprint.DoubleTarget=rerambut silang berganda Footprint.BoldDoubleTarget=rerambut silang tebal OffsetOrigin.MenuItem.Fixed=Koordinat Dunia Tetap ParticleModel.Dialog.Offscreen.Message1=Beberapa langkah model adalah kosong kerana terlalu jauh tersasar dari skrin. ParticleModel.Dialog.Offscreen.Message2=Untuk membaikinya, ubah model atau skala semula video. ParticleModel.Dialog.Offscreen.Title=Luar Sempadan PrefsDialog.Tab.Configuration.Title=Konfigurasi PrefsDialog.Memory.BorderTitle=Saiz Memori PrefsDialog.Tab.General.Title=Umum PrefsDialog.RecentFiles.BorderTitle=Buka Menu Terakhir PrefsDialog.Label.RecentSize=Kiraan fail PrefsDialog.Hints.BorderTitle=Panduan PrefsDialog.Button.Relaunch=Lancar Semula Sekarang PrefsDialog.Button.ClearRecent=Bersih PrefsDialog.Checkbox.DefaultSize=Guna lalai PrefsDialog.Checkbox.HintsOn=Tunjukkan panduan dengan lalai PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Enjin Video PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Pengurusan ingatan tak tersedia apabila menggunakan Web Start PrefsDialog.Dialog.WebStart.Title=Mod Web Start PrefsDialog.LookFeel.BorderTitle=Lihat dan Rasa PrefsDialog.Language.BorderTitle=Language Bahasa PrefsDialog.Upgrades.BorderTitle=Periksa Penaik Taraf PrefsDialog.Tab.Runtime.Title=Runtime Waktu Jalan PrefsDialog.Tab.Display.Title=Paparan PrefsDialog.Language.Default=lalai PrefsDialog.Upgrades.Always=Setiap hari PrefsDialog.Upgrades.Weekly=Setiap minggu PrefsDialog.Upgrades.Monthly=Setiap bulan PrefsDialog.Upgrades.Never=Tak perlu PrefsDialog.Button.CheckForUpgrade=Periksa Sekarang PrefsDialog.FFMPeg.Speed.BorderTitle=Main Semula Video FFMPeg PrefsDialog.FFMPeg.Slow=Licin (mungkin perlahan) PrefsDialog.FFMPeg.Fast=Laju (mungkin tersekat-sekat) PrefsDialog.CalibrationTool.BorderTitle=Tool Alat Tentu Ukur Lalai Protractor.Name=Jangka Sudut Protractor.New.Name=jangka sudut Protractor.Hint=seret lengan untuk ukur sudut Protractor.Label.Angle=sudut Protractor.Field.Angle.Tooltip=Sudut di antara lengan jangka sudut Protractor.Vertex.Name=bucu Protractor.Vertex.Hint=seret untuk alih bucu Protractor.End.Name=hujung lengan Protractor.End.Hint=drag to rotate the arm seret untuk putar lengan Protractor.Handle.Name=pemegang Protractor.Handle.Hint=seret untuk alihkan jangka sudut Protractor.Rotator.Name=pemutar Protractor.Rotator.Hint=seret untuk putarkan jangka sudut Protractor.Readout.Name=bacaan Protractor.Readout.Hint=sudut di antara lengan jangka sudut ProtractorFootprint.Circle3=bulatan kecil ProtractorFootprint.Circle5=bulatan besar ProtractorFootprint.Circle3Bold=bulatan kecil tebal ProtractorFootprint.Circle5Bold=bulatan besar tebal Stick.Name=Kayu Tentu Ukur Stick.New.Name=kayu tentu ukur TableTrackView.MenuItem.Unformatted=Kepersisan Penuh TableTrackView.MenuItem.Formatted=Seperti yang Terformat TableTrackView.Menu.SetDelimiter=Set Penghehad TableTrackView.MenuItem.AddDelimiter=Tambah... TableTrackView.MenuItem.RemoveDelimiter=Singkir... TableTrackView.Dialog.CustomDelimiter.Message=Masukkan tetali pembatas baharu: TableTrackView.Dialog.CustomDelimiter.Title=Tambah Pembatas TableTrackView.Header.Tooltip=Klik untuk sisih atau klik-berganda untuk pilih lajur TableTrackView.MenuItem.CopySelectedData=Salin Sel Terpilih TableTrackView.Dialog.RemoveDelimiter.Message=Pilih pembatas untuk singkir: TableTrackView.Dialog.RemoveDelimiter.Title=Singkkir Pembatas TableTrackView.Radians.Tooltip=dalam radian TableTrackView.Degrees.Tooltip=dalam darjah TableTrackView.RadiansPerSecond.Tooltip=dalam radian/s TableTrackView.DegreesPerSecond.Tooltip=dalam darjah/s TableTrackView.RadiansPerSecondSquared.Tooltip=dalam radian/s^2 TableTrackView.DegreesPerSecondSquared.Tooltip=dalam darjah/s^2 TableTrackView.MenuItem.DeleteDataFunction=DBuang Fungsi Data TActions.Action.SaveFrame=Simpan Tabset Sebagai... TActions.AboutVideo=Sifat... TActions.Dialog.AboutVideo.Title=Sifat Video TActions.Dialog.AboutVideo.Type=Jenis TActions.Dialog.AboutVideo.SizeDimensi TActions.Dialog.AboutVideo.Length=Panjang TActions.Dialog.AboutVideo.Frames=bingkai TActions.Dialog.AboutVideo.Seconds=saat TActions.Dialog.AboutVideo.FrameRate=Kadar Bingkai TActions.Dialog.AboutVideo.FramesPerSecond=fps TActions.Dialog.AboutVideo.Path=Laluan TActions.Action.ImportTRK=Fail Tracker… TActions.Action.ProtractorVisible=Tampak TapeMeasure.MenuItem.FixedLength=Panjang Tetap TextTView.Label.NoTab=Klik “Halaman†untuk tambah teks dan halaman HTML di sini. TextTView.NewTab.Text1=Klik-berganda untuk sunting teks atau judul. Klik-kanan untuk lebih pilihan. TextTView.NewTab.Text2=Untuk papar halaman HTML, masukkan url atau klik-kanan untuk buka fail. TextTView.NewTab.Title=Tak Bertajuk TextTView.Dialog.TabTitle.Title=Set Judul TextTView.MenuItem.OpenHTML=Buka HTML... TextTView.MenuItem.SetTitle=Set Judul... TextTView.Button.NewTab=Baharu TextTView.TextEdit.Description=Teks TFrame.Dialog.FileNotFound.Message=Fail tak dapat ditemui. TFrame.Dialog.FileNotFound.Title=Fail Tak Ditemui. TFrame.View.Text=Pandangan Halaman TFrame.View.Main=Pandangan Utama TMenuBar.Menu.OpenRecent=Buka Terakhir TMenuBar.Menu.Import=Import TMenuBar.Menu.Export=Eksport TMenuBar.MenuItem.Video=Video... TMenuBar.MenuItem.Data=Fail Data... TMenuBar.Menu.CopyObject=Salin Objek TMenuBar.MenuItem.Coords=Sistem Koordinat TMenuBar.MenuItem.VideoClip=Klip video TMenuBar.Menu.MeasuringTools=Alat Pengukuran TMenuBar.Menu.AngleUnits=Unit Sudut TMenuBar.MenuItem.Degrees=Darjah TMenuBar.MenuItem.Radians=Radian Tracker.Dialog.NoFFMPeg.Title=FFMPeg tak ditemui Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (enjin video rentas platform) tak terpasang. Tracker.Dialog.NoFFMPeg.Message2=Muat turun FFMPeg daripada http://www.ffmpeg.org/download.html. +ZipResourceDialog.Checkbox.TrimVideo=Pangkas Klip ZipResourceDialog.AddHTMLInfo.Title=Tambah HTML Ke Dalam Fail ZipResourceDialog.AddHTMLInfo.Message1=Adakah anda ingin tambah HTML ke dalam fail ZipResourceDialog.AddHTMLInfo.Message2=ke ZIP Tracker? ZipResourceDialog.HTMLField.DefaultText=Jika tiada dikhususkan, fail kosong yang baharu akan dicipta. ZipResourceDialog.Dialog.AddFiles.Title=Tambah Fail HTML dan PDF ZipResourceDialog.Tooltip.HTML=Laluan ke fail sumber HTML (jika tiada, fail kosong yang baharu akan dibuat.) ZipResourceDialog.Tooltip.Author=Pengarang bagi sumber ini. ZipResourceDialog.Tooltip.Title=Papar nama sumber ini (bukan nama fail) ZipResourceDialog.Tooltip.Description=Pernyataan berguna sumber ini ZipResourceDialog.Tooltip.Keywords=Senarai kata kunci untuk carian dalam pelayar DL ZipResourceDialog.Tooltip.Contact=Maklumat perhubungan pengarang (institusi, e-mel, laman web, dsb.) ZipResourceDialog.Tooltip.Link=URL fail HTML luaran dengan maklumat lanjut tentang sumber ini ZipResourceDialog.Tooltip.ThumbnailSettings=Ubah pandangan, saiz atau jenis fail lakaran ZipResourceDialog.Tooltip.AddFiles=Tambah fail HTML dan PDF ke ZIP Tracker ZipResourceDialog.Tooltip.TrimVideo=Semak untuk eksport klip video, biarkan untuk guna video asal ZipResourceDialog.Tooltip.LoadHTML=Gunakan pemilih fail untuk muatkan HTML ke dalam fail # Additions by Doug Brown 2012-12-10 PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Jangka masa bingkai boleh ubah PrefsDialog.Button.NoEngine=Tiada PrefsDialog.Dialog.SwitchToQT.Message=Penukaran kepada QuickTime juga mengubah Java VM kepada 32-bit. PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Penukaran kepada FFMPeg juga mengubah Java VM kepada 32-bit. PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Penukaran kepada FFMPeg juga mengubah Java VM kepada 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Telah Berubah PrefsDialog.Dialog.SwitchTo32.Message=Penukaran ke Java VM 32-bit juga mengubah enjin video ke QuickTime PrefsDialog.Dialog.SwitchTo64.Message=Penukaran ke Java VM 64-bit juga mengubah enjin video ke FFMPeg PrefsDialog.Dialog.SwitchEngine.Title=Enjin Video Telah Berubah PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Tiada enjin video tersedia untuk Java VM 64-bit. Anda PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=masih boleh buka imej (JPEG, PNG) dan GIF beranimasi. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Adakah anda pasti ingin bertukar ke VM 64-bit? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Tiada Enjin Video 64-bit. PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Java VM 32-bit mesti dipasang sebelum FFMPeg boleh digunakan. PrefsDialog.Dialog.No32bitVMQT.Message=Java VM 32-bit mesti dipasang sebelum QuickTime boleh digunakan. PrefsDialog.Dialog.No32bitVM.Message=Untuk maklumat lanjut, lihat Bantuan Tracker: Pemasangan PrefsDialog.Dialog.No32bitVM.Title=VM 32-bit Diperlukan PrefsDialog.Button.ShowHelpNow=Tunjuk Bantuan Sekarang TActions.Dialog.AboutVideo.FramesPerSecond.NotConstant=BUKAN PEMALAR TMenuBar.MenuItem.CheckFrameDurations=Jangka Masa Bingkai TMenuBar.MenuItem.ExportZIP=Zip Tracker Tracker.Dialog.Install32BitVM.Message=Anda mesti pasang Java VM 32-bit sebelum enjin video boleh digunakan. Tracker.Dialog.SwitchTo32BitVM.Message1=Satu atau lebih enjin video sudah terpasang tetapi tak tersedia kerana ia Tracker.Dialog.SwitchTo32BitVM.Message2=memerlukan Java VM 32-bit dan anda sedang menggunakan VM 64-bit. Tracker.Dialog.SwitchTo32BitVM.Question=Adakah anda ingin melancar semula dengan VM 32-bit dan enjin lalai? Tracker.Dialog.Button.RelaunchNow=Ya, lancar semula sekarang Tracker.Dialog.Button.ShowPrefs=Tidak, tetapi tunjukkan keutamaan Tracker.Dialog.Button.ContinueWithoutEngine=Tidak, teruskan tanpa video Tracker.Dialog.EngineProblems.Message1=Satu atau lebih enjin video sudah terpasang namun tidak berfungsi. Tracker.Dialog.EngineProblems.Message2=Untuk maklumat lanjut lihat Bantuan|Diagnostik|Tentang FFMPeg atau QuickTime. Tracker.Dialog.ReplaceFFMPeg.Message1=Kami cadangkan anda gantikan enjin video FFMPeg anda sekarang Tracker.Dialog.ReplaceFFMPeg.Message2=dengan FFMPeg versi 3.4 melalui pemasangan semula Tracker (versi 4.75 Tracker.Dialog.ReplaceFFMPeg.Message3=atau lebih tinggi) dan pilih FFMPeg dalam pilihan pemasangan. TrackerIO.Dialog.DurationIsConstant.Message=Semua jangka masa bingkai adalah sama (fps tetap). TrackerIO.ZIPResourceFilter.Description=Fail ZIP Tracker (.trz) TToolbar.Button.Desktop.Tooltip=Paparan berkaitan dokumen HTML dan/atau PDF ZipResourceDialog.BadModels.Message1=Klip video tidak mengandungi bingkai mula ZipResourceDialog.BadModels.Message2=Modul Zarah berikut. Jika anda pangkas video ZipResourceDialog.BadModels.Message3=model tersebut TIDAK akan termasuk dalam ZIP Tracker yang diimport. ZipResourceDialog.BadModels.Question=dakah anda ingin teruskan atau abaikan model tersebut? ZipResourceDialog.BadModels.Title=Konflik Klip-Model TMenuBar.MenuItem.EditVideoFrames=Tambah/Singkir Bingkai TMenuBar.Dialog.RequiresMemory.Message1=Semua imej mesti dimuatkan ke dalam ingatan untuk suntingan bingkai. Ini akan meningkatkan laju main semula. TMenuBar.Dialog.RequiresMemory.Message2=Sila semak ingatan tersedia dan lancarkan semula dengan lebih ingatan jika diperlukan. TMenuBar.Dialog.RequiresMemory.Title=Ingatan # Additions by Doug Brown 2013-01-25 PointMass.Data.Description.PixelX=piksel komponen-x PointMass.Data.Description.PixelY=piksel komponen-y ExportVideoDialog.Content.DeinterlacedVideo=Video ternyahjalin ExportVideoDialog.Deinterlace.OddFirst=Medan ganjil dahulu ExportVideoDialog.Deinterlace.EvenFirst=Medan genap dahulu ExportVideoDialog.Deinterlace.Dialog.Title=Tertib Medan Ternyahjalin TFrame.Dialog.LibraryError.FileNotFound.Title=Fail Tak Ditemui TFrame.Dialog.LibraryError.FileNotFound.Message=Tak boleh menjumpai fail TrackerPanel.DataBuilder.Button.Autoload=Automuat TrackerPanel.DataBuilder.Button.Autoload.Tooltip=Urus fungsi data terautomuat TrackerPanel.DataBuilder.Autoload.Title=Automuat fungsi data TrackerPanel.DataBuilder.Autoload.Message=Pilih fungsi untuk automuat: TrackerPanel.DataBuilder.Chooser.XMLFiles=Fail XML TrackerIO.Dialog.Open.Title=Buka TToolbar.Button.Refresh.Popup.RefreshNow=Segar semula TToolbar.Button.Refresh.Popup.AutoRefresh=Auto-refresh Autosegar semula TToolbar.Button.Refresh.Tooltip=Segar semula data dan pandangan # Additions by Doug Brown 2013-05-10 CoordAxes.Origin.Label=kedudukan piksel asalan CoordAxes.Origin.Field.Tooltip=kedudukan asalan diukur dari pepenjuru kiri atas video # Additions by Doug Brown 2013-08-24 MainTView.Popup.MenuItem.Select=Pilih Titik MainTView.Popup.MenuItem.Deselect=Nyahpilih Titik ZipResourceDialog.Checkbox.PreviewThumbnail=Pratonton ZipResourceDialog.Dialog.BadFileName.Message=Nama fail tidak boleh mengandungi aksara berikut: ZipResourceDialog.Dialog.BadFileName.Title=Nama Fail Yang Tak Dibenarkan ZipResourceDialog.Dialog.ExportFailed.Message=Fail ZIP tak boleh dieksport. ZipResourceDialog.Dialog.ExportFailed.Title=Eksport Gagal PrefsDialog.Button.SetCache=Set Cache # Additions by Doug Brown 2013-12-17 Tracker.StartLog=Log Mula Tracker.StartLog.NotFound=Fail log mula tak ditemui Tracker.Dialog.MemoryReduced.Title=Ingatan Yang Dikehendaki Dikurangkan Tracker.Dialog.MemoryReduced.Message1=Tracker tak boleh dimulakan dengan ingatan Tracker.Dialog.MemoryReduced.Message2=jadi ingatan yang dikehendaki telah dikurangkan ke Tracker.Dialog.MemoryReduced.Message3=Untuk maklumat lanjut lihat Bantuan|Diagnostik|Log Mula... TrackPlottingPanel.Popup.MenuItem.ShowZero=Tunjuk TableTrackView.Menu.TextColumn.Text=Lajur Teks TableTrackView.Menu.TextColumn.Tooltip=Urus lajur teks boleh sunting TableTrackView.Action.CreateTextColumn.Text=Cipta... TableTrackView.Action.DeleteTextColumn.Text=Buang TableTrackView.Action.RenameTextColumn.Text=Nama Semula TableTrackView.Dialog.NameColumn.Message=Sila masukkan nama lajur. TableTrackView.Dialog.NameColumn.TryAgain=Nama tersebut sudah digunakan. TableTrackView.Dialog.NameColumn.Title=Lajur Teks TToolBar.MenuItem.StretchOff=Set Semula # Additions by Doug Brown 2014-02-20 PrefsDialog.Checkbox.WarnFFMPegVersion=Versi FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=Ralat Salin Fail Enjin Video Tracker.Dialog.FailedToCopy.Title=Ralat Salin Fail Velocity.Dialog.Color.Title=Pilih Warna Halaju Acceleration.Dialog.Color.Title=Pilih Warna Pecutan TMenuBar.Menu.FontSize=Aras Fon TMenuBar.MenuItem.DefaultFontSize=Lalai PrefsDialog.FontSize.BorderTitle=Aras Fon TrackerPanel.Label.Booster=Pelancar TrackerPanel.Booster.None=(tiada) TrackerPanel.Dropdown.Booster.Tooltip=Jisim titik yang menetapkan keadaan awal model ini. CoordAxes.Checkbox.Grid=Grid CoordAxes.Checkbox.Grid.Tooltip=Papar tindihan grid CoordAxes.Button.Grid.Tooltip=Set warna dan kelegapan grid CoordAxes.Dialog.GridColor.Title=Pilih Warna Grid CoordAxes.MenuItem.GridColor=Warna Grid... CoordAxes.MenuItem.GridOpacity=Kelegapan.. CoordAxes.Dialog.GridOpacity.Title=Set Kelegapan Grid DynamicSystem.Dialog.RemoveBooster.Title=Konflik Pelancar DynamicSystem.Dialog.RemoveBooster.Message1=Zarah dalam sistem juga tidak boleh melancarkan satu yang lain. DynamicSystem.Dialog.RemoveBooster.Message2=Pelancar yang berkonfik akan dialihkan daripada DynamicSystem.Dialog.RemoveBooster.Message3=sebelum pengubahsuaian sistem. # Additions by Doug Brown 2014-05-09 PageTView.MenuItem.OpenInBrowser=Buka Halaman dalam Pelayar TToolbar.Button.Desktop.Menu.OpenPage=Halaman TToolbar.Button.Desktop.Menu.OpenFile=Fail # Additions by Doug Brown 2014-10-24 Tracker.Prefs.MenuItem.Text=Fail Keutamaan Tracker.Prefs.NotFound=Fail keutamaan tak ditemui TapeMeasure.Alert.UnfixScale.Message1=Skala Sistem Koordinat mesti dilonggarkan untuk diletakkan hujung. TapeMeasure.Alert.UnfixScale.Message2=Adakah anda ingin longgarkannya sekarang? TapeMeasure.Alert.UnfixScale.Title=Skala telah ditetapkan. Tracker.Dialog.StarterWarning.Title=Pelancaran Tak-Piawai # Additions by Doug Brown 2014-12-26 TrackDataBuilder.Dialog.NoFunctionsFound.Message=iada fungsi data yang ditemui untuk jenis trek TrackDataBuilder.Dialog.NoFunctionsFound.Title=Fungsi Tak Ditemui TrackDataBuilder.Instructions.SelectToAutoload=Pilih fungsi data untuk automuat daripada senarai di bawah. TrackDataBuilder.Instructions.WhereDefined=Fungsi ditakrifkan dalam fail XML Pembina Data yang ditemui dalam direktori yang ditunjukkan. TrackDataBuilder.Instructions.HowToAddFunction=Untuk tambah fungsi baru, ciptanya dalam Pembina Data, simpannya dalam fail XML, dan salin fail ke salah satu direktori. TrackDataBuilder.Instructions.HowToAddDirectory=TUntuk ubah laluan carian, klik butang Carian Laluan. TrackDataBuilder.Dialog.ConvertAutoload.Message1=Sesetengah fungsi terautomuat disimpan dalam format terdahulu. TrackDataBuilder.Dialog.ConvertAutoload.Message2=Adakah anda ingin menukarnya ke dalam format mudah alih baharu? TrackDataBuilder.Dialog.ConvertAutoload.Message3=Nota: format baharu tak boleh dibaca oleh Tracker versi terdahulu. TrackDataBuilder.Dialog.ConvertAutoload.Title=Tukar Fungsi Automuat? TrackDataBuilder.MenuItem.SaveAll.Text=Simpan semua TrackDataBuilder.MenuItem.SaveAll.Tooltip=Simpan semua fungsi dalam format mudah alih, boleh automuat (tak boleh dibaca oleh Tracker versi terdahulu). TrackDataBuilder.MenuItem.SaveOnly.Text=Simpan sahaja TrackDataBuilder.MenuItem.SaveOnly.Tooltip=Simpan fungsi trek terpilih dalam format boleh baca oleh semua versi Tracker (tak boleh automuat) ParticleDataTrack.Name=Trek Data ParticleDataTrack.Builder.Title=Trek Data ParticleDataTrack.New.Name=trek data TActions.Action.ImportData=Sumber Data... TrackerIO.TextFileFilter.Description=Fail Teks (.txt) TrackerIO.JarFileFilter.Description=Fail Jar (.jar) TrackerIO.Dialog.OpenData.Title=Sumber Data Terbuka DataTrackClipControl.Label.Data=Data DataTrackClipControl.Label.Video=Video DataTrackClipControl.Border.Title=Klip Data DataTrackClipControl.Label.VideoStart=Bingkai Mula DataTrackClipControl.Label.FrameCount=Kiraan Bingkai DataTrackClipControl.Label.DataStart=Mula Data DataTrackClipControl.Label.Stride=Langkah Data ParticleDataTrackFunctionPanel.Border.Title=Kawalan Sumber Data DataTrackTimeControl.Button.Video=Masa Video DataTrackTimeControl.Button.Data=Masa Data DataTrackTimeControl.Border.Title=Basis Masa TActions.Action.DataTrack.Unsupported.JarFile=Fail Jar TActions.Action.DataTrack.Unsupported.Message=tak dapat hantar data ke Tracker TActions.Action.DataTrack.Unsupported.Title=Bukan Sumber Data # Additions by Doug Brown 2015-04-17 to 2015-05-30 DataTrackTool.Dialog.VideoNotFound.Message1=Unable to find video Tak dapat menemui video DataTrackTool.Dialog.VideoNotFound.Message2=Adakah anda mahu mencarinya? DataTrackTool.Dialog.VideoNotFound.Title=VVideo Tak Ditemui DataTrackTool.Dialog.FileNotFound.Message1=Tak boleh menemui fail DataTrackTool.Dialog.FileNotFound.Title=Fail Tak Ditemui DataTrackTool.Dialog.InvalidTRK.Message=Fail bukan fail TRK yang sah DataTrackTool.Dialog.InvalidTRK.Title=Fail Tak Sah DataTrackTool.Dialog.InvalidData.Message=Data tidak mengandungi kedudukan (x, y) DataTrackTool.Dialog.InvalidData.Title=Data Tak Sah ParticleDataTrack.Dialog.NoNewData.Message=Data dihantar tak melanjutkan data sedia ada. ParticleDataTrack.Dialog.NoNewData.Title=Tiada Data Baharu ParticleDataTrackFunctionPanel.Instructions.General=Klik-berganda masa awal untuk sunting atau guna gelegar untuk ubah tetapan video dan data. TrackerPanel.Dialog.NoData.Message=Tiada data ditemui TrackerPanel.Dialog.NoData.Title=Tiada Data TrackerPanel.Dialog.Exception.Message=Data tak boleh diimport kerana pengecualian berikut berlaku TrackerPanel.Dialog.Exception.Title=Import Data Gagal TActions.Dialog.URLResourceNotFound.Message=Tiada sumber ditemui pada URL TActions.Dialog.URLResourceNotFound.Title=Sumber Tak Ditemui CircleFitter.Name=Penyesuai Bulatan CircleFitter.New.Name=bulatan CircleFitter.Label.Radius=jejari CircleFitter.Checkbox.RadialLine=Garis jejarian CircleFitter.Checkbox.RadialLine.Tooltip=Tunjuk atau sembunyi garis jejarian CircleFitter.Field.Radius.Tooltip=Jejari bulatan penyesuaian terbaik CircleFitter.Field.CenterX.Tooltip=komponen-x pusat penyesuaian terbaik CircleFitter.Field.CenterY.Tooltip=komponen-y pusat penyesuaian terbaik CircleFitter.Label.MarkPoint=Penyesuaian bulatan memerlukan 3 atau lebih titik data CircleFitter.Hint.MarkMore=shift-klik untuk tanda lebih titik jika mahu CircleFitter.Hint.Mark3=shift-klik untuk tanda titik data CircleFitter.Data.Center=pusat CircleFitter.Data.Description.0=masa CircleFitter.Data.Description.1=pusat komponen-x CircleFitter.Data.Description.2=pusat komponen-y CircleFitter.Data.Description.3=jejari CircleFitter.Data.Description.4=nombor langkah CircleFitter.Data.Description.5=nombor bingkai CircleFitter.Data.Description.6=sudut garis jejarian CircleFitter.DataPoint.Name=titik perimeter CircleFitter.DataPoint.Hint=seret untuk alih CircleFitter.Slider.Name=garis jejarian CircleFitter.Slider.Hint=seret untuk putar CircleFitterFootprint.Circle4=titik kecil CircleFitterFootprint.Circle7=titik besar CircleFitterFootprint.Circle4Bold=titik kecil tebal CircleFitterFootprint.Circle7Bold=titik besar tebal CircleFitter.MenuItem.OriginToCenter=Alih Asalan ke Pusat CircleFitter.MenuItem.Inspector=Salin Langkah Jisim Titik... CircleFitter.MenuItem.ClearPoints=Bersih Titik CircleFitter.MenuItem.DeletePoint=Buang Titik Terpilih CircleFitter.Inspector.Instructions1=Ini menyesuaikan bulatan pada 3 atau lebih titik data. CircleFitter.Inspector.Instructions2=Anda boleh tanda titik secara manual atau salinnya daripada sumber titik jisim. CircleFitter.Inspector.Label.SourceTrack=Trek sumber CircleFitter.Inspector.Label.From=Langkah CircleFitter.Inspector.Label.To=ke CircleFitter.Inspector.Dropdown.None=Tiada CircleFitter.Inspector.Button.Apply=Salin Langkah TActions.Action.SaveVideoAs=Simpan Video Sebagai... TrackerIO.Export.Option.WithVideo=dengan video TrackerIO.Export.Option.WithoutVideo=tanpa video ParticleModel.MenuItem.UseDefaultReferenceFrame=Sentiasa Relatif Kepada Bingkai Rujukan Lalai TFrame.NotesDialog.Checkbox.ShowByDefault=Tunjuk nota dengan lalai \ No newline at end of file diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties index 3bd2a3ee..38870d65 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_nl_NL.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -907,13 +907,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1187,17 +1187,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1213,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents @@ -1282,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pl.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pl.properties index fb4cf85b..49da2cc6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pl.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pl.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=U\u017cyj domy\u015blnych PrefsDialog.Checkbox.HintsOn=Poka\u017c wskaz\u00f3wki domy\u015blnie PrefsDialog.Tab.Video.Title=Wideo PrefsDialog.VideoPref.BorderTitle=Silnik wideo -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Zarz\u0105dzenie pami\u0119ci\u0105 niedost\u0119pne podczas korzystanie z Web Start. PrefsDialog.Dialog.WebStart.Title=Tryb Web Start @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=tygodniowo PrefsDialog.Upgrades.Monthly=miesi\u0119cznie PrefsDialog.Upgrades.Never=Nigdy PrefsDialog.Button.CheckForUpgrade=Sprawd\u017a teraz -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=P\u0142ynnie (mo\u017ce pracowa\u0107 wolno) -PrefsDialog.Xuggle.Fast=Szybko (mo\u017ce zrywa\u0107) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=P\u0142ynnie (mo\u017ce pracowa\u0107 wolno) +PrefsDialog.FFMPeg.Fast=Szybko (mo\u017ce zrywa\u0107) PrefsDialog.CalibrationTool.BorderTitle=Domy\u015blne narz\u0119dzia kalibracyjne Protractor.Name=K\u0105tomierz Protractor.New.Name=k\u0105tomierz @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools=Narz\u0119dzie pomiarowe TMenuBar.Menu.AngleUnits=Jednostki k\u0105ta TMenuBar.MenuItem.Degrees=Stopnie TMenuBar.MenuItem.Radians=Radiany -Tracker.Dialog.NoXuggle.Title=Xuggle nieznaleziony -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) niezainstalowany. -Tracker.Dialog.NoXuggle.Message2=Pobierz Xuggle z http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=O Xuggle... -Tracker.Dialog.AboutXuggle.Title=O Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Wersja Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg nieznaleziony +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) niezainstalowany. +Tracker.Dialog.NoFFMPeg.Message2=Pobierz FFMPeg z http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=O FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=O FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Wersja FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=Nie zainstalowano silnika wideo. Bez niego, Tracker.Dialog.NoVideoEngine.Message2=mo\u017cna jedynie otworzy\u0107 obraz (JPEG, PNG) i animowane pliki GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Zalecane: przeinstalowanie programu Tracker z silnikiem wideo Xuggle. +Tracker.Dialog.NoVideoEngine.Message3=Zalecane: przeinstalowanie programu Tracker z silnikiem wideo FFMPeg. Tracker.Dialog.NoVideoEngine.Title=Brak silnika wideo -Tracker.Dialog.NoXuggle.Message1=Xuggle nie pracuje poprawnie. Upewnij si\u0119, \u017ce wymagane -Tracker.Dialog.NoXuggle.Message2=xuggle jar pliki znajduj\u0105 si\u0119 w katalogu domowym programu Tracker. Szczeg\u00f3\u0142y, -Tracker.Dialog.NoXuggle.Message3=znajdziesz w pliku Tracker_README.txt. -Tracker.Dialog.NoXuggle.Message4=By zainstalowa\u0107 Xuggle, pobierz najnowasz\u0105 wersj\u0119 programu Tracker -Tracker.Dialog.NoXuggle.Title=Xuggle niedost\u0119pny +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg nie pracuje poprawnie. Upewnij si\u0119, \u017ce wymagane +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar pliki znajduj\u0105 si\u0119 w katalogu domowym programu Tracker. Szczeg\u00f3\u0142y, +Tracker.Dialog.NoFFMPeg.Message3=znajdziesz w pliku Tracker_README.txt. +Tracker.Dialog.NoFFMPeg.Message4=By zainstalowa\u0107 FFMPeg, pobierz najnowasz\u0105 wersj\u0119 programu Tracker +Tracker.Dialog.NoFFMPeg.Title=FFMPeg niedost\u0119pny Tracker.About.DefaultLocale=Lokalizacja domy\u015blna Tracker.About.CurrentLanguage=J\u0119zyk Tracker.Dialog.InsufficientMemory.Title=Niedostateczna ilo\u015b\u0107 pami\u0119ci @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Ustaw rozmiar pami\u0119ci... TTrackBar.Button.Version=Niedost\u0119pne: wersja TTrackBar.Popup.MenuItem.Upgrade=Aktualizuj teraz... TTrackBar.Popup.MenuItem.Ignore=Ignoruj -XuggleVideo.MenuItem.SmoothPlay=P\u0142ynne odtwarzanie (mo\u017ce by\u0107 wolne) +FFMPegVideo.MenuItem.SmoothPlay=P\u0142ynne odtwarzanie (mo\u017ce by\u0107 wolne) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Rodzaj kalibracji @@ -908,13 +908,13 @@ WorldTView.Button.World=\u015awiat # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Ostrze\u017cenia PrefsDialog.Checkbox.WarnIfNoEngine=Brak silnika wideo -PrefsDialog.Checkbox.WarnIfXuggleError=Niekluczowe b\u0142\u0119dy Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=Niekluczowe b\u0142\u0119dy FFMPeg PropertiesDialog.Title=W\u0142a\u015bciwo\u015bci PropertiesDialog.Label.Author=Autorzy PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=W\u0142a\u015bciwo\u015bci... TActions.Action.OpenBrowser=Otw\u00f3rz bibliotek\u0119 przegl\u0105darki... -TFrame.Progress.Xuggle=Xuggle \u0142adowana klatka +TFrame.Progress.FFMPeg=FFMPeg \u0142adowana klatka TFrame.Progress.ClickToCancel=(kliknij by skasowa\u0107) TFrame.Dialog.StalledVideo.Title=B\u0142\u0105d \u0142adowania wideo TFrame.Dialog.StalledVideo.Message0=Wideo zatrzymane podczas \u0142adowania. Mo\u017ce to by\u0107 sytuacja przej\u015bciowa. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Zatrzymaj TFrame.Dialog.StalledVideo.Button.Wait=Czekaj Tracker.Dialog.NoVideoEngine.Checkbox=Nie pokazuj wi\u0119cej TrackerIO.ZipFileFilter.Description=Plik ZIP(.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle napodka\u0142 poni\u017csze b\u0142\u0119dy podczas otwierania pliku wideo: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg napodka\u0142 poni\u017csze b\u0142\u0119dy podczas otwierania pliku wideo: TrackerIO.Dialog.ErrorFFMPEG.Message2=Nie wszystkie b\u0142\u0119dy s\u0105 kluczowe. Pe\u0142en opis b\u0142\u0119d\u00f3w znajduje si\u0119 w Pomoc|Komunikaty \u0142adowania. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Je\u015bli Xuggle zawi\u00f3d\u0142 spr\u00f3buj otworzy\u0107 plik wideo za pomoc\u0105 QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Je\u015bli FFMPeg zawi\u00f3d\u0142 spr\u00f3buj otworzy\u0107 plik wideo za pomoc\u0105 QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Wskaz\u00f3wka: Dla Mac OSX niezb\u0119dny jest Tracker z 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=B\u0142\u0105d Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Wi\u0119cej szczeg\u00f3\u0142\u00f3w po uruchomieniu ostrze\u017ce\u0144 Xuggle w oknie preferencji (Edytuj|Preferencje). +TrackerIO.Dialog.ErrorFFMPEG.Title=B\u0142\u0105d FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Wi\u0119cej szczeg\u00f3\u0142\u00f3w po uruchomieniu ostrze\u017ce\u0144 FFMPeg w oknie preferencji (Edytuj|Preferencje). TToolBar.Button.OpenBrowser.Tooltip=Otw\u00f3rz cyfrow\u0105 bibliotek\u0119 OSP przegl\u0105darki # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Zmienna d\u0142ugo\u015bci klatki PrefsDialog.Button.NoEngine=Nic PrefsDialog.Dialog.SwitchToQT.Message=Prze\u0142\u0105czanie do QuickTime atak\u017ce zmienia Java VM do 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Prze\u0142\u0105czanie do Xuggle tak\u017ce zmienia Java VM do 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Prze\u0142\u0105czanie do Xuggle tak\u017ce zmienia Java VM do 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Prze\u0142\u0105czanie do FFMPeg tak\u017ce zmienia Java VM do 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Prze\u0142\u0105czanie do FFMPeg tak\u017ce zmienia Java VM do 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Zmieniono Java VM PrefsDialog.Dialog.SwitchTo32.Message=Prze\u0142\u0105czanie do 32-bit Java VM tak\u017ce zmienia silnik wideo na QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Prze\u0142\u0105czanie do 64-bit Java VM tak\u017ce zmienia silnik wideo na Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Prze\u0142\u0105czanie do 64-bit Java VM tak\u017ce zmienia silnik wideo na FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Silnik Wideo Zmieniono PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Brak silnika wideo dla 64-bit Java VM. Mo\u017cliwe PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=nadal otwarcie obraz\u00f3w (JPEG, PNG) i animowanych GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Na pewno prze\u0142\u0105czy\u0107 do 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Brak Silnika Wideo 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=32-bit Java VM musi zosta\u0107 zainstalowana przed korzystaniem z Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=32-bit Java VM musi zosta\u0107 zainstalowana przed korzystaniem z FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=32-bit Java VM musi zosta\u0107 zainstalowana przed korzystaniem z QuickTime. PrefsDialog.Dialog.No32bitVM.Message=Wi\u0119cej informacji patrz Pomoc: Instalacja. PrefsDialog.Dialog.No32bitVM.Title=Wynmagany 32-bit VM @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=Tak, za\u0142aduj teraz Tracker.Dialog.Button.ShowPrefs=Nie, ale poka\u017c preferencje Tracker.Dialog.Button.ContinueWithoutEngine=Nie, kontynuuj bez wideo Tracker.Dialog.EngineProblems.Message1=Jeden lub wi\u0119cej silnik\u00f3w wideo jest azinstalowanych i nie pracuje poprawnie. -Tracker.Dialog.EngineProblems.Message2=Wi\u0119cej szczeg\u00f3\u0142\u00f3w patrz Pomoc|Diagnostyka|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Zalecamu zast\u0105pienie obecnego silnika wideo Xuggle przez -Tracker.Dialog.ReplaceXuggle.Message2=Xuggle versja 3.4 dzi\u0119ki przeinstalowaniu Trackera (wersja 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=lub powy\u017cej) i wybierz Xuggle podczas instalacji. +Tracker.Dialog.EngineProblems.Message2=Wi\u0119cej szczeg\u00f3\u0142\u00f3w patrz Pomoc|Diagnostyka|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Zalecamu zast\u0105pienie obecnego silnika wideo FFMPeg przez +Tracker.Dialog.ReplaceFFMPeg.Message2=FFMPeg versja 3.4 dzi\u0119ki przeinstalowaniu Trackera (wersja 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=lub powy\u017cej) i wybierz FFMPeg podczas instalacji. TrackerIO.Dialog.DurationIsConstant.Message=Wszystkie czasy klatek s\u0105 r\u00f3wne TrackerIO.ZIPResourceFilter.Description=Plik Tracker ZIP (.trz) TToolbar.Button.Desktop.Tooltip=Wy\u015bwietl do\u0142\u0105czony plik HTML i/lub PDF @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=Tekst kolumny TToolBar.MenuItem.StretchOff=Prze\u0142\u0105duj # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Wersja Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=Wersja FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=B\u0142\u0105d sinika wideo kopii Tracker.Dialog.FailedToCopy.Title=B\u0142\u0105d pliku kopii Velocity.Dialog.Color.Title=Wybierz kolor pr\u0119dko\u015bci diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties index f9b6ad9e..346428ec 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt.properties @@ -740,7 +740,7 @@ PrefsDialog.Checkbox.DefaultSize=Usar padr PrefsDialog.Checkbox.HintsOn=Mostrar as dicas como padrão PrefsDialog.Tab.Video.Title=Vídeo PrefsDialog.VideoPref.BorderTitle=Mecanismo de Vídeo -PrefsDialog.Button.Xuggle=Xuggle (recomendado) +PrefsDialog.Button.FFMPeg=FFMPeg (recomendado) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Gestão da memória indisponível quando Web Start é utilizado. PrefsDialog.Dialog.WebStart.Title=Modo Web Start @@ -755,9 +755,9 @@ PrefsDialog.Upgrades.Weekly=Semanalmente PrefsDialog.Upgrades.Monthly=Mensalmente PrefsDialog.Upgrades.Never=Nunca PrefsDialog.Button.CheckForUpgrade=Verificar Agora -PrefsDialog.Xuggle.Speed.BorderTitle=Reprodução de Vídeo -PrefsDialog.Xuggle.Slow=Suave (pode ser lenta) -PrefsDialog.Xuggle.Fast=Rápida (pode ser grosseira) +PrefsDialog.FFMPeg.Speed.BorderTitle=Reprodução de Vídeo +PrefsDialog.FFMPeg.Slow=Suave (pode ser lenta) +PrefsDialog.FFMPeg.Fast=Rápida (pode ser grosseira) PrefsDialog.CalibrationTool.BorderTitle=Ferramenta de Calibração Padrão Protractor.Name=Transferidor Protractor.New.Name=transferidor @@ -837,22 +837,22 @@ TMenuBar.Menu.MeasuringTools=Ferramentas de Medida TMenuBar.Menu.AngleUnits=Unidades de ângulo TMenuBar.MenuItem.Degrees=Graus TMenuBar.MenuItem.Radians=Radianos -Tracker.Dialog.NoXuggle.Title=Xuggle não encontrado -Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplataforma de mecanismo vídeo) não está instalada. -Tracker.Dialog.NoXuggle.Message2=Descarregar Xuggle de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Acerca do Xuggle... -Tracker.Dialog.AboutXuggle.Title=Acerca do Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Versão do Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Página do Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=Caminho do Xuggle: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg não encontrado +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (multiplataforma de mecanismo vídeo) não está instalada. +Tracker.Dialog.NoFFMPeg.Message2=Descarregar FFMPeg de http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Acerca do FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Acerca do FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Versão do FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=Página do FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=Caminho do FFMPeg: Tracker.Dialog.NoVideoEngine.Message1=Nenhum mecanismo de vídeo foi encontrado! Como tal, o Tracker pode Tracker.Dialog.NoVideoEngine.Message2=abrir apenas imagens, sequências de imagens e GIFs animados. -Tracker.Dialog.NoVideoEngine.Message3=Para instalar o Xuggle, mecanismo de vídeo preferido pelo Tracker em +Tracker.Dialog.NoVideoEngine.Message3=Para instalar o FFMPeg, mecanismo de vídeo preferido pelo Tracker em Tracker.Dialog.NoVideoEngine.Message4=todas as plataformas, descarregue a última versão do instalador do Tracker. Tracker.Dialog.NoVideoEngine.Title=Falta de Mecanismo de Vídeo -Tracker.Dialog.NoXuggle.Message1=o Xuggle, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. -Tracker.Dialog.NoXuggle.Message2=Para instalar o Xuggle, descarregue a última versão do instalador do Tracker -Tracker.Dialog.NoXuggle.Title=falta o Xuggle +Tracker.Dialog.NoFFMPeg.Message1=o FFMPeg, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. +Tracker.Dialog.NoFFMPeg.Message2=Para instalar o FFMPeg, descarregue a última versão do instalador do Tracker +Tracker.Dialog.NoFFMPeg.Title=falta o FFMPeg Tracker.About.DefaultLocale=Local padrão Tracker.About.CurrentLanguage=Idioma Tracker.Dialog.InsufficientMemory.Title=Memória insuficiente @@ -898,7 +898,7 @@ TTrackBar.Memory.Menu.SetSize=Definir o tamanho da mem TTrackBar.Button.Version=Agora disponível: versão TTrackBar.Popup.MenuItem.Upgrade=Atualizar Agora... TTrackBar.Popup.MenuItem.Ignore=Ignorar -XuggleVideo.MenuItem.SmoothPlay=Executar suavemente (poderá ser lento) +FFMPegVideo.MenuItem.SmoothPlay=Executar suavemente (poderá ser lento) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Fita de Calibração @@ -927,13 +927,13 @@ WorldTView.Button.World=Mundo # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Avisos PrefsDialog.Checkbox.WarnIfNoEngine=Sem motor Vídeo -PrefsDialog.Checkbox.WarnIfXuggleError=Erros Xuggle não fatais +PrefsDialog.Checkbox.WarnIfFFMPegError=Erros FFMPeg não fatais PropertiesDialog.Title=Propriedades PropertiesDialog.Label.Author=Autor PropertiesDialog.Label.Contact=Contacto TActions.Action.Properties=Propriedades... TActions.Action.OpenBrowser=Abrir Navegador da Biblioteca... -TFrame.Progress.Xuggle=Janela de carregamento do Xuggle +TFrame.Progress.FFMPeg=Janela de carregamento do FFMPeg TFrame.Progress.ClickToCancel=(clicar para cancelar) TFrame.Dialog.StalledVideo.Title=Erro a carregar o Vídeo TFrame.Dialog.StalledVideo.Message0=O vídeo parou durante o carregamento. Isso pode ser temporário. @@ -946,12 +946,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Parar TFrame.Dialog.StalledVideo.Button.Wait=esperar Tracker.Dialog.NoVideoEngine.Checkbox=Não mostrar outra vez TrackerIO.ZipFileFilter.Description=Ficheiros ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=O Xuggle encontrou os seguintes erros ao abrir o vídeo: +TrackerIO.Dialog.ErrorFFMPEG.Message1=O FFMPeg encontrou os seguintes erros ao abrir o vídeo: TrackerIO.Dialog.ErrorFFMPEG.Message2=Nem todos os erros são fatais. Para todas as mensagens de erro, escolher Ajuda|Menssagem. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o Xuggle falhar, poderá abrir o vídeo com o QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o FFMPeg falhar, poderá abrir o vídeo com o QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Nota: No Mac OSX, isto requer corer o Tracker numa 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, ative os avisos do Xuggle na caixa de preferências (Editar|Preferências). +TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, ative os avisos do FFMPeg na caixa de preferências (Editar|Preferências). TToolBar.Button.OpenBrowser.Tooltip=Abrir o Navegador da Biblioteca Digital da OSP # Additions by Doug Brown 2011-07-20 @@ -1075,7 +1075,7 @@ AlgorithmDialog.FiniteDifference.Message2=Velocidade: v[i] = (x[i+1] - x[i-1]) AlgorithmDialog.FiniteDifference.Message3=Aceleração: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) AlgorithmDialog.BounceDetect.Message1=Este Algoritmo suaviza o cálculo de velocidades e acelerações, mas também deteta variações súbitas na velocidade. AlgorithmDialog.BounceDetect.Message2=Cuidado: pode produzir artefactos. Para mais informações, consultar: -AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ +AlgorithmDialog.BounceDetect.Message3=http://www.ffmpeg.org/download.html. TMenuBar.Menu.Diagnostics=Diagnósticos # Additions by Doug Brown 2012-02-12 @@ -1208,17 +1208,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Durações variáveis dos Quadros PrefsDialog.Button.NoEngine=Nenhum PrefsDialog.Dialog.SwitchToQT.Message=Mudar para o QuickTime também altera a Java VM para 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Mudar para o Xuggle também altera a Java VM para 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Mudar para o Xuggle também altera a Java VM para 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Mudar para o FFMPeg também altera a Java VM para 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Mudar para o FFMPeg também altera a Java VM para 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Alterada PrefsDialog.Dialog.SwitchTo32.Message=Mudar para a Java VM 32-bit também altera o motor de vídeo para QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Mudar para a Java VM 64-bit também altera o motor de vídeo para Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Mudar para a Java VM 64-bit também altera o motor de vídeo para FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Motor de Vídeo alterado PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Não está disponível um motor de vídeo para a Java VM 64-bit. PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=Poderá ainda abrir imagens (JPEG, PNG) e GIFs animados. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Tem a certeza que quer alterar para uma Java VM a 64-bit? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Não existe motor de vídeo a 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=A Java VM a 32-bit tem de ser instalada antes de usar o Xuggle. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A Java VM a 32-bit tem de ser instalada antes de usar o FFMPeg. PrefsDialog.Dialog.No32bitVMQT.Message=A Java VM a 32-bit tem de ser instalada antes de usar o QuickTime. PrefsDialog.Dialog.No32bitVM.Message=Para mais informação consulte Ajuda: Instalação. PrefsDialog.Dialog.No32bitVM.Title=É necessária uma VM a 32-bit @@ -1234,10 +1234,10 @@ Tracker.Dialog.Button.RelaunchNow=Sim, reiniciar agora Tracker.Dialog.Button.ShowPrefs=Não, mas mostrar preferências Tracker.Dialog.Button.ContinueWithoutEngine=Não, continuar sem vídeo Tracker.Dialog.EngineProblems.Message1=Um ou mais motores de vídeo estão instalados mas não funcionam. -Tracker.Dialog.EngineProblems.Message2=Para mais informação ver Ajuda|Diagnósticos|Sobre o Xuggle ou QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Recomenda-se que substitua o atual motor de vídeo Xuggle -Tracker.Dialog.ReplaceXuggle.Message2=pela versão 3.4 do Xuggle, reinstalando o Tracker (versão 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=ou superior) e selecionando Xuggle nas opções de instalação. +Tracker.Dialog.EngineProblems.Message2=Para mais informação ver Ajuda|Diagnósticos|Sobre o FFMPeg ou QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Recomenda-se que substitua o atual motor de vídeo FFMPeg +Tracker.Dialog.ReplaceFFMPeg.Message2=pela versão 3.4 do FFMPeg, reinstalando o Tracker (versão 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=ou superior) e selecionando FFMPeg nas opções de instalação. TrackerIO.Dialog.DurationIsConstant.Message=Todos os Quadros têm a mesma duração (constante qps). TrackerIO.ZIPResourceFilter.Description=Ficheiro ZIP do Tracker (.trz) TToolbar.Button.Desktop.Tooltip=Mostrar documentos associados HTML e/ou PDF @@ -1303,7 +1303,7 @@ TableTrackView.Dialog.NameColumn.Title=Texto da Coluna TToolBar.MenuItem.StretchOff=Repor # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Versão Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=Versão FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=Erros de cópia do ficheiro do Motor de Vídeo Tracker.Dialog.FailedToCopy.Title=Erro ao copiar Ficheiro Velocity.Dialog.Color.Title=Escolher Cor para a Velocidade diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties index 85181f64..b4c7c8fd 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_pt_BR.properties @@ -725,7 +725,7 @@ PrefsDialog.Checkbox.DefaultSize=Usar padr PrefsDialog.Checkbox.HintsOn=Mostrar as dicas como padrão PrefsDialog.Tab.Video.Title=Vídeo PrefsDialog.VideoPref.BorderTitle=Mecanismo de Vídeo -PrefsDialog.Button.Xuggle=Xuggle (recomendado) +PrefsDialog.Button.FFMPeg=FFMPeg (recomendado) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Gerenciamento de memória indisponível quando Web Start é utilizado. PrefsDialog.Dialog.WebStart.Title=Modo Web Start @@ -740,9 +740,9 @@ PrefsDialog.Upgrades.Weekly=Semanalmente PrefsDialog.Upgrades.Monthly=Mensamente PrefsDialog.Upgrades.Never=Nunca PrefsDialog.Button.CheckForUpgrade=Verificar Agora -PrefsDialog.Xuggle.Speed.BorderTitle=Reprodução de Vídeo -PrefsDialog.Xuggle.Slow=Suave (pode ser lenta) -PrefsDialog.Xuggle.Fast=Rápida (pode ser grosseira) +PrefsDialog.FFMPeg.Speed.BorderTitle=Reprodução de Vídeo +PrefsDialog.FFMPeg.Slow=Suave (pode ser lenta) +PrefsDialog.FFMPeg.Fast=Rápida (pode ser grosseira) PrefsDialog.CalibrationTool.BorderTitle=Ferramenta de Calibragem Padrão Protractor.Name=Transferidor Protractor.New.Name=transferidor @@ -822,22 +822,22 @@ TMenuBar.Menu.MeasuringTools=Ferramentas de Medidas TMenuBar.Menu.AngleUnits=Unidades de ângulo TMenuBar.MenuItem.Degrees=Graus TMenuBar.MenuItem.Radians=Radianos -Tracker.Dialog.NoXuggle.Title=Xuggle não encontrado -Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplataforma de mecanismo vídeo) não está instalada. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle de http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Sobre Xuggle... -Tracker.Dialog.AboutXuggle.Title=Sobre Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Versão do Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg não encontrado +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (multiplataforma de mecanismo vídeo) não está instalada. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg de http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Sobre FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Sobre FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Versão do FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoVideoEngine.Message1=Nenhum mecanismo de vídeo foi encontrado! Sem nenhum, o Tracker pode Tracker.Dialog.NoVideoEngine.Message2=abrir apenas imagens, sequências de imagens e gifs animados. -Tracker.Dialog.NoVideoEngine.Message3=Para instalar o Xuggle, mecanismo de vídeo preferido pelo Tracker em +Tracker.Dialog.NoVideoEngine.Message3=Para instalar o FFMPeg, mecanismo de vídeo preferido pelo Tracker em Tracker.Dialog.NoVideoEngine.Message4=todas as plataformas, faça o download da última versão do instalador do Tracker. Tracker.Dialog.NoVideoEngine.Title=Falta de Mecanismo de Vídeo -Tracker.Dialog.NoXuggle.Message1=o Xuggle, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. -Tracker.Dialog.NoXuggle.Message2=Para instalar o Xuggle, faça o download da última versão do instalador do Tracker -Tracker.Dialog.NoXuggle.Title=faltando o Xuggle +Tracker.Dialog.NoFFMPeg.Message1=o FFMPeg, mecanismo de vídeo preferido pelo Tracker, ainda não está instalado. +Tracker.Dialog.NoFFMPeg.Message2=Para instalar o FFMPeg, faça o download da última versão do instalador do Tracker +Tracker.Dialog.NoFFMPeg.Title=faltando o FFMPeg Tracker.About.DefaultLocale=Local padrão Tracker.About.CurrentLanguage=Idioma Tracker.Dialog.InsufficientMemory.Title=Memória Insuficiente @@ -883,7 +883,7 @@ TTrackBar.Memory.Menu.SetSize=Definir o tamanho da mem TTrackBar.Button.Version=Agora disponível: versão TTrackBar.Popup.MenuItem.Upgrade=Atualizar Agora... TTrackBar.Popup.MenuItem.Ignore=Ignorar -XuggleVideo.MenuItem.SmoothPlay=Executar Suavemente (poderá ser lento) +FFMPegVideo.MenuItem.SmoothPlay=Executar Suavemente (poderá ser lento) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Fita de Calibração @@ -912,13 +912,13 @@ WorldTView.Button.World=Mundo # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Avisos PrefsDialog.Checkbox.WarnIfNoEngine=Sem mecanismos de Vídeo -PrefsDialog.Checkbox.WarnIfXuggleError=Erros do Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=Erros do FFMPeg PropertiesDialog.Title=Propriedades PropertiesDialog.Label.Author=Autor PropertiesDialog.Label.Contact=Contato TActions.Action.Properties=Propriedades... TActions.Action.OpenBrowser=Abrir Navegador de Biblioteca... -TFrame.Progress.Xuggle=Xuggle carregando imagem +TFrame.Progress.FFMPeg=FFMPeg carregando imagem TFrame.Progress.ClickToCancel=(clique para cancelar) TFrame.Dialog.StalledVideo.Title=Erro ao carregar Vídeo TFrame.Dialog.StalledVideo.Message0=O vídeo travou durante o carregamento. Isto pode ser temporário. @@ -931,12 +931,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Parar TFrame.Dialog.StalledVideo.Button.Wait=Esperar Tracker.Dialog.NoVideoEngine.Checkbox=Não mostrar isto novamente TrackerIO.ZipFileFilter.Description=Arquivos ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle encontrou o seguinte erro ao abrir este vídeo: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg encontrou o seguinte erro ao abrir este vídeo: TrackerIO.Dialog.ErrorFFMPEG.Message2= Nem todos os erros são fatais. Para todas as mensagens de erro, escolha Ajuda | Log de mensagem -TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o Xuggle falhar, você deve habilitar o QuickTime para abrir vídeos +TrackerIO.Dialog.ErrorFFMPEG.Message3=Se o FFMPeg falhar, você deve habilitar o QuickTime para abrir vídeos TrackerIO.Dialog.ErrorFFMPEG.MessageMac= Nota: No Mac OSX isso requer executar o Tracker em Java VM 32-bit. -TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, habilitar os avisos Xuggle na janela de prefêrencias (Editar|Preferências). +TrackerIO.Dialog.ErrorFFMPEG.Title=Erro no FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Para mais detalhes, habilitar os avisos FFMPeg na janela de prefêrencias (Editar|Preferências). TToolBar.Button.OpenBrowser.Tooltip=Abrir a Biblioteca Digital OSP # Additions by Doug Brown 2011-07-20 @@ -1060,7 +1060,7 @@ AlgorithmDialog.FiniteDifference.Message2=Velocidade: v[i] = (x[i+1] - x[i-1]) AlgorithmDialog.FiniteDifference.Message3=Aceleração: a[i] = (2*x[i+2] - x[i+1] - 2*x[i] - x[i-1] + 2*x[i-2]) / (7*dt) AlgorithmDialog.BounceDetect.Message1=Este algoritmo suaviza velocidades e acelerações mas também detecta mudanças bruscas na velocidade. AlgorithmDialog.BounceDetect.Message2=Cuidado: pode produzir artefatos, para mais informações: -AlgorithmDialog.BounceDetect.Message3=http://gasstationwithoutpumps.wordpress.com/2011/11/08/tracker-video-analysis-tool-fixes/ +AlgorithmDialog.BounceDetect.Message3=http://www.ffmpeg.org/download.html. TMenuBar.Menu.Diagnostics=Diagnósticos # Additions by Doug Brown 2012-02-12 @@ -1193,17 +1193,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1219,10 +1219,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1288,7 +1288,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ru.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ru.properties index ed85796e..0500c8e6 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ru.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_ru.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -907,13 +907,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1187,17 +1187,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1213,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1282,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors TrackerStarter.Warning.FailedToCopy1=Some video engine files could not be copied automatically. TrackerStarter.Warning.FailedToCopy2=The video engine may not work unless they are copied manually. diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties index 20ecf7b7..75d11e06 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sk.properties @@ -721,7 +721,7 @@ PrefsDialog.Checkbox.DefaultSize=Pou\u017ei\u0165 prednastaven\u00e9 PrefsDialog.Checkbox.HintsOn=Zobrazi\u0165 prednastaven\u00e9 n\u00e1povede PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle (recommended) +PrefsDialog.Button.FFMPeg=FFMPeg (recommended) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Spr\u00e1va pa\u00e4te je nepr\u00edstupn\u00e1 pri pou\u017e\u00edvan\u00ed Web \u0161tartu PrefsDialog.Dialog.WebStart.Title=Web \u0161tart m\u00f3d @@ -736,9 +736,9 @@ PrefsDialog.Upgrades.Weekly=t\u00fd\u017edenne PrefsDialog.Upgrades.Monthly=mesa\u010dne PrefsDialog.Upgrades.Never=nikdy PrefsDialog.Button.CheckForUpgrade=H\u013eadaj teraz -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Hladko (m\u00f4\u017ee by\u0165 pomal\u00e9) -PrefsDialog.Xuggle.Fast=r\u00fdchlo (m\u00f4\u017ee by\u0165 trhan\u00e9) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Hladko (m\u00f4\u017ee by\u0165 pomal\u00e9) +PrefsDialog.FFMPeg.Fast=r\u00fdchlo (m\u00f4\u017ee by\u0165 trhan\u00e9) PrefsDialog.CalibrationTool.BorderTitle=Predvolen\u00fd kalibra\u010dn\u00fd n\u00e1stroj Protractor.Name=Uhlomer Protractor.New.Name=Uhlomer @@ -818,22 +818,22 @@ TMenuBar.Menu.MeasuringTools=Meracie n\u00e1stroje TMenuBar.Menu.AngleUnits=Jednotky uhla TMenuBar.MenuItem.Degrees=Stupne TMenuBar.MenuItem.Radians=Radi\u00e1ny -Tracker.Dialog.NoXuggle.Title=Xuggle nen\u00e1jden\u00fd -Tracker.Dialog.NoXuggle.Message1=Xuggle (multiplatformov\u00fd n\u00e1stroj na spracovanie video) nie je nain\u0161talovan\u00fd -Tracker.Dialog.NoXuggle.Message2=Stiahnu\u0165 Xuggle z http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=O programe Xuggle... -Tracker.Dialog.AboutXuggle.Title=O programe Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle verzia -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg nen\u00e1jden\u00fd +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (multiplatformov\u00fd n\u00e1stroj na spracovanie video) nie je nain\u0161talovan\u00fd +Tracker.Dialog.NoFFMPeg.Message2=Stiahnu\u0165 FFMPeg z http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=O programe FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=O programe FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg verzia +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoVideoEngine.Message1=Nebol n\u00e1jden\u00fd \u017eiaden program pre spracovanie Videa! Bez neho,Tracker m\u00f4\u017ee Tracker.Dialog.NoVideoEngine.Message2=otvori\u0165 len obr\u00e1zky, sekvencie obr\u00e1zkov a animovan\u00e9 gif s\u00fabory -Tracker.Dialog.NoVideoEngine.Message3=V pr\u00edpade in\u0161tal\u00e1cie Xuggle, Trackerom preferovan\u00fd program pre spracovanie Videa +Tracker.Dialog.NoVideoEngine.Message3=V pr\u00edpade in\u0161tal\u00e1cie FFMPeg, Trackerom preferovan\u00fd program pre spracovanie Videa Tracker.Dialog.NoVideoEngine.Message4=v r\u00e1mci v\u0161etk\u00fdch platforiem, stiahnite pre Tracker posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z Tracker.Dialog.NoVideoEngine.Title=Ch\u00fdbaj\u00faci program pre spracovanie Videa -Tracker.Dialog.NoXuggle.Message1=Xuggle, program pre spracovanie Videa preferovan\u00fd Trackerom, nebol dosia\u013e nain\u0161talovn\u00fd. -Tracker.Dialog.NoXuggle.Message2=Pre in\u0161tal\u00e1ciu Xuggle, stiahnite posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z -Tracker.Dialog.NoXuggle.Title=Ch\u00fdbaj\u00faci program Xuggle pre spracovanie videa +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, program pre spracovanie Videa preferovan\u00fd Trackerom, nebol dosia\u013e nain\u0161talovn\u00fd. +Tracker.Dialog.NoFFMPeg.Message2=Pre in\u0161tal\u00e1ciu FFMPeg, stiahnite posledn\u00fa verziu in\u0161tala\u010dn\u00e9ho programu z +Tracker.Dialog.NoFFMPeg.Title=Ch\u00fdbaj\u00faci program FFMPeg pre spracovanie videa Tracker.About.DefaultLocale=Prednastaven\u00e9 umiestnenie Tracker.About.CurrentLanguage=jazyk Tracker.Dialog.InsufficientMemory.Title=Nedostatok pam\u00e4te @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Moment\u00e1lne dostupn\u00e1:verzia TTrackBar.Popup.MenuItem.Upgrade=Aktualizova\u0165 teraz... TTrackBar.Popup.MenuItem.Ignore=Ignorova\u0165 -XuggleVideo.MenuItem.SmoothPlay=Plynul\u00e9 prehr\u00e1vanie (m\u00f4\u017ee by\u0165 pomal\u00e9) +FFMPegVideo.MenuItem.SmoothPlay=Plynul\u00e9 prehr\u00e1vanie (m\u00f4\u017ee by\u0165 pomal\u00e9) # Additions by Doug Brown CircleFootprint.Circle=kr\u00fa\u017eok @@ -908,13 +908,13 @@ WorldTView.Button.World=Re\u00e1lny poh\u013ead # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1189,17 +1189,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1215,10 +1215,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display supplemental HTML and/or PDF documents @@ -1284,7 +1284,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties index ff210072..9d393612 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sl.properties @@ -725,7 +725,7 @@ PrefsDialog.Checkbox.DefaultSize=Uporabi privzeto PrefsDialog.Checkbox.HintsOn=Privzeto prika\u017Ei namige PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video pogon -PrefsDialog.Button.Xuggle=Xuggle (priporo\u010Deno) +PrefsDialog.Button.FFMPeg=FFMPeg (priporo\u010Deno) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\u010Ce uporablja\u0161 Web Start, upravljanje pomnilnika ni na voljo. PrefsDialog.Dialog.WebStart.Title=Na\u010Din Web Start @@ -740,9 +740,9 @@ PrefsDialog.Upgrades.Weekly=Tedensko PrefsDialog.Upgrades.Monthly=Mese\u010Dno PrefsDialog.Upgrades.Never=Nikoli PrefsDialog.Button.CheckForUpgrade=Preveri sedaj -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Gladko (lahko je po\u010Dasno) -PrefsDialog.Xuggle.Fast=Hitro (lahko bo sunkovito) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Gladko (lahko je po\u010Dasno) +PrefsDialog.FFMPeg.Fast=Hitro (lahko bo sunkovito) PrefsDialog.CalibrationTool.BorderTitle=Privzeto orodje za kalibracijo Protractor.Name=Kotomer Protractor.New.Name=kotomer @@ -822,22 +822,22 @@ TMenuBar.Menu.MeasuringTools=Merilna orodja TMenuBar.Menu.AngleUnits=Enote za kot TMenuBar.MenuItem.Degrees=Stopinje TMenuBar.MenuItem.Radians=Radiani -Tracker.Dialog.NoXuggle.Title=Ne najdem Xuggle -Tracker.Dialog.NoXuggle.Message1=Xuggle (platformno neodvisen video pogon) ni name\u0161\u010Den. -Tracker.Dialog.NoXuggle.Message2=Nalo\u017Ei Xuggle iz http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Nekaj o Xuggle... -Tracker.Dialog.AboutXuggle.Title=Nekaj o Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Verzija Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle dom: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle pot: +Tracker.Dialog.NoFFMPeg.Title=Ne najdem FFMPeg +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (platformno neodvisen video pogon) ni name\u0161\u010Den. +Tracker.Dialog.NoFFMPeg.Message2=Nalo\u017Ei FFMPeg iz http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Nekaj o FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Nekaj o FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Verzija FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg dom: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg pot: Tracker.Dialog.NoVideoEngine.Message1=ne najdem video pogona! Brez tega lahko Tracker Tracker.Dialog.NoVideoEngine.Message2=odpre le slike, zaporedja slik in animirane gif. -Tracker.Dialog.NoVideoEngine.Message3=Za namestitev Xuggle, ki je najbolj priporo\u010Dljiv video pogon za +Tracker.Dialog.NoVideoEngine.Message3=Za namestitev FFMPeg, ki je najbolj priporo\u010Dljiv video pogon za Tracker.Dialog.NoVideoEngine.Message4=vse platforme, nalo\u017Ei zadnji Tracker installer iz Tracker.Dialog.NoVideoEngine.Title=Manjka video pogon -Tracker.Dialog.NoXuggle.Message1=Xuggle, Trackerjev priporo\u010Dljiv video pogon, ni name\u0161\u010Den. -Tracker.Dialog.NoXuggle.Message2=Za namestitev Xuggle, nalo\u017Ei zadnji Tracker installer iz -Tracker.Dialog.NoXuggle.Title=Manjka Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Trackerjev priporo\u010Dljiv video pogon, ni name\u0161\u010Den. +Tracker.Dialog.NoFFMPeg.Message2=Za namestitev FFMPeg, nalo\u017Ei zadnji Tracker installer iz +Tracker.Dialog.NoFFMPeg.Title=Manjka FFMPeg Tracker.About.DefaultLocale=Privzeti locale Tracker.About.CurrentLanguage=Jezik Tracker.Dialog.InsufficientMemory.Title=Premajhen pomnilnik @@ -883,7 +883,7 @@ TTrackBar.Memory.Menu.SetSize=Nastavi velikost pomnilnika... TTrackBar.Button.Version=Sedaj na voljo: verzija TTrackBar.Popup.MenuItem.Upgrade=Posodobi sedaj... TTrackBar.Popup.MenuItem.Ignore=Ignoriraj -XuggleVideo.MenuItem.SmoothPlay=mehko predvajanje (je lahko po\u010Dasno) +FFMPegVideo.MenuItem.SmoothPlay=mehko predvajanje (je lahko po\u010Dasno) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Merilni trak @@ -912,13 +912,13 @@ WorldTView.Button.World=Svet # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Opozorila PrefsDialog.Checkbox.WarnIfNoEngine=Ni video pogona -PrefsDialog.Checkbox.WarnIfXuggleError=Ne usodne napake Xuggle +PrefsDialog.Checkbox.WarnIfFFMPegError=Ne usodne napake FFMPeg PropertiesDialog.Title=Lastnosti PropertiesDialog.Label.Author=Avtor PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Lastnosti... TActions.Action.OpenBrowser=Odpri brkljalnik knji\u017Enice... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(Klikni za brisanje) TFrame.Dialog.StalledVideo.Title=Napaka pri nalaganju videa TFrame.Dialog.StalledVideo.Message0=Nalaganje videa se je zaustavilo. Morda je to za\u010Dasno. @@ -931,12 +931,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=\u010Cakaj Tracker.Dialog.NoVideoEngine.Checkbox=Tega ne prika\u017Ei ve\u010D TrackerIO.ZipFileFilter.Description=Datoteke ZIP -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle je naletel na naslednje napake pri odpiranju tega videa: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg je naletel na naslednje napake pri odpiranju tega videa: TrackerIO.Dialog.ErrorFFMPEG.Message2=Vse napake niso usodne. Za polna obvestila o napakah izberi Pomo\u010D|Zapis obvestil. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u010Ce Xuggle izpade, morda lahko odpre\u0161 video s QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u010Ce FFMPeg izpade, morda lahko odpre\u0161 video s QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Opomba: Na Mac OSX mora te\u010Di Tracker na 32-bitnem Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Napaka Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=Za ve\u010D podrobnosti vklju\u010Di opozorila Xuggle v pogovornem oknu s preferencami (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=Napaka FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=Za ve\u010D podrobnosti vklju\u010Di opozorila FFMPeg v pogovornem oknu s preferencami (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Odpri brkljalnik digitalne knji\u017Enice OSP # Additions by Doug Brown 2011-07-20 @@ -1195,17 +1195,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Trajanje spremenljivega okvirja PrefsDialog.Button.NoEngine=Ni\u010D PrefsDialog.Dialog.SwitchToQT.Message=Preklop na QuickTime tudi spremeni JVM na 32-bitno verzijo. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Preklop na Xuggle tudi spremeni JVM na 32-bitno verzijo. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Preklop na Xuggle tudi spremeni JVM na 64-bitno verzijot. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Preklop na FFMPeg tudi spremeni JVM na 32-bitno verzijo. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Preklop na FFMPeg tudi spremeni JVM na 64-bitno verzijot. PrefsDialog.Dialog.SwitchVM.Title=Java VM je spremenjen PrefsDialog.Dialog.SwitchTo32.Message=Preklop na 32-bitni Java VM tudi spremeni video pogon na QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Preklop na 64-bitni Java VM tudi spremeni video pogon na Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Preklop na 64-bitni Java VM tudi spremeni video pogon na FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video pogon je spremenjen PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Ni na voljo video pogona za 64-bitni Java VM. \u0161e vedno PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=bo\u0161 lahko odpiral slike (JPEG, PNG) in animirane GIF. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Ali res \u017Eeli\u0161 preklop na 64-bitni VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ni 64-bitnega Video pogona -PrefsDialog.Dialog.No32bitVMXuggle.Message=Pred uporabo Xuggle moramo namestiti 32-bitni Java VM. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=Pred uporabo FFMPeg moramo namestiti 32-bitni Java VM. PrefsDialog.Dialog.No32bitVMQT.Message=Pred uporabo QuickTime moramo namestiti 32-bitni Java VM. PrefsDialog.Dialog.No32bitVM.Message=Za ve\u010D informacij si oglej Pomo\u010D Trackerja: Namestitev. PrefsDialog.Dialog.No32bitVM.Title=Zahtevan je 32-bitni VM @@ -1221,10 +1221,10 @@ Tracker.Dialog.Button.RelaunchNow=Da, za\u017Eeni ponovno Tracker.Dialog.Button.ShowPrefs=Ne, vendar poka\u017Ei preference Tracker.Dialog.Button.ContinueWithoutEngine=Ne, nadaljuj brez videa Tracker.Dialog.EngineProblems.Message1=En ali ve\u010D video pogonov je name\u0161\u010Denih, a ne dela. -Tracker.Dialog.EngineProblems.Message2=Za ve\u010D informacij poglej Pomo\u010D|Diagnostika|O Xuggle ali QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Priporo\u010Damo, da zamenjate trenutni video pogon Xuggle -Tracker.Dialog.ReplaceXuggle.Message2=z Xuggle verzije 3.4 s ponovno namestitvijo programa Tracker (verzija 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=ali ve\u010D) in pri opcijah namestitve izberete Xuggle. +Tracker.Dialog.EngineProblems.Message2=Za ve\u010D informacij poglej Pomo\u010D|Diagnostika|O FFMPeg ali QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Priporo\u010Damo, da zamenjate trenutni video pogon FFMPeg +Tracker.Dialog.ReplaceFFMPeg.Message2=z FFMPeg verzije 3.4 s ponovno namestitvijo programa Tracker (verzija 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=ali ve\u010D) in pri opcijah namestitve izberete FFMPeg. TrackerIO.Dialog.DurationIsConstant.Message=Trajanja vseh okvirjev so enaka (konstantni fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Prikaz ustreznih dokumentov HTML oziroma PDF @@ -1290,7 +1290,7 @@ TableTrackView.Dialog.NameColumn.Title=Stolpec besedila TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Verzija +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Verzija PrefsDialog.Checkbox.WarnCopyFailed=Napake pri kopiranju datoteke za video pogon Tracker.Dialog.FailedToCopy.Title=Napaka pri kopiranju datoteke Velocity.Dialog.Color.Title=Izbira barve hitrosti diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sr.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sr.properties index 916f056b..7e714f5f 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sr.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sr.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -908,13 +908,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties index 590d9204..44d40508 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_sv.properties @@ -730,7 +730,7 @@ PrefsDialog.Checkbox.DefaultSize=Anv PrefsDialog.Checkbox.HintsOn=Visa tips genom default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video spelare -PrefsDialog.Button.Xuggle=Xuggle (rekommenderas) +PrefsDialog.Button.FFMPeg=FFMPeg (rekommenderas) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Minnes hanteringen är inte tillgänglig när Web Start används. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -745,9 +745,9 @@ PrefsDialog.Upgrades.Weekly=Varje vecka PrefsDialog.Upgrades.Monthly=Varje månad PrefsDialog.Upgrades.Never=Aldrig PrefsDialog.Button.CheckForUpgrade=Sök nu -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (kan vara långsam) -PrefsDialog.Xuggle.Fast=Fast (kan verka hoppande) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (kan vara långsam) +PrefsDialog.FFMPeg.Fast=Fast (kan verka hoppande) PrefsDialog.CalibrationTool.BorderTitle=Default Kalibreringsverktyg Protractor.Name=Gradskiva Protractor.New.Name=gradskiva @@ -828,22 +828,22 @@ TMenuBar.Menu.MeasuringTools=M TMenuBar.Menu.AngleUnits=Vinkel enheter TMenuBar.MenuItem.Degrees=Grader TMenuBar.MenuItem.Radians=Radianer -Tracker.Dialog.NoXuggle.Title=Xuggle kunde inte hittas -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) är inte installerad. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle från http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=Om Xuggle... -Tracker.Dialog.AboutXuggle.Title=Om Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg kunde inte hittas +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) är inte installerad. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg från http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=Om FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=Om FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoVideoEngine.Message1=Ingen video spelare kunde hittas. Utan dessa kan Trakck bara Tracker.Dialog.NoVideoEngine.Message2=öppna bilder, blidsekvenser och animmated gifs. -Tracker.Dialog.NoVideoEngine.Message3=För att installera Xuggle, Trackers rekommenderade videospelare på +Tracker.Dialog.NoVideoEngine.Message3=För att installera FFMPeg, Trackers rekommenderade videospelare på Tracker.Dialog.NoVideoEngine.Message4=alla platformar, download den senaste Tracker installer från Tracker.Dialog.NoVideoEngine.Title=Videospelare saknas -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's rekommenderade videospelare, har inte installerats än. -Tracker.Dialog.NoXuggle.Message2=För att installera Xuggle, download den senaste Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle saknas +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's rekommenderade videospelare, har inte installerats än. +Tracker.Dialog.NoFFMPeg.Message2=För att installera FFMPeg, download den senaste Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg saknas Tracker.About.DefaultLocale=Default placering Tracker.About.CurrentLanguage=Språk Tracker.Dialog.InsufficientMemory.Title=För lite minne @@ -889,7 +889,7 @@ TTrackBar.Memory.Menu.SetSize=S TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Uppdatera nu... TTrackBar.Popup.MenuItem.Ignore=Ignorera -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (kan vara långsam) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (kan vara långsam) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Kalibrerings måttband @@ -918,13 +918,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Varningar PrefsDialog.Checkbox.WarnIfNoEngine=Ingen video-spelare -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle fel +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg fel PropertiesDialog.Title=Egenskaper PropertiesDialog.Label.Author=Författare PropertiesDialog.Label.Contact=Kontakt TActions.Action.Properties=Egenskaper... TActions.Action.OpenBrowser=Öppna bliblioteks webläsaren... -TFrame.Progress.Xuggle=Xuggle lastar in bildrutor +TFrame.Progress.FFMPeg=FFMPeg lastar in bildrutor TFrame.Progress.ClickToCancel=(klicka för att stoppa) TFrame.Dialog.StalledVideo.Title=Fel inträffade under inläsning av video TFrame.Dialog.StalledVideo.Message0=Inlastning av video har stannat upp. Detta kan vara ett tillfälligt fel. @@ -937,12 +937,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stopp TFrame.Dialog.StalledVideo.Button.Wait=Vänta Tracker.Dialog.NoVideoEngine.Checkbox=Visa inte igen TrackerIO.ZipFileFilter.Description=ZIP filer -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle träffat på följande fel medan videon öppnades: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg träffat på följande fel medan videon öppnades: TrackerIO.Dialog.ErrorFFMPEG.Message2=Inte alla fel är fatala. För fullständigt felmeddelande öppna Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=Om Xuggle misslyckas, kan det gå att öppna videon med QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=Om FFMPeg misslyckas, kan det gå att öppna videon med QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: I Mac OSX kräver detta att Tracker körs med 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Fel -TrackerIO.ErrorFFMPEG.LogMessage=För mer detajer, sätt på Xuggle varningar i inställningsdialogen (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Fel +TrackerIO.ErrorFFMPEG.LogMessage=För mer detajer, sätt på FFMPeg varningar i inställningsdialogen (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Öppna OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1200,17 +1200,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Varierande bild separation PrefsDialog.Button.NoEngine=Ingen PrefsDialog.Dialog.SwitchToQT.Message=Byte till QuickTime ändrar också Java VM till 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Byte till Xuggle ändrar också Java VM till 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle ändrar också Java VM till 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Byte till FFMPeg ändrar också Java VM till 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg ändrar också Java VM till 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Ändrad PrefsDialog.Dialog.SwitchTo32.Message=Byte till 32-bit Java VM ändrar också videospelaren till QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Byte till 64-bit Java VM ändrar också videospelaren till Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Byte till 64-bit Java VM ändrar också videospelaren till FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Videospelare ändrad PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Ingen videospelare finn tillgänglig för 64-bit Java VM. Du kan PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=fortfarande öppna bilder images (JPEG, PNG) och animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Är du säker på att du vill byta till 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Ingen 64-bit Videospelare -PrefsDialog.Dialog.No32bitVMXuggle.Message=32-bit Java VM måste vara installerad innan Xuggle kan brukas. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=32-bit Java VM måste vara installerad innan FFMPeg kan brukas. PrefsDialog.Dialog.No32bitVMQT.Message=32-bit Java VM måste vara installerad innane QuickTime kan brukas. PrefsDialog.Dialog.No32bitVM.Message=För mer information, se Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM krävs @@ -1226,10 +1226,10 @@ Tracker.Dialog.Button.RelaunchNow=Ja, starta om Tracker.Dialog.Button.ShowPrefs=Nej, men visa inställningar Tracker.Dialog.Button.ContinueWithoutEngine=Nej, fortsätt utan video Tracker.Dialog.EngineProblems.Message1=En eller flera videospelare är installerade men fungerar ej. -Tracker.Dialog.EngineProblems.Message2=För mer information se Help|Diagnostics|About Xuggle eller QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Vi rekommenderar att du ersätter din nuvarande Xuggle videospelare -Tracker.Dialog.ReplaceXuggle.Message2=med Xuggle version 3.4 genom att ominstallera Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=eller senare) och väljer Xuggle i installationen. +Tracker.Dialog.EngineProblems.Message2=För mer information se Help|Diagnostics|About FFMPeg eller QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Vi rekommenderar att du ersätter din nuvarande FFMPeg videospelare +Tracker.Dialog.ReplaceFFMPeg.Message2=med FFMPeg version 3.4 genom att ominstallera Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=eller senare) och väljer FFMPeg i installationen. TrackerIO.Dialog.DurationIsConstant.Message=Uppspelningshastigheten är konstant (konstant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) @@ -1296,7 +1296,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Kolumn TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video maskin Fil Kopieringsfel Tracker.Dialog.FailedToCopy.Title=Fil kopieringsfel Velocity.Dialog.Color.Title=Välj färg för hastighet diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties index 4454a481..7d081565 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties @@ -726,7 +726,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle (recommended) +PrefsDialog.Button.FFMPeg=FFMPeg (recommended) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -741,9 +741,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -823,22 +823,22 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoVideoEngine.Message1=No video engine was found! Without one, Tracker can Tracker.Dialog.NoVideoEngine.Message2=open only images, image sequences, and animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=To install Xuggle, Tracker's preferred video engine on +Tracker.Dialog.NoVideoEngine.Message3=To install FFMPeg, Tracker's preferred video engine on Tracker.Dialog.NoVideoEngine.Message4=all platforms, download the latest Tracker installer from Tracker.Dialog.NoVideoEngine.Title=Missing Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle, Tracker's preferred video engine, is not yet installed. -Tracker.Dialog.NoXuggle.Message2=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Missing Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg, Tracker's preferred video engine, is not yet installed. +Tracker.Dialog.NoFFMPeg.Message2=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=Missing FFMPeg Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -884,7 +884,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -913,13 +913,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -932,12 +932,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1195,17 +1195,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1221,10 +1221,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1290,7 +1290,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_tr.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_tr.properties index 562e14b0..d9813fbb 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_tr.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_tr.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=Varsay\u0131lan\u0131 kullan PrefsDialog.Checkbox.HintsOn=Varsay\u0131lan olarak ipuçlar\u0131n\u0131 göster PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Motoru -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Web Ba\u015Flat kullan\u0131rken bellek yönetimi kullan\u0131lamaz. PrefsDialog.Dialog.WebStart.Title=Web Ba\u015Flat Modu @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=Haftal\u0131k PrefsDialog.Upgrades.Monthly=Ayl\u0131k PrefsDialog.Upgrades.Never=Asla PrefsDialog.Button.CheckForUpgrade=\u015Eimdi Kontrol Et -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Oynatma -PrefsDialog.Xuggle.Slow=Pürüzsüz (yava\u015F olabilir) -PrefsDialog.Xuggle.Fast=H\u0131zl\u0131 (sars\u0131nt\u0131l\u0131 olabilir) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Oynatma +PrefsDialog.FFMPeg.Slow=Pürüzsüz (yava\u015F olabilir) +PrefsDialog.FFMPeg.Fast=H\u0131zl\u0131 (sars\u0131nt\u0131l\u0131 olabilir) PrefsDialog.CalibrationTool.BorderTitle=Varsay\u0131lan Ayarlama Arac\u0131 Protractor.Name=Aç\u0131 Ölçer Protractor.New.Name=aç\u0131 ölçer @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools= TMenuBar.Menu.AngleUnits=Aç\u0131 Birimleri TMenuBar.MenuItem.Degrees=Derece TMenuBar.MenuItem.Radians=Radyan -Tracker.Dialog.NoXuggle.Title=Xuggle bulunamad\u0131 -Tracker.Dialog.NoXuggle.Message1=Xuggle (çapraz-platform video motoru) yüklü de\u011Fil. -Tracker.Dialog.NoXuggle.Message2=Xuggle'\u0131 http://www.xuggle.com/xuggler/downloads/ adresinden indir. -Tracker.Action.AboutXuggle=Xuggle hakk\u0131nda... -Tracker.Dialog.AboutXuggle.Title=Xuggle hakk\u0131nda -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle sürümü -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle ana sayfa: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar yolu: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg bulunamad\u0131 +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (çapraz-platform video motoru) yüklü de\u011Fil. +Tracker.Dialog.NoFFMPeg.Message2=FFMPeg'\u0131 http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=FFMPeg hakk\u0131nda... +Tracker.Dialog.AboutFFMPeg.Title=FFMPeg hakk\u0131nda +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg sürümü +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg ana sayfa: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar yolu: Tracker.Dialog.NoVideoEngine.Message1=Hiçbir video motoru yüklü de\u011Fil. Bunlar olmadan, Tracker.Dialog.NoVideoEngine.Message2=(JPEG, PNG) görüntülerini açabilir ve GIF'leri canland\u0131rabilirsiniz. -Tracker.Dialog.NoVideoEngine.Message3=Tavsiye edilen: Takipçiyi Xuggle video motoru ile yeniden yükle. +Tracker.Dialog.NoVideoEngine.Message3=Tavsiye edilen: Takipçiyi FFMPeg video motoru ile yeniden yükle. Tracker.Dialog.NoVideoEngine.Title=Video Motoru Yok -Tracker.Dialog.NoXuggle.Message1=Xuggle düzgün çal\u0131\u015Fm\u0131yor. Gerekli xuggle jar dosyalar\u0131n\u0131n -Tracker.Dialog.NoXuggle.Message2=Takipçi ana dizininde oldu\u011Fundan emin olun. Ayr\u0131t\u0131lar için, -Tracker.Dialog.NoXuggle.Message3=Takipçi ana dizinindeki Tracker_README.txt dosyas\u0131na bak\u0131n. -Tracker.Dialog.NoXuggle.Message4=Xuggle'\u0131 yüklemek için, en son Takipçi yükleyici program\u0131n\u0131 \u015Fu adresten indirin: -Tracker.Dialog.NoXuggle.Title=Xuggle Kullan\u0131lam\u0131yor +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg düzgün çal\u0131\u015Fm\u0131yor. Gerekli ffmpeg jar dosyalar\u0131n\u0131n +Tracker.Dialog.NoFFMPeg.Message2=Takipçi ana dizininde oldu\u011Fundan emin olun. Ayr\u0131t\u0131lar için, +Tracker.Dialog.NoFFMPeg.Message3=Takipçi ana dizinindeki Tracker_README.txt dosyas\u0131na bak\u0131n. +Tracker.Dialog.NoFFMPeg.Message4=FFMPeg'\u0131 yüklemek için, en son Takipçi yükleyici program\u0131n\u0131 \u015Fu adresten indirin: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Kullan\u0131lam\u0131yor Tracker.About.DefaultLocale=Varsay\u0131lan Yerel Ayar Tracker.About.CurrentLanguage=Dil Tracker.Dialog.InsufficientMemory.Title=Yetersiz Bellek @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Bellek boyutunu ayarla... TTrackBar.Button.Version=\u015Eu an kullan\u0131lan: sürüm TTrackBar.Popup.MenuItem.Upgrade=\u015Eimdi Yükselt... TTrackBar.Popup.MenuItem.Ignore=Dikkate alma -XuggleVideo.MenuItem.SmoothPlay=Pürüzsüz Çal (yava\u015F olabilir) +FFMPegVideo.MenuItem.SmoothPlay=Pürüzsüz Çal (yava\u015F olabilir) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Ayar \u015Eeridi @@ -908,13 +908,13 @@ WorldTView.Button.World=Yerel # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Uyar\u0131lar PrefsDialog.Checkbox.WarnIfNoEngine=Video motoru bulunamad\u0131 -PrefsDialog.Checkbox.WarnIfXuggleError=Zararl\u0131 olmayan Xuggle hatalar\u0131 +PrefsDialog.Checkbox.WarnIfFFMPegError=Zararl\u0131 olmayan FFMPeg hatalar\u0131 PropertiesDialog.Title=Özellikler PropertiesDialog.Label.Author=Yazarlar PropertiesDialog.Label.Contact=Temas TActions.Action.Properties=Özellikler... TActions.Action.OpenBrowser=Kütüphane Taray\u0131c\u0131s\u0131n\u0131 Aç... -TFrame.Progress.Xuggle=Xuggle yükleme çerçevesi +TFrame.Progress.FFMPeg=FFMPeg yükleme çerçevesi TFrame.Progress.ClickToCancel=(iptal etmek için t\u0131klay\u0131n) TFrame.Dialog.StalledVideo.Title=Video Yükleme Hatas\u0131 TFrame.Dialog.StalledVideo.Message0=Video yüklenirken durdu. Bu durum geçici olabilir. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Dur TFrame.Dialog.StalledVideo.Button.Wait=Bekle Tracker.Dialog.NoVideoEngine.Checkbox=Bunu bir daha gösterme TrackerIO.ZipFileFilter.Description=ZIP dosyas\u0131 (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle bu videoyu açarken a\u015Fa\u011F\u0131daki hatayla kar\u015F\u0131la\u015Ft\u0131: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg bu videoyu açarken a\u015Fa\u011F\u0131daki hatayla kar\u015F\u0131la\u015Ft\u0131: TrackerIO.Dialog.ErrorFFMPEG.Message2=Hatalar\u0131n hepsi de zararl\u0131 de\u011Fildir. Tam hata mesajlar\u0131 için, Yard\u0131m|Mesaj Giri\u015Fi seç. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u015Eayet Xuggle ba\u015Far\u0131s\u0131z olursa, QuickTime ile videoyu açman\u0131z mümkün olabilir. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u015Eayet FFMPeg ba\u015Far\u0131s\u0131z olursa, QuickTime ile videoyu açman\u0131z mümkün olabilir. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Not: Bu Mac OSX'te 32-bit Java VM de çal\u0131\u015Fan Takipçi gerektirir. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Hatas\u0131 -TrackerIO.ErrorFFMPEG.LogMessage=Daha fazla bilgi için, tercihler ileti\u015Fimindeki Xuggle uyar\u0131lar\u0131n\u0131 aç\u0131n (Düzenle|Tercihler). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Hatas\u0131 +TrackerIO.ErrorFFMPEG.LogMessage=Daha fazla bilgi için, tercihler ileti\u015Fimindeki FFMPeg uyar\u0131lar\u0131n\u0131 aç\u0131n (Düzenle|Tercihler). TToolBar.Button.OpenBrowser.Tooltip=OSP Dijital Kütüphane Taray\u0131c\u0131s\u0131n\u0131 Aç # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=De\u011Fi\u015Fken çerçeve süreleri PrefsDialog.Button.NoEngine=Hiçbiri PrefsDialog.Dialog.SwitchToQT.Message=QuickTime'a geçi\u015F yapmak ayn\u0131 zamanda Java VM'yi 32-bit'e dönü\u015Ftürür. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Xuggle'a geçi\u015F yapmak ayn\u0131 zamanda Java VM'yi 32-bit'e dönü\u015Ftürür. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Xuggle'a geçi\u015F yapmak ayn\u0131 zamanda Java VM'yi 64-bit'e dönü\u015Ftürür. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=FFMPeg'a geçi\u015F yapmak ayn\u0131 zamanda Java VM'yi 32-bit'e dönü\u015Ftürür. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=FFMPeg'a geçi\u015F yapmak ayn\u0131 zamanda Java VM'yi 64-bit'e dönü\u015Ftürür. PrefsDialog.Dialog.SwitchVM.Title=Java VM De\u011Fi\u015Ftirildi PrefsDialog.Dialog.SwitchTo32.Message=32-bit Java VM'ye geçi\u015F yapmak ayn\u0131 zamanda video motorunu QuickTime'a dönü\u015Ftürür. -PrefsDialog.Dialog.SwitchTo64.Message=64-bit Java VM'ye geçi\u015F yapmak ayn\u0131 zamanda video motorunu Xuggle'a dönü\u015Ftürür. +PrefsDialog.Dialog.SwitchTo64.Message=64-bit Java VM'ye geçi\u015F yapmak ayn\u0131 zamanda video motorunu FFMPeg'a dönü\u015Ftürür. PrefsDialog.Dialog.SwitchEngine.Title=Video Motoru De\u011Fi\u015Ftirildi PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Hiçbir video motoru 64-bit Java VM için kullan\u0131labilir de\u011Fil. PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=Siz hala görüntüleri (JPEG, PNG) ve canland\u0131r\u0131lm\u0131\u015F GIF'leri açabilirsiniz. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=64-bit VM'ye geçi\u015F yapmay\u0131 istedi\u011Finize eminmisiniz? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=64-bit Video Motoru Yok -PrefsDialog.Dialog.No32bitVMXuggle.Message=Xuggle kullan\u0131lmadan önce 32-bit Java VM yüklenmek zorunda. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=FFMPeg kullan\u0131lmadan önce 32-bit Java VM yüklenmek zorunda. PrefsDialog.Dialog.No32bitVMQT.Message=QuickTime kullan\u0131lmadan önce 32-bit Java VM yüklenmek zorunda. PrefsDialog.Dialog.No32bitVM.Message=Daha fazla bilgi için, Takipçi Yard\u0131m'a Bak: Kurulum. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Zorunludur @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=Evet, \u015Fimdi yeniden ba\u015Flat Tracker.Dialog.Button.ShowPrefs=Hay\u0131r fakat tercihleri göster Tracker.Dialog.Button.ContinueWithoutEngine=Hay\u0131r, videosuz devam et Tracker.Dialog.EngineProblems.Message1=Bir veya daha fazla video motoru yüklü fakat çal\u0131\u015Fm\u0131yor. -Tracker.Dialog.EngineProblems.Message2=Daha fazla bilgi için Yard\u0131m|Te\u015Fhis|Xuggle veya QuickTime Hakk\u0131nda'ki bölüme bak\u0131n. -Tracker.Dialog.ReplaceXuggle.Message1=Biz \u015Fu anki Xuggle video motorunuz olan 3.4 versiyonunu ile, -Tracker.Dialog.ReplaceXuggle.Message2=yeniden Takipçi (version 4.75 veya üstü) program\u0131n\u0131 kurarak ve -Tracker.Dialog.ReplaceXuggle.Message3=kurulum seçeneklerinde Xuggle'\u0131 seçerek, de\u011Fi\u015Ftirmenizi tavsiye ederiz. +Tracker.Dialog.EngineProblems.Message2=Daha fazla bilgi için Yard\u0131m|Te\u015Fhis|FFMPeg veya QuickTime Hakk\u0131nda'ki bölüme bak\u0131n. +Tracker.Dialog.ReplaceFFMPeg.Message1=Biz \u015Fu anki FFMPeg video motorunuz olan 3.4 versiyonunu ile, +Tracker.Dialog.ReplaceFFMPeg.Message2=yeniden Takipçi (version 4.75 veya üstü) program\u0131n\u0131 kurarak ve +Tracker.Dialog.ReplaceFFMPeg.Message3=kurulum seçeneklerinde FFMPeg'\u0131 seçerek, de\u011Fi\u015Ftirmenizi tavsiye ederiz. TrackerIO.Dialog.DurationIsConstant.Message=Tüm çerçeve süreleri e\u015Fittir (sabit sçs). TrackerIO.ZIPResourceFilter.Description=Takipçi ZIP Dosyas\u0131 (.trz) TToolbar.Button.Desktop.Tooltip=HTML ve/veya PDF ile ili\u015Fkili belgeleri görüntüle @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=Metin S TToolBar.MenuItem.StretchOff=\u0130lk Durumuna Getir # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Sürümü +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Sürümü PrefsDialog.Checkbox.WarnCopyFailed=Video Motoru Dosya Kopyalama Hatalar\u0131 Tracker.Dialog.FailedToCopy.Title=Dosya Kopyalama Hatas\u0131 Velocity.Dialog.Color.Title=H\u0131z Rengini Seç diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_uk.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_uk.properties index b6db9467..68e5d3f7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_uk.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_uk.properties @@ -718,7 +718,7 @@ PrefsDialog.Checkbox.DefaultSize=Use default PrefsDialog.Checkbox.HintsOn=Show hints by default PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=Video Engine -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=Memory management is unavailable when using Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -733,9 +733,9 @@ PrefsDialog.Upgrades.Weekly=Weekly PrefsDialog.Upgrades.Monthly=Monthly PrefsDialog.Upgrades.Never=Never PrefsDialog.Button.CheckForUpgrade=Check Now -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (may be slow) -PrefsDialog.Xuggle.Fast=Fast (may be jerky) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (may be slow) +PrefsDialog.FFMPeg.Fast=Fast (may be jerky) PrefsDialog.CalibrationTool.BorderTitle=Default Calibration Tool Protractor.Name=Protractor Protractor.New.Name=protractor @@ -815,23 +815,23 @@ TMenuBar.Menu.MeasuringTools=Measuring Tools TMenuBar.Menu.AngleUnits=Angle Units TMenuBar.MenuItem.Degrees=Degrees TMenuBar.MenuItem.Radians=Radians -Tracker.Dialog.NoXuggle.Title=Xuggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (cross-platform video engine) is not installed. -Tracker.Dialog.NoXuggle.Message2=Download Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=About Xuggle... -Tracker.Dialog.AboutXuggle.Title=About Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle version -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle home: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle jar path: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (cross-platform video engine) is not installed. +Tracker.Dialog.NoFFMPeg.Message2=Download FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=About FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=About FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg version +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg jar path: Tracker.Dialog.NoVideoEngine.Message1=No video engine is installed. Without one, you Tracker.Dialog.NoVideoEngine.Message2=can only open images (JPEG, PNG) and animated GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the Xuggle video engine. +Tracker.Dialog.NoVideoEngine.Message3=Recommended: reinstall Tracker with the FFMPeg video engine. Tracker.Dialog.NoVideoEngine.Title=No Video Engine -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=Xuggle Unavailable +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=ffmpeg jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Unavailable Tracker.About.DefaultLocale=Default locale Tracker.About.CurrentLanguage=Language Tracker.Dialog.InsufficientMemory.Title=Insufficient Memory @@ -877,7 +877,7 @@ TTrackBar.Memory.Menu.SetSize=Set memory size... TTrackBar.Button.Version=Now available: version TTrackBar.Popup.MenuItem.Upgrade=Upgrade Now... TTrackBar.Popup.MenuItem.Ignore=Ignore -XuggleVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) +FFMPegVideo.MenuItem.SmoothPlay=Smooth Play (may be slow) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -906,13 +906,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Authors PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -925,12 +925,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1186,17 +1186,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1212,10 +1212,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1281,7 +1281,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors TrackerStarter.Warning.FailedToCopy1=Some video engine files could not be copied automatically. TrackerStarter.Warning.FailedToCopy2=The video engine may not work unless they are copied manually. diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties index 5b1a3905..e629e1dd 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties @@ -720,7 +720,7 @@ PrefsDialog.Checkbox.DefaultSize=S\u01b0\u0309 du\u0323ng m\u0103\u0323c \u0111i PrefsDialog.Checkbox.HintsOn=Hi\u1ec3n th\u1ecb g\u1ee3i \u00fd theo m\u1eb7c \u0111\u1ecbnh PrefsDialog.Tab.Video.Title=Video PrefsDialog.VideoPref.BorderTitle=\u0110\u1ed9ng c\u01a1 video -PrefsDialog.Button.Xuggle=Xuggle +PrefsDialog.Button.FFMPeg=FFMPeg PrefsDialog.Button.QT=Th\u1eddi gian nhanh ch\u00f3ng PrefsDialog.Dialog.WebStart.Message=Qu\u1ea3n l\u00fd b\u1ed9 nh\u1edb l\u00e0 kh\u00f4ng c\u00f3 s\u1eb5n khi s\u1eed d\u1ee5ng Web Start. PrefsDialog.Dialog.WebStart.Title=Web Start Mode @@ -735,9 +735,9 @@ PrefsDialog.Upgrades.Weekly=h\u00e0ng tu\u1ea7n PrefsDialog.Upgrades.Monthly=h\u1eb1ng th\u00e1ng PrefsDialog.Upgrades.Never=Kh\u00f4ng bao gi\u1edd PrefsDialog.Button.CheckForUpgrade=Ki\u1ec3m tra ngay -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video Playback -PrefsDialog.Xuggle.Slow=Smooth (c\u00f3 th\u1ec3 ch\u1eadm) -PrefsDialog.Xuggle.Fast=Nhanh (c\u00f3 th\u1ec3 l\u00e0 gi\u1eadt gi\u1eadt) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video Playback +PrefsDialog.FFMPeg.Slow=Smooth (c\u00f3 th\u1ec3 ch\u1eadm) +PrefsDialog.FFMPeg.Fast=Nhanh (c\u00f3 th\u1ec3 l\u00e0 gi\u1eadt gi\u1eadt) PrefsDialog.CalibrationTool.BorderTitle=M\u1eb7c \u0111\u1ecbnh hi\u1ec7u chu\u1ea9n c\u1ee5 Protractor.Name=th\u01b0\u1edbc \u0111o h\u00ecnh b\u00e1n nguy\u1ec7t Protractor.New.Name=th\u01b0\u1edbc \u0111o h\u00ecnh b\u00e1n nguy\u1ec7t @@ -817,23 +817,23 @@ TMenuBar.Menu.MeasuringTools=D\u1ee5ng c\u1ee5 \u0111o l\u01b0\u1eddng TMenuBar.Menu.AngleUnits=C\u00e1c \u0111\u01a1n v\u1ecb g\u00f3c TMenuBar.MenuItem.Degrees=B\u1eb1ng TMenuBar.MenuItem.Radians=radian -Tracker.Dialog.NoXuggle.Title=Xuggle kh\u00f4ng t\u00ecm th\u1ea5y -Tracker.Dialog.NoXuggle.Message1=Xuggle (\u0111\u1ed9ng c\u01a1 h\u00ecnh cross-platform) kh\u00f4ng \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t. -Tracker.Dialog.NoXuggle.Message2=T\u1ea3i Xuggle t\u1eeb http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=V\u1ec1 Xuggle ... -Tracker.Dialog.AboutXuggle.Title=v\u1ec1 Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=phi\u00ean b\u1ea3n Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle nh\u00e0: -Tracker.Dialog.AboutXuggle.Message.Path=\u0111\u01b0\u1eddng jar Xuggle: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg kh\u00f4ng t\u00ecm th\u1ea5y +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (\u0111\u1ed9ng c\u01a1 h\u00ecnh cross-platform) kh\u00f4ng \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t. +Tracker.Dialog.NoFFMPeg.Message2=T\u1ea3i FFMPeg t\u1eeb http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=V\u1ec1 FFMPeg ... +Tracker.Dialog.AboutFFMPeg.Title=v\u1ec1 FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=phi\u00ean b\u1ea3n FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg nh\u00e0: +Tracker.Dialog.AboutFFMPeg.Message.Path=\u0111\u01b0\u1eddng jar FFMPeg: Tracker.Dialog.NoVideoEngine.Message1=Kh\u00f4ng c\u00f3 c\u00f4ng c\u1ee5 video \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t. Kh\u00f4ng c\u00f3 n\u00f3, b\u1ea1n Tracker.Dialog.NoVideoEngine.Message2=ch\u1ec9 c\u00f3 th\u1ec3 h\u00ecnh \u1ea3nh m\u1edf (JPEG, PNG) v\u00e0 \u1ea3nh GIF \u0111\u1ed9ng. -Tracker.Dialog.NoVideoEngine.Message3=\u0110\u1ec1 xu\u1ea5t: c\u00e0i \u0111\u1eb7t l\u1ea1i Tracker v\u1edbi \u0111\u1ed9ng c\u01a1 h\u00ecnh Xuggle. +Tracker.Dialog.NoVideoEngine.Message3=\u0110\u1ec1 xu\u1ea5t: c\u00e0i \u0111\u1eb7t l\u1ea1i Tracker v\u1edbi \u0111\u1ed9ng c\u01a1 h\u00ecnh FFMPeg. Tracker.Dialog.NoVideoEngine.Title=Kh\u00f4ng c\u00f3 c\u01a1 video -Tracker.Dialog.NoXuggle.Message1=Xuggle kh\u00f4ng l\u00e0m vi\u1ec7c m\u1ed9t c\u00e1ch ch\u00ednh x\u00e1c. H\u00e3y ch\u1eafc ch\u1eafn c\u00e1c y\u00eau c\u1ea7u -Tracker.Dialog.NoXuggle.Message2=file jar xuggle n\u1eb1m trong th\u01b0 m\u1ee5c Tracker nh\u00e0. \u0110\u1ec3 bi\u1ebft chi ti\u1ebft, -Tracker.Dialog.NoXuggle.Message3=th\u1ea5y Tracker_README.txt trong th\u01b0 m\u1ee5c Tracker nh\u00e0. -Tracker.Dialog.NoXuggle.Message4=\u0110\u1ec3 c\u00e0i \u0111\u1eb7t Xuggle, t\u1ea3i v\u1ec1 b\u1ed9 c\u00e0i \u0111\u1eb7t Tracker m\u1edbi nh\u1ea5t t\u1eeb -Tracker.Dialog.NoXuggle.Title=Xuggle Kh\u00f4ng c\u00f3 s\u1eb5n +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg kh\u00f4ng l\u00e0m vi\u1ec7c m\u1ed9t c\u00e1ch ch\u00ednh x\u00e1c. H\u00e3y ch\u1eafc ch\u1eafn c\u00e1c y\u00eau c\u1ea7u +Tracker.Dialog.NoFFMPeg.Message2=file jar ffmpeg n\u1eb1m trong th\u01b0 m\u1ee5c Tracker nh\u00e0. \u0110\u1ec3 bi\u1ebft chi ti\u1ebft, +Tracker.Dialog.NoFFMPeg.Message3=th\u1ea5y Tracker_README.txt trong th\u01b0 m\u1ee5c Tracker nh\u00e0. +Tracker.Dialog.NoFFMPeg.Message4=\u0110\u1ec3 c\u00e0i \u0111\u1eb7t FFMPeg, t\u1ea3i v\u1ec1 b\u1ed9 c\u00e0i \u0111\u1eb7t Tracker m\u1edbi nh\u1ea5t t\u1eeb +Tracker.Dialog.NoFFMPeg.Title=FFMPeg Kh\u00f4ng c\u00f3 s\u1eb5n Tracker.About.DefaultLocale=ng\u00f4n ng\u1eef m\u1eb7c \u0111\u1ecbnh Tracker.About.CurrentLanguage=ng\u00f4n ng\u1eef Tracker.Dialog.InsufficientMemory.Title=Kh\u00f4ng \u0111\u1ee7 b\u1ed9 nh\u1edb @@ -879,7 +879,7 @@ TTrackBar.Memory.Menu.SetSize=Thi\u1ebft l\u1eadp k\u00edch th\u01b0\u1edbc b\u1 TTrackBar.Button.Version=B\u00e2y gi\u1edd c\u00f3 s\u1eb5n: phi\u00ean b\u1ea3n TTrackBar.Popup.MenuItem.Upgrade=N\u00e2ng c\u1ea5p ngay b\u00e2y gi\u1edd... TTrackBar.Popup.MenuItem.Ignore=B\u1ecf qua -XuggleVideo.MenuItem.SmoothPlay=M\u1ecbn Play (c\u00f3 th\u1ec3 ch\u1eadm) +FFMPegVideo.MenuItem.SmoothPlay=M\u1ecbn Play (c\u00f3 th\u1ec3 ch\u1eadm) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Hi\u1ec7u chu\u1ea9n Tape @@ -908,13 +908,13 @@ WorldTView.Button.World=th\u1ebf gi\u1edbi # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=c\u1ea3nh b\u00e1o PrefsDialog.Checkbox.WarnIfNoEngine=Kh\u00f4ng c\u00f3 \u0111\u1ed9ng c\u01a1 h\u00ecnh -PrefsDialog.Checkbox.WarnIfXuggleError=l\u1ed7i Xuggle kh\u00f4ng g\u00e2y t\u1eed vong +PrefsDialog.Checkbox.WarnIfFFMPegError=l\u1ed7i FFMPeg kh\u00f4ng g\u00e2y t\u1eed vong PropertiesDialog.Title=T\u00ednh ch\u1ea5t PropertiesDialog.Label.Author=t\u00e1c gi\u1ea3 PropertiesDialog.Label.Contact=Ti\u1ebfp x\u00fac TActions.Action.Properties=T\u00ednh ch\u1ea5t... TActions.Action.OpenBrowser=M\u1edf Library Browser ... -TFrame.Progress.Xuggle=khung t\u1ea3i Xuggle +TFrame.Progress.FFMPeg=khung t\u1ea3i FFMPeg TFrame.Progress.ClickToCancel=(B\u1ea5m v\u00e0o \u0111\u1ec3 h\u1ee7y b\u1ecf) TFrame.Dialog.StalledVideo.Title=L\u1ed7i t\u1ea3i video TFrame.Dialog.StalledVideo.Message0=C\u00e1c video \u0111\u00e3 b\u1ecb \u0111\u00ecnh tr\u1ec7 trong khi t\u1ea3i. \u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 l\u00e0 t\u1ea1m th\u1eddi. @@ -927,12 +927,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=D\u1eebng l\u1ea1i TFrame.Dialog.StalledVideo.Button.Wait=Ch\u1edd \u0111\u1ee3i Tracker.Dialog.NoVideoEngine.Checkbox=Kh\u00f4ng hi\u1ec3n th\u1ecb n\u00e0y m\u1ed9t l\u1ea7n n\u1eefa TrackerIO.ZipFileFilter.Description=t\u1eadp tin ZIP (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle \u0111\u00e3 g\u1eb7p ph\u1ea3i nh\u1eefng l\u1ed7i sau \u0111\u00e2y khi m\u1edf video n\u00e0y: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg \u0111\u00e3 g\u1eb7p ph\u1ea3i nh\u1eefng l\u1ed7i sau \u0111\u00e2y khi m\u1edf video n\u00e0y: TrackerIO.Dialog.ErrorFFMPEG.Message2=Kh\u00f4ng ph\u1ea3i t\u1ea5t c\u1ea3 c\u00e1c l\u1ed7i g\u00e2y t\u1eed vong. \u0110\u1ed1i v\u1edbi c\u00e1c th\u00f4ng b\u00e1o l\u1ed7i \u0111\u1ea7y \u0111\u1ee7, ch\u1ecdn Tr\u1ee3 gi\u00fap | Tin Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=N\u1ebfu Xuggle th\u1ea5t b\u1ea1i, b\u1ea1n c\u00f3 th\u1ec3 m\u1edf video v\u1edbi QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=N\u1ebfu FFMPeg th\u1ea5t b\u1ea1i, b\u1ea1n c\u00f3 th\u1ec3 m\u1edf video v\u1edbi QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=L\u01b0u \u00fd: Tr\u00ean Mac OSX n\u00e0y \u0111\u00f2i h\u1ecfi ph\u1ea3i ch\u1ea1y Tracker trong m\u1ed9t 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle L\u1ed7i -TrackerIO.ErrorFFMPEG.LogMessage=\u0110\u1ec3 bi\u1ebft th\u00eam chi ti\u1ebft, b\u1eadt c\u1ea3nh b\u00e1o Xuggle trong h\u1ed9p tho\u1ea1i s\u1edf th\u00edch (Edit | Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg L\u1ed7i +TrackerIO.ErrorFFMPEG.LogMessage=\u0110\u1ec3 bi\u1ebft th\u00eam chi ti\u1ebft, b\u1eadt c\u1ea3nh b\u00e1o FFMPeg trong h\u1ed9p tho\u1ea1i s\u1edf th\u00edch (Edit | Preferences). TToolBar.Button.OpenBrowser.Tooltip=M\u1edf th\u01b0 vi\u1ec7n s\u1ed1 OSP duy\u1ec7t # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=th\u1eddi h\u1ea1n khung Variable PrefsDialog.Button.NoEngine=kh\u00f4ng ai PrefsDialog.Dialog.SwitchToQT.Message=Chuy\u1ec3n sang QuickTime c\u0169ng thay \u0111\u1ed5i c\u00e1c m\u00e1y \u1ea3o Java \u0111\u1ebfn 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Chuy\u1ec3n sang Xuggle c\u0169ng thay \u0111\u1ed5i c\u00e1c m\u00e1y \u1ea3o Java \u0111\u1ebfn 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Chuy\u1ec3n sang Xuggle c\u0169ng thay \u0111\u1ed5i c\u00e1c m\u00e1y \u1ea3o Java \u0111\u1ebfn 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Chuy\u1ec3n sang FFMPeg c\u0169ng thay \u0111\u1ed5i c\u00e1c m\u00e1y \u1ea3o Java \u0111\u1ebfn 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Chuy\u1ec3n sang FFMPeg c\u0169ng thay \u0111\u1ed5i c\u00e1c m\u00e1y \u1ea3o Java \u0111\u1ebfn 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM thay \u0111\u1ed5i PrefsDialog.Dialog.SwitchTo32.Message=Chuy\u1ec3n sang m\u1ed9t 32-bit Java VM c\u0169ng thay \u0111\u1ed5i \u0111\u1ed9ng c\u01a1 video QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Chuy\u1ec3n sang m\u1ed9t 64-bit Java VM c\u0169ng thay \u0111\u1ed5i \u0111\u1ed9ng c\u01a1 video \u0111\u1ec3 Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Chuy\u1ec3n sang m\u1ed9t 64-bit Java VM c\u0169ng thay \u0111\u1ed5i \u0111\u1ed9ng c\u01a1 video \u0111\u1ec3 FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video C\u00f4ng c\u1ee5 thay \u0111\u1ed5i PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=Kh\u00f4ng c\u00f3 c\u00f4ng c\u1ee5 n\u00e0y s\u1eb5n c\u00f3 \u0111\u1ec3 m\u1ed9t 64-bit Java VM. B\u1ea1n s\u1ebd PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=v\u1eabn c\u00f2n c\u00f3 th\u1ec3 m\u1edf h\u00ecnh \u1ea3nh (JPEG, PNG) v\u00e0 GIF \u0111\u1ed9ng. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=B\u1ea1n c\u00f3 ch\u1eafc ch\u1eafn mu\u1ed1n chuy\u1ec3n sang m\u1ed9t m\u00e1y \u1ea3o 64-bit? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Kh\u00f4ng c\u00f3 c\u01a1 video 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM ph\u1ea3i \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u01b0\u1edbc khi Xuggle c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM ph\u1ea3i \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u01b0\u1edbc khi FFMPeg c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM ph\u1ea3i \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u01b0\u1edbc khi QuickTime c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. PrefsDialog.Dialog.No32bitVM.Message=\u0110\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin, xem Tracker Help: C\u00e0i \u0111\u1eb7t. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM bu\u1ed9c @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=C\u00f3, relaunch nay Tracker.Dialog.Button.ShowPrefs=Kh\u00f4ng, nh\u01b0ng s\u1edf th\u00edch c\u1ee7a ch\u01b0\u01a1ng tr\u00ecnh Tracker.Dialog.Button.ContinueWithoutEngine=Kh\u00f4ng, ti\u1ebfp t\u1ee5c m\u00e0 kh\u00f4ng c\u00f3 h\u00ecnh Tracker.Dialog.EngineProblems.Message1=M\u1ed9t ho\u1eb7c nhi\u1ec1u \u0111\u1ed9ng c\u01a1 video \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t nh\u01b0ng kh\u00f4ng l\u00e0m vi\u1ec7c. -Tracker.Dialog.EngineProblems.Message2=\u0110\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin, xem Tr\u1ee3 gi\u00fap | Diagnostics | Gi\u1edbi Xuggle ho\u1eb7c QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=Ch\u00fang t\u00f4i khuy\u00ean b\u1ea1n n\u00ean thay th\u1ebf c\u00f4ng c\u1ee5 Video Xuggle hi\u1ec7n t\u1ea1i c\u1ee7a b\u1ea1n -Tracker.Dialog.ReplaceXuggle.Message2=v\u1edbi Xuggle phi\u00ean b\u1ea3n 3.4 b\u1eb1ng c\u00e1ch c\u00e0i \u0111\u1eb7t l\u1ea1i Tracker (phi\u00ean b\u1ea3n 4,75 -Tracker.Dialog.ReplaceXuggle.Message3=ho\u1eb7c \u1edf tr\u00ean) v\u00e0 ch\u1ecdn Xuggle trong c\u00e1c t\u00f9y ch\u1ecdn c\u00e0i \u0111\u1eb7t. +Tracker.Dialog.EngineProblems.Message2=\u0110\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin, xem Tr\u1ee3 gi\u00fap | Diagnostics | Gi\u1edbi FFMPeg ho\u1eb7c QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=Ch\u00fang t\u00f4i khuy\u00ean b\u1ea1n n\u00ean thay th\u1ebf c\u00f4ng c\u1ee5 Video FFMPeg hi\u1ec7n t\u1ea1i c\u1ee7a b\u1ea1n +Tracker.Dialog.ReplaceFFMPeg.Message2=v\u1edbi FFMPeg phi\u00ean b\u1ea3n 3.4 b\u1eb1ng c\u00e1ch c\u00e0i \u0111\u1eb7t l\u1ea1i Tracker (phi\u00ean b\u1ea3n 4,75 +Tracker.Dialog.ReplaceFFMPeg.Message3=ho\u1eb7c \u1edf tr\u00ean) v\u00e0 ch\u1ecdn FFMPeg trong c\u00e1c t\u00f9y ch\u1ecdn c\u00e0i \u0111\u1eb7t. TrackerIO.Dialog.DurationIsConstant.Message=T\u1ea5t c\u1ea3 th\u1eddi l\u01b0\u1ee3ng khung h\u00ecnh b\u1eb1ng nhau (fps kh\u00f4ng \u0111\u1ed5i). TrackerIO.ZIPResourceFilter.Description=T\u1eadp tin Tracker ZIP (.trz) TToolbar.Button.Desktop.Tooltip=Hi\u1ec3n th\u1ecb li\u00ean k\u1ebft c\u00e1c t\u00e0i li\u1ec7u HTML v\u00e0 / ho\u1eb7c PDF @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=Ti\u00eau C\u1ed9t TToolBar.MenuItem.StretchOff=Thi\u1ebft l\u1eadp l\u1ea1i # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Sao ch\u00e9p l\u1ed7i \u0111\u1ed9ng c\u01a1 t\u1eadp tin video Tracker.Dialog.FailedToCopy.Title=File Copy L\u1ed7i Velocity.Dialog.Color.Title=Ch\u1ecdn Velocity M\u00e0u diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties index f4a1e712..7736d71a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_CN.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9ed8\u8ba4 PrefsDialog.Checkbox.HintsOn=\u9ed8\u8ba4\u663e\u793a\u63d0\u793a PrefsDialog.Tab.Video.Title=\u89c6\u9891 PrefsDialog.VideoPref.BorderTitle=\u89c6\u9891\u5f15\u64ce -PrefsDialog.Button.Xuggle=Xuggle (\u63a8\u8350) +PrefsDialog.Button.FFMPeg=FFMPeg (\u63a8\u8350) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\u4f7f\u7528Web Start\u65f6\u5185\u5b58\u7ba1\u7406\u4e0d\u53ef\u7528. PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 PrefsDialog.Upgrades.Never=\u4ece\u4e0d PrefsDialog.Button.CheckForUpgrade=\u73b0\u5728\u68c0\u67e5 -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle\u64ad\u653e\u5f71\u7247 -PrefsDialog.Xuggle.Slow=\u5149\u6ed1 (\u53ef\u80fd\u4f1a\u53d8\u6162) -PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u4f1a\u6709\u952f\u9f7f) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg\u64ad\u653e\u5f71\u7247 +PrefsDialog.FFMPeg.Slow=\u5149\u6ed1 (\u53ef\u80fd\u4f1a\u53d8\u6162) +PrefsDialog.FFMPeg.Fast=\u5feb\u901f (\u53ef\u80fd\u4f1a\u6709\u952f\u9f7f) PrefsDialog.CalibrationTool.BorderTitle=\u9ed8\u8ba4\u5b9a\u6807\u5de5\u5177 Protractor.Name=\u91cf\u89d2\u5668 Protractor.New.Name=\u91cf\u89d2\u5668 @@ -816,22 +816,22 @@ TMenuBar.Menu.MeasuringTools=\u6d4b\u91cf\u5de5\u5177 TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u5355\u4f4d TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 TMenuBar.MenuItem.Radians=\u5f27\u5ea6 -Tracker.Dialog.NoXuggle.Title=Xuggle\u672a\u627e\u5230 -Tracker.Dialog.NoXuggle.Message1=Xuggle (\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ce)\u672a\u5b89\u88c5. -Tracker.Dialog.NoXuggle.Message2=\u4ecehttp://www.xuggle.com/xuggler/downloads/ \u4e0b\u8f7dXuggle. -Tracker.Action.AboutXuggle=\u5173\u4e8eXuggle... -Tracker.Dialog.AboutXuggle.Title=\u5173\u4e8eXuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle\u7248\u672c -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle\u4e3b\u9875: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle\u8def\u5f84: +Tracker.Dialog.NoFFMPeg.Title=FFMPeg\u672a\u627e\u5230 +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ce)\u672a\u5b89\u88c5. +Tracker.Dialog.NoFFMPeg.Message2=\u4ecehttp://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=\u5173\u4e8eFFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=\u5173\u4e8eFFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg\u7248\u672c +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg\u4e3b\u9875: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg\u8def\u5f84: Tracker.Dialog.NoVideoEngine.Message1=\u9ed8\u8ba4\u60c5\u51b5\u4e0b,Tracker\u53ef\u4ee5\u6253\u5f00\u52a8\u753bgif\u56fe\u50cf\u53ca\u56fe\u7247\u5e8f\u5217, Tracker.Dialog.NoVideoEngine.Message2=\u5982\u679c\u8981\u6253\u5f00\u5176\u4ed6\u7c7b\u578b\u7684\u89c6\u9891\u5219\u9700\u8981\u5176\u4ed6\u7684\u89c6\u9891\u5f15\u64ce. -Tracker.Dialog.NoVideoEngine.Message3=\u63a8\u8350\u5b89\u88c5\u81ea\u7531\u5f00\u6e90\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ceXuggle +Tracker.Dialog.NoVideoEngine.Message3=\u63a8\u8350\u5b89\u88c5\u81ea\u7531\u5f00\u6e90\u8de8\u5e73\u53f0\u89c6\u9891\u5f15\u64ceFFMPeg Tracker.Dialog.NoVideoEngine.Message4=\u6700\u65b0\u7248Tracker\u4e0b\u8f7d Tracker.Dialog.NoVideoEngine.Title=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce -Tracker.Dialog.NoXuggle.Message1=Xuggle\u672a\u5b89\u88c5\u6216\u5de5\u4f5c\u4e0d\u6b63\u5e38(\u672a\u77e5\u539f\u56e0). -Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f7d\u6700\u65b0\u7684Xuggle\u5b89\u88c5 -Tracker.Dialog.NoXuggle.Title=Xuggle\u4e0d\u53ef\u7528 +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg\u672a\u5b89\u88c5\u6216\u5de5\u4f5c\u4e0d\u6b63\u5e38(\u672a\u77e5\u539f\u56e0). +Tracker.Dialog.NoFFMPeg.Message2=\u4e0b\u8f7d\u6700\u65b0\u7684FFMPeg\u5b89\u88c5 +Tracker.Dialog.NoFFMPeg.Title=FFMPeg\u4e0d\u53ef\u7528 Tracker.About.DefaultLocale=\u9ed8\u8ba4\u533a\u57df Tracker.About.CurrentLanguage=\u8bed\u8a00 Tracker.Dialog.InsufficientMemory.Title=\u5185\u5b58\u4e0d\u8db3 @@ -877,7 +877,7 @@ TTrackBar.Memory.Menu.SetSize=\u8bbe\u7f6e\u5185\u5b58\u5927\u5c0f... TTrackBar.Button.Version=\u5f53\u524d\u53ef\u7528\u7248\u672c: version TTrackBar.Popup.MenuItem.Upgrade=\u73b0\u5728\u5347\u7ea7... TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 -XuggleVideo.MenuItem.SmoothPlay=\u5e73\u6ed1\u64ad\u653e(\u7a0d\u6162) +FFMPegVideo.MenuItem.SmoothPlay=\u5e73\u6ed1\u64ad\u653e(\u7a0d\u6162) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\u5b9a\u6807\u5c3a @@ -906,13 +906,13 @@ WorldTView.Button.World=\u89c6\u9891 # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u8b66\u544a PrefsDialog.Checkbox.WarnIfNoEngine=\u6ca1\u6709\u89c6\u9891\u5f15\u64ce -PrefsDialog.Checkbox.WarnIfXuggleError=\u4e0d\u4e25\u91cd\u7684Xuggle\u9519\u8bef +PrefsDialog.Checkbox.WarnIfFFMPegError=\u4e0d\u4e25\u91cd\u7684FFMPeg\u9519\u8bef PropertiesDialog.Title=\u5c5e\u6027 PropertiesDialog.Label.Author=\u4f5c\u8005 PropertiesDialog.Label.Contact=\u8054\u7cfb TActions.Action.Properties=\u5c5e\u6027... TActions.Action.OpenBrowser=\u6253\u5f00\u5e93\u6d4f\u89c8\u5668... -TFrame.Progress.Xuggle=Xuggle\u6b63\u5728\u8f7d\u5165\u5e27 +TFrame.Progress.FFMPeg=FFMPeg\u6b63\u5728\u8f7d\u5165\u5e27 TFrame.Progress.ClickToCancel=(\u70b9\u51fb\u53d6\u6d88) TFrame.Dialog.StalledVideo.Title=\u8f7d\u5165\u89c6\u9891\u9519\u8bef TFrame.Dialog.StalledVideo.Message0=\u8f7d\u5165\u89c6\u9891\u65f6\u53d1\u751f\u672a\u77e5\u9519\u8bef,\u6709\u53ef\u80fd\u662f\u6682\u65f6\u7684. @@ -925,12 +925,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=\u7ec8\u6b62 TFrame.Dialog.StalledVideo.Button.Wait=\u7b49\u5f85 Tracker.Dialog.NoVideoEngine.Checkbox=\u4e0d\u518d\u663e\u793a\u8be5\u4fe1\u606f TrackerIO.ZipFileFilter.Description=ZIP\u6587\u4ef6 -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle\u5728\u6253\u5f00\u89c6\u9891\u65f6\u9047\u5230\u5982\u4e0b\u9519\u8bef: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg\u5728\u6253\u5f00\u89c6\u9891\u65f6\u9047\u5230\u5982\u4e0b\u9519\u8bef: TrackerIO.Dialog.ErrorFFMPEG.Message2=\u5e76\u975e\u6240\u6709\u7684\u9519\u8bef\u90fd\u662f\u4e25\u91cd\u9519\u8bef.\u66f4\u5b8c\u6574\u7684\u9519\u8bef\u4fe1\u606f\u8bf7\u9009\u62e9 \u5e2e\u52a9|\u4fe1\u606f\u8bb0\u5f55 \u67e5\u770b. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5982\u679cXuggle\u5f15\u64ce\u5931\u8d25,\u60a8\u53ef\u4ee5\u8bd5\u7528QuickTime\u6253\u5f00\u89c6\u9891. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5982\u679cFFMPeg\u5f15\u64ce\u5931\u8d25,\u60a8\u53ef\u4ee5\u8bd5\u7528QuickTime\u6253\u5f00\u89c6\u9891. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u6ce8\u610f: \u5728Mac OSX\u4e2d\u9700\u8981\u572832\u4f4dJava\u865a\u62df\u673a\u4e0a\u8fd0\u884cTracker. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle\u9519\u8bef -TrackerIO.ErrorFFMPEG.LogMessage=\u66f4\u591a\u4fe1\u606f,\u8bf7\u5728\u4e2a\u4eba\u504f\u597d\u8bbe\u5b9a(\u7f16\u8f91|\u4e2a\u4eba\u504f\u597d)\u5f00\u542fXuggle\u8b66\u544a\u4fe1\u606f. +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg\u9519\u8bef +TrackerIO.ErrorFFMPEG.LogMessage=\u66f4\u591a\u4fe1\u606f,\u8bf7\u5728\u4e2a\u4eba\u504f\u597d\u8bbe\u5b9a(\u7f16\u8f91|\u4e2a\u4eba\u504f\u597d)\u5f00\u542fFFMPeg\u8b66\u544a\u4fe1\u606f. TToolBar.Button.OpenBrowser.Tooltip=\u6253\u5f00\u5f00\u6e90\u7269\u7406(OPS)\u6570\u5b66\u5e93\u6d4f\u89c8\u5668 # Additions by Doug Brown 2011-07-20 @@ -1181,17 +1181,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1207,10 +1207,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1276,7 +1276,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties index 2484b781..593d48d9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties @@ -726,7 +726,7 @@ PrefsDialog.Checkbox.DefaultSize=\u4f7f\u7528\u9810\u8a2d PrefsDialog.Checkbox.HintsOn=\u9810\u8a2d\u986f\u793a\u63d0\u793a PrefsDialog.Tab.Video.Title=\u5f71\u7247 PrefsDialog.VideoPref.BorderTitle=\u5f71\u7247\u8655\u7406\u7a0b\u5f0f -PrefsDialog.Button.Xuggle=Xuggle (\u5efa\u8b70\u5b89\u88dd) +PrefsDialog.Button.FFMPeg=FFMPeg (\u5efa\u8b70\u5b89\u88dd) PrefsDialog.Button.QT=QuickTime PrefsDialog.Dialog.WebStart.Message=\u7576\u4f7f\u7528Web Start\u6642\u7121\u6cd5\u4f7f\u7528\u8a18\u61b6\u9ad4\u7ba1\u7406 PrefsDialog.Dialog.WebStart.Title=Web Start \u6a21\u5f0f @@ -741,9 +741,9 @@ PrefsDialog.Upgrades.Weekly=\u6bcf\u5468 PrefsDialog.Upgrades.Monthly=\u6bcf\u6708 PrefsDialog.Upgrades.Never=\u5f9e\u4e0d PrefsDialog.Button.CheckForUpgrade=\u99ac\u4e0a\u6aa2\u67e5 -PrefsDialog.Xuggle.Speed.BorderTitle=\u64ad\u653e\u5f71\u7247 -PrefsDialog.Xuggle.Slow=\u9806\u66a2 (\u53ef\u80fd\u6703\u8b8a\u6162) -PrefsDialog.Xuggle.Fast=\u5feb\u901f (\u53ef\u80fd\u51fa\u73fe\u92f8\u9f52) +PrefsDialog.FFMPeg.Speed.BorderTitle=\u64ad\u653e\u5f71\u7247 +PrefsDialog.FFMPeg.Slow=\u9806\u66a2 (\u53ef\u80fd\u6703\u8b8a\u6162) +PrefsDialog.FFMPeg.Fast=\u5feb\u901f (\u53ef\u80fd\u51fa\u73fe\u92f8\u9f52) PrefsDialog.CalibrationTool.BorderTitle=\u9810\u8a2d\u6821\u6b63\u5de5\u5177 Protractor.Name=\u91cf\u89d2\u5668 Protractor.New.Name=\u91cf\u89d2\u5668 @@ -823,22 +823,22 @@ TMenuBar.Menu.MeasuringTools=\u6e2c\u91cf\u5de5\u5177 TMenuBar.Menu.AngleUnits=\u89d2\u5ea6\u55ae\u4f4d TMenuBar.MenuItem.Degrees=\u89d2\u5ea6 TMenuBar.MenuItem.Radians=\u5f91\u5ea6 -Tracker.Dialog.NoXuggle.Title=\u6c92\u6709\u5b89\u88dd Xuggle -Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddXuggle (\u8de8\u5e73\u53f0\u5f71\u7247\u8655\u7406\u7a0b\u5f0f). -Tracker.Dialog.NoXuggle.Message2=\u4e0b\u8f09 Xuggle from http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u95dc\u65bc Xuggle... -Tracker.Dialog.AboutXuggle.Title=\u95dc\u65bc Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Xuggle \u7248\u672c -Tracker.Dialog.AboutXuggle.Message.Home=Xuggle \u9996\u9801: -Tracker.Dialog.AboutXuggle.Message.Path=Xuggle \u8def\u5f91: +Tracker.Dialog.NoFFMPeg.Title=\u6c92\u6709\u5b89\u88dd FFMPeg +Tracker.Dialog.NoFFMPeg.Message1=\u6c92\u6709\u5b89\u88ddFFMPeg (\u8de8\u5e73\u53f0\u5f71\u7247\u8655\u7406\u7a0b\u5f0f). +Tracker.Dialog.NoFFMPeg.Message2=\u4e0b\u8f09 FFMPeg from http://www.ffmpeg.org/download.html. +Tracker.Action.AboutFFMPeg=\u95dc\u65bc FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=\u95dc\u65bc FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=FFMPeg \u7248\u672c +Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg \u9996\u9801: +Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg \u8def\u5f91: Tracker.Dialog.NoVideoEngine.Message1=\u6c92\u6709\u5f71\u7247\u7a0b\u5f0f! \u96d6\u6c92\u6709 Tracker \u4ecd\u53ef\u4ee5 Tracker.Dialog.NoVideoEngine.Message2=\u50c5\u986f\u793a\u5716\u7247, \u5716\u7247\u96c6\u6216 animated gifs. -Tracker.Dialog.NoVideoEngine.Message3=\u6e96\u5099\u5b89\u88dd Xuggle, Tracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f +Tracker.Dialog.NoVideoEngine.Message3=\u6e96\u5099\u5b89\u88dd FFMPeg, Tracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f Tracker.Dialog.NoVideoEngine.Message4=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer Tracker.Dialog.NoVideoEngine.Title=\u7f3a\u5c11\u5f71\u7247\u8655\u7406\u7a0b\u5f0f -Tracker.Dialog.NoXuggle.Message1=\u6c92\u6709\u5b89\u88ddTracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f Xuggle. -Tracker.Dialog.NoXuggle.Message2=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer\u6703\u540c\u6642\u5b89\u88ddXuggle -Tracker.Dialog.NoXuggle.Title=\u7f3a\u5c11 Xuggle +Tracker.Dialog.NoFFMPeg.Message1=\u6c92\u6709\u5b89\u88ddTracker\u9810\u8a2d\u5f71\u7247\u8655\u7406\u7a0b\u5f0f FFMPeg. +Tracker.Dialog.NoFFMPeg.Message2=\u8acb\u4e0b\u8f09\u6700\u65b0\u7248\u672cTracker installer\u6703\u540c\u6642\u5b89\u88ddFFMPeg +Tracker.Dialog.NoFFMPeg.Title=\u7f3a\u5c11 FFMPeg Tracker.About.DefaultLocale=\u9810\u8a2d\u8a9e\u8a00 Tracker.About.CurrentLanguage=\u8a9e\u8a00 Tracker.Dialog.InsufficientMemory.Title=\u8a18\u61b6\u9ad4\u4e0d\u8db3 @@ -884,7 +884,7 @@ TTrackBar.Memory.Menu.SetSize=\u8a2d\u5b9a\u8a18\u61b6\u9ad4\u5927\u5c0f... TTrackBar.Button.Version=\u76ee\u524d\u53ef\u66f4\u65b0\u7248\u672c: TTrackBar.Popup.MenuItem.Upgrade=\u99ac\u4e0a\u66f4\u65b0... TTrackBar.Popup.MenuItem.Ignore=\u5ffd\u7565 -XuggleVideo.MenuItem.SmoothPlay=\u7de9\u6162\u64ad\u653e (\u53ef\u80fd\u8b8a\u6162) +FFMPegVideo.MenuItem.SmoothPlay=\u7de9\u6162\u64ad\u653e (\u53ef\u80fd\u8b8a\u6162) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=Calibration Tape @@ -913,13 +913,13 @@ WorldTView.Button.World=World # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=Warnings PrefsDialog.Checkbox.WarnIfNoEngine=No video engine -PrefsDialog.Checkbox.WarnIfXuggleError=Non-fatal Xuggle errors +PrefsDialog.Checkbox.WarnIfFFMPegError=Non-fatal FFMPeg errors PropertiesDialog.Title=Properties PropertiesDialog.Label.Author=Author PropertiesDialog.Label.Contact=Contact TActions.Action.Properties=Properties... TActions.Action.OpenBrowser=Open Library Browser... -TFrame.Progress.Xuggle=Xuggle loading frame +TFrame.Progress.FFMPeg=FFMPeg loading frame TFrame.Progress.ClickToCancel=(click to cancel) TFrame.Dialog.StalledVideo.Title=Error Loading Video TFrame.Dialog.StalledVideo.Message0=The video has stalled while loading. This may be temporary. @@ -932,12 +932,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=Stop TFrame.Dialog.StalledVideo.Button.Wait=Wait Tracker.Dialog.NoVideoEngine.Checkbox=Don't show this again TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle has encountered the following error while opening this video: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg has encountered the following error while opening this video: TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=If Xuggle fails, you may be able to open the video with QuickTime. +TrackerIO.Dialog.ErrorFFMPEG.Message3=If FFMPeg fails, you may be able to open the video with QuickTime. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: On Mac OSX this requires running Tracker in a 32-bit Java VM. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle Error -TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on Xuggle warnings in the preferences dialog (Edit|Preferences). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg Error +TrackerIO.ErrorFFMPEG.LogMessage=For more details, turn on FFMPeg warnings in the preferences dialog (Edit|Preferences). TToolBar.Button.OpenBrowser.Tooltip=Open the OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1194,17 +1194,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=Switching to QuickTime also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Switching to Xuggle also changes the Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=Switching to Xuggle also changes the Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Switching to FFMPeg also changes the Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=Switching to FFMPeg also changes the Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=Switching to a 32-bit Java VM also changes the video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=Switching to a 64-bit Java VM also changes the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=Video Engine Changed PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=No video engine is available for a 64-bit Java VM. You will PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=still be able to open images (JPEG, PNG) and animated GIFs. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=Are you sure you wish to switch to a 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=No 64-bit Video Engine -PrefsDialog.Dialog.No32bitVMXuggle.Message=A 32-bit Java VM must be installed before Xuggle can be used. +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=A 32-bit Java VM must be installed before FFMPeg can be used. PrefsDialog.Dialog.No32bitVMQT.Message=A 32-bit Java VM must be installed before QuickTime can be used. PrefsDialog.Dialog.No32bitVM.Message=For more information, see Tracker Help: Installation. PrefsDialog.Dialog.No32bitVM.Title=32-bit VM Required @@ -1220,10 +1220,10 @@ Tracker.Dialog.Button.RelaunchNow=Yes, relaunch now Tracker.Dialog.Button.ShowPrefs=No, but show preferences Tracker.Dialog.Button.ContinueWithoutEngine=No, continue without video Tracker.Dialog.EngineProblems.Message1=One or more video engines are installed but not working. -Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About Xuggle or QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=We recommend you replace your current Xuggle video engine -Tracker.Dialog.ReplaceXuggle.Message2=with Xuggle version 3.4 by reinstalling Tracker (version 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=or above) and selecting Xuggle in the installation options. +Tracker.Dialog.EngineProblems.Message2=For more information see Help|Diagnostics|About FFMPeg or QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=We recommend you replace your current FFMPeg video engine +Tracker.Dialog.ReplaceFFMPeg.Message2=with FFMPeg version 3.4 by reinstalling Tracker (version 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=or above) and selecting FFMPeg in the installation options. TrackerIO.Dialog.DurationIsConstant.Message=All frame durations are equal (constant fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP File (.trz) TToolbar.Button.Desktop.Tooltip=Display associated HTML and/or PDF documents @@ -1289,7 +1289,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle Version +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg Version PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=File Copy Error Velocity.Dialog.Color.Title=Choose Velocity Color From 52008ca4e0079d980ca5e32614895506dfd833f3 Mon Sep 17 00:00:00 2001 From: fschuett Date: Thu, 5 Oct 2017 16:06:48 +0200 Subject: [PATCH 17/20] fix missing declaration of 2 buttons --- .../cabrillo/tracker/TToolBar.java | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java b/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java index b5a441a8..21e3672a 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TToolBar.java @@ -93,6 +93,7 @@ public class TToolBar extends JToolBar implements PropertyChangeListener { protected JButton axesButton, zoomButton, autotrackerButton; protected JButton traceVisButton, pVisButton, vVisButton, aVisButton; protected JButton xMassButton, trailButton, labelsButton, stretchButton; + protected JButton fontSmallerButton, fontBiggerButton; protected int trailLength = trailLengths[trailLengths.length-2]; protected JPopupMenu newPopup = new JPopupMenu(); protected JPopupMenu selectPopup = new JPopupMenu(); @@ -473,12 +474,28 @@ protected JPopupMenu getPopup() { } }; + // font buttons + fontSmallerButton = new TButton(fontSmallerIcon); fontSmallerButton.setDisabledIcon(fontSmallerDisabledIcon); - fontSmallerButton.setEnabled(FontSizer.getLevel()>0); - fontBiggerButton.setEnabled(FontSizer.getLevel()0); + fontBiggerButton.setEnabled(FontSizer.getLevel()0); - fontBiggerButton.setEnabled(FontSizer.getLevel()0); + fontBiggerButton.setEnabled(FontSizer.getLevel() Date: Sun, 7 Oct 2018 13:55:06 +0200 Subject: [PATCH 18/20] fix translations Xuggle -> FFMPeg --- .../resources/tracker_th_TH.properties | 64 +++++++++--------- .../resources/tracker_vi_VN.properties | 66 +++++++++---------- .../resources/tracker_zh_TW.properties | 30 ++++----- 3 files changed, 80 insertions(+), 80 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties index 492fd4ff..5fa46cf5 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_th_TH.properties @@ -719,7 +719,7 @@ PrefsDialog.Checkbox.DefaultSize=\u0e43\u0e0a\u0e49\u0e04\u0e48\u0e32\u0e40\u0e2 PrefsDialog.Checkbox.HintsOn=\u0e41\u0e2a\u0e14\u0e07\u0e04\u0e48\u0e32\u0e17\u0e35\u0e48\u0e41\u0e19\u0e30\u0e19\u0e33\u0e17\u0e35\u0e48\u0e16\u0e39\u0e01\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e44\u0e27\u0e49 PrefsDialog.Tab.Video.Title=\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d PrefsDialog.VideoPref.BorderTitle=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e25\u0e48\u0e19\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d -PrefsDialog.Button.Xuggle=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle (\u0e41\u0e19\u0e30\u0e19\u0e33) +PrefsDialog.Button.FFMPeg=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg (\u0e41\u0e19\u0e30\u0e19\u0e33) PrefsDialog.Button.QT=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 QuickTime PrefsDialog.Dialog.WebStart.Message=\u0e01\u0e32\u0e23\u0e08\u0e31\u0e14\u0e01\u0e32\u0e23\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e44\u0e21\u0e48\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e43\u0e0a\u0e49\u0e44\u0e14\u0e49 \u0e02\u0e13\u0e30\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e40\u0e27\u0e1b\u0e44\u0e0b\u0e15\u0e4c PrefsDialog.Dialog.WebStart.Title=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e42\u0e21\u0e40\u0e14\u0e25\u0e08\u0e32\u0e01\u0e40\u0e27\u0e1b\u0e44\u0e0b\u0e15\u0e4c @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=\u0e23\u0e32\u0e22\u0e2a\u0e31\u0e1b\u0e14\u0e32\u0e PrefsDialog.Upgrades.Monthly=\u0e23\u0e32\u0e22\u0e40\u0e14\u0e37\u0e2d\u0e19 PrefsDialog.Upgrades.Never=\u0e44\u0e21\u0e48\u0e40\u0e04\u0e22 PrefsDialog.Button.CheckForUpgrade=\u0e15\u0e23\u0e32\u0e08\u0e2a\u0e2d\u0e1a\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49 -PrefsDialog.Xuggle.Speed.BorderTitle=\u0e40\u0e25\u0e48\u0e19\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a -PrefsDialog.Xuggle.Slow=\u0e40\u0e23\u0e35\u0e22\u0e1a (\u0e2d\u0e32\u0e08\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e0a\u0e49\u0e32\u0e25\u0e07) -PrefsDialog.Xuggle.Fast=\u0e40\u0e23\u0e47\u0e27 (\u0e2d\u0e32\u0e08\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e01\u0e23\u0e30\u0e15\u0e38\u0e01) +PrefsDialog.FFMPeg.Speed.BorderTitle=\u0e40\u0e25\u0e48\u0e19\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d\u0e22\u0e49\u0e2d\u0e19\u0e01\u0e25\u0e31\u0e1a +PrefsDialog.FFMPeg.Slow=\u0e40\u0e23\u0e35\u0e22\u0e1a (\u0e2d\u0e32\u0e08\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e0a\u0e49\u0e32\u0e25\u0e07) +PrefsDialog.FFMPeg.Fast=\u0e40\u0e23\u0e47\u0e27 (\u0e2d\u0e32\u0e08\u0e17\u0e33\u0e43\u0e2b\u0e49\u0e01\u0e23\u0e30\u0e15\u0e38\u0e01) PrefsDialog.CalibrationTool.BorderTitle=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e04\u0e48\u0e32\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e02\u0e2d\u0e07\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e40\u0e17\u0e35\u0e22\u0e1a Protractor.Name=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e04\u0e48\u0e32\u0e27\u0e31\u0e14\u0e21\u0e38\u0e21 Protractor.New.Name=\u0e40\u0e04\u0e23\u0e37\u0e48\u0e2d\u0e07\u0e21\u0e37\u0e2d\u0e27\u0e31\u0e14\u0e04\u0e48\u0e32\u0e21\u0e38\u0e21 @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=\u0e40\u0e21\u0e19\u0e39\u0e40\u0e04\u0e23\u0e37\u0 TMenuBar.Menu.AngleUnits=\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e02\u0e2d\u0e07\u0e21\u0e38\u0e21 TMenuBar.MenuItem.Degrees=\u0e2d\u0e07\u0e28\u0e32 TMenuBar.MenuItem.Radians=\u0e40\u0e23\u0e40\u0e14\u0e35\u0e22\u0e19 -Tracker.Dialog.NoXuggle.Title=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle -Tracker.Dialog.NoXuggle.Message1=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle (cross-platform video engine) -Tracker.Dialog.NoXuggle.Message2=Download \u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle \u0e08\u0e32\u0e01 http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a Xuggle... -Tracker.Dialog.AboutXuggle.Title=\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e48\u0e19 Xuggle +Tracker.Dialog.NoFFMPeg.Title=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg +Tracker.Dialog.NoFFMPeg.Message1=\u0e22\u0e31\u0e07\u0e44\u0e21\u0e48\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg (cross-platform video engine) +Tracker.Dialog.NoFFMPeg.Message2=Download \u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg \u0e08\u0e32\u0e01 http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutFFMPeg=\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a FFMPeg... +Tracker.Dialog.AboutFFMPeg.Title=\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e48\u0e19 FFMPeg Tracker.Dialog.AboutFFMPeg.Message.Home=FFMPeg home: Tracker.Dialog.AboutFFMPeg.Message.Path=FFMPeg path: Tracker.Dialog.NoVideoEngine.Message1=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49\u0e40\u0e1b\u0e34\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d Tracker.Dialog.NoVideoEngine.Message2=\u0e40\u0e1b\u0e34\u0e14\u0e20\u0e32\u0e1e\u0e40\u0e17\u0e48\u0e32\u0e19\u0e31\u0e49\u0e19, \u0e25\u0e33\u0e14\u0e31\u0e1a\u0e20\u0e32\u0e1e, \u0e41\u0e25\u0e30\u0e20\u0e32\u0e1e\u0e40\u0e04\u0e25\u0e37\u0e48\u0e2d\u0e19\u0e44\u0e2b\u0e27. -Tracker.Dialog.NoVideoEngine.Message3=\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle,\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e1a\u0e19 Tracker +Tracker.Dialog.NoVideoEngine.Message3=\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg,\u0e43\u0e2b\u0e49\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e1a\u0e19 Tracker Tracker.Dialog.NoVideoEngine.Title=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e1b\u0e34\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d -Tracker.Dialog.NoXuggle.Message1=Xuggle is not working correctly. Please be sure the required -Tracker.Dialog.NoXuggle.Message2=xuggle jar files are in the Tracker home directory. For details, -Tracker.Dialog.NoXuggle.Message3=see Tracker_README.txt in the Tracker home directory. -Tracker.Dialog.NoXuggle.Message4=To install Xuggle, download the latest Tracker installer from -Tracker.Dialog.NoXuggle.Title=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg is not working correctly. Please be sure the required +Tracker.Dialog.NoFFMPeg.Message2=xuggle jar files are in the Tracker home directory. For details, +Tracker.Dialog.NoFFMPeg.Message3=see Tracker_README.txt in the Tracker home directory. +Tracker.Dialog.NoFFMPeg.Message4=To install FFMPeg, download the latest Tracker installer from +Tracker.Dialog.NoFFMPeg.Title=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg Tracker.About.DefaultLocale=\u0e20\u0e32\u0e29\u0e32\u0e17\u0e35\u0e48\u0e43\u0e0a\u0e49 Tracker.About.CurrentLanguage=\u0e20\u0e32\u0e29\u0e32 Tracker.Dialog.InsufficientMemory.Title=\u0e2b\u0e19\u0e48\u0e27\u0e22\u0e04\u0e27\u0e32\u0e21\u0e08\u0e33\u0e44\u0e21\u0e48\u0e40\u0e1e\u0e35\u0e22\u0e07\u0e1e\u0e2d @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e02\u0e19\u0e32\u TTrackBar.Button.Version=Now available: \u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19 TTrackBar.Popup.MenuItem.Upgrade=\u0e2d\u0e31\u0e1e\u0e40\u0e01\u0e23\u0e14\u0e15\u0e2d\u0e19\u0e19\u0e35\u0e49... TTrackBar.Popup.MenuItem.Ignore=\u0e44\u0e21\u0e48\u0e2a\u0e19\u0e43\u0e08 -XuggleVideo.MenuItem.SmoothPlay=\u0e40\u0e25\u0e48\u0e19\u0e44\u0e14\u0e49\u0e15\u0e48\u0e2d\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07 (\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e0a\u0e49\u0e32) +FFMPegVideo.MenuItem.SmoothPlay=\u0e40\u0e25\u0e48\u0e19\u0e44\u0e14\u0e49\u0e15\u0e48\u0e2d\u0e40\u0e19\u0e37\u0e48\u0e2d\u0e07 (\u0e2d\u0e32\u0e08\u0e08\u0e30\u0e0a\u0e49\u0e32) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=\u0e40\u0e17\u0e1b\u0e27\u0e31\u0e14\u0e1b\u0e23\u0e31\u0e1a\u0e40\u0e17\u0e35\u0e22\u0e1a @@ -907,13 +907,13 @@ WorldTView.Button.World=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e1b\u0e47\u0e19\u0e08\u # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u0e04\u0e33\u0e40\u0e15\u0e37\u0e2d\u0e19 PrefsDialog.Checkbox.WarnIfNoEngine=\u0e44\u0e21\u0e48\u0e1e\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e25\u0e48\u0e19\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d -PrefsDialog.Checkbox.WarnIfXuggleError=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle \u0e40\u0e01\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 +PrefsDialog.Checkbox.WarnIfFFMPegError=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg \u0e40\u0e01\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14 PropertiesDialog.Title=\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34 PropertiesDialog.Label.Author=\u0e1c\u0e39\u0e49\u0e40\u0e02\u0e35\u0e22\u0e19 PropertiesDialog.Label.Contact=\u0e15\u0e34\u0e14\u0e15\u0e48\u0e2d TActions.Action.Properties=\u0e04\u0e38\u0e13\u0e2a\u0e21\u0e1a\u0e31\u0e15\u0e34... TActions.Action.OpenBrowser=\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19\u0e23\u0e32\u0e22\u0e01\u0e32\u0e23\u0e04\u0e49\u0e19\u0e2b\u0e32... -TFrame.Progress.Xuggle=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14 Xuggle +TFrame.Progress.FFMPeg=\u0e01\u0e33\u0e25\u0e31\u0e07\u0e42\u0e2b\u0e25\u0e14 FFMPeg TFrame.Progress.ClickToCancel=(\u0e04\u0e25\u0e34\u0e01\u0e40\u0e1e\u0e37\u0e48\u0e2d\u0e22\u0e01\u0e40\u0e25\u0e34\u0e01) TFrame.Dialog.StalledVideo.Title=\u0e01\u0e32\u0e23\u0e42\u0e2b\u0e25\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d\u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27 TFrame.Dialog.StalledVideo.Message0=\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e2d\u0e32\u0e08\u0e2b\u0e22\u0e38\u0e14\u0e17\u0e33\u0e07\u0e32\u0e19\u0e0a\u0e31\u0e48\u0e27\u0e04\u0e23\u0e32\u0e27\u0e43\u0e19\u0e02\u0e13\u0e30\u0e42\u0e2b\u0e25\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=\u0e2b\u0e22\u0e38\u0e14 TFrame.Dialog.StalledVideo.Button.Wait=\u0e23\u0e2d Tracker.Dialog.NoVideoEngine.Checkbox=\u0e44\u0e21\u0e48\u0e41\u0e2a\u0e14\u0e07\u0e2a\u0e48\u0e27\u0e19\u0e19\u0e35\u0e49\u0e2d\u0e35\u0e01\u0e04\u0e23\u0e31\u0e49\u0e07 TrackerIO.ZipFileFilter.Description=ZIP files -TrackerIO.Dialog.ErrorFFMPEG.Message1= \u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 Xuggle \u0e1e\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e44\u0e1f\u0e25\u0e4c\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d\u0e19\u0e35\u0e49 +TrackerIO.Dialog.ErrorFFMPEG.Message1= \u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 FFMPeg \u0e1e\u0e1a\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e43\u0e19\u0e02\u0e13\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e34\u0e14\u0e44\u0e1f\u0e25\u0e4c\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d\u0e19\u0e35\u0e49 TrackerIO.Dialog.ErrorFFMPEG.Message2=Not all errors are fatal. For full error messages, choose Help|Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0e16\u0e49\u0e32 Xuggle \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27, \u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e34\u0e14\u0e01\u0e31\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 QuickTime +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u0e16\u0e49\u0e32 FFMPeg \u0e25\u0e49\u0e21\u0e40\u0e2b\u0e25\u0e27, \u0e04\u0e38\u0e13\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e34\u0e14\u0e01\u0e31\u0e1a\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 QuickTime TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Note: \u0e1a\u0e19\u0e23\u0e30\u0e1a\u0e1a Mac OSX \u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e43\u0e0a\u0e49 32-bit Java VM -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19 -TrackerIO.ErrorFFMPEG.LogMessage=\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e14\u0e35\u0e22\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21,\u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e1b\u0e34\u0e14 Xuggle \u0e43\u0e19 preferences dialog (\u0e41\u0e01\u0e49\u0e44\u0e02|\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32). +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg \u0e21\u0e35\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e40\u0e01\u0e34\u0e14\u0e02\u0e36\u0e49\u0e19 +TrackerIO.ErrorFFMPEG.LogMessage=\u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e14\u0e35\u0e22\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21,\u0e43\u0e2b\u0e49\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e40\u0e1b\u0e34\u0e14 FFMPeg \u0e43\u0e19 preferences dialog (\u0e41\u0e01\u0e49\u0e44\u0e02|\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32). TToolBar.Button.OpenBrowser.Tooltip=\u0e40\u0e1b\u0e34\u0e14\u0e43\u0e19 OSP Digital Library Browser # Additions by Doug Brown 2011-07-20 @@ -1187,17 +1187,17 @@ PrefsDialog.Checkbox.32BitVM=32 \u0e1a\u0e34\u0e15 PrefsDialog.Checkbox.WarnVariableDuration=\u0e40\u0e1b\u0e47\u0e19\u0e15\u0e31\u0e27\u0e41\u0e1b\u0e23\u0e0a\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e02\u0e2d\u0e07\u0e40\u0e1f\u0e23\u0e21 PrefsDialog.Button.NoEngine=\u0e44\u0e21\u0e48 PrefsDialog.Dialog.SwitchToQT.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 QuickTime \u0e14\u0e49\u0e32\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 Xuggle \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Java VM to 32-bit. -PrefsDialog.Dialog.SwitchToXuggle64.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 Xuggle \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Java VM to 64-bit. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 FFMPeg \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Java VM to 32-bit. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 FFMPeg \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Java VM to 64-bit. PrefsDialog.Dialog.SwitchVM.Title=\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07 Java VM PrefsDialog.Dialog.SwitchTo32.Message=\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e40\u0e1b\u0e47\u0e19 a 32-bit Java VM \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 video engine to QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 a 64-bit Java VM \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 the video engine to Xuggle. +PrefsDialog.Dialog.SwitchTo64.Message=\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 a 64-bit Java VM \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 the video engine to FFMPeg. PrefsDialog.Dialog.SwitchEngine.Title=\u0e01\u0e32\u0e23\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e1b\u0e34\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e1b\u0e34\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d \u0e2a\u0e33\u0e2b\u0e23\u0e31\u0e1a 64-bit Java VM. \u0e04\u0e38\u0e13\u0e08\u0e30 PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=\u0e22\u0e31\u0e07\u0e04\u0e07\u0e2a\u0e32\u0e21\u0e32\u0e23\u0e16\u0e40\u0e1b\u0e34\u0e14\u0e20\u0e32\u0e1e (JPEG, PNG) \u0e41\u0e25\u0e30 animated GIFs \u0e44\u0e14\u0e49 PrefsDialog.Dialog.NoEngineIn64bitVM.Question=\u0e04\u0e38\u0e13\u0e41\u0e19\u0e48\u0e43\u0e08\u0e2b\u0e23\u0e37\u0e2d\u0e44\u0e21\u0e48\u0e17\u0e35\u0e48\u0e08\u0e30\u0e2a\u0e25\u0e31\u0e1a\u0e40\u0e1b\u0e47\u0e19 64-bit VM PrefsDialog.Dialog.NoEngineIn64bitVM.Title=\u0e44\u0e21\u0e48\u0e21\u0e35\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21\u0e40\u0e1b\u0e34\u0e14\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 32-bit Java \u0e01\u0e48\u0e2d\u0e19 Xuggle \u0e08\u0e36\u0e07\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49 +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 32-bit Java \u0e01\u0e48\u0e2d\u0e19 FFMPeg \u0e08\u0e36\u0e07\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49 PrefsDialog.Dialog.No32bitVMQT.Message=\u0e08\u0e30\u0e15\u0e49\u0e2d\u0e07\u0e25\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 32-bit Java VM \u0e01\u0e48\u0e2d\u0e19 QuickTime \u0e08\u0e36\u0e07\u0e08\u0e30\u0e43\u0e0a\u0e49\u0e07\u0e32\u0e19\u0e44\u0e14\u0e49 PrefsDialog.Dialog.No32bitVM.Message=\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21, \u0e14\u0e39\u0e43\u0e19 Tracker Help: \u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e42\u0e1b\u0e23\u0e41\u0e01\u0e23\u0e21 PrefsDialog.Dialog.No32bitVM.Title=\u0e15\u0e49\u0e2d\u0e07\u0e01\u0e32\u0e23 32-bit VM @@ -1213,10 +1213,10 @@ Tracker.Dialog.Button.RelaunchNow=\u0e43\u0e0a\u0e48, \u0e40\u0e23\u0e34\u0e48\u Tracker.Dialog.Button.ShowPrefs=\u0e44\u0e21\u0e48, \u0e41\u0e15\u0e48\u0e41\u0e2a\u0e14\u0e07\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32 Tracker.Dialog.Button.ContinueWithoutEngine=\u0e44\u0e21\u0e48, \u0e17\u0e33\u0e15\u0e48\u0e2d\u0e42\u0e14\u0e22\u0e44\u0e21\u0e48\u0e21\u0e35\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d Tracker.Dialog.EngineProblems.Message1=\u0e27\u0e34\u0e14\u0e35\u0e42\u0e2d engines 1 \u0e15\u0e31\u0e27 \u0e2b\u0e23\u0e37\u0e2d\u0e21\u0e32\u0e01\u0e01\u0e27\u0e48\u0e32\u0e44\u0e14\u0e49\u0e23\u0e31\u0e1a\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07\u0e41\u0e15\u0e48\u0e44\u0e21\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19 -Tracker.Dialog.EngineProblems.Message2=\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e14\u0e39\u0e43\u0e19 Help|\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e27\u0e34\u0e19\u0e34\u0e08\u0e09\u0e31\u0e22|\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a Xuggle \u0e2b\u0e23\u0e37\u0e2d QuickTime -Tracker.Dialog.ReplaceXuggle.Message1=\u0e40\u0e23\u0e32\u0e41\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 Xuggle video engine \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 -Tracker.Dialog.ReplaceXuggle.Message2=\u0e14\u0e49\u0e27\u0e22 Xuggle \u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19 3.4 \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07Tracker (version 4.75 \u0e43\u0e2b\u0e21\u0e48 -Tracker.Dialog.ReplaceXuggle.Message3=\u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e2b\u0e21\u0e48\u0e01\u0e27\u0e48\u0e32) \u0e41\u0e25\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01 Xuggle \u0e43\u0e19\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 +Tracker.Dialog.EngineProblems.Message2=\u0e23\u0e32\u0e22\u0e25\u0e30\u0e40\u0e2d\u0e35\u0e22\u0e14\u0e40\u0e1e\u0e34\u0e48\u0e21\u0e40\u0e15\u0e34\u0e21\u0e14\u0e39\u0e43\u0e19 Help|\u0e08\u0e32\u0e01\u0e01\u0e32\u0e23\u0e27\u0e34\u0e19\u0e34\u0e08\u0e09\u0e31\u0e22|\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e01\u0e31\u0e1a FFMPeg \u0e2b\u0e23\u0e37\u0e2d QuickTime +Tracker.Dialog.ReplaceFFMPeg.Message1=\u0e40\u0e23\u0e32\u0e41\u0e19\u0e30\u0e19\u0e33\u0e43\u0e2b\u0e49\u0e04\u0e38\u0e13\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19 FFMPeg video engine \u0e1b\u0e31\u0e08\u0e08\u0e38\u0e1a\u0e31\u0e19\u0e02\u0e2d\u0e07\u0e04\u0e38\u0e13 +Tracker.Dialog.ReplaceFFMPeg.Message2=\u0e14\u0e49\u0e27\u0e22 FFMPeg \u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e19 3.4 \u0e14\u0e49\u0e27\u0e22\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07Tracker (version 4.75 \u0e43\u0e2b\u0e21\u0e48 +Tracker.Dialog.ReplaceFFMPeg.Message3=\u0e2b\u0e23\u0e37\u0e2d\u0e43\u0e2b\u0e21\u0e48\u0e01\u0e27\u0e48\u0e32) \u0e41\u0e25\u0e30\u0e17\u0e33\u0e01\u0e32\u0e23\u0e40\u0e25\u0e37\u0e2d\u0e01 FFMPeg \u0e43\u0e19\u0e15\u0e31\u0e27\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e01\u0e32\u0e23\u0e15\u0e34\u0e14\u0e15\u0e31\u0e49\u0e07 TrackerIO.Dialog.DurationIsConstant.Message=\u0e0a\u0e48\u0e27\u0e07\u0e40\u0e27\u0e25\u0e32\u0e02\u0e2d\u0e07\u0e40\u0e1f\u0e23\u0e21\u0e17\u0e31\u0e49\u0e07\u0e2b\u0e21\u0e14\u0e40\u0e17\u0e48\u0e32\u0e01\u0e31\u0e19 (\u0e21\u0e35\u0e04\u0e48\u0e32\u0e04\u0e07\u0e17\u0e35\u0e48 fps) TrackerIO.ZIPResourceFilter.Description= ZIP \u0e44\u0e1f\u0e25\u0e4c Tracker (.trz) TToolbar.Button.Desktop.Tooltip=\u0e41\u0e2a\u0e14\u0e07 HTML \u0e17\u0e35\u0e48\u0e40\u0e01\u0e35\u0e48\u0e22\u0e27\u0e02\u0e49\u0e2d\u0e07\u0e41\u0e25\u0e30/\u0e2b\u0e23\u0e37\u0e2d \u0e40\u0e2d\u0e01\u0e2a\u0e32\u0e23\u0e43\u0e19\u0e23\u0e39\u0e1b\u0e41\u0e1a\u0e1a PDF @@ -1282,7 +1282,7 @@ TableTrackView.Dialog.NameColumn.Title=\u0e04\u0e2d\u0e25\u0e31\u0e21\u0e19\u0e4 TToolBar.MenuItem.StretchOff=\u0e40\u0e23\u0e34\u0e48\u0e21\u0e15\u0e49\u0e19\u0e43\u0e2b\u0e21\u0e48 # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e48\u0e19 Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=\u0e40\u0e27\u0e2d\u0e23\u0e4c\u0e0a\u0e31\u0e48\u0e19 FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=\u0e40\u0e01\u0e34\u0e14\u0e04\u0e27\u0e32\u0e21\u0e1c\u0e34\u0e14\u0e1e\u0e25\u0e32\u0e14\u0e01\u0e32\u0e23\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e44\u0e1f\u0e25\u0e4c Velocity.Dialog.Color.Title=\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e2a\u0e35\u0e02\u0e2d\u0e07\u0e04\u0e27\u0e32\u0e21\u0e40\u0e23\u0e47\u0e27 diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties index 153817d7..1a392f76 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_vi_VN.properties @@ -734,9 +734,9 @@ PrefsDialog.Upgrades.Weekly=H\u00E0ng tu\u1EA7n PrefsDialog.Upgrades.Monthly=H\u00E0ng th\u00E1ng PrefsDialog.Upgrades.Never=Kh\u00F4ng bao gi\u1EDD PrefsDialog.Button.CheckForUpgrade=Ki\u1EC3m tra ngay -PrefsDialog.Xuggle.Speed.BorderTitle=Xuggle Video playback -PrefsDialog.Xuggle.Slow=M\u01B0\u1EE3t (c\u00F3 th\u1EC3 ch\u1EADm) -PrefsDialog.Xuggle.Fast=Nhanh (c\u00F3 th\u1EC3 gi\u1EADt) +PrefsDialog.FFMPeg.Speed.BorderTitle=FFMPeg Video playback +PrefsDialog.FFMPeg.Slow=M\u01B0\u1EE3t (c\u00F3 th\u1EC3 ch\u1EADm) +PrefsDialog.FFMPeg.Fast=Nhanh (c\u00F3 th\u1EC3 gi\u1EADt) PrefsDialog.CalibrationTool.BorderTitle=c\u00F4ng c\u1EE5 t\u1ECDa \u0111\u1ED9 m\u1EB7c \u0111\u1ECBnh Protractor.Name=Th\u01B0\u1EDBc \u0111o g\u00F3c Protractor.New.Name=Th\u01B0\u1EDBc \u0111o g\u00F3c @@ -816,23 +816,23 @@ TMenuBar.Menu.MeasuringTools=c\u00F4ng c\u1EE5 \u0111o TMenuBar.Menu.AngleUnits=\u0110\u01A1n v\u1ECB \u0111o g\u00F3c TMenuBar.MenuItem.Degrees=\u0110\u1ED9 TMenuBar.MenuItem.Radians=Radian -Tracker.Dialog.NoXuggle.Title=Xugggle not found -Tracker.Dialog.NoXuggle.Message1=Xuggle (c\u00F4ng c\u1EE5 video n\u1EC1n t\u1EA3ng) kh\u00F4ng th\u1EC3 c\u00E0i \u0111\u1EB7t \u0111\u01B0\u1EE3c -Tracker.Dialog.NoXuggle.Message2=T\u1EA3i Xuggle t\u1EEB: http://www.xuggle.com/xuggler/downloads/. -Tracker.Action.AboutXuggle=V\u1EC1 Xuggle\u2026 -Tracker.Dialog.AboutXuggle.Title=V\u1EC1 Xuggle -Tracker.Dialog.AboutXuggle.Message.Version=Phi\u00EAn b\u1EA3n Xuggle -Tracker.Dialog.AboutXuggle.Message.Home=Trang ch\u1EE7 Xuggle: -Tracker.Dialog.AboutXuggle.Message.Path=\u0110\u01B0\u01A1\u0300ng d\u00E2\u0303n Xuggle jar: +Tracker.Dialog.NoFFMPeg.Title=Xugggle not found +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg (c\u00F4ng c\u1EE5 video n\u1EC1n t\u1EA3ng) kh\u00F4ng th\u1EC3 c\u00E0i \u0111\u1EB7t \u0111\u01B0\u1EE3c +Tracker.Dialog.NoFFMPeg.Message2=T\u1EA3i FFMPeg t\u1EEB: http://www.xuggle.com/xuggler/downloads/. +Tracker.Action.AboutFFMPeg=V\u1EC1 FFMPeg\u2026 +Tracker.Dialog.AboutFFMPeg.Title=V\u1EC1 FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Version=Phi\u00EAn b\u1EA3n FFMPeg +Tracker.Dialog.AboutFFMPeg.Message.Home=Trang ch\u1EE7 FFMPeg: +Tracker.Dialog.AboutFFMPeg.Message.Path=\u0110\u01B0\u01A1\u0300ng d\u00E2\u0303n FFMPeg jar: Tracker.Dialog.NoVideoEngine.Message1=Kh\u00F4ng c\u00F3 c\u00F4ng c\u1EE5 video n\u00E0o \u0111\u01B0\u1EE3c c\u00E0i \u0111\u1EB7t. Kh\u00F4ng c\u00F3 n\u00F3, b\u1EA1n Tracker.Dialog.NoVideoEngine.Message2=Ch\u1EC9 c\u00F3 th\u1EC3 m\u1EDF \u1EA3nh (JPEG,PNG) v\u00E0 ho\u1EA1t h\u00ECnh GIFs. -Tracker.Dialog.NoVideoEngine.Message3=Khuy\u1EBFn c\u00E1o: c\u00E0i \u0111\u1EB7t l\u1EA1i Tracker b\u1EB1ng c\u00F4ng c\u1EE5 Xuggle video. +Tracker.Dialog.NoVideoEngine.Message3=Khuy\u1EBFn c\u00E1o: c\u00E0i \u0111\u1EB7t l\u1EA1i Tracker b\u1EB1ng c\u00F4ng c\u1EE5 FFMPeg video. Tracker.Dialog.NoVideoEngine.Title=Kh\u00F4ng c\u00F3 c\u00F4ng c\u1EE5 video -Tracker.Dialog.NoXuggle.Message1=Xuggle kh\u00F4ng ho\u1EA1t \u0111\u1ED9ng ch\u00EDnh x\u00E1c. H\u00E3y ch\u1EAFc ch\u1EAFn v\u1EC1 y\u00EAu c\u1EA7u -Tracker.Dialog.NoXuggle.Message2=c\u00E1c t\u1EC7p tin xuggle jar n\u1EB1m trong th\u01B0 m\u1EE5c ch\u00EDnh c\u1EE7a Tracker. \u0110\u1EC3 bi\u1EBFt chi ti\u1EBFt, -Tracker.Dialog.NoXuggle.Message3=xem Tracker_README.txt trong th\u01B0 m\u1EE5c ch\u00EDnh c\u1EE7a Tracker -Tracker.Dialog.NoXuggle.Message4=\u0110\u1EC3 c\u00E0i \u0111\u1EB7t Xuggle, h\u00E3y t\u1EA3i b\u1EA3n c\u00E0i \u0111\u0103t m\u1EDBi nh\u1EA5t t\u1EEB -Tracker.Dialog.NoXuggle.Title=Xuggle kh\u00F4ng c\u00F3 s\u1EB5n +Tracker.Dialog.NoFFMPeg.Message1=FFMPeg kh\u00F4ng ho\u1EA1t \u0111\u1ED9ng ch\u00EDnh x\u00E1c. H\u00E3y ch\u1EAFc ch\u1EAFn v\u1EC1 y\u00EAu c\u1EA7u +Tracker.Dialog.NoFFMPeg.Message2=c\u00E1c t\u1EC7p tin xuggle jar n\u1EB1m trong th\u01B0 m\u1EE5c ch\u00EDnh c\u1EE7a Tracker. \u0110\u1EC3 bi\u1EBFt chi ti\u1EBFt, +Tracker.Dialog.NoFFMPeg.Message3=xem Tracker_README.txt trong th\u01B0 m\u1EE5c ch\u00EDnh c\u1EE7a Tracker +Tracker.Dialog.NoFFMPeg.Message4=\u0110\u1EC3 c\u00E0i \u0111\u1EB7t FFMPeg, h\u00E3y t\u1EA3i b\u1EA3n c\u00E0i \u0111\u0103t m\u1EDBi nh\u1EA5t t\u1EEB +Tracker.Dialog.NoFFMPeg.Title=FFMPeg kh\u00F4ng c\u00F3 s\u1EB5n Tracker.About.DefaultLocale=Ng\u00F4n ng\u1EEF m\u1EB7c \u0111\u1ECBnh Tracker.About.CurrentLanguage=Ng\u00F4n ng\u1EEF Tracker.Dialog.InsufficientMemory.Title=kh\u00F4ng \u0111\u1EE7 b\u1ED9 nh\u1EDB @@ -878,7 +878,7 @@ TTrackBar.Memory.Menu.SetSize=c\u00E0i \u0111\u1EB7t k\u00EDch th\u01B0\u1EDBc b TTrackBar.Button.Version=hi\u1EC7n c\u00F3 b\u00E2y gi\u1EDD: phi\u00EAn b\u1EA3n TTrackBar.Popup.MenuItem.Upgrade=n\u00E2ng c\u1EA5p ngay TTrackBar.Popup.MenuItem.Ignore=b\u1ECF qua -XuggleVideo.MenuItem.SmoothPlay=Ch\u1EA1y m\u01B0\u1EE3t (c\u00F3 th\u1EC3 ch\u1EADm) +FFMPegVideo.MenuItem.SmoothPlay=Ch\u1EA1y m\u01B0\u1EE3t (c\u00F3 th\u1EC3 ch\u1EADm) # Additions by Doug Brown 2011-02-05 CalibrationTapeMeasure.Name=b\u0103ng c\u00E2n @@ -907,13 +907,13 @@ WorldTView.Button.World=Kh\u00F4ng gian # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=C\u1EA3nh b\u00E1o PrefsDialog.Checkbox.WarnIfNoEngine=Kh\u00F4ng c\u00F3 c\u00F4ng c\u1EE5 video -PrefsDialog.Checkbox.WarnIfXuggleError=Xuggle l\u1ED7i (kh\u00F4ng tr\u00E2\u0300m tro\u0323ng) +PrefsDialog.Checkbox.WarnIfFFMPegError=FFMPeg l\u1ED7i (kh\u00F4ng tr\u00E2\u0300m tro\u0323ng) PropertiesDialog.Title=Thu\u00F4\u0323c ti\u0301nh PropertiesDialog.Label.Author=T\u00E1c gi\u1EA3 PropertiesDialog.Label.Contact=Li\u00EAn h\u1EC7 TActions.Action.Properties=Thu\u00F4\u0323c ti\u0301nh... TActions.Action.OpenBrowser=M\u1EDF tr\u00ECnh duy\u1EC7t th\u01B0 vi\u1EC7n -TFrame.Progress.Xuggle=Xuggle t\u1EA3i khung +TFrame.Progress.FFMPeg=FFMPeg t\u1EA3i khung TFrame.Progress.ClickToCancel=(Nh\u1EA5p \u0111\u1EC3 h\u1EE7y) TFrame.Dialog.StalledVideo.Title=L\u1ED7i t\u1EA3i video TFrame.Dialog.StalledVideo.Message0=Video \u0111\u00E3 b\u1ECB tr\u1EC5 trong khi t\u1EA3i. \u0110\u00E2y c\u00F3 th\u1EC3 l\u00E0 t\u1EA1m th\u1EDDi @@ -926,12 +926,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=D\u1EEBng TFrame.Dialog.StalledVideo.Button.Wait=\u0110\u1EE3i Tracker.Dialog.NoVideoEngine.Checkbox=Kh\u00F4ng hi\u1EC3n th\u1ECB \u0111i\u1EC1u n\u00E0y n\u1EEFa TrackerIO.ZipFileFilter.Description=ZIP file (.zip) -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle \u0111\u00E3 g\u1EB7p ph\u1EA3i l\u1ED7i sau trong khi m\u1EDF video +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg \u0111\u00E3 g\u1EB7p ph\u1EA3i l\u1ED7i sau trong khi m\u1EDF video TrackerIO.Dialog.ErrorFFMPEG.Message2=Kh\u00F4ng ph\u1EA3i t\u1EA5t c\u1EA3 c\u00E1c l\u1ED7i \u0111\u1EC1u kh\u00F4ng th\u1EC3 kh\u1EAFc ph\u1EE5c. \u0110\u1EC3 c\u00F3 c\u00E1c th\u00F4ng b\u00E1o l\u1ED7i \u0111\u1EA7y \u0111\u1EE7, ch\u1ECDn Help | Message Log. -TrackerIO.Dialog.ErrorFFMPEG.Message3=N\u1EBFu Xuggle th\u1EA5t b\u1EA1i, b\u1EA1n c\u00F3 th\u1EC3 m\u1EDF video v\u1EDBi QuickTime +TrackerIO.Dialog.ErrorFFMPEG.Message3=N\u1EBFu FFMPeg th\u1EA5t b\u1EA1i, b\u1EA1n c\u00F3 th\u1EC3 m\u1EDF video v\u1EDBi QuickTime TrackerIO.Dialog.ErrorFFMPEG.MessageMac=Ghi ch\u00FA: Trong Mac OSX y\u00EAu c\u1EA7u ch\u1EA1y Tracker trong b\u1EA3n java 32bit VM -TrackerIO.Dialog.ErrorFFMPEG.Title=L\u1ED7i Xuggle -TrackerIO.ErrorFFMPEG.LogMessage=\u0110\u1EC3 th\u00EAm chi ti\u1EBFt, b\u1EADt c\u1EA3nh b\u00E1o Xuggle trong h\u1ED9p tho\u1EA1i t\u00F9y ch\u1ECDn (Ch\u1EC9nh s\u1EEDa|T\u00F9y ch\u1ECDn) +TrackerIO.Dialog.ErrorFFMPEG.Title=L\u1ED7i FFMPeg +TrackerIO.ErrorFFMPEG.LogMessage=\u0110\u1EC3 th\u00EAm chi ti\u1EBFt, b\u1EADt c\u1EA3nh b\u00E1o FFMPeg trong h\u1ED9p tho\u1EA1i t\u00F9y ch\u1ECDn (Ch\u1EC9nh s\u1EEDa|T\u00F9y ch\u1ECDn) TToolBar.Button.OpenBrowser.Tooltip=M\u1EDF tr\u00ECnh duy\u1EC7t Th\u01B0 vi\u1EC7n s\u1ED1 OSP # Additions by Doug Brown 2011-07-20 @@ -1188,17 +1188,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=th\u1EDDi l\u01B0\u1EE3ng khung thay \u0111\u1ED5i PrefsDialog.Button.NoEngine=kh\u00F4ng c\u00F3 PrefsDialog.Dialog.SwitchToQT.Message=Chuy\u1EC3n sang QuickTime c\u0169ng thay \u0111\u1ED5i m\u00E1y \u1EA3o Java th\u00E0nh 32-bit. -PrefsDialog.Dialog.SwitchToXuggle32.Message=Chuy\u1EC3n sang Xuggle c\u0169ng thay \u0111\u1ED5i m\u00E1y \u1EA3o Java th\u00E0nh 32-bit -PrefsDialog.Dialog.SwitchToXuggle64.Message=chuy\u1EC3n sang xuggle c\u0169ng thay \u0111\u1ED5i m\u00E1y \u1EA3o java th\u00E0nh 64-bit +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=Chuy\u1EC3n sang FFMPeg c\u0169ng thay \u0111\u1ED5i m\u00E1y \u1EA3o Java th\u00E0nh 32-bit +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=chuy\u1EC3n sang xuggle c\u0169ng thay \u0111\u1ED5i m\u00E1y \u1EA3o java th\u00E0nh 64-bit PrefsDialog.Dialog.SwitchVM.Title=M\u00E1y \u1EA3o Java \u0111\u00E3 \u0111\u1ED5i PrefsDialog.Dialog.SwitchTo32.Message=Chuy\u1EC3n sang m\u1ED9t m\u00E1y \u1EA3o Java 32-bit c\u0169ng thay \u0111\u1ED5i c\u00F4ng c\u1EE5 video th\u00E0nh QuickTime. -PrefsDialog.Dialog.SwitchTo64.Message=Chuy\u1EC3n sang m\u1ED9t m\u00E1y \u1EA3o Java 64-bit c\u0169ng thay \u0111\u1ED5i c\u00F4ng c\u1EE5 video th\u00E0nh Xuggle +PrefsDialog.Dialog.SwitchTo64.Message=Chuy\u1EC3n sang m\u1ED9t m\u00E1y \u1EA3o Java 64-bit c\u0169ng thay \u0111\u1ED5i c\u00F4ng c\u1EE5 video th\u00E0nh FFMPeg PrefsDialog.Dialog.SwitchEngine.Title=C\u00F4ng c\u1EE5 video \u0111\u00E3 \u0111\u1ED5i PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=kh\u00F4ng c\u00F3 c\u00F4ng c\u1EE5 video ph\u00F9 h\u1EE3p cho m\u00E1y \u1EA3o Java 64-bit. B\u1EA1n s\u1EBD PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=v\u1EABn c\u00F3 th\u1EC3 m\u1EDF h\u00ECnh \u1EA3nh (JPEG, PNG) v\u00E0 GIF \u0111\u1ED9ng. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=B\u1EA1n c\u00F3 ch\u1EAFc mu\u1ED1n \u0111\u1ED5i sang m\u00E1y \u1EA3o 64-bit PrefsDialog.Dialog.NoEngineIn64bitVM.Title=Kh\u00F4ng c\u00F3 c\u00F4ng c\u1EE5 video 64-bit -PrefsDialog.Dialog.No32bitVMXuggle.Message=M\u1ED9t m\u00E1y \u1EA3o Java 32-bit ph\u1EA3i \u0111\u01B0\u1EE3c c\u00E0i \u0111\u1EB7t tr\u01B0\u1EDBc khi Xuggle c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=M\u1ED9t m\u00E1y \u1EA3o Java 32-bit ph\u1EA3i \u0111\u01B0\u1EE3c c\u00E0i \u0111\u1EB7t tr\u01B0\u1EDBc khi FFMPeg c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng PrefsDialog.Dialog.No32bitVMQT.Message=M\u1ED9t m\u00E1y \u1EA3o Java 32-bit ph\u1EA3i \u0111\u01B0\u1EE3c c\u00E0i \u0111\u1EB7t tr\u01B0\u1EDBc khi QuickTime c\u00F3 th\u1EC3 s\u1EED d\u1EE5ng PrefsDialog.Dialog.No32bitVM.Message=\u0110\u1EC3 c\u00F3 th\u00EAm nhi\u1EC1u th\u00F4ng tin, xem \u1EDF Tracker Gi\u00FAp \u0111\u1EE1: C\u00E0i \u0111\u1EB7t PrefsDialog.Dialog.No32bitVM.Title=Y\u00EAu c\u1EA7u M\u00E1y \u1EA3o 32-bit @@ -1214,10 +1214,10 @@ Tracker.Dialog.Button.RelaunchNow=C\u00F3, b\u1EAFt \u0111\u1EA7u l\u1EA1i ngay Tracker.Dialog.Button.ShowPrefs=Kh\u00F4ng, nh\u01B0ng h\u00E3y hi\u1EC3n th\u1ECB h\u1EEFu \u00EDch Tracker.Dialog.Button.ContinueWithoutEngine=Kh\u00F4ng, ti\u1EBFp t\u1EE5c kh\u00F4ng c\u1EA7n video Tracker.Dialog.EngineProblems.Message1=M\u1ED9t ho\u1EB7c nhi\u1EC1u h\u01A1n c\u00F4ng c\u1EE5 video \u0111\u00E3 \u0111\u01B0\u1EE3c c\u00E0i \u0111\u1EB7t nh\u01B0ng kh\u00F4ng ho\u1EA1t \u0111\u1ED9ng -Tracker.Dialog.EngineProblems.Message2=\u0110\u1EC3 c\u00F3 th\u00EAm th\u00F4ng tin, xem Gi\u00FAp \u0111\u1EE1|Ch\u1EA9n \u0111o\u00E1n|V\u1EC1 Xuggle ho\u1EB7c QuickTime -Tracker.Dialog.ReplaceXuggle.Message1=Ch\u00FAng t\u00F4i khuy\u00EAn b\u1EA1n n\u00EAn thay th\u1EBF c\u00F4ng c\u1EE5 Xuggle video hi\u1EC7n t\u1EA1i -Tracker.Dialog.ReplaceXuggle.Message2=v\u1EDBi phi\u00EAn b\u1EA3n Xuggle 3.4 b\u1EB1ng c\u00E0i \u0111\u1EB7t l\u1EA1i Tracker (phi\u00EAn b\u1EA3n 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=ho\u1EB7c tr\u00EAn) v\u00E0 ch\u1ECDn Xuggle trong l\u1EF1a ch\u1ECDn c\u00E0i \u0111\u1EB7t +Tracker.Dialog.EngineProblems.Message2=\u0110\u1EC3 c\u00F3 th\u00EAm th\u00F4ng tin, xem Gi\u00FAp \u0111\u1EE1|Ch\u1EA9n \u0111o\u00E1n|V\u1EC1 FFMPeg ho\u1EB7c QuickTime +Tracker.Dialog.ReplaceFFMPeg.Message1=Ch\u00FAng t\u00F4i khuy\u00EAn b\u1EA1n n\u00EAn thay th\u1EBF c\u00F4ng c\u1EE5 FFMPeg video hi\u1EC7n t\u1EA1i +Tracker.Dialog.ReplaceFFMPeg.Message2=v\u1EDBi phi\u00EAn b\u1EA3n FFMPeg 3.4 b\u1EB1ng c\u00E0i \u0111\u1EB7t l\u1EA1i Tracker (phi\u00EAn b\u1EA3n 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=ho\u1EB7c tr\u00EAn) v\u00E0 ch\u1ECDn FFMPeg trong l\u1EF1a ch\u1ECDn c\u00E0i \u0111\u1EB7t TrackerIO.Dialog.DurationIsConstant.Message=t\u1EA5t c\u1EA3 th\u1EDDi l\u01B0\u1EE3ng khung nh\u01B0 nhau TrackerIO.ZIPResourceFilter.Description=t\u1EC7p Tracker zip (.trz) TToolbar.Button.Desktop.Tooltip=Hi\u1EC3n th\u1ECB t\u00E0i li\u1EC7u HTML v\u00E0 / ho\u1EB7c PDF k\u1EBFt h\u1EE3p @@ -1283,7 +1283,7 @@ TableTrackView.Dialog.NameColumn.Title=C\u1ED9t v\u0103n b\u1EA3n TToolBar.MenuItem.StretchOff=C\u00E0i l\u1EA1i # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Phi\u00EAn b\u1EA3n Xuggle +PrefsDialog.Checkbox.WarnFFMPegVersion=Phi\u00EAn b\u1EA3n FFMPeg PrefsDialog.Checkbox.WarnCopyFailed=T\u1EC7p c\u00F4ng c\u1EE5 video sao ch\u00E9p l\u1ED7i Tracker.Dialog.FailedToCopy.Title=T\u1EC7p sao ch\u00E9p l\u1ED7i Velocity.Dialog.Color.Title=Ch\u1ECDn m\u00E0u v\u1EADn t\u1ED1c diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties index 8572b67f..3eefc6e7 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/tracker_zh_TW.properties @@ -914,13 +914,13 @@ WorldTView.Button.World=\u5168\u90e8 # Additions by Doug Brown 2011-04-04 PrefsDialog.NoVideoWarning.BorderTitle=\u8b66\u544a PrefsDialog.Checkbox.WarnIfNoEngine=\u672a\u5b89\u88dd\u5f71\u50cf\u7a0b\u5f0fe -PrefsDialog.Checkbox.WarnIfXuggleError=\u975e\u81f4\u547d Xuggle \u932f\u8aa4 +PrefsDialog.Checkbox.WarnIfFFMPegError=\u975e\u81f4\u547d FFMPeg \u932f\u8aa4 PropertiesDialog.Title=\u5c6c\u6027 PropertiesDialog.Label.Author=\u4f5c\u8005 PropertiesDialog.Label.Contact=\u806f\u7e6b TActions.Action.Properties=\u5c6c\u6027... TActions.Action.OpenBrowser=\u958b\u555f\u7a0b\u5f0f\u5eab\u700f\u89bd\u5668... -TFrame.Progress.Xuggle=Xuggle \u8f09\u5165\u5f71\u683c +TFrame.Progress.FFMPeg=FFMPeg \u8f09\u5165\u5f71\u683c TFrame.Progress.ClickToCancel=(\u6309\u9375\u53d6\u6d88) TFrame.Dialog.StalledVideo.Title=\u8f09\u5165\u5f71\u6642\u51fa\u932f TFrame.Dialog.StalledVideo.Message0=\u8f09\u5165\u5f71\u7247\u6642\u767c\u751f\u66ab\u505c\u73fe\u8c61. \u6216\u8a31\u53ea\u662f\u66ab\u6642\u6027 @@ -933,12 +933,12 @@ TFrame.Dialog.StalledVideo.Button.Stop=\u505c\u6b62 TFrame.Dialog.StalledVideo.Button.Wait=\u7b49\u5019 Tracker.Dialog.NoVideoEngine.Checkbox=\u4e0d\u8981\u5728\u986f\u793a\u6b64\u8a0a\u606f TrackerIO.ZipFileFilter.Description=ZIP \u58d3\u7e2e\u6a94 -TrackerIO.Dialog.ErrorFFMPEG.Message1=Xuggle \u958b\u555f\u5f71\u7247\u6a94\u6642\u9047\u5230\u4ee5\u4e0b\u932f\u8aa4: +TrackerIO.Dialog.ErrorFFMPEG.Message1=FFMPeg \u958b\u555f\u5f71\u7247\u6a94\u6642\u9047\u5230\u4ee5\u4e0b\u932f\u8aa4: TrackerIO.Dialog.ErrorFFMPEG.Message2=\u4e26\u975e\u6240\u6709\u7684\u932f\u8aa4\u90fd\u662f\u7121\u6cd5\u7e7c\u7e8c\u7684. \u9078\u53d6 \u5e6b\u52a9|\u8a0a\u606f \u53ef\u89c0\u770b\u66f4\u4ed4\u7d30\u932f\u8aa4\u8cc7\u8a0a. -TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5c31\u7b97 Xuggle \u7121\u6cd5\u958b\u555f\u5f71\u7247, \u53ef\u5617\u8a66\u6539\u7528 QuickTime \u958b\u555f. +TrackerIO.Dialog.ErrorFFMPEG.Message3=\u5c31\u7b97 FFMPeg \u7121\u6cd5\u958b\u555f\u5f71\u7247, \u53ef\u5617\u8a66\u6539\u7528 QuickTime \u958b\u555f. TrackerIO.Dialog.ErrorFFMPEG.MessageMac=\u6ce8\u610f: \u5c0d\u65bc Mac OSX \u7684\u7cfb\u7d71\u9700\u8981\u572832-bit Java VM \u74b0\u5883\u4e0b\u57f7\u884c\u672c\u8edf\u9ad4 Tracker. -TrackerIO.Dialog.ErrorFFMPEG.Title=Xuggle \u932f\u8aa4 -TrackerIO.ErrorFFMPEG.LogMessage=\u958b\u555f Xuggle (\u7de8\u8f2f|\u8a2d\u5b9a) \u53ef\u7372\u5f97\u66f4\u9032\u4e00\u6b65\u932f\u8aa4\u8cc7\u8a0a +TrackerIO.Dialog.ErrorFFMPEG.Title=FFMPeg \u932f\u8aa4 +TrackerIO.ErrorFFMPEG.LogMessage=\u958b\u555f FFMPeg (\u7de8\u8f2f|\u8a2d\u5b9a) \u53ef\u7372\u5f97\u66f4\u9032\u4e00\u6b65\u932f\u8aa4\u8cc7\u8a0a TToolBar.Button.OpenBrowser.Tooltip=\u958b\u555f OSP Digital Library \u700f\u89bd\u5668 # Additions by Doug Brown 2011-07-20 @@ -1195,17 +1195,17 @@ PrefsDialog.Checkbox.32BitVM=32-bit PrefsDialog.Checkbox.WarnVariableDuration=Variable frame durations PrefsDialog.Button.NoEngine=None PrefsDialog.Dialog.SwitchToQT.Message=\u82e5\u6539\u7528QuickTime \u5c07\u540c\u6642\u6539\u7528 32-bit Java VM. -PrefsDialog.Dialog.SwitchToXuggle32.Message=\u82e5\u6539\u7528 Xuggle \u4e26\u540c\u6642\u6539\u7528 32-bit Java VM. -PrefsDialog.Dialog.SwitchToXuggle64.Message=\u6539\u7528 Xuggle \u4e26\u540c\u6642\u6539\u7528 64-bit Java VM. +PrefsDialog.Dialog.SwitchToFFMPeg32.Message=\u82e5\u6539\u7528 FFMPeg \u4e26\u540c\u6642\u6539\u7528 32-bit Java VM. +PrefsDialog.Dialog.SwitchToFFMPeg64.Message=\u6539\u7528 FFMPeg \u4e26\u540c\u6642\u6539\u7528 64-bit Java VM. PrefsDialog.Dialog.SwitchVM.Title=Java VM Changed PrefsDialog.Dialog.SwitchTo32.Message=\u6539\u752832-bit Java VM \u540c\u6642\u6539\u7528 QuickTime \u8655\u7406\u5f71\u7247. -PrefsDialog.Dialog.SwitchTo64.Message=\u6539\u7528 64-bit Java VM \u540c\u6642\u6539\u7528 Xuggle \u8655\u7406\u5f71\u7247. +PrefsDialog.Dialog.SwitchTo64.Message=\u6539\u7528 64-bit Java VM \u540c\u6642\u6539\u7528 FFMPeg \u8655\u7406\u5f71\u7247. PrefsDialog.Dialog.SwitchEngine.Title=\u6539\u8b8a\u5f71\u7247\u8655\u7406\u7a0b\u5f0f PrefsDialog.Dialog.NoEngineIn64bitVM.Message1=\u6c92\u6709 64-bit Java VM \u7684\u5f71\u7247\u8655\u7406\u7a0b\u5f0f. \u4f60\u4ecd\u7136 PrefsDialog.Dialog.NoEngineIn64bitVM.Message2=\u53ef\u4ee5\u958b\u555f (JPEG, PNG) \u6216 animated GIFs\u7684\u5716\u50cf\u6a94. PrefsDialog.Dialog.NoEngineIn64bitVM.Question=\u662f\u5426\u78ba\u5b9a\u5207\u63db\u6210 64-bit VM? PrefsDialog.Dialog.NoEngineIn64bitVM.Title=\u7121 64-bit \u5f71\u7247\u8655\u7406\u7a0b\u5f0f -PrefsDialog.Dialog.No32bitVMXuggle.Message=\u4f7f\u7528Xuggle\u7a0b\u5f0f\u9700\u8981\u5b89\u88dd 32-bit Java VM +PrefsDialog.Dialog.No32bitVMFFMPeg.Message=\u4f7f\u7528FFMPeg\u7a0b\u5f0f\u9700\u8981\u5b89\u88dd 32-bit Java VM PrefsDialog.Dialog.No32bitVMQT.Message=\u4f7f\u7528QuickTime\u7a0b\u5f0f\u9700\u8981\u5b89\u88dd 32-bit Java VM PrefsDialog.Dialog.No32bitVM.Message=\u53ef\u65bc Tracker \u8aaa\u660e:\u5b89\u88dd \u9078\u55ae\u7372\u5f97\u66f4\u9032\u4e00\u6b65\u8aaa\u660e. PrefsDialog.Dialog.No32bitVM.Title=\u9700\u898132-bit VM @@ -1221,10 +1221,10 @@ Tracker.Dialog.Button.RelaunchNow=\u662f\u7684, \u91cd\u65b0\u555f\u52d5 Tracker.Dialog.Button.ShowPrefs=\u5426, \u4f46\u662f\u986f\u793a\u9810\u8a2d\u503c Tracker.Dialog.Button.ContinueWithoutEngine=\u5426, \u7e7c\u7e8c\u4f7f\u7528\u4f46\u7121\u6cd5\u8655\u7406\u5f71\u7247 Tracker.Dialog.EngineProblems.Message1=\u5b89\u88dd\u4e0d\u53ea\u4e00\u500b\u5f71\u7247\u8655\u7406\u7a0b\u5f0f\u4f46\u662f\u537b\u7121\u6cd5\u4f7f\u7528 -Tracker.Dialog.EngineProblems.Message2=\u8acb\u89c0\u770b \u8aaa\u660eHelp|\u8a3a\u65b7Diagnostics|\u95dc\u65bc Xuggle\u6216QuickTime. -Tracker.Dialog.ReplaceXuggle.Message1=\u5efa\u8b70\u4f60\u53d6\u4ee3\u76ee\u524d\u4f7f\u7528\u7684Xuggle \u5f71\u7247\u7a0b\u5f0f -Tracker.Dialog.ReplaceXuggle.Message2=\u4f7f\u7528 Xuggle 3.4\u7248 \u4e26\u91cd\u65b0\u5b89\u88ddTracker (\u7248\u672c 4.75 -Tracker.Dialog.ReplaceXuggle.Message3=\u6216\u66f4\u65b0\u7248) \u4e26\u9078\u64c7\u642d\u914d Xuggle \u7684\u7248\u672c. +Tracker.Dialog.EngineProblems.Message2=\u8acb\u89c0\u770b \u8aaa\u660eHelp|\u8a3a\u65b7Diagnostics|\u95dc\u65bc FFMPeg\u6216QuickTime. +Tracker.Dialog.ReplaceFFMPeg.Message1=\u5efa\u8b70\u4f60\u53d6\u4ee3\u76ee\u524d\u4f7f\u7528\u7684FFMPeg \u5f71\u7247\u7a0b\u5f0f +Tracker.Dialog.ReplaceFFMPeg.Message2=\u4f7f\u7528 FFMPeg 3.4\u7248 \u4e26\u91cd\u65b0\u5b89\u88ddTracker (\u7248\u672c 4.75 +Tracker.Dialog.ReplaceFFMPeg.Message3=\u6216\u66f4\u65b0\u7248) \u4e26\u9078\u64c7\u642d\u914d FFMPeg \u7684\u7248\u672c. TrackerIO.Dialog.DurationIsConstant.Message=\u6bcf\u500b\u5f71\u683c\u7684\u6642\u9593\u9593\u9694\u90fd\u76f8\u540c (\u56fa\u5b9a\u6bcf\u79d2\u5f71\u683c\u6578 fps). TrackerIO.ZIPResourceFilter.Description=Tracker ZIP \u58d3\u7e2e\u6a94 (.trz) TToolbar.Button.Desktop.Tooltip=\u986f\u793a\u95dc\u806f\u7684HTML\u7db2\u9801\u8207PDF\u8cc7\u6599 @@ -1290,7 +1290,7 @@ TableTrackView.Dialog.NameColumn.Title=Text Column TToolBar.MenuItem.StretchOff=\u91cd\u7f6e Reset # Additions by Doug Brown 2014-02-20 -PrefsDialog.Checkbox.WarnXuggleVersion=Xuggle \u7248\u672c +PrefsDialog.Checkbox.WarnFFMPegVersion=FFMPeg \u7248\u672c PrefsDialog.Checkbox.WarnCopyFailed=\u5f71\u7247\u7a0b\u5f0f\u8907\u88fd\u932f\u8aa4Video Engine File Copy Errors Tracker.Dialog.FailedToCopy.Title=\u6a94\u6848\u8907\u88fd\u932f\u8aa4File Copy Error Velocity.Dialog.Color.Title=\u9078\u64c7\u901f\u5ea6\u984f\u8272Choose Velocity Color From 2943d552c8e5d452a59aa8801704d23fc1459dc5 Mon Sep 17 00:00:00 2001 From: fschuett Date: Sun, 7 Oct 2018 13:58:53 +0200 Subject: [PATCH 19/20] fix Xuggle -> FFMPeg, xuggle -> ffmpeg --- src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java | 6 +++--- src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java | 6 +++--- src/org/opensourcephysics/cabrillo/tracker/Tracker.java | 4 ++-- .../cabrillo/tracker/resources/help/install.html | 4 ++-- .../cabrillo/tracker/resources/help/videos.html | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index e0c63540..9d224df2 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -47,7 +47,7 @@ import org.opensourcephysics.display.ResizableIcon; import org.opensourcephysics.media.core.IntegerField; import org.opensourcephysics.media.core.VideoIO; -import org.opensourcephysics.tools.DiagnosticsForXuggle; +import org.opensourcephysics.tools.DiagnosticsForFFMPeg; import org.opensourcephysics.tools.JREFinder; import org.opensourcephysics.tools.FontSizer; import org.opensourcephysics.tools.ResourceLoader; @@ -857,7 +857,7 @@ public void actionPerformed(ActionEvent e) { box = Box.createVerticalBox(); videoPanel.add(box, BorderLayout.CENTER); - boolean xuggleInstalled = DiagnosticsForXuggle.getXuggleJar()!=null; + boolean ffmpegInstalled = DiagnosticsForFFMPeg.getFFMPegJar()!=null; // videoType subpanel JPanel videoTypeSubPanel = new JPanel(); @@ -1498,7 +1498,7 @@ protected void refreshGUI() { memorySubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.Memory.BorderTitle")); //$NON-NLS-1$ runSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.Run.BorderTitle")); //$NON-NLS-1$ videoTypeSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ - xuggleSpeedSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.Xuggle.Speed.BorderTitle")); //$NON-NLS-1$ + ffmpegSpeedSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.FFMPeg.Speed.BorderTitle")); //$NON-NLS-1$ warningsSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.NoVideoWarning.BorderTitle")); //$NON-NLS-1$ recentSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.RecentFiles.BorderTitle")); //$NON-NLS-1$ cacheSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.CacheFiles.BorderTitle")); //$NON-NLS-1$ diff --git a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java index 917f81dc..2513d8c1 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java +++ b/src/org/opensourcephysics/cabrillo/tracker/TMenuBar.java @@ -1568,7 +1568,7 @@ public synchronized void run() { playAllStepsItem.setSelected(clip.isPlayAllSteps()); videoMenu.add(playAllStepsItem); // smooth play item for ffmpeg videos - boolean isXuggleVideo = false; + boolean isFFMPegVideo = false; VideoType videoType = (VideoType)video.getProperty("video_type"); //$NON-NLS-1$ if (videoType!=null && videoType.getClass().getSimpleName().contains(VideoIO.ENGINE_FFMPEG)) { String ffmpegName = "org.opensourcephysics.media.ffmpeg.FFMPegVideo"; //$NON-NLS-1$ @@ -1578,7 +1578,7 @@ public synchronized void run() { Boolean smooth = (Boolean)method.invoke(video, (Object[])null); playVideoSmoothlyItem.setSelected(smooth); videoMenu.add(playVideoSmoothlyItem); - isXuggleVideo = true; + isFFMPegVideo = true; } catch (Exception ex) { } } @@ -1637,7 +1637,7 @@ public synchronized void run() { videoMenu.add(filtersMenu); } videoMenu.addSeparator(); - if (isXuggleVideo) videoMenu.add(checkDurationsItem); + if (isFFMPegVideo) videoMenu.add(checkDurationsItem); videoMenu.add(aboutVideoItem); } // update save and close items diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index 90e297c1..a7ce91ae 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -1221,7 +1221,7 @@ protected static void setCache(String cachePath) { } /** - * Checks and updates Xuggle resources. + * Checks and updates FFMPeg resources. * * @return true if any resources were updated */ @@ -2202,7 +2202,7 @@ public Object loadObject(XMLControl control, Object obj) { Tracker.enableAutofill = control.getBoolean("enable_autofill"); //$NON-NLS-1$ Tracker.showGaps = control.getBoolean("show_gaps"); //$NON-NLS-1$ Tracker.centerCalibrationStick = control.getBoolean("center_stick"); //$NON-NLS-1$ - Tracker.isXuggleFast = control.getBoolean("xuggle_fast"); //$NON-NLS-1$ + Tracker.isFFMPegFast = control.getBoolean("ffmpeg_fast"); //$NON-NLS-1$ if (control.getPropertyNames().contains("trail_length")) { //$NON-NLS-1$ String name = control.getString("trail_length"); //$NON-NLS-1$ for (int i=0; i

    Installation

    Tracker includes its own bundled runtime Java and open-source video engine FFMPeg. You can always use a separate JRE to run Tracker by choosing it in Tracker Preferences.

    -

    1. Install Tracker (includes Java and Xuggle)

    +

    1. Install Tracker (includes Java and FFMPeg)

    1. Download the tracker installer for your platform (Windows, Mac OS X, or Linux) from Tracker's home page at https://physlets.org/tracker/.
    2. Follow the Installer Help instructions at https://physlets.org/tracker/installers/installer_help.html.
    3. @@ -31,7 +31,7 @@

      3. Upgrade Tracker when new versions ar Upgrade notification button--click to show popup menu

      -
    4. Most upgrades are instant: the new version or upgrade installer is downloaded and launched immediately. Some upgrades will require that you download a new installer from the Tracker website. Upgrades may include Tracker itself, Java, Xuggle and/or other components.
    5. +
    6. Most upgrades are instant: the new version or upgrade installer is downloaded and launched immediately. Some upgrades will require that you download a new installer from the Tracker website. Upgrades may include Tracker itself, Java, FFMPeg and/or other components.

    diff --git a/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html b/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html index bf1f3d26..9a7fd7d8 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html +++ b/src/org/opensourcephysics/cabrillo/tracker/resources/help/videos.html @@ -16,7 +16,7 @@

    Videos

  • animated GIF files (.gif).
  • image sequences consisting of one or more digital images (.jpg, .png or pasted from the clipboard).
  • -

    Tracker uses the Xuggle video engine to open most digital video files including .mov, .avi and .mp4 on all platforms.

    +

    Tracker uses the FFMPeg video engine to open most digital video files including .mov, .avi and .mp4 on all platforms.

    1. Opening or importing a video from a local drive

    To open a video into a new tab, use the Open button or File|Open File menu item. To import a video into an existing tab, use the Video|Import, Video|Replace or File|Import|Video menu item.

    From bbe1b1269afd25ae35649c1a80eb618780e312c1 Mon Sep 17 00:00:00 2001 From: fschuett Date: Sun, 7 Oct 2018 14:51:56 +0200 Subject: [PATCH 20/20] fix ffmpeg merging errors --- .../cabrillo/tracker/PrefsDialog.java | 11 ++++++----- .../opensourcephysics/cabrillo/tracker/Tracker.java | 12 +++--------- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java index 9d224df2..8c87c2c9 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java +++ b/src/org/opensourcephysics/cabrillo/tracker/PrefsDialog.java @@ -101,6 +101,7 @@ public class PrefsDialog extends JDialog { protected JRadioButton radiansButton, degreesButton; protected JRadioButton scrubButton, zoomButton; protected JRadioButton markStickEndsButton, centerStickButton; + protected JRadioButton videoFastButton, videoSlowButton; protected JRadioButton defaultDecimalButton, periodDecimalButton, commaDecimalButton; protected Tracker.Version[] trackerVersions; protected boolean relaunching, refreshing; @@ -857,7 +858,7 @@ public void actionPerformed(ActionEvent e) { box = Box.createVerticalBox(); videoPanel.add(box, BorderLayout.CENTER); - boolean ffmpegInstalled = DiagnosticsForFFMPeg.getFFMPegJar()!=null; + boolean ffmpegInstalled = DiagnosticsForFFMPeg.hasFFMPegJars(); // videoType subpanel JPanel videoTypeSubPanel = new JPanel(); @@ -925,7 +926,7 @@ public void itemStateChanged(ItemEvent e) { videoSpeedSubPanelBorder = BorderFactory.createTitledBorder( TrackerRes.getString("PrefsDialog.FFMPeg.Speed.BorderTitle")); //$NON-NLS-1$ if (!ffmpegInstalled) - ffmpegSpeedSubPanelBorder.setTitleColor(GUIUtils.getDisabledTextColor()); + videoSpeedSubPanelBorder.setTitleColor(GUIUtils.getDisabledTextColor()); videoSpeedSubPanel.setBorder(BorderFactory.createCompoundBorder(etched, videoSpeedSubPanelBorder)); buttonGroup = new ButtonGroup(); videoFastButton = new JRadioButton(); @@ -989,7 +990,7 @@ public void actionPerformed(ActionEvent e) { warningsCenterPanel.add(ffmpegErrorCheckbox); // set selected states of engine buttons AFTER creating the videofast, videoslow and warnffmpeg buttons - if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE) + if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG) && VideoIO.getVideoType("FFMPeg", null)!=null) { //$NON-NLS-1$ ffmpegButton.setSelected(true); } @@ -1498,7 +1499,7 @@ protected void refreshGUI() { memorySubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.Memory.BorderTitle")); //$NON-NLS-1$ runSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.Run.BorderTitle")); //$NON-NLS-1$ videoTypeSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.VideoPref.BorderTitle")); //$NON-NLS-1$ - ffmpegSpeedSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.FFMPeg.Speed.BorderTitle")); //$NON-NLS-1$ + videoSpeedSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.FFMPeg.Speed.BorderTitle")); //$NON-NLS-1$ warningsSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.NoVideoWarning.BorderTitle")); //$NON-NLS-1$ recentSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.RecentFiles.BorderTitle")); //$NON-NLS-1$ cacheSubPanelBorder.setTitle(TrackerRes.getString("PrefsDialog.CacheFiles.BorderTitle")); //$NON-NLS-1$ @@ -1884,7 +1885,7 @@ protected void updateDisplay() { trailLengthDropdown.setSelectedIndex(Tracker.trailLengthIndex); // video - if (VideoIO.getEngine().equals(VideoIO.ENGINE_XUGGLE)) { + if (VideoIO.getEngine().equals(VideoIO.ENGINE_FFMPEG)) { ffmpegButton.setSelected(true); } repaint(); diff --git a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java index a7ce91ae..00aad89c 100644 --- a/src/org/opensourcephysics/cabrillo/tracker/Tracker.java +++ b/src/org/opensourcephysics/cabrillo/tracker/Tracker.java @@ -173,7 +173,7 @@ public class Tracker { static String preferredJRE, preferredTrackerJar, preferredPointMassFootprint; static int checkForUpgradeInterval = 0; static int preferredFontLevel = 0, preferredFontLevelPlus = 0; - static boolean isRadians, isFFMPegFast; + static boolean isRadians, isVideoFast; static boolean warnFFMPegError=true, warnNoVideoEngine=true; static boolean warnVariableDuration=true; static String[] prelaunchExecutables = new String[0]; @@ -1227,12 +1227,6 @@ protected static void setCache(String cachePath) { */ protected static boolean updateResources() { boolean updated = false; - // copy ffmpeg files to Tracker home, if needed - try { - File trackerDir = new File(TrackerStarter.findTrackerHome(false)); - updated = DiagnosticsForFFMPeg.copyFFMPegJarsTo(trackerDir); - } catch (Exception e) { - } return updated; } @@ -1712,7 +1706,7 @@ public void run() { // warnNoVideoEngine = false; // for PLATO if (warnNoVideoEngine && VideoIO.getDefaultEngine().equals(VideoIO.ENGINE_NONE)) { // warn user that there is no working video engine - boolean ffmpegInstalled = DiagnosticsForFFMPeg.guessFFMPegVersion()!=0; + boolean ffmpegInstalled = DiagnosticsForFFMPeg.hasFFMPegJars(); ArrayList message = new ArrayList(); boolean showRelaunchDialog = false; @@ -2202,7 +2196,7 @@ public Object loadObject(XMLControl control, Object obj) { Tracker.enableAutofill = control.getBoolean("enable_autofill"); //$NON-NLS-1$ Tracker.showGaps = control.getBoolean("show_gaps"); //$NON-NLS-1$ Tracker.centerCalibrationStick = control.getBoolean("center_stick"); //$NON-NLS-1$ - Tracker.isFFMPegFast = control.getBoolean("ffmpeg_fast"); //$NON-NLS-1$ + Tracker.isVideoFast = control.getBoolean("ffmpeg_fast"); //$NON-NLS-1$ if (control.getPropertyNames().contains("trail_length")) { //$NON-NLS-1$ String name = control.getString("trail_length"); //$NON-NLS-1$ for (int i=0; i