Repository: CommonWealthRobotics/BowlerStudio Branch: development Commit: a1e3d797dc3e Files: 197 Total size: 1.1 MB Directory structure: gitextract_bnacbskg/ ├── .gitattributes ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── release.yml │ └── verify.yml ├── .gitignore ├── .gitmodules ├── .travis.yml ├── COC.md ├── DEPENDENCIES.md ├── DEPENDENCIES_shallow.md ├── DEPENDENCIES_unknown.md ├── ISSUE_TEMPLATE.md ├── LICENSE ├── README.md ├── alllibs.txt ├── build.gradle ├── debian/ │ ├── .gitignore │ ├── README.Debian │ ├── README.source │ ├── bowlerstudio-docs.docs │ ├── bowlerstudio.doc-base.EX │ ├── changelog │ ├── compat │ ├── control │ ├── copyright │ ├── install │ ├── outfile │ └── rules ├── genDeps.sh ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew ├── gradlew.bat ├── jvm.json ├── libraries/ │ └── .gitignore ├── log/ │ └── .gitignore ├── makeJar.sh ├── runMac.sh ├── searchLicense.sh ├── settings.gradle ├── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── neuronrobotics/ │ │ ├── bowlerstudio/ │ │ │ ├── AddFileToGistController.java │ │ │ ├── BowlerStudio.java │ │ │ ├── BowlerStudioController.java │ │ │ ├── BowlerStudioFXMLController.java │ │ │ ├── BowlerStudioMenu.java │ │ │ ├── BowlerStudioMenuWorkspace.java │ │ │ ├── BowlerStudioModularFrame.java │ │ │ ├── ChangeAssetRepoController.java │ │ │ ├── ConnectionManager.java │ │ │ ├── CreatureLab3dController.java │ │ │ ├── DeviceSupportPluginMap.java │ │ │ ├── GistHelper.java │ │ │ ├── INewVitaminCallback.java │ │ │ ├── Main.java │ │ │ ├── MakeReleaseController.java │ │ │ ├── MeasurmentConfig.java │ │ │ ├── MenuRefreshEvent.java │ │ │ ├── MenuResettingEventHandler.java │ │ │ ├── NameGetter.java │ │ │ ├── NewCreatureWizard.java │ │ │ ├── NewVitaminWizardController.java │ │ │ ├── OutputFilter.java │ │ │ ├── PluginFactory.java │ │ │ ├── PluginManager.java │ │ │ ├── PluginManagerWidget.java │ │ │ ├── PsudoSplash.java │ │ │ ├── RedirectableStream.java │ │ │ ├── RpcCommandPanel.java │ │ │ ├── SplashManager.java │ │ │ ├── Terminal.java │ │ │ ├── TestServer.java │ │ │ ├── Tutorial.java │ │ │ ├── assets/ │ │ │ │ └── BowlerStudioResourceFactory.java │ │ │ ├── creature/ │ │ │ │ ├── AbstractGameController.java │ │ │ │ ├── AdjustbodyMassWidget.java │ │ │ │ ├── CreatureLab.java │ │ │ │ ├── CreatureLabControlsTab.java │ │ │ │ ├── DhLab.java │ │ │ │ ├── DhSettingsWidget.java │ │ │ │ ├── EngineeringUnitsSliderWidget.java │ │ │ │ ├── GameControlThreadManager.java │ │ │ │ ├── IAmControlled.java │ │ │ │ ├── IGameControllerUpdateListener.java │ │ │ │ ├── IGistPromptCompletionListener.java │ │ │ │ ├── IJogProvider.java │ │ │ │ ├── IOnEngineeringUnitsChange.java │ │ │ │ ├── IOnTransformChange.java │ │ │ │ ├── ITransformProvider.java │ │ │ │ ├── ITrimControl.java │ │ │ │ ├── JogMobileBase.java │ │ │ │ ├── JogThread.java │ │ │ │ ├── JogWidget.java │ │ │ │ ├── LinkConfigurationWidget.java │ │ │ │ ├── LinkGaugeController.java │ │ │ │ ├── LinkSliderWidget.java │ │ │ │ ├── MobleBaseMenueFactory.java │ │ │ │ ├── ParallelWidget.java │ │ │ │ ├── PhysicsWidget.java │ │ │ │ ├── TransformWidget.java │ │ │ │ ├── TransformWidgetTest.java │ │ │ │ ├── VitaminWidgetTest.java │ │ │ │ └── VitatminWidget.java │ │ │ ├── scripting/ │ │ │ │ ├── AskToDeleteWidget.java │ │ │ │ ├── GithubLoginFX.java │ │ │ │ ├── IExternalEditor.java │ │ │ │ ├── IScriptEventListener.java │ │ │ │ ├── ScriptingFileWidget.java │ │ │ │ ├── ScriptingWebWidget.java │ │ │ │ ├── ScriptingWidgetType.java │ │ │ │ └── external/ │ │ │ │ ├── ArduinoExternalEditor.java │ │ │ │ ├── BlenderExternalEditor.java │ │ │ │ ├── CaDoodleExternalEditor.java │ │ │ │ ├── EclipseExternalEditor.java │ │ │ │ ├── ExternalEditorController.java │ │ │ │ ├── FreeCADExternalEditor.java │ │ │ │ ├── GroovyEclipseExternalEditor.java │ │ │ │ ├── OpenSCADExternalEditor.java │ │ │ │ ├── SVGExternalEditor.java │ │ │ │ └── SceneBuilderExternalEditor.java │ │ │ ├── tabs/ │ │ │ │ ├── AbstractBowlerStudioTab.java │ │ │ │ ├── CalibrateGameControl.java │ │ │ │ ├── FirmataTab.java │ │ │ │ ├── LocalFileScriptTab.java │ │ │ │ ├── WebTab.java │ │ │ │ ├── WebTabController.java │ │ │ │ ├── WebTabFactory.java │ │ │ │ └── WebTabTest.java │ │ │ ├── threed/ │ │ │ │ ├── AssemblySlider.java │ │ │ │ ├── Axis.java │ │ │ │ ├── BowlerStudio3dEngine.java │ │ │ │ ├── CreaturelLabController.java │ │ │ │ ├── ICameraChangeListener.java │ │ │ │ ├── IControlsMap.java │ │ │ │ ├── Jbullet.java │ │ │ │ ├── MakeRuler.java │ │ │ │ ├── VirtualCameraMobileBase.java │ │ │ │ └── Xform.java │ │ │ └── utils/ │ │ │ ├── BowlerConnectionMenu.java │ │ │ ├── FindTextWidget.java │ │ │ ├── ImageTracer.java │ │ │ └── SVGFactory.java │ │ ├── graphing/ │ │ │ ├── CSVWriter.java │ │ │ ├── DataChannel.java │ │ │ ├── DataWriter.java │ │ │ ├── ExcelWriter.java │ │ │ ├── GraphDataElement.java │ │ │ ├── GraphingOptionsDialog.java │ │ │ └── GraphingWindow.java │ │ ├── nrconsole/ │ │ │ ├── plugin/ │ │ │ │ ├── BowlerCam/ │ │ │ │ │ ├── BowlerCamController.java │ │ │ │ │ ├── BowlerCamPanel.java │ │ │ │ │ └── RGBSlider.java │ │ │ │ ├── DyIO/ │ │ │ │ │ └── Secheduler/ │ │ │ │ │ ├── AnamationSequencer.java │ │ │ │ │ ├── SchedulerControlBar.java │ │ │ │ │ ├── SchedulerGui.java │ │ │ │ │ └── ServoOutputScheduleChannelUI.java │ │ │ │ └── bootloader/ │ │ │ │ ├── BootloaderPanel.java │ │ │ │ └── gui/ │ │ │ │ ├── BootloaderParams.java │ │ │ │ ├── NRBootLoaderApp.java │ │ │ │ ├── NR_Bootloader_GUI.java │ │ │ │ └── StatusLabel.java │ │ │ └── util/ │ │ │ ├── CommitWidget.java │ │ │ ├── CompoundSlider.java │ │ │ ├── DirectoryFilter.java │ │ │ ├── FileSelectionFactory.java │ │ │ ├── GCodeFilter.java │ │ │ ├── GroovyFilter.java │ │ │ ├── IntegerComboBox.java │ │ │ ├── Mp3Filter.java │ │ │ ├── NRConsoleDocumentationFactory.java │ │ │ ├── PrefsLoader.java │ │ │ ├── PromptForGit.java │ │ │ ├── Slic3rFilter.java │ │ │ ├── StlFilter.java │ │ │ └── XmlFilter.java │ │ ├── pidsim/ │ │ │ ├── CSVWriter.java │ │ │ ├── DataPanel.java │ │ │ ├── ExcelWriter.java │ │ │ ├── GraphingPanel.java │ │ │ ├── LinearPhysicsEngine.java │ │ │ ├── PIDConstantsDialog.java │ │ │ ├── PIDSim.java │ │ │ ├── PIDSimFullTest.java │ │ │ ├── PidLab.java │ │ │ └── SettingsDialog.java │ │ └── sdk/ │ │ └── addons/ │ │ └── kinematics/ │ │ ├── FirmataBowler.java │ │ └── FirmataLink.java │ └── resources/ │ ├── com/ │ │ └── neuronrobotics/ │ │ └── bowlerstudio/ │ │ └── build.properties │ ├── javax.usb.properties │ └── speech.properties ├── test.dxf └── wrappers/ ├── JavaVersionCheck.jar ├── linux/ │ ├── BowlerStudio.desktop │ ├── bowlerstudio │ └── control └── osx/ ├── BowlerStudio └── bowler-scripting-kernel.sh ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitattributes ================================================ src/main/java/com/neuronrobotics/bowlerstudio/NameGetter.java filter=unchanged * text=auto eol=lf *.java eol=lf ================================================ FILE: .github/FUNDING.yml ================================================ # These are supported funding model platforms # github: madhephaestus github: CommonWealthRobotics patreon: madhephaestus #community_bridge: BowlerStudio issuehunt: CommonWealthRobotics/BowlerStudio #ko-fi: bowlerstudio #open_collective: kevin-harrington ================================================ FILE: .github/workflows/release.yml ================================================ name: "Release" on: push: tags: - '*' jobs: release: runs-on: ubuntu-latest steps: - name: Checkout repository and submodules uses: actions/checkout@v2 with: submodules: recursive - name: Get the version id: get_version run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//} - name: Set Release Number Studio run: | echo $'app.name=BowlerStudio' > src/main/resources/com/neuronrobotics/bowlerstudio/build.properties echo "app.version=${{ steps.get_version.outputs.VERSION }}" >> src/main/resources/com/neuronrobotics/bowlerstudio/build.properties - name: Set OAuth Key env: # Or as an environment variable OAUTH_SECRET: ${{ secrets.OAUTH_SECRET }} run: | sed -i "s/REPLACE_ME/$OAUTH_SECRET/g" src/main/java/com/neuronrobotics/bowlerstudio/NameGetter.java - name: start xvfb run: Xvfb :99 & - name: initialize the X11 DISPLAY variable run: export DISPLAY=:99 - name: After JDK download, list directory contnts run: pwd; ls -la - name: Build with Gradle run: bash makeJar.sh - name: Set Java uses: actions/setup-java@v1 with: java-version: 25 jdkFile: zulu25.32.21-ca-fx-jdk25.0.2-linux_x64.tar.gz - name: release uses: actions/create-release@v1 id: create_release with: draft: false prerelease: false release_name: ${{ steps.version.outputs.version }} tag_name: ${{ github.ref }} env: GITHUB_TOKEN: ${{ github.token }} - name: upload JVM Configuration uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: jvm.json asset_name: jvm.json asset_content_type: application/json - name: upload BowlerStudio artifact uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ github.token }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ./build/libs/BowlerStudio.jar asset_name: BowlerStudio.jar asset_content_type: application/jar ================================================ FILE: .github/workflows/verify.yml ================================================ # test name: Test package on: push: branches: - '*' tags-ignore: - '*' pull_request: branches: - '*' jobs: build: runs-on: ubuntu-latest steps: - name: Checkout repository and submodules uses: actions/checkout@v2 with: submodules: recursive - name: List directory contents run: pwd; ls -la - name: start xvfb run: Xvfb :0 & - name: initialize the X11 DISPLAY variable run: export DISPLAY=:0 - name: After checkout, list directory contnts run: pwd; ls -la - name: Build with Gradle run: bash makeJar.sh - name: Set Java uses: actions/setup-java@v1 with: java-version: 25 jdkFile: zulu25.32.21-ca-fx-jdk25.0.2-linux_x64.tar.gz - name: Run Unit Tests run: xvfb-run -s '-screen 0 1024x768x24' ./gradlew test ================================================ FILE: .gitignore ================================================ /build/ /.nb-gradle/private/ /bin/ /JFXScad.jar /servoTest.jfxscad /wheel.stl /.gradle* /.gradle* /.project /.classpath /.settings* /.idea* /build/ /whitecylinder/ *.iml /CSGdatabase.json /jbullet-20101010/ /.DS_Store *hs_err_pid*.log* *.debuggerDefaults* /*.svg /*.svg.png /.combined.png-autosave.kra /combined.png /Oracle_VM_VirtualBox_Extension_Pack-5.2.20.vbox-extpack /chdk-ptp-java.log /deps.txt /MUJOCO_LOG.TXT /physicsTest/ /zulu*.tar.gz ================================================ FILE: .gitmodules ================================================ [submodule "libraries/bowler-script-kernel"] path = libraries/bowler-script-kernel url = https://github.com/CommonWealthRobotics/bowler-script-kernel.git ================================================ FILE: .travis.yml ================================================ language: java before_install: - "export DISPLAY=:99.0" - "export TERM=dumb" - "sh -e /etc/init.d/xvfb start" script: - TERM=dumb ./gradlew compileJava javadoc cache: directories: - $HOME/.m2 jdk: - oraclejdk8 # for running tests on Travis CI container infrastructure for faster builds sudo: true dist: trusty ================================================ FILE: COC.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards Examples of behavior that contributes to creating a positive environment include: * Using welcoming and inclusive language * Being respectful of differing viewpoints and experiences * Gracefully accepting constructive criticism * Focusing on what is best for the community * Showing empathy towards other community members Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or electronic address, without explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. ## Scope This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [INSERT EMAIL ADDRESS]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq ================================================ FILE: DEPENDENCIES.md ================================================ batik-all.jar , Apache batik-awt-util-1.7.jar , Apache batik-svggen-1.7.jar , Apache batik-util-1.7.jar , Apache bowler-kernel.jar , Apache commons-beanutils-1.8.0.jar , Apache commons-codec-1.13.jar , Apache commons-collections-3.2.2.jar , Apache commons-discovery-0.4.jar , Apache commons-fileupload-1.2.1.jar , Apache commons-io-2.6.jar , Apache commons-lang-2.6.jar , Apache commons-lang3-3.11.jar , Apache commons-logging-1.2.jar , Apache commons-math3-3.6.1.jar , Apache commons-net-3.3.jar , Apache controlsfx-8.0.6.jar , Unknown groovy-2.3.7.jar , Apache groovy-all-2.4.5.jar , Apache hamcrest-core-1.1.jar , BSD httpclient-4.5.1.jar , Apache httpcore-4.4.3.jar , Apache httpcore-nio-4.1.jar , Apache icu4j-54.1.1.jar , BSD ivy-2.2.0.jar , Apache jackson-annotations-2.10.1.jar , Apache jackson-core-2.10.1.jar , Apache jackson-databind-2.10.1.jar , Apache jakarta.activation-api-1.2.1.jar , Unknown jakarta.xml.bind-api-2.3.2.jar , Unknown javax.annotation-api-1.2.jar , CDDL javax.servlet-api-3.1.0.jar , CDDL jetty-continuation-9.4.36.v20210114.jar , Apache jetty-http-9.4.36.v20210114.jar , Apache jetty-io-9.4.36.v20210114.jar , Apache jetty-security-9.4.36.v20210114.jar , Apache jetty-server-9.4.36.v20210114.jar , Apache jetty-servlet-9.4.36.v20210114.jar , Apache jetty-servlets-9.4.36.v20210114.jar , Apache jetty-util-9.4.36.v20210114.jar , Apache jetty-util-ajax-9.4.36.v20210114.jar , Apache jetty-webapp-9.4.36.v20210114.jar , Apache jetty-xml-9.4.36.v20210114.jar , Apache jtok-core-1.9.3.jar , Apache junit-4.10.jar , BSD jython-2.5.3.jar , Apache jython-standalone-2.5.2.jar , Apache log4j-1.2.16.jar , Apache mockito-all-1.9.5.jar , MIT License opennlp-maxent-3.0.3.jar , Apache opennlp-tools-1.5.3.jar , Apache pdf-transcoder.jar , Apache svg-dom-java-1.1.jar , W3C xml-apis-1.3.04.jar , Apache xml-apis-ext.jar , Apache xml-apis.jar , W3C xmlrpc-client-3.1.3.jar , Apache xmlrpc-common-3.1.3.jar , Apache ================================================ FILE: DEPENDENCIES_shallow.md ================================================ annotation-indexer-1.4.jar asm5-5.0.1.jar asm-all-3.1.jar asm-debug-all-4.2.jar batik-all.jar batik-awt-util-1.7.jar batik-svggen-1.7.jar batik-util-1.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar bluecove-2.1.1.jar bluecove-gpl-2.1.1.jar bowler-kernel.jar bridge-method-annotation-1.14.jar bridge-method-injector-1.14.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar clojure-1.8.0.jar commons-beanutils-1.8.0.jar commons-codec-1.13.jar commons-collections-3.2.2.jar commons-discovery-0.4.jar commons-fileupload-1.2.1.jar commons-io-2.6.jar commons-lang-2.6.jar commons-lang3-3.11.jar commons-logging-1.2.jar commons-math3-3.6.1.jar commons-net-3.3.jar controlsfx-8.0.6.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar easybind-1.0.4-SNAPSHOT.jar emotionml-checker-java-1.1.jar ezmorph-1.0.6.jar fast-md5-2.7.1.jar firmata4j-2.3.4.1.jar flowless-0.4.jar github-api-1.101.jar GithubPasswordManager-0.6.1.jar groovy-2.3.7.jar groovy-all-2.4.5.jar gson-2.5.jar guava-14.0.1.jar hamcrest-core-1.1.jar hsqldb-2.0.0.jar httpclient-4.5.1.jar httpcore-4.4.3.jar httpcore-nio-4.1.jar icu4j-54.1.1.jar ihmc-native-library-loader-1.3.1.jar ivy-2.2.0.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jackson-databind-2.10.1.jar jakarta.activation-api-1.2.1.jar jakarta.xml.bind-api-2.3.2.jar jama-1.0.3.jar Jampack-1.0.jar JavaCad-0.27.0.jar javacpp-1.5.7.jar JavaEWAH-1.1.6.jar javax.annotation-api-1.2.jar javax.servlet-api-3.1.0.jar jbullet-2.72.2.4.jar jbullet-2.72.2.4-sources.jar jcommon-1.0.15.jar jetty-continuation-9.4.36.v20210114.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-webapp-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jfreechart-1.0.12.jar jinput-2.0.6-ihmc2.jar jinput-platform-2.0.6-natives-linux.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-windows.jar jl1.0.jar jmf-2.1.1e.jar jsapi.jar jsch-0.1.55.jar js.jar json-20180813.jar json-lib-2.4-jenkins-2.jar json-simple-1.1.jar jsoup-1.8.3.jar jsr305-2.0.1.jar jssc-2.8.0.jar jtok-core-1.9.3.jar junit-4.0.jar junit-4.10.jar jutils-1.0.0.jar jwnl-1.3.3.jar jxl-2.4.2.jar jython-2.5.3.jar jython-standalone-2.5.2.jar jzlib-1.1.3.jar kabeja-0.4.jar kabeja-svg-0.4.jar kabeja-xslt.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-osx-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-windows-x86.jar localizer-1.7.jar log4j-1.2.16.jar marytts-common-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar maven-plugin-api-2.0.1.jar mbrola.jar Medusa-7.1.jar miethxml-toolkit.jar miethxml-ui.jar miglayout-core-4.2.jar miglayout-swing-4.2.jar mockito-all-1.9.5.jar motej.0.9.jar mujoco-java-2.2.0-pre.5.jar nrjavaserial-5.1.1.jar nrsdk-3.33.0-jar-with-dependencies.jar nrV4J-3.8.1.jar okhttp-2.0.0.jar okhttp-urlconnection-2.0.0.jar okio-1.0.0.jar opennlp-maxent-3.0.3.jar opennlp-tools-1.5.3.jar org.eclipse.jgit-5.6.0.201912101111-r.jar pdf-transcoder.jar protobuf-java-3.8.0.jar reactfx-2.0-M5.jar richtextfx-0.6.jar rosjava-0.1.6.jar rsyntaxtextarea-2.6.0.jar slf4j-api-1.7.7.jar slf4j-simple-1.6.1.jar smack-3.2.1.jar smackx-3.2.1.jar smil-boston-dom-java-2000-02-25.jar stack-alloc.jar stapler-1.237.jar svg-dom-java-1.1.jar swing-layout-1.0.3.jar tiger-types-1.3.jar tink-1.3.0-rc1.jar trove4j-2.0.2.jar undofx-2.1.1.jar usb4java-1.2.0.jar usb4java-javax-1.2.0.jar usb-api-1.0.2.jar vecmath-1.3.1.jar voice-cmu-slt-hsmm-5.2.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar vvecmath-0.3.2.jar WalnutiQ-2.3.3.jar wellbehavedfx-0.1.1.jar wordnet-random-name-1.2.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar xml-apis-ext.jar xml-apis.jar xmlrpc-client-3.1.3.jar xmlrpc-common-3.1.3.jar ================================================ FILE: DEPENDENCIES_unknown.md ================================================ annotation-indexer-1.4.jar asm5-5.0.1.jar asm-all-3.1.jar asm-debug-all-4.2.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar bluecove-2.1.1.jar bluecove-gpl-2.1.1.jar bridge-method-annotation-1.14.jar bridge-method-injector-1.14.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar clojure-1.8.0.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar easybind-1.0.4-SNAPSHOT.jar emotionml-checker-java-1.1.jar ezmorph-1.0.6.jar fast-md5-2.7.1.jar firmata4j-2.3.4.1.jar flowless-0.4.jar github-api-1.101.jar GithubPasswordManager-0.6.1.jar gson-2.5.jar guava-14.0.1.jar hsqldb-2.0.0.jar ihmc-native-library-loader-1.3.1.jar jama-1.0.3.jar Jampack-1.0.jar JavaCad-0.27.0.jar javacpp-1.5.7.jar JavaEWAH-1.1.6.jar jbullet-2.72.2.4.jar jbullet-2.72.2.4-sources.jar jcommon-1.0.15.jar jfreechart-1.0.12.jar jinput-2.0.6-ihmc2.jar jinput-platform-2.0.6-natives-linux.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-windows.jar jl1.0.jar jmf-2.1.1e.jar jsapi.jar jsch-0.1.55.jar js.jar json-20180813.jar json-lib-2.4-jenkins-2.jar json-simple-1.1.jar jsoup-1.8.3.jar jsr305-2.0.1.jar jssc-2.8.0.jar junit-4.0.jar jutils-1.0.0.jar jwnl-1.3.3.jar jxl-2.4.2.jar jzlib-1.1.3.jar kabeja-0.4.jar kabeja-svg-0.4.jar kabeja-xslt.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-osx-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-windows-x86.jar localizer-1.7.jar marytts-common-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar maven-plugin-api-2.0.1.jar mbrola.jar Medusa-7.1.jar miethxml-toolkit.jar miethxml-ui.jar miglayout-core-4.2.jar miglayout-swing-4.2.jar motej.0.9.jar mujoco-java-2.2.0-pre.5.jar nrjavaserial-5.1.1.jar nrsdk-3.33.0-jar-with-dependencies.jar nrV4J-3.8.1.jar okhttp-2.0.0.jar okhttp-urlconnection-2.0.0.jar okio-1.0.0.jar org.eclipse.jgit-5.6.0.201912101111-r.jar protobuf-java-3.8.0.jar reactfx-2.0-M5.jar richtextfx-0.6.jar rosjava-0.1.6.jar rsyntaxtextarea-2.6.0.jar slf4j-api-1.7.7.jar slf4j-simple-1.6.1.jar smack-3.2.1.jar smackx-3.2.1.jar smil-boston-dom-java-2000-02-25.jar stack-alloc.jar stapler-1.237.jar swing-layout-1.0.3.jar tiger-types-1.3.jar tink-1.3.0-rc1.jar trove4j-2.0.2.jar undofx-2.1.1.jar usb4java-1.2.0.jar usb4java-javax-1.2.0.jar usb-api-1.0.2.jar vecmath-1.3.1.jar voice-cmu-slt-hsmm-5.2.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar vvecmath-0.3.2.jar WalnutiQ-2.3.3.jar wellbehavedfx-0.1.1.jar wordnet-random-name-1.2.jar ws-commons-util-1.0.2.jar ================================================ FILE: ISSUE_TEMPLATE.md ================================================ ### Installed Version ### OS type and version number ### Expected behavior ### Actual Behavior ### Steps to reproduce the behavior ================================================ FILE: LICENSE ================================================ GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. ================================================ FILE: README.md ================================================ BowlerStudio ========== [![Join the chat at https://gitter.im/CommonWealthRobotics/BowlerStudio](https://badges.gitter.im/CommonWealthRobotics/BowlerStudio.svg)](https://gitter.im/CommonWealthRobotics/BowlerStudioDevelopment?utm_source=share-link&utm_medium=link&utm_campaign=share-link) [![Test Build](https://github.com/CommonWealthRobotics/BowlerStudio/actions/workflows/verify.yml/badge.svg)](https://github.com/CommonWealthRobotics/BowlerStudio/actions/workflows/verify.yml) [![Github All Releases](https://img.shields.io/github/downloads/CommonWealthRobotics/BowlerStudio/total.svg)](https://github.com/CommonWealthRobotics/BowlerStudio/releases) [![CII Best Practices](https://bestpractices.coreinfrastructure.org/projects/2904/badge)](https://bestpractices.coreinfrastructure.org/projects/2904) # [Download Latest](https://commonwealthrobotics.com/#downloads) # What is BowlerStudio? BowlerStudio assists you in every step of a robotics project from concept to completion. Tools enable users to: * Interface with motors, sensors, and other electronics hardware. * Create 3d models for fabrication, and for simulating the motions of your project. * Give your robot sight with image processing on camera feeds and Kinect data. * Operate 3d printers and other CNC machines. * Create custom graphical user interfaces to control yours robots. * Create and control animations. ========== ## The Nitty-Gritty Version BowlerStudio Robotics development IDE is based on * [JCSG](https://github.com/miho/JCSG) * [Java-Bowler](https://github.com/NeuronRobotics/java-bowler) * [Jinput](https://github.com/jinput/jinput) * [motej](http://motej.sourceforge.net/) * [Usb4Java](https://github.com/usb4java/usb4java) * [NrJavaSerial](https://github.com/NeuronRobotics/nrjavaserial) * [BlueCove](https://github.com/hcarver/bluecove) * JavaFX 8 3d engine. * [JBullet](http://jbullet.advel.cz/) physics engine ported from the popular Bullet C++ framework. * [Jetty](http://www.eclipse.org/jetty/) Web Framework BowlerStudio is a device manager, scripting engine, CAD package, and simulation tool all in one application. A user can develop the kinematic of an robot arm using the D-H parameters-based automatic kinematics engine. With this kinematics model, the user can then generate the CAD for new unique parts to match the kinematic model. The user can then export the model to an STL, and connect a Bowler 3d printer to BowlerStudio. The printer can print out the part (using the newly generated STL) while the user connects a DyIO and begins testing the servos with the kinematics model. When the print is done, the user can assemble the arm with the tested servos and run the model again to control the arm with Cartesian instructions. Once this is complete, the user can then attach a wiimote to train the robot arm through a set of tasks, recording them with the animation framework built into BowlerStudio. To be sure the arm is moving to the right place, the user can attach a webcam to the end and use OpenCV to verify the arm's position, or use the arm (in conjunction with the webcam with OpenCV enabled) to track and grab objects (IE "eye-in-hand" tracking). Every step of this task can be performed from within BowlerStudio! Let's go through the main features: # Scripting With Gist ### About scripts and Gist Scripts are bits of code that BowlerStudio can load and run. BowlerStudio allows you to open a local file and run it, but BowlerStudio is most powerful when the code lives on Github Gist (a code snippet hosting service from Github). Simply give BowlerStudio the URL for a Gist you want to load and execute. Gists can be selected and edited using the built in browser, or inline in another script using the Gist ID. ### Java and Groovy BowlerStudio can load and run scripts written in Java, Groovy, and Python. Which parser is used is determined by the file extension. Files that end in .java or .groovy will be run through the Groovy compiler. These Groovy scripts are compiled fully and run directly in the JVM. This means they will execute at full speed, just like a regular application. ### Python Python, on the other hand, by virtue of its structure, will generally execute much slower then Java. With the reduction in speed you get lots of flexibility and a clean and easy to understand syntax. The python code can also create and return objects to BowlerStudio (such as CAD CSG objects, or UI Tabs). ### Return Objects A script can return a few object types that will be handled by BowlerStudio: Objects of type "CSG" and "MeshView" will be added to the 3d display. If a transform is added to either of these and updated by a script the user can move an object in the 3d view. Objects of type "Tab" will be added to the Tabmanager and displayed in BowlerStudio. This is an easy way to make control panels or state displays and monitors. Objects of type "BowlerAbstractDevice" (or any subclass) will be added to the connections manager and made available to all other scripts. These can be external devices or virtual communication bus devices. A bowler Server/Client pair is the preferred mechanism for communication between scripts. ### Device Access All scripts are passed all connected devices by name when the script is run. The name associated with the device in the connections tab is the name to use in the script to access that device. A script can also create and return a device (EG to connect to a specific device in order to give that device a specific name). The device returned will be added to the list of available devices and be available to other scripts. A user can define their own devices to facilitate communication between scripts. # Bowler Devices BowlerDevices (such as the Neuron Robotics DyIO) are devices that implement the Bowler Communication System. BowlerDevices are servers of features to applications. The DyIO, for example, is a server of microcontroller features. These devices implement a micro domain-specific language as a protocol. This language synchronizes the device with the application by building the communication system at runtime using a namespace/RPC system. As such, the device is treated as a collection of namespaces. Each namespace has a set of RPCs for communication, some synchronous (IE they are application initiated) and some asynchronous (IE device initiated). In addition, each RPC has full method introspection. This means that all parameters and datatypes (including how to pack and interpret all packets) are able to be queried over the communication system. A Library need only implement the core packet parser and every device will assemble its own communication layer live. # Cameras Cameras can be connected to Bowler Studio using one of 3 supported drivers: OpenCV's native Java bindings are provided by installing OpenCV using your OS specific installer (unfortunately not available for Mac at this time). JavaCV is a meta-library that adds support for a wide range of camera device integrations and image processing options. This is a big project and integrated now with a full scripting system. CHDK-PTP-Java is a Java library that adds support for SLR Cannon cameras. CHDK is a camera OS that makes the cameras features available over USB, and the Java library makes those images and controls available to Java and or scripting engine. # Image processing Image processing is provided be a variety of libraries included in this application. OpenCV and ARToolkit are some of the most widely used image recognition libraries available, and now you can use them directly from our scripting environment! # Kinematics Engine The Bowler Kinematics engine is based on [D-H parameters](https://www.youtube.com/embed/rA9tm0gTln8)- the standard mathematical definition of kinematics chains. This standard simplifies the calculation process and allows us to run forward kinematics equations for arbitrary defined chains in real time. For inverse kinematics, a collection of kinematic engines are available for optimizing for speed and accuracy. # Real-Time validated For applications where real time is required, there is no need to leave the Bowler OS. The Bowler Java stack has been validated as real-time capable when run on JamaicaVM (the real-time Java implementation). The Bowler Kinematics engine is run in a real-time loop for neurosurgery applications (Bowler and Java are fast and reliable enough for brain surgery!) # 3D CAD Users can write scripts using Java, Groovy or Python to generate CSG style CAD. This programmatic CAD engine JCSG was inspired by OpenSCAD, but implemented in pure Java with JavaFX visualizations. JCSG implements all basic shape generation and manipulation, using Java's library packaging and distribution for libraries of parts. Gist hosting of parts can also simplify sharing and loading of dependent libraries. # Virtualization ### Virtual links Virtual PID devices allow users to make applications that can be simulated with virtual links before ever connecting a real device. Users can also use the PIDLab to learn about designing and implementing PID controllers with a built in motor physics simulation. ### Virtual Camera Coming soon! Soon users will be able to interact with the 3D environment camera from their code just like a real camera. Users will be able to manipulate it just like it was another 3d object. ### Virtual Sensors Coming soon! Soon we will be able to provide virtual sensor devices, simulating real world sensors within the 3d environment. # Make A Contribution BowlerStudio is an open source project and is always looking for help with both the application code and the tutorials content. ### Java Contributions If you are a Java developmer, skip ahead to [The Build Instructions](#command-line). The application is a light plugin framework for UI, 3D and Device interaction. You can look at this repository for issues. ### Adding Tutorials All of the content for BowlerStudio Tutorials is housed on our [Neuronrobotics.github.io](https://github.com/CommonWealthRobotics/CommonWealthRobotics.github.io) web page. Fork that repository and make contributions based on the README.md file in the root of the repository. To merge the changes into the main website, send a pull request with your changes to official repository. Examples of tutorials that need to be added are [A simple Java Programming Introduction](https://github.com/CommonWealthRobotics/CommonWealthRobotics.github.io/issues/59). This tutorial set would go through the basic syntax of java and what all of the symbols mean and how to use them. Another example of a tutorial that could be added is one for [JavaCad Cheatsheet](https://github.com/CommonWealthRobotics/CommonWealthRobotics.github.io/issues/58) where you would add a 'cheat sheet' of commands to use in the JavaCad system. If a tutorial is missing and not described as needed by an issue, feel free to add additional issues. ## How to Build BowlerStudio ### Requirements - Internet connection (dependencies are downloaded automatically) - IDE: [Gradle](http://www.gradle.org/) Plugin (not necessary for command line usage) - The Binary installer for BowlerStudio must be installed before develpment. ### IDE Open the `BowlerStudio` [Gradle](http://www.gradle.org/) project in your favorite IDE (tested with NetBeans 7.4) and build by calling the `assemble` task. #### Windows Setup Instructions - Download and install Sloeber Eclipse or an alternative Java IDE of your choice. - Install BowlerStudio via the provided installer. This will ensure that the correct JVM is accessible. - Enable Clone a Git repository in Eclipse (Window > Show View > Other... > Git > Git Repositories > Clone a Git repository) - Clone this repository via HTTPS and use your [GitHub personal access token](https://github.com/settings/tokens). - Make sure to enable the option to clone submodules. - Set the default JVM in Eclipse to the following file path: `C:\Program Files (x86)\Commonwealth Robotics BowlerStudio\BowlerStudioApp\jre`. (Window > Preferences > Java > Installed JREs) - In the Eclipse gradle configuration, set the `javahome` path to the following file path: `C:\Program Files (x86)\Commonwealth Robotics BowlerStudio\BowlerStudioApp\jre`. (Window > Preferences > Gradle > Jave home) - Import the cloned project into Eclipse using gradle. (File > Import... > Gradle > Existing Gradle Project) - The path to add can be found in Eclipse by right-clicking the git repo and selecting Copy Path to Clipboard. Remove the /.git from the directory before importing. ### Command Line Navigate to the [Gradle](http://www.gradle.org/) project (e.g., `path/to/BowlerStudio`) and enter the following command: #### Bash (Linux/OS X/Cygwin/other Unix-like shell) ##### Ubuntu 18.04 Dependencies ``` sudo apt install curl ``` ##### Ubuntu 16.04 Dependencies ``` sudo apt-get install git gradle ``` ##### Ubuntu 14.04, install extra dependencies ``` sudo add-apt-repository "deb http://ppa.launchpad.net/mad-hephaestus/commonwealthrobotics/ubuntu xenial main" -y sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 71EA898B sudo add-apt-repository "deb http://us.archive.ubuntu.com/ubuntu/ trusty universe multiverse" sudo apt-get update -qq sudo apt-get install -y --force-yes gradle ``` ##### All Unix ``` bowlerstudio # run this to get the JVM downloaded into $HOME/bin/java8/jre git clone https://github.com/CommonWealthRobotics/BowlerStudio.git JAVA_HOME=$HOME/bin/java8/jre export JAVA_HOME cd BowlerStudio git submodule update --init --recursive git submodule update --recursive ./gradlew shadowJar $JAVA_HOME/bin/java -jar build/libs/BowlerStudio*.jar ``` Now you can use the Eclipse Marketplace to install the Gradle Plugin #### Windows (CMD) gradlew jar # History Bowler Studio began [Feb 11, 2015](https://github.com/CommonWealthRobotics/BowlerStudio/releases/tag/0.0.1) with the goal of making a robotics IDE. ================================================ FILE: alllibs.txt ================================================ Starting a Gradle Daemon (subsequent builds will be faster) > Task :showAll BowlerStudio: -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar libraries: -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar bowler-script-kernel: -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar java-bowler: -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar JCSG: -compile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar xmlrpc-common-3.1.3.jar batik-awt-util-1.7.jar batik-util-1.7.jar ws-commons-util-1.0.2.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar junit-4.0.jar json-simple-1.1.jar vvecmath-0.3.2.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar -testCompile: bowler-kernel.jar mbrola.jar rosjava-0.1.6.jar jsapi.jar jl1.0.jar jbullet-2.72.2.4.jar nrV4J-3.8.1.jar asm-all-3.1.jar jbullet-2.72.2.4-sources.jar stack-alloc.jar GithubPasswordManager-0.6.1.jar tink-1.3.0-rc1.jar json-20180813.jar nrsdk-3.33.0-jar-with-dependencies.jar bluecove-gpl-2.1.1.jar motej.0.9.jar bluecove-2.1.1.jar voice-dfki-poppy-hsmm-5.2.jar voice-dfki-prudence-hsmm-5.2.jar voice-dfki-spike-hsmm-5.2.jar voice-cmu-slt-hsmm-5.2.jar marytts-lang-en-5.2.jar marytts-runtime-5.2.jar marytts-signalproc-5.2.jar jama-1.0.3.jar richtextfx-0.6.jar flowless-0.4.jar undofx-2.1.1.jar reactfx-2.0-M5.jar groovy-2.3.7.jar ivy-2.2.0.jar controlsfx-8.0.6.jar stapler-1.237.jar json-lib-2.4-jenkins-2.jar marytts-common-5.2.jar ezmorph-1.0.6.jar commons-lang-2.6.jar httpclient-4.5.1.jar github-api-1.101.jar commons-codec-1.13.jar org.eclipse.jgit-5.6.0.201912101111-r.jar okhttp-urlconnection-2.0.0.jar wordnet-random-name-1.2.jar mockito-all-1.9.5.jar bridge-method-injector-1.14.jar miglayout-swing-4.2.jar JavaCad-0.27.0.jar pdf-transcoder.jar xml-apis-ext.jar kabeja-svg-0.4.jar miethxml-toolkit.jar batik-all.jar js.jar xml-apis.jar kabeja-0.4.jar kabeja-xslt.jar miethxml-ui.jar commons-io-2.6.jar jython-2.5.3.jar jython-standalone-2.5.2.jar clojure-1.8.0.jar jetty-webapp-9.4.36.v20210114.jar jetty-servlet-9.4.36.v20210114.jar jetty-security-9.4.36.v20210114.jar jetty-server-9.4.36.v20210114.jar jetty-servlets-9.4.36.v20210114.jar javax.servlet-api-3.1.0.jar vecmath-1.3.1.jar slf4j-simple-1.6.1.jar CHDK-PTP-Java-0.5.3-SNAPSHOT.jar WalnutiQ-2.3.3.jar jxl-2.4.2.jar de.huxhorn.sulky.3rdparty.jlayer-1.0.jar gson-2.5.jar jsoup-1.8.3.jar jmf-2.1.1e.jar firmata4j-2.3.4.1.jar jfreechart-1.0.12.jar xmlrpc-client-3.1.3.jar rsyntaxtextarea-2.6.0.jar batik-svggen-1.7.jar svg-dom-java-1.1.jar Medusa-7.1.jar xmlrpc-common-3.1.3.jar ws-commons-util-1.0.2.jar junit-4.10.jar protobuf-java-3.8.0.jar wellbehavedfx-0.1.1.jar easybind-1.0.4-SNAPSHOT.jar javax.annotation-api-1.2.jar commons-discovery-0.4.jar commons-beanutils-1.8.0.jar localizer-1.7.jar tiger-types-1.3.jar guava-14.0.1.jar asm5-5.0.1.jar commons-fileupload-1.2.1.jar jsr305-2.0.1.jar jzlib-1.1.3.jar jsch-0.1.55.jar JavaEWAH-1.1.6.jar jtok-core-1.9.3.jar slf4j-api-1.7.7.jar bcpg-jdk15on-1.64.jar bcpkix-jdk15on-1.64.jar bcprov-jdk15on-1.64.jar okhttp-2.0.0.jar bridge-method-annotation-1.14.jar asm-debug-all-4.2.jar maven-plugin-api-2.0.1.jar miglayout-core-4.2.jar jetty-http-9.4.36.v20210114.jar jetty-io-9.4.36.v20210114.jar jetty-util-ajax-9.4.36.v20210114.jar jetty-continuation-9.4.36.v20210114.jar jetty-xml-9.4.36.v20210114.jar jetty-util-9.4.36.v20210114.jar usb4java-javax-1.2.0.jar httpcore-nio-4.1.jar httpcore-4.4.3.jar commons-logging-1.2.jar jssc-2.8.0.jar jcommon-1.0.15.jar batik-awt-util-1.7.jar batik-util-1.7.jar xml-apis-1.3.04.jar smil-boston-dom-java-2000-02-25.jar smack-3.2.1.jar smackx-3.2.1.jar usb4java-1.2.0.jar jinput-2.0.6-ihmc2.jar ihmc-native-library-loader-1.3.1.jar commons-lang3-3.11.jar nrjavaserial-5.1.1.jar commons-math3-3.6.1.jar mujoco-java-2.2.0-pre.5.jar json-simple-1.1.jar vvecmath-0.3.2.jar hamcrest-core-1.1.jar commons-collections-3.2.2.jar okio-1.0.0.jar annotation-indexer-1.4.jar jackson-databind-2.10.1.jar usb-api-1.0.2.jar libusb4java-1.2.0-linux-x86.jar libusb4java-1.2.0-linux-x86_64.jar libusb4java-1.2.0-linux-arm.jar libusb4java-1.2.0-windows-x86.jar libusb4java-1.2.0-windows-x86_64.jar libusb4java-1.2.0-osx-x86.jar libusb4java-1.2.0-osx-x86_64.jar commons-net-3.3.jar jutils-1.0.0.jar jinput-platform-2.0.6-natives-windows.jar jinput-platform-2.0.6-natives-osx.jar jinput-platform-2.0.6-natives-linux.jar jakarta.xml.bind-api-2.3.2.jar javacpp-1.5.7.jar icu4j-54.1.1.jar emotionml-checker-java-1.1.jar trove4j-2.0.2.jar opennlp-tools-1.5.3.jar opennlp-maxent-3.0.3.jar hsqldb-2.0.0.jar log4j-1.2.16.jar fast-md5-2.7.1.jar groovy-all-2.4.5.jar Jampack-1.0.jar swing-layout-1.0.3.jar jackson-annotations-2.10.1.jar jackson-core-2.10.1.jar jakarta.activation-api-1.2.1.jar jwnl-1.3.3.jar Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0. Use '--warning-mode all' to show the individual deprecation warnings. See https://docs.gradle.org/6.2/userguide/command_line_interface.html#sec:command_line_warnings BUILD SUCCESSFUL in 2m 39s 1 actionable task: 1 executed ================================================ FILE: build.gradle ================================================ buildscript { repositories { [ mavenCentral(), maven { url "https://plugins.gradle.org/m2/" }, mavenLocal(), maven { url "https://repo.jenkins-ci.org/releases/" } ] } dependencies { classpath 'com.gradleup.shadow:shadow-gradle-plugin:8.3.9' } } boolean is64Bit() { ////System.out.println("Arch: "+getOsArch()); return getOsArch().startsWith("x86_64") || getOsArch().startsWith("amd64"); } boolean isARM() { return getOsArch().startsWith("arm"); } boolean isCortexA8(){ if(isARM()){ //TODO check for cortex a8 vs arm9 generic return true; } return false; } boolean isWindows() { ////System.out.println("OS name: "+getOsName()); return getOsName().toLowerCase().startsWith("windows") ||getOsName().toLowerCase().startsWith("microsoft") || getOsName().toLowerCase().startsWith("ms"); } boolean isLinux() { return getOsName().toLowerCase().startsWith("linux"); } boolean isOSX() { return getOsName().toLowerCase().startsWith("mac"); } String getExtension() { if(isWindows()) { return ".dll"; } if(isLinux()) { return ".so"; } if(isOSX()) { return ".jnilib"; } return ""; } String getOsName() { return System.getProperty("os.name"); } String getOsArch() { return System.getProperty("os.arch"); } plugins { id 'com.github.jk1.dependency-license-report' version '1.17' id 'java' id 'signing' id 'application' id 'eclipse' id 'com.diffplug.spotless' version '6.25.0' } spotless { java { lineEndings = com.diffplug.spotless.LineEnding.UNIX // Eclipse formatter with your config file eclipse('4.26').configFile('libraries/bowler-script-kernel/config/eclipse-formatter.xml') // Optional but recommended additions: // Optional but recommended additions: removeUnusedImports() trimTrailingWhitespace() endWithNewline() } } if (project == rootProject) { apply plugin: 'application' apply plugin: 'com.gradleup.shadow' }else { apply plugin: 'java-library' } import com.github.jk1.license.render.* import com.github.jk1.license.importer.* licenseReport { // Set output directory for the report data. // Defaults to ${project.buildDir}/reports/dependency-license. outputDir = "$projectDir/build/licenses" // Adjust the configurations to fetch dependencies. Default is 'runtimeClasspath' // For Android projects use 'releaseRuntimeClasspath' or 'yourFlavorNameReleaseRuntimeClasspath' // Use 'ALL' to dynamically resolve all configurations: // configurations = ALL configurations = ['runtimeClasspath'] // List the ids (in module:name format) to exclude from dependency report. Supports regular expressions. // By default excludes is empty. excludes = ['moduleGroup:moduleName'] // Don't include artifacts of project's own group into the report excludeOwnGroup = false // Don't exclude bom dependencies. // If set to true, then all boms will be excluded from the report excludeBoms = false // Set custom report renderer, implementing ReportRenderer. // Yes, you can write your own to support any format necessary. renderers = [ new XmlReportRenderer('third-party-libs.xml', 'Back-End Libraries'), new CsvReportRenderer('third-party-libs.csv') ] } //apply plugin: 'edu.sc.seis.launch4j' [compileJava, compileTestJava]*.options*.encoding = 'UTF-8' // NetBeans will automatically add "run" and "debug" tasks relying on the // "mainClass" property. You may however define the property prior executing // tasks by passing a "-PmainClass=" argument. // // Note however, that you may define your own "run" and "debug" task if you // prefer. In this case NetBeans will not add these tasks but you may rely on // your own compile. ext.mainClass = 'com.neuronrobotics.bowlerstudio.BowlerStudio' File buildDir = file("."); configurations.all { exclude module: 'slf4j-log4j12' } sourceSets { test { java { srcDirs = [ "test/java/src" ] // Note @Peter's comment below } } } /* launch4j { mainClassName = ext.mainClass icon = buildDir.getAbsolutePath()+"/src/main/resources/CommonWealthRobotics.ico" } */ Properties props = new Properties() props.load(new FileInputStream(buildDir.getAbsolutePath()+"/src/main/resources/com/neuronrobotics/bowlerstudio/build.properties")) repositories { maven { url "https://repo.jenkins-ci.org/public/" } mavenCentral() maven { url 'https://repo1.maven.org/maven2/'} // maven { // url "https://repo.myrobotlab.org/artifactory/myrobotlab/" // content { // includeGroup("de.dfki.mary") // } // } maven { url 'https://maven-central.storage-download.googleapis.com/repos/central/data/'} maven {url 'https://repo.jenkins-ci.org/public/'} maven { url 'https://clojars.org/repo' } maven { url 'https://jline.sourceforge.net/m2repo' } maven { url 'https://repo.spring.io/milestone'} // // maven { // url 'https://jenkinsci.artifactoryonline.com/jenkinsci/public/' // allowInsecureProtocol = true // } maven { url "https://raw.githubusercontent.com/DFKI-MLT/Maven-Repository/main" } // maven { // url "https://repo.spring.io/libs-milestone/" // } maven { url "https://maven.cloudsmith.io/marytts/marytts/" } maven { url 'https://plugins.gradle.org/m2/' } //maven { url 'https://dl.bintray.com/clearcontrol/ClearControl' } // maven { url 'https://repo.spring.io/plugins-release/' } maven { url "https://jitpack.io" } maven { url "https://repo.eclipse.org/content/groups/releases/" } maven { url "https://dl.bintray.com/dfki-lt/maven/" } maven { url "https://raw.github.com/marytts/marytts/master/repository/" } maven { url "https://repo.jenkins-ci.org/public/" } maven { url "https://raw.githubusercontent.com/DFKI-MLT/DFKI-LT-MAVEN/master/repository" } maven { url 'https://commonwealthrobotics.com/maven/' allowInsecureProtocol = true } maven { url "https://clojars.org/repo" } } dependencies { implementation 'org.kohsuke.stapler:stapler:1.263' // https://mvnrepository.com/artifact/org.kohsuke.stapler/stapler //implementation group: 'org.kohsuke.stapler', name: 'stapler', version: '1881.vd39f3ee5c629' implementation group: 'org.json', name: 'json', version: '20180813' implementation 'com.google.crypto.tink:tink:1.3.0-rc1' implementation 'gov.nist.math:jama:1.0.2' implementation group: 'org.fxmisc.richtext', name: 'richtextfx', version: '0.6' implementation group: 'org.controlsfx', name: 'controlsfx', version: '8.0.6' implementation group: 'commons-lang', name: 'commons-lang', version: '2.6' implementation group: 'commons-codec', name: 'commons-codec', version: '1.7' // https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit implementation group: 'org.eclipse.jgit', name: 'org.eclipse.jgit', version: '5.13.1.202206130422-r' implementation group: 'com.squareup.okhttp', name: 'okhttp-urlconnection', version: '2.0.0' implementation group: 'org.mockito', name: 'mockito-all', version: '1.9.5' implementation group: 'com.infradna.tool', name: 'bridge-method-injector', version: '1.14' //compile group: 'com.neuronrobotics', name:'GithubPasswordManager', version:'0.6.1' implementation 'com.miglayout:miglayout-swing:4.2' implementation 'commons-io:commons-io:2.6' implementation group:'org.python',name:'jython',version:'2.5.3' implementation group:'org.python',name:'jython-standalone',version:'2.5.2' implementation 'org.clojure:clojure:1.8.0' // jetty server implementation "org.eclipse.jetty:jetty-server:9.4.36.v20210114" implementation "org.eclipse.jetty:jetty-servlet:9.4.36.v20210114" implementation "org.eclipse.jetty:jetty-servlets:9.4.36.v20210114" implementation "org.eclipse.jetty:jetty-webapp:9.4.36.v20210114" implementation "javax.servlet:javax.servlet-api:3.1.0" //compile 'org.clojure:tools.nrepl:0.2.10' //compile "overtone:overtone:0.9.1" //compile "edu.cmu.sphinx:sphinx4-core:5prealpha-SNAPSHOT" //compile "edu.cmu.sphinx:sphinx4-data:5prealpha-SNAPSHOT" implementation group: 'java3d', name: 'vecmath', version: '1.3.1' implementation 'org.slf4j:slf4j-simple:1.6.1' //implementation "com.neuronrobotics:CHDK-PTP-Java:0.5.3-SNAPSHOT" //compile "com.neuronrobotics:java-bowler:3.25.4" //compile fileTree (dir: '../java-bowler/build/libs/', includes: ['nrsdk-3.23.3-jar-with-dependencies.jar']) implementation "com.neuronrobotics:WalnutiQ:2.3.3" /* String basedir =System.getenv("OPENCV_DIR")+"/java/opencv-249.jar"; if(isWindows()){ basedir =System.getenv("OPENCV_DIR")+"\\..\\..\\java\\opencv-249.jar"; println("OPENCV_DIR="+basedir); compile files(basedir) } if(isOSX()){ basedir =System.getenv("OPENCV_DIR")+"../../java/opencv-249.jar"; println("OPENCV_DIR="+basedir); if(System.getenv("OPENCV_DIR")!=null) compile files(basedir) else //If you set your OPENCV_DIR environment variable, then we wouldnt have to do hacky things compile files('/Applications/BowlerStudio.app/Contents/MacOS/opencv249build/bin/opencv-249.jar') } if(isLinux()){ //compile files('/usr/share/java/opencv-249.jar') if(new File("/usr/share/OpenCV/java/").exists()){ System.out.println("Using the legacy opencv dir ") compile fileTree (dir: '/usr/share/OpenCV/java/', includes: ['*opencv-24*.jar']) }else{ compile fileTree (dir: '/usr/share/java/', includes: ['*opencv-24*.jar']) } } */ //compile group: 'jfree', name: 'jfreechart', version: '1.0.12' implementation group: 'jexcelapi', name: 'jxl', version: '2.4.2' //compile group: 'com.google.zxing', name: 'zxing-parent', version: '3.2.0' //compile group:'com.github.ellzord', name:'JALSE', version:'1.0.9' implementation group:'de.huxhorn.sulky', name:'de.huxhorn.sulky.3rdparty.jlayer', version:'1.0' //compile("org.springframework.boot:spring-boot-starter-web:1.2.7.RELEASE") implementation 'com.google.code.gson:gson:2.5' implementation 'org.jsoup:jsoup:1.8.3' implementation 'org.apache.httpcomponents:httpclient:4.5.1' //compile 'cz.advel.jbullet:jbullet:20101010-1' //compile 'org.bubblecloud.jbullet:jbullet:2.72.2.4'// replaced by local jar because jbullet maven went down //compile "alda:alda:1.0.0-rc14" //Deep Learning 4 j and dependancies /* compile 'org.deeplearning4j:deeplearning4j-core:0.4-rc3.8' //compile 'org.nd4j:nd4j-x86:0.4-rc3.8' compile 'org.deeplearning4j:deeplearning4j-nlp:0.4-rc3.8' compile 'org.deeplearning4j:deeplearning4j-ui:0.4-rc3.8' compile 'com.google.guava:guava:19.0' compile 'org.nd4j:canova-nd4j-image:0.0.0.14' compile 'org.nd4j:canova-nd4j-codec:0.0.0.14' compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.5.1' */ // JScience: //compile 'org.jscience:jscience:4.3.1' implementation 'javax.media:jmf:2.1.1e' //Weka //compile 'nz.ac.waikato.cms.weka:weka-stable:3.6.13' //Firmata implementation 'com.github.kurbatov:firmata4j:2.3.4.1' implementation group: 'jfree', name: 'jfreechart', version: '1.0.12' //compile fileTree (dir: '../bowler-script-kernel/build/libs', includes: ['BowlerScriptingKernel-0.25.4.jar']) testImplementation group: 'junit', name: 'junit', version: '4.10' //compile "org.jfxtras:jfxtras-common:8.0-r4" //compile "org.jfxtras:jfxtras-fxml:8.0-r4" //compile "org.jfxtras:jfxtras-controls:8.0-r4" //compile "org.jfxtras:jfxtras-agenda:8.0-r4" //compile "org.jfxtras:jfxtras-window:8.0-r4" //compile "org.jfxtras:jfxtras-menu:8.0-r4" //compile "org.jfxtras:jfxtras-labs:8.0-r4" //compile 'com.github.movisens:SmartGattLib:1.7' // https://mvnrepository.com/artifact/org.apache.xmlrpc/xmlrpc-client implementation group: 'org.apache.xmlrpc', name: 'xmlrpc-client', version: '3.1.3' // https://mvnrepository.com/artifact/com.abercap/odoo-java-api //compile group: 'com.abercap', name: 'odoo-java-api', version: '1.1.0.RELEASE' //http://www.jocl.org/ //compile group: 'org.jocl', name: 'jocl', version: '2.0.0' // https://mvnrepository.com/artifact/com.nativelibs4java/jnaerator //compile group: 'com.nativelibs4java', name: 'jnaerator', version: '0.11' // https://mvnrepository.com/artifact/com.github.kurbatov/firmata4j // https://mvnrepository.com/artifact/com.fifesoft/rsyntaxtextarea implementation("com.fifesoft:rsyntaxtextarea:3.6.0") //compile 'org.bubblecloud.jbullet:jbullet:2.72.2.4' // https://mvnrepository.com/artifact/org.apache.xmlgraphics/batik-svggen implementation group: 'org.apache.xmlgraphics', name: 'batik-all', version: '1.17' // https://mvnrepository.com/artifact/org.axsl.org.w3c.dom.svg/svg-dom-java implementation group: 'org.axsl.org.w3c.dom.svg', name: 'svg-dom-java', version: '1.1' //compile fileTree (dir: 'libraries/bowler-script-kernel/libs/', includes: ['*.jar']) implementation project('libraries:bowler-script-kernel:java-bowler') implementation project('libraries:bowler-script-kernel:JCSG') implementation project('libraries:bowler-script-kernel') //compile project(':libraries:bowler-script-kernel:JCSG') implementation project('libraries:bowler-script-kernel:GithubPasswordManager:GithubPasswordManager') //compile project(':kinematics-chef') //compile 'com.neuronrobotics:kinematics-chef-core:0.0.15' //compile fileTree (dir: 'libraries/java-bowler/libs/', includes: ['*.jar']) implementation 'com.google.guava:guava:19+' implementation group: 'org.kohsuke', name: 'wordnet-random-name', version: '1.2' //https://github.com/HanSolo/Medusa implementation group: 'eu.hansolo', name: 'Medusa', version: '7.1' //MuJoCo implementation group: 'org.bytedeco', name: 'javacpp', version: '1.5.7' implementation group: 'com.neuronrobotics', name: 'mujoco-java', version:'3.1.3-pre.11' // Zip and unzip, tar and untar implementation 'org.apache.commons:commons-compress:1.26.2' } // create a fat-jar (class files plus dependencies // excludes VRL.jar (plugin jar files must not start with 'vrl-\\d+') jar { //zip64 true jar.duplicatesStrategy = DuplicatesStrategy.EXCLUDE // project class files compiled from source //from files(sourceSets.main.output.classesDir) manifest { attributes( "Main-Class": 'com.neuronrobotics.bowlerstudio.BowlerStudio', "Manifest-Version": "1.0", "Created-By": "CommonWealth Robotics Cooperative", "Specification-Title": props."app.name", "Specification-Version": props."app.version", "Specification-Vendor": "CommonWealth Robotics Cooperative", "Implementation-Title": props."app.name", "Implementation-Version" : props."app.version", "Implementation-Vendor": "CommonWealth Robotics Cooperative" ) } } tasks.withType(JavaCompile).configureEach { options.compilerArgs += ['--enable-preview'] } tasks.withType(Test).configureEach { jvmArgs '--enable-preview' } tasks.withType(JavaExec).configureEach { jvmArgs '--enable-preview' } task ('showAll') { doLast { allprojects.each { println(it.name+':') println('-compile:') configurations.compile.each { c -> println(' '+c.name) } println '-testCompile:' configurations.testCompile.each { r-> println(' '+ r.name) } } } } eclipse{ jdt { // sourceCompatibility = 1.8 // targetCompatibility = 1.8 file { withProperties { properties -> properties.setProperty('org.eclipse.jdt.core.compiler.problem.forbiddenReference', 'ignore') } } } } application { mainClass = 'com.neuronrobotics.bowlerstudio.BowlerStudio' } if (project == rootProject) { shadowJar { dependsOn 'spotlessApply' zip64 true manifest { attributes 'Main-Class': 'com.neuronrobotics.bowlerstudio.BowlerStudio' } if (project == rootProject) { archiveBaseName.set('BowlerStudio') archiveClassifier.set('') archiveVersion.set('') } else { archiveBaseName.set('BowlerStudio') archiveClassifier.set('') archiveVersion.set('') } mergeServiceFiles() } } ================================================ FILE: debian/.gitignore ================================================ /changelog.bak /.changelog.swp ================================================ FILE: debian/README.Debian ================================================ bowlerstudio for Debian ---------------------- -- Kevin Harrington Sun, 26 Jun 2016 11:43:09 -0400 ================================================ FILE: debian/README.source ================================================ bowlerstudio for Debian ---------------------- -- Kevin Harrington Sun, 26 Jun 2016 11:43:09 -0400 ================================================ FILE: debian/bowlerstudio-docs.docs ================================================ README.source README.Debian ================================================ FILE: debian/bowlerstudio.doc-base.EX ================================================ Document: bowlerstudio Title: Debian bowlerstudio Manual Author: Abstract: This manual describes what bowlerstudio is and how it can be used to manage online manuals on Debian systems. Section: unknown Format: debiandoc-sgml Files: /usr/share/doc/bowlerstudio/bowlerstudio.sgml.gz Format: postscript Files: /usr/share/doc/bowlerstudio/bowlerstudio.ps.gz Format: text Files: /usr/share/doc/bowlerstudio/bowlerstudio.text.gz Format: HTML Index: /usr/share/doc/bowlerstudio/html/index.html Files: /usr/share/doc/bowlerstudio/html/*.html ================================================ FILE: debian/changelog ================================================ bowlerstudio (1.24.0) bionic; urgency=medium * adding svg loading * adding a buton to launch advanced editors * removed prints * add info for items * bugfix * adding API for fail over install * approprate construstor order * adding tooltips for the buttons * Adding the launcher class for Eclipse/groovy * fix junk import * modularized * deal with gists better * adding auto-run from external editor * 0.16.0 * jcsg * update addFile wizard to create repos instead of gists * changing fork from gist fork to git repo forking * Adding windows inkscape file * adding windows * allow eclipse on windows * Tested working on windows! * check for ignore contents existing * adding windows support * #225 Check for null string before checking the stack * 1.17.1 * bugfix * ficing the delimiters for windows in the subclass * Use more than one option for inkscape * 1.17.4 * eclipse loading stuff again * jcsg * jcsg * SVG loading * bugfix in the color loading * Disable the advanced editor button if the editor is open * adding a search for inkscape exe * adding arduino to the advanced editors * launch using the finle name * find the workspace * dealing wiht the escaped slashes on windows * 1.18.1 * dramatic jog widget performance boost * change controller wrapper api * new game controller framework * controller with multiple sources * 1.20.0 * new jog configuration * Adding the game contoller mapping wizard * Calibrate game controllers as a plugin tab * add tooltips for plugin buttons * Moving javaFX depenancies to the kernel * kernel * close the running script and restart in a thread on file change * 1.21.0 * addin a mobile base jogging * 1.22.0 * #227 #228 #229 * revbump jetty to 9.4.36.v20210114 * close #206 * add clearer printing while installing and opening eclipse * check to see if the workspace exists before checking the lock file * eclipse opening * adding print statements to entering kernel mode * disconnect listeners * kernels * fixing bounding issue * 1.23.2 * 1.23.3 Fixing the loading of default creatures by pulling first * Adding a pull step to the XML commit * prevent infinet loops * app.version=1.24.0 -- Kevin Harrington Sun, 21 Feb 2021 10:38:43 -0500 bowlerstudio (1.14.0) bionic; urgency=medium * fix l;aunching bug * remove the junk progress viewer * kernel version change * adding SVGLoad API -- Kevin Harrington Wed, 30 Dec 2020 15:32:07 -0500 bowlerstudio (1.13.3) bionic; urgency=medium * adding 1.13.3 -- Kevin Harrington Sat, 26 Dec 2020 18:03:43 -0500 bowlerstudio (1.13.1) bionic; urgency=medium [ Octogonapus ] * Create gradle-wrapper-validation.yml [ Kevin Harrington ] * Delete .DS_Store * Delete .DS_Store * Delete .DS_Store * Close #169 * 1.5.4 start * close #170 * close 159 * 1.5.5 * close #163 * close #179 * Better logging for #175 * Close #177 * to 1.5.7 * close #178 * to 1.5.8 * more robust to networless startup * Loading application stable with no network * update to gradle 6.2 * Delete readme.html * unused imports * 1.5.10 * serial update * close #160 * only call login once * JCSG * kernel * kernel * kernel * kernel * updated issue reporting * kernel * 1.5.13 * clear all watched files on exit * Also for #190 * 1.5.14 * #194 Catch the exception pull throws and remove the junk URL * 1.5.15 * adding dependant API to solve #195 * adding the engineering units * To begin with for #195 link limits to zero * added to support #195 * Adding jog buttons and limit-zero linking for #195 * kernel * attempting to add the gauge display #195 * Adding a test widget to test the link configurations * Implementing the bounds on the dial gauge. * fix java-bowler javadoc * Moving tester app into test sources * #195 Adding the ability to set limits in engineering units * Adding calibration widget * changing what link to look at * focus on the limb root, not the links, keeps the camera orentation clean * formatting * adding interface to focus on affine * creating the focus on affine function * 1.6.1 * updating the Jog Widget * 1.6.2 * Update LICENSE * java bowler * kernel * kernel * bugfix * kernel * adding a link gauge controller class * setting the gauge at the link * hanging of the gauge widget from the 3d display * alligned the link gauge center * Allign the link gauge limits with the devices limits * kernel * testing the gauge display * Close #184 and only report once when the same exception is thrown. * tuning the gauge display * 1.6.4 * Close #196 * 1.6.4 * Adding an instantanious storage and retrival value * Split the Mobile base jog off from the limb jog widgets * Change the display format to remove the sliders that make no sense for positions. * 1.6.6 * 1.6.7 * kernel * ensure the target is not changed unless changed explicatly. * 1.7.0 * move the target as adjusting the link configuration to see if * 1.7.1 * no sliders for DH parameters * Move the slider underneith the rest of the Engineering Units widget * no slider for the zero value * Focus the D-H widget on the link before the link being adjusted * bound the jogging to the limits set in the slider * Add events to jogging the angles * dont zero out the rotation in the jog widget * nrjavaserial * kernel * formatting * sort the fields * link slider less jumpy * 1.7.2 * fixed the editing of an event * sort the list of possible vitamins * bugfix in DH widget * spacing out the dh widgets * correct name of A value * Switching to webflow * WebFlow enabled for BowlerStudio * do not go into unknown state when refresh is hit after login * switching to the defined scopes * 1.8.1 * take key from the command line * close #198 * close #175 again * 1.8.2 * check for exceptions in the UI thread * Catch and print the users exception rather than reporting it * kernel * only provide as opotions the link types from the userdefined area * kernel * pass the owner down through the menuies * kernel * support multible bases at the root level for comprehention * select the correct base at root * kernel events * 1.9.0 * move this function into the transform set for the limb * update the limb locations on set of the root transform * adjusting the job speed * close #200 * COmpressing camera control into single class * move affin into contructor * cleanup * camera startup orentation * Camera startup returned to original framing * startup camera must be in UI thread * 1.9.3 * kernel * 1.9.4 * this fixes the default orentation * removing junk api * code generation section * kernel * kernel * adding version number * 1.9.6 * adding paralell robots to the menufactory * adding parallel widget * mod the paralell widget * make the parallel widget work * updated teh parallel widget * kernel * version * catch exception caused by paralell groups * renaming * adding and removing working * kernel * close #212 * kernel * 1.10.5 * dropping synchronized * cleaning out cruft and switching PID ticks to float from integer * compile * DH settings more intuitive in the UI * 1.11.0 * adding perms for deleting repos * 1.12.0 * updating commons-io * kernel * remove DyIO classes * Full installer release to add --force-gpu to linux installer * 1.13.1 -- Kevin Harrington Tue, 08 Dec 2020 15:47:24 -0500 bowlerstudio (1.5.3) bionic; urgency=medium * password manager * updating kernel -- Kevin Harrington Fri, 20 Mar 2020 12:43:22 -0400 bowlerstudio (1.5.2) bionic; urgency=medium * 1.5.2 -- Kevin Harrington Thu, 19 Mar 2020 15:24:46 -0400 bowlerstudio (1.5.1) bionic; urgency=medium * kernel * 1.5.1 -- Kevin Harrington Thu, 19 Mar 2020 14:53:57 -0400 bowlerstudio (1.5.0) bionic; urgency=medium * chasing down memory leak and found this * fixing the memory leak -- Kevin Harrington Wed, 11 Mar 2020 18:19:17 -0400 bowlerstudio (1.4.7) bionic; urgency=medium * check the owner updated to not fail * 1.4.6 * assets spoolup procedure * clearing physics on exit * startup with no assets working * address the memory leak * addressed memory leak -- Kevin Harrington Fri, 06 Mar 2020 15:42:36 -0500 bowlerstudio (1.4.5) bionic; urgency=medium * 1.4.5 * kernel * check the device for null and print error is none is loaded * close #166 -- Kevin Harrington Thu, 27 Feb 2020 15:03:36 -0500 bowlerstudio (1.4.4) bionic; urgency=medium * 1.4.3 * close #149 * Refresh the menu for #148 * close #148 * Close #153 * 1.4.4 * kernel -- Kevin Harrington Mon, 10 Feb 2020 07:49:11 -0500 bowlerstudio (1.4.2) bionic; urgency=medium * kernel to close #144 * adding the SVG loader * adding a parser for SVG * 1.4.2 * kernel -- Kevin Harrington Tue, 04 Feb 2020 21:46:34 -0500 bowlerstudio (1.4.1) bionic; urgency=medium * remove junk exception handler * close #142 Only highlight when the controller is open * close #139 * 1.4.1 -- Kevin Harrington Mon, 03 Feb 2020 18:48:44 -0500 bowlerstudio (1.4.0) bionic; urgency=medium * Stagger the opening of tabs to avoid collision * Cleaned up the connection manager * 1.4.0 -- Kevin Harrington Sat, 01 Feb 2020 16:56:21 -0500 bowlerstudio (1.3.2) bionic; urgency=medium * removing junk * #120 shoudle reso;ve bey reading the branch * close #124 * 1.3.2 * close #127 * Close #129 * Add new repo in copy creature immediatly to the workspace * correct crash on load when downgrading * paralell loading the menu of GitHub * #135 Check for null tabs * #134 Catch the index out of bounds exception * catch and reset teh values * load devices on launch * pull befor rinning both dep injectors * kernel * getting rid of loading scripts makes the copy process cleaner -- Kevin Harrington Fri, 31 Jan 2020 21:00:51 -0500 bowlerstudio (1.3.1) bionic; urgency=medium * Adding Kotlin * tested kotlin tab working * 1.3.0 * Close #126 By loading repos as list. * kernel * kernel * removing stale depenancy * adding 64 bit zipping * adding 64 bit zipping -- Kevin Harrington Sat, 18 Jan 2020 18:15:39 -0500 bowlerstudio (1.2.4) bionic; urgency=medium * kernel * build * vitamins * string insertion method no longer nibbles bytes off the end * startup sequence with no files and no login tested working * kernel * close #113 By catching this stack trace and ignoring it * version * ensure that all new vitamins have teh required fields * ensure starter data doesnt look right * kernel -- Kevin Harrington Tue, 14 Jan 2020 10:45:20 -0500 bowlerstudio (1.2.2) bionic; urgency=medium * Resolve #100 * updating library * This should address #104 * 1.2.0 * Close #106 and Close #105 * Catch and swallow printing exceptions Close #110 * Ensure #110 is handled properly in the future * kernel -- Kevin Harrington Wed, 08 Jan 2020 16:35:22 -0500 bowlerstudio (1.1.0) bionic; urgency=medium * renamed the label on the git file add * version bump * Added a vitamins menu * adding uncaught exception handlers * Adding a new Vitamin wizard * Adding the vitamin creation callbacks * basic workflow added * Basic editing of data * Adding functioning New Vitamins wizard * ensure that motors have all required fields * Vitamins menu for editing works * New vitamin wizard is working * Close #98 * better issue reporting * cleaned up codegen section * sanatized configurations * kernel -- Kevin Harrington Mon, 06 Jan 2020 17:45:52 -0500 bowlerstudio (1.0.11) bionic; urgency=medium * Only load menu items when the mouse enters the repository * only one thread allowing for the loading of configuration data. * kernel * Bugfixes to address additional issues raised * loading assets the proper git way -- Kevin Harrington Sat, 04 Jan 2020 16:14:59 -0500 bowlerstudio (1.0.9) bionic; urgency=medium * 1.0.9 * #180 This was a side effect of the branching system beginning to work. * more issue reporting * adding exception reporting * kernel -- Kevin Harrington Sat, 04 Jan 2020 13:29:21 -0500 bowlerstudio (1.0.8) bionic; urgency=medium * close #76 * updated kernel * menue update * kernel and faster menue loading * adding branches and commit listing * Branch setting works * removing unused imports * reset commits when a commit event is detected * Adding branch select and commit select * removed suspicious slash * safer kernel url parsing * kerne * 1.0.8 * formatting * adding more complete messages to creation of branches * Menu driven commits and branches -- Kevin Harrington Fri, 03 Jan 2020 14:15:24 -0500 bowlerstudio (1.0.7) bionic; urgency=medium * loading the name of the device from the link * cleaner launching scripts * adding the updating code for the launcher * kernel * catch uncaught exception * Repaired the copy a creature feature * kernel -- Kevin Harrington Mon, 30 Dec 2019 01:46:02 -0500 bowlerstudio (1.0.6) bionic; urgency=medium * Update README.md * Create FUNDING.yml * Update FUNDING.yml * Update README.md * Create COC.md * Update FUNDING.yml * Update FUNDING.yml * Update FUNDING.yml * Update FUNDING.yml * Update FUNDING.yml * Update FUNDING.yml * Update FUNDING.yml * Update README.md * Update README.md * more robust error handeling * high level error handeling * Update README.md * Update README.md * kernel * Update README.md * Update README.md * Create a new creature with sub directories and loader script * error handling * adding issue reporting * spelling * deep copy of creatures tested working * 1.0.6 -- Kevin Harrington Sun, 29 Dec 2019 15:52:58 -0500 bowlerstudio (1.0.5) bionic; urgency=medium * removing offending clones and ensure only one pull thread at a time * add the tutorial git to the configurationDatabase * 1.0.5 -- Kevin Harrington Sun, 29 Dec 2019 00:53:30 -0500 bowlerstudio (1.0.4) bionic; urgency=medium * add exception reporting to close #50 * Adding code for #50 * Storing the tutorial brancha nd base url in the configurations database * 1.0.4 * kernel -- Kevin Harrington Sat, 28 Dec 2019 23:41:27 -0500 bowlerstudio (1.0.3) bionic; urgency=medium * kernel * Commented code for computing the total number of verticies * stable save of configurations * remove redundant pulls * Device manager to the left of terminal, not tabbed with it * cleaner disconnectiong of devices and closing of stale configuration window * removed the dhlab plugin form the mobile base * Remove the MobileBase UI and cad from BowlerStudio on disconnect -- Kevin Harrington Fri, 27 Dec 2019 16:42:08 -0500 bowlerstudio (1.0.2) bionic; urgency=medium * javadoc fix * test fixed * select all items made by a line of code rather than just the one * 1.0.2 -- Kevin Harrington Sun, 22 Dec 2019 15:29:23 -0500 bowlerstudio (1.0.1) bionic; urgency=medium * thread safing the clear of highlights * THread safing the selection code * thread-safing the Device manager * #68 * restructure to make the location of the 3d windo more sane * exception caught, but no resolution * removing the event listener * attempt to remove the scene * just catch the exception for now * exit on error * refactoring to chase down #68 * kernel * nrToAffine should be in a UI thread * change the jog widget to use the set all joints method #68 * set the affine from the UI thread * move the affine set into the platform runlater #68 * Updating kernel for #68 * Close #68 * code cleanup in jog widget * version 1.0.0 released! * 1.0.1 -- Kevin Harrington Sun, 22 Dec 2019 13:07:17 -0500 bowlerstudio (0.36.1) bionic; urgency=medium * print statements * removing print statements * adding a public removeObjects to the static calls * adding public API for selecting a CSG * revbump * #68 This may resolve the issue, but extensive testing is needed -- Kevin Harrington Sat, 21 Dec 2019 13:26:53 -0500 bowlerstudio (0.36.0) bionic; urgency=medium * adding git@ uri support * updating jgit * rev bump kernel * udpating jgit * removing the clone conflict loop -- Kevin Harrington Thu, 19 Dec 2019 14:10:11 -0500 bowlerstudio (0.35.1) bionic; urgency=medium * kernel updated * version bump -- Kevin Harrington Wed, 18 Dec 2019 18:40:32 -0500 bowlerstudio (0.35.0) bionic; urgency=medium * kernel * kernel * kernel * new version * #67 Default to virtual if no other link type exist. * close #66 * compileing * moving the make a copy button * added the mass adjust widget * loading the ass of the robots body * close #64 * adding a transform widget for the IMU centroid * revbump -- Kevin Harrington Wed, 18 Dec 2019 17:24:31 -0500 bowlerstudio (0.34.1) bionic; urgency=medium * password manager * kernel * 0.34.1 * Fixed the logout cleanup -- Kevin Harrington Thu, 28 Nov 2019 13:09:01 -0500 bowlerstudio (0.34.0) bionic; urgency=medium * kernel * kernel * kernel * adding 2 factor authentication * updated the version number * close #6 * tagged the kernel update -- Kevin Harrington Wed, 27 Nov 2019 17:44:44 -0500 bowlerstudio (0.33.3) bionic; urgency=medium * cleaned catching errors * 0.33.2 * switching to new github api -- Kevin Harrington Thu, 15 Aug 2019 16:20:25 -0400 bowlerstudio (0.33.1) bionic; urgency=medium * pull password manager from library * kernel runtime bug * adding exception handeling to button clicks * all limbs homed to zero degrees directly -- Kevin Harrington Tue, 06 Aug 2019 20:52:54 -0400 bowlerstudio (0.33.0) bionic; urgency=medium [ Kevin Harrington ] * changing default physics compute time [ Technocopia PC 01 ] * jcsg [ Kevin Harrington ] * Switching over to password manager in kernel * new password manager * updated password loading * move the delete function to the kernel wher it belongs * 0.33.0 * print on login -- Kevin Harrington Sun, 28 Jul 2019 16:50:30 -0400 bowlerstudio (0.32.7) bionic; urgency=medium * kernel * merge * clear the text string * Robust loading when uplink is unavailible -- Kevin Harrington Mon, 22 Jul 2019 20:45:29 -0400 bowlerstudio (0.32.6) bionic; urgency=medium * do not add degenerate files to the configurations * when encountering an erronious file, remove from configs in the future and keep going. * 0.32.6 * kernel -- Kevin Harrington Sat, 06 Jul 2019 11:15:48 -0400 bowlerstudio (0.32.5) bionic; urgency=medium * kernel * auto-pull latest tutorials -- Kevin Harrington Fri, 05 Jul 2019 12:57:42 -0400 bowlerstudio (0.32.4) bionic; urgency=medium [ Kevin Harrington ] * cleanup * fixing the scrilling freez issue [ hephaestus ] * resolved the most recent macos issue -- Kevin Harrington Fri, 28 Jun 2019 03:27:34 -0400 bowlerstudio (0.32.3) bionic; urgency=medium * version * only refesh on mouse entry * 0.32.3 -- Kevin Harrington Mon, 24 Jun 2019 09:36:08 -0400 bowlerstudio (0.32.1) bionic; urgency=medium * more robust focus grabbing on mouse entered -- Kevin Harrington Mon, 24 Jun 2019 09:02:32 -0400 bowlerstudio (0.32.0) bionic; urgency=medium * Fixed docking of window to a very small size -- Kevin Harrington Mon, 24 Jun 2019 07:33:08 -0400 bowlerstudio (0.31.9) bionic; urgency=medium [ Technocopia PC 01 ] * when a file is added or the git us pulled, refresh menu * kernel update [ Kevin Harrington ] * better javafx initializer * javafx initializer * removing javafx launching via depricated means * kernel -- Kevin Harrington Sat, 22 Jun 2019 20:47:44 -0400 bowlerstudio (0.31.8) bionic; urgency=medium * loading the new tab into workspace * thread wrap loading the tab into the workspace * restructure the menu loading * restructured the workspace manager * 0.31.8 * allow for non-blocking menu loading * load menue with known message * kernel * if the rank changes, save * stable rank order, and refresh of UI only when the rank changes -- Kevin Harrington Fri, 21 Jun 2019 18:05:31 -0400 bowlerstudio (0.31.7) bionic; urgency=medium * when no message is given, use the file name * 0.31.7 * login event for configurations * re-load the configurations database on login * larger max workspace -- Kevin Harrington Fri, 21 Jun 2019 12:25:07 -0400 bowlerstudio (0.31.6) bionic; urgency=medium * Closes #57 Adding files to empty repos * adding basic adding feature * adding calls to the workspace manager * adding workspace manager * calls to workspace manager * null check * adding file open windows to the workspace menu * set up the files after pull * change it to pull * add repo to workspace button * bugfix -- Kevin Harrington Thu, 20 Jun 2019 18:31:49 -0400 bowlerstudio (0.31.4) bionic; urgency=medium * catch the exception in the lambda * Fix the flicker * delay the print to ensure that the window loads after the web tab loads * 0.31.4 -- Kevin Harrington Thu, 20 Jun 2019 00:47:16 -0400 bowlerstudio (0.31.3) bionic; urgency=medium * Loading an image as the tray icon for the splash * 0.31.3 -- Kevin Harrington Wed, 19 Jun 2019 18:09:17 -0400 bowlerstudio (0.31.2) bionic; urgency=medium * kernel * more robust refeshing of tab panel * build 0.31.2 -- Kevin Harrington Wed, 19 Jun 2019 15:58:56 -0400 bowlerstudio (0.31.1) bionic; urgency=medium * working marytts jar * ignore * kernel -- Kevin Harrington Tue, 18 Jun 2019 12:17:28 -0400 bowlerstudio (0.31.0) bionic; urgency=medium * minimized flicker * cleanup * editable * minimal needed for refresh * cleanup * changing the speach kernel * ignore * text to spech update * 0.31.0 -- Kevin Harrington Tue, 18 Jun 2019 10:53:09 -0400 bowlerstudio (0.30.5) bionic; urgency=medium * #63 * #63 adding individual invokelaters and a retry loop with timing gating * close #63 * 0.30.5 * Removing the flashing for #63 -- Kevin Harrington Mon, 17 Jun 2019 13:15:37 -0400 bowlerstudio (0.30.4) bionic; urgency=medium * UI loading in kernel * updated travis * setting the modular frame on loading * 0.30.4 -- Kevin Harrington Sun, 16 Jun 2019 14:41:45 -0400 bowlerstudio (0.30.3) bionic; urgency=medium * freetts * defaulting the CAD manager to config mode * 0.30.3 -- Kevin Harrington Mon, 10 Jun 2019 16:01:36 -0400 bowlerstudio (0.30.2) bionic; urgency=medium * adding obj export now that obj string bug is fixed * 0.30.2 -- Kevin Harrington Sun, 02 Jun 2019 12:24:54 -0400 bowlerstudio (0.30.1) xenial; urgency=medium [ hephaestus ] * xenial [ Kevin Harrington ] -- Kevin Harrington Fri, 31 May 2019 08:52:58 -0400 bowlerstudio (0.30.0) xenial; urgency=medium * Added parabola -- Kevin Harrington Fri, 31 May 2019 08:01:51 -0400 bowlerstudio (0.29.8) xenial; urgency=medium [ hephaestus ] * xenial [ Kevin Harrington ] -- Kevin Harrington Thu, 30 May 2019 16:31:16 -0400 bowlerstudio (0.29.7) xenial; urgency=medium * kernel updates * 0.29.7 -- Kevin Harrington Thu, 30 May 2019 09:35:12 -0400 bowlerstudio (0.29.6) xenial; urgency=medium * null checks on the interface frame * wait for splash to be ready before returning * serialVersionUID * 0.29.6 -- Kevin Harrington Mon, 20 May 2019 19:50:35 -0400 bowlerstudio (0.29.5) xenial; urgency=medium * kernel * 0.29.5 start * updating the hardware setting menues * formatting * Prevent fault on null passed here * formatting * regenerate on link configuration changes * sanatize text input * Remember the open file and open another from the same directory * bound the link setting * inter-connecting the bounding to ensure a slider never shows invalid data * kernel -- Kevin Harrington Sun, 19 May 2019 21:39:00 -0400 bowlerstudio (0.29.4) xenial; urgency=medium * moving splash screen to a manager class * 0.29.4-dev * Adding a psudo-splash screen using Jframe * set font after loading tab to prevent NPE * java-bowler update * Re-display slash on closing to indicate saving state * Adding toggle buttons for config mode * adding a cad configuration mode * Stable loading of tabs * Better defaults for jog widget * tab loading failure reporting * Set the font with a delay and a fail-over loop in the tab * if spash availible, use the better one * use the same splash for all -- Kevin Harrington Sat, 18 May 2019 02:43:48 -0400 bowlerstudio (0.29.3) xenial; urgency=medium [ Kevin Harrington ] * Update README.md * 0.29.3 * jcsg [ McKinney ] * Adding the kinematics-chef * Adding the kinematics-chef * Adding the kinematics-chef [ Kevin Harrington ] * from compile to implementation * updating gradle * travis update * removing kinematics chef source * kinematics chef submodule * adding the maven switch-over * maven version of kinematicsChef working * removing kinematics chef untill the circular kernel dep is resolved. * added back KC after modifying the depencies * removing kc again * adjusting dh widget * remove kinematics * Fixing the "double enter" bug * Correcting the error of file tabs loading and interfearing with each other at boot time * no silent fails * formatting * return logical bounds * Update .gitmodules * Update README.md * Update README.md * removing submodule * updating submodules -- Kevin Harrington Wed, 15 May 2019 17:29:28 -0400 bowlerstudio (0.29.2) xenial; urgency=medium * 0.35.2 * 0.29.2 -- Kevin Harrington Sun, 06 Jan 2019 16:07:15 -0500 bowlerstudio (0.29.0) xenial; urgency=medium * =Updating gradle * updated kernel * removing OpenCV * moving dockfx off server * Updaing build * Updaing build * gradle version * tests working * remove test * comments * reove javadoc violations * Update README.md * merging * removed opencv components * fixing travis * javadoc fix * fixed travis * removing the opencv from the build tree * updating JCSG * 0.29.0 -- Kevin Harrington Sun, 06 Jan 2019 14:17:56 -0500 bowlerstudio (0.28.1) xenial; urgency=medium * 0.28.1 -- Kevin Harrington Wed, 18 Jul 2018 17:14:47 -0400 bowlerstudio (0.28.0) xenial; urgency=medium * jcsg * 0.28.0 -- Kevin Harrington Wed, 18 Jul 2018 15:25:23 -0400 bowlerstudio (0.27.6) xenial; urgency=medium * Change from exception to throwable dispalys and highlights * easier clearing of the highlights * Avoud competition with the click to highlight * kernel -- Kevin Harrington Sat, 07 Jul 2018 19:02:21 -0400 bowlerstudio (0.27.5) xenial; urgency=medium * Better loading of exceptions and SVG manipulations -- Kevin Harrington Sat, 07 Jul 2018 11:52:27 -0400 bowlerstudio (0.27.4) xenial; urgency=medium * bugfix * 0.27.4 -- Kevin Harrington Thu, 05 Jul 2018 18:17:00 -0400 bowlerstudio (0.27.3) xenial; urgency=medium * Adding the version number to the splash screen * error out on 32bit systems * Arror message on 32 bit mode JVM in UI * Gracefull loading of unknown links -- Kevin Harrington Thu, 05 Jul 2018 16:51:30 -0400 bowlerstudio (0.27.2) xenial; urgency=medium * rev bump * Massivly faster slicer * kernel -- Kevin Harrington Thu, 05 Jul 2018 13:59:57 -0400 bowlerstudio (0.27.1) xenial; urgency=medium * kernel -- Kevin Harrington Fri, 29 Jun 2018 10:15:26 -0400 bowlerstudio (0.27.0) xenial; urgency=medium * kernel * kernel * usinf the javacad sources * 0.27.0 -- Kevin Harrington Thu, 28 Jun 2018 15:08:24 -0400 bowlerstudio (0.26.2) xenial; urgency=medium * updating java-bowler * java -bowler * java-bowler * Java-bowler to submodule * Java-bowler to submodule * Adding java-bowler submodule * addign the java-bowler build to the final build * Rmoving submodule * Rmoving submodule * Compiling with 2 submodules * build with submodule * Adding the auto-wrapping of objects that act like devices with a connect and disconnect method * java-bowler * java-bowler * move filter to java-bowler * formatting and use DMDevice * device loading more efficient for scripts * working with the fix for mobile base updates * builds as jar * fixed the drifting window issue * kernel * kernel -- Kevin Harrington Mon, 25 Jun 2018 10:02:48 -0400 bowlerstudio (0.26.1) xenial; urgency=medium [ hephaestus ] * xenial [ Kevin Harrington ] -- Kevin Harrington Sun, 03 Jun 2018 16:44:12 -0400 bowlerstudio (0.26.0) xenial; urgency=medium * 0.26.0 -- Kevin Harrington Sun, 03 Jun 2018 16:25:06 -0400 bowlerstudio (0.25.9) xenial; urgency=medium * 0.25.8 * Build archive working -- Kevin Harrington Sat, 02 Jun 2018 22:41:43 -0400 bowlerstudio (0.25.7) xenial; urgency=medium * Filter devices for existance in the device manager already * use the built in UI with filter * bugfix * kernel -- Kevin Harrington Mon, 28 May 2018 21:25:23 -0400 bowlerstudio (0.25.6) xenial; urgency=medium * slower jogging -- Kevin Harrington Sun, 27 May 2018 19:49:40 -0400 bowlerstudio (0.25.5) xenial; urgency=medium * kernel * 0.25.5 * process percentage realistic * kernel -- Kevin Harrington Fri, 25 May 2018 22:50:28 -0400 bowlerstudio (0.25.4) xenial; urgency=medium [ hephaestus ] * xenial [ Kevin Harrington ] -- Kevin Harrington Tue, 22 May 2018 20:10:39 -0400 bowlerstudio (0.25.3) xenial; urgency=medium * kernel * 0.25.2 * kernel * 0.25.3 -- Kevin Harrington Thu, 17 May 2018 14:12:09 -0400 bowlerstudio (0.25.1) xenial; urgency=medium * moving lower bound to 0 * kernel update * fixing the cold-start issue for the image assets * kernel * getter vor camera view * User draw modes for wireframe * removed stale code * stale imports * moving MobileBaseCadManager and FIle Watcher into kernel * updating kernel to use abstracted interface * Moving script loading of movbile bases into kernel * implementing updated API * library update * 0.31.0 kernel * ordering for clarity * updating kernel * kernel * updated library * movign git file copy to kernel * loading messages more accurate * use javacad intermediate jar in kernel * updating JavaCad * catch exceptions of hotfixes -- Kevin Harrington Tue, 09 Jan 2018 23:57:10 -0500 bowlerstudio (0.25.0) xenial; urgency=medium * updaing kernel to one that builds in travis * Updaing gradle permissions * adding the opencv depenancies * same travis as working kernel * update travis * try xenial verison * command line flags for quiet * adding connecting line to the polygon display * updating the SVGFactory to call the built in slicer * Filter out the csgDatabase.json file from the gist run * adding JCSG with new slicer * adding a cad EXPORT path * javacad update * updating the loading of objects to manufacturing files * updating JCSG * adding the hotfix script * updating the syntax highlighting * never edit the csgDatabse.json -- Kevin Harrington Wed, 29 Nov 2017 18:56:53 -0500 bowlerstudio (0.24.0) xenial; urgency=medium * Updating a database value if found in the root of a repository. * FIxing the file watcher file state upate. * updating JavaCad * using CSG names to make STL files -- Kevin Harrington Tue, 14 Nov 2017 21:59:50 -0500 bowlerstudio (0.23.1) xenial; urgency=medium * Fixing the bounding and rotation problem in the Transform widget when close to Euler singularities. * 0.23.1 * Engineering units sliders should be more sane about the ticks * adding the place limb widget to the menu * Making the Transform widget more readable * exception handeling on file selection * only auto-highlight when the check box is checked -- Kevin Harrington Wed, 18 Oct 2017 14:55:40 -0400 bowlerstudio (0.23.0) xenial; urgency=medium * convert lines to cylindar * make thicknesses match the line equivalent * smaller stroke * dump all the STL;s into a single directory as single parts * stagger teh loading to avoid collisions * deal with the inititail case * Much improved progress monitor for cad generation * 0.22.1 * Adding a menu item to generate Kinematic STL's * adding the link number into the file name * Adding the link to CSG mapper as a function making teh export of named files easier. * Update ISSUE_TEMPLATE.md * Update ISSUE_TEMPLATE.md * Tutorial loading of GIT should happen outside of the internal thread to ensure loaded git before moving on * more testing of vitamins * updating to 0.23.0 * Loading file from gist in web was broken * Ensure new links have a type * Loading link of non-zero radius * type and type string need to beset, this should be handled by the library * when the hardware limits are reset, the slider for the link should be reset * Text field should auto size to the file and Git url * compute the box size using the font * carrot moves to the start of a file -- Kevin Harrington Sun, 01 Oct 2017 15:05:02 -0400 bowlerstudio (0.21.3) xenial; urgency=medium [ Kevin Harrington ] * adding fonts menues * setting the font size is working * cleaner creature lab menues * adding menu option to hide objects in assemblies [ Student ] * Cleaning the loading path in MacOS * cleaner fault state launches * setting the stylesheet after the platform is shown * try catch around user agent * slower camera spin * updateing dockfx to 12 * moving the Application stylesheet loading * fiddeling with the loading of the user agent sheets [ Kevin Harrington ] * converting axis to lines not boxes * 3d line generation * 3d line interface * more complete removal of stale objects * include polygon to the removel datatypes * adding smoother lines and sharper end terminaion * adding the polygon to wireframe conversion to add the manipulator * inset the axis -- Kevin Harrington Mon, 17 Jul 2017 11:46:13 -0400 bowlerstudio (0.21.2) xenial; urgency=medium [ Kevin Harrington ] * 0.21.2 update * updating kernel [ Octogonapus ] * Removed AssetFactory from local src and importing the version from the kernel instead [ Kevin Harrington ] * updating java-bowler * using the studio build info from the kernel * load a mobile base form git * Cleanly catching the caso of generated class -- Kevin Harrington Tue, 11 Jul 2017 09:49:54 -0400 bowlerstudio (0.21.1) xenial; urgency=medium * updating the default creature URL * updating kernel * updating kernel * removing excessive prints * stagerring code loading * removing the CSG pringing * pulling repos rather thatn loading a file * moving the physics engine into the kernel * adding the print and println function to bowlerstudio static api * Adding the permutations of the call * changing to standard thread * updating kernel * updating kernel version -- Kevin Harrington Wed, 10 May 2017 08:59:01 -0400 bowlerstudio (0.21.0) xenial; urgency=medium * adding additional libraries to the imports * removing synchronization in any UI accessed threads * updating javacad -- Kevin Harrington Thu, 04 May 2017 09:52:30 -0400 bowlerstudio (0.20.9) xenial; urgency=medium * removing junk annotation * updating the kernel to use branches * removing hard coded "master" * making the tutorial access master rather than the default "source" * updaing kernel * updating kernel * Updating JCSG * 0.20.9 -- Kevin Harrington Fri, 28 Apr 2017 00:25:03 -0400 bowlerstudio (0.20.8) xenial; urgency=medium [ Kevin Harrington ] * switching the internal loader of ht emenue to the offical repo [ Kevin Harrington ] * ignoring eclipse project files * surpressing restricted api warnings [ Kevin Harrington ] * Adding the git submodule instrunctions * null manufacturing call should just not add the part, not fail * when an object is sent to manufacturing, show the new one * setting the controllers carefully * updating the verion to 0.20.8 [ harrington ] * fixing the build on windows * load JNI on windows from correct location [ Kevin Harrington ] * fixing jni * windows build should be working now * #21 Move from overlays to tab * #21 removing the overlays entirely * moving controls into a new tab #21 * Anchoring the treeview to the archor panel #21 * anchor the tree -- Kevin Harrington Sun, 26 Mar 2017 21:26:08 -0400 bowlerstudio (0.20.7) xenial; urgency=medium * 14.04 instructions update * Update README.md * updating the tutorials URL at boot time * updating bowler kernel * new version * updating kernel * updating the URL's * removing the exception printing * update javacad * 0.20.7 -- Kevin Harrington Mon, 06 Mar 2017 11:50:52 -0500 bowlerstudio (0.20.6) xenial; urgency=medium * 14.04 instructions update * Update README.md * updating the tutorials URL at boot time * updating bowler kernel * new version * updating kernel * updating the URL's * removing the exception printing * update javacad -- Kevin Harrington Mon, 06 Mar 2017 11:13:57 -0500 bowlerstudio (0.20.5) xenial; urgency=medium * adding loading progress info * splash loading working * more loading info * public splash rendering * leaving only the print stream in the static declaration * Text should only be appended when there is text to append. -- Kevin Harrington Fri, 10 Feb 2017 22:58:23 -0500 bowlerstudio (0.20.4) xenial; urgency=medium * Wider margin for cancle double click * buffered output stream for log with tail clipping * reduce the memory footprint of the camera spin. * higher efficency camera * making the camera use static objects wherever possible * Load the ASSETS FORM THE CORRECT REPOSITORY * force the mainline version in when the version updates * save changes when they are made to the configurations * changing asset print * deeper read-back buffer * moving the garbage collect to the start side * Auto spin should not be enabled by default * attempting to run the swingnode bounds * more robust rerendering * moving kernel to submodule * compile the submodule version of kernel * Adding imports * adding the vehicle update * return on any error * using wheel position as opposed to its delta * adding dependancies * fixed the import of kernel jars * removing old splash * adding new splash * cleaning up image assets * upating javacad * updating javacad -- Kevin Harrington Mon, 23 Jan 2017 20:33:04 -0500 bowlerstudio (0.20.3) xenial; urgency=medium * Reverse the interpolation for smoother transition * removing the cancel from all clicks * fixing the cancle detection * adding an acceleration to the camera spin * the sin scaling should be across Pi/2 * Sinusoidal scaling is now working * slower spin interpolation * Basif fin and replace widgit loading on ctrl f signel * close #17 Find Replace Widget -- Kevin Harrington Mon, 02 Jan 2017 00:13:49 -0500 bowlerstudio (0.20.2) xenial; urgency=medium [ Kevin Harrington ] * 0.21.1 * removing junk files * Changing the use of the file watcher * Moving change watcher inot local code to ensure thread management works with the javafx conventions * Update to single thread per file watchers * After much hunting i think the magic Yo is gone * Request focus is needed even with new RSyntax * remove the debug hook * Close #2 * Adding blocks to elevation to conform to the bounding standards set by the rotation object. * updateing the transform object to Apache-commons-math3 * The camera rotation cna not be a singularity! * catch any exception and clear gits * Updating the kernel to use more strict java-bowle rotation bounding. * Adding a vehicle wrapper to the control class * adding a wheel wrapper * Fixing the link widjet so it displays current value * adding a weel module to the physics engine * putting the physics components back intot he update wrapping function * Adding the looping mechanism * move wheel updates into mobile base physics for user control * use the wheel transform to compute the location of the new wheel. * only add and remove ridgid bodys if they are not parts of vehicles. * adding the rotation test for the conversion to bullet and affine [ Octogonapus ] * Added way to change asset repo #9 [ Kevin Harrington ] * CSG rotation to CSG was broken and now works * Attempting to update the camera, WIP * 0.20.2 * Adding a mechanism to clear out the assets based on the current version check * updated the script access to the camera adjustments * load the URL from the database for assets before loading asset files * default value * Verified that the asset change repo is working * Updating Java-Bowler * Use ZYX order for the tests * making the degenerate angle of all 0 is displayed as all 0 * Camera rotation for the new rontation schema has been fully integrated * updated the kernel with robust angle error checking * Switched the rotation button action * Fixing the transform orentation hack * Adding focus interpolation * smoother camer transitions * Smooth camera transition between manipulated scgs and regular csgs. * simpler no-transform loading * remove the interpolator * by moving the motions into the removal, the transitions are a bit smoother. * smooth transition for selection from a file * Assing the starting camera rotation back in * The x and y rotations needed inversion to be constistant with the rest of the rotations. * Updating kernel to include rotation with qutaurning values swapped * removing work around * Auto spin the camera when the mouse input goes idle for 10 seconds. A user check box disables this -- Kevin Harrington Sat, 31 Dec 2016 11:27:26 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 23:19:44 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 23:15:58 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 23:14:05 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 23:07:07 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 22:35:28 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 22:28:22 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 22:26:12 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 21:59:08 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 21:55:03 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 21:42:42 -0500 bowlerstudio (0.20.0) xenial; urgency=medium [ Kevin Harrington ] * 0.19.6 [ Kevin Harrington ] * catch error s and exceptions * cleanup * clean warnings * The zoom level and enable/disable grid * Adding the axis to the hide feature * Adding the ability for scripts to display to 3d window * Loading of image nodes ttested working * when an image is loaded the creature lab should display * Faster turn over for loading creaturelav * if any other exceptiuon besides the expected one comes up, print right away * Adding the ability to clear the screen * Making the zoom scale by distance to avoid jumpy navigation * remove print * Exiting the application after clearing cache * Using the open flag to prevent multiple openings * Reversing the motion directions * Adding the bezier extrude * Fixing the JavaCad depancy tree. -- Kevin Harrington Tue, 29 Nov 2016 21:41:07 -0500 bowlerstudio (0.19.5) xenial; urgency=medium * 0.19.4 * checking for valid tutorial URL as commonwealth not NR * retry opening tab * removing the focus request and relying on the one below * When setting a database value the internal caches should be cleared, ofrcing a reloading of the database files. * Adding try catch in flush widget to prevent thread lock * Adding an event path for refreshing the menus on adding a file. * adding the refreshing of the menues when a file is created or from a menu option * do not use iterators with a threaded opening * adding an err printout of all console prints * Adding the configuration to BowlerConnection allowing it to use the classloader when loading from FXML * close #1 -- Kevin Harrington Tue, 11 Oct 2016 15:10:01 -0400 bowlerstudio (0.19.4) xenial; urgency=medium * 0.19.4 * checking for valid tutorial URL as commonwealth not NR * retry opening tab * removing the focus request and relying on the one below * When setting a database value the internal caches should be cleared, ofrcing a reloading of the database files. * Adding try catch in flush widget to prevent thread lock * Adding an event path for refreshing the menus on adding a file. * adding the refreshing of the menues when a file is created or from a menu option -- Kevin Harrington Wed, 05 Oct 2016 19:17:37 -0400 bowlerstudio (0.19.3) xenial; urgency=medium [ Kevin Harrington ] * Updating the readme links * Changing the documention cache root to the new website server [ Kevin Harrington ] * Update README.md [ Kevin Harrington ] * updating JCSG, GRAPES * adding a parameter listener for all objects * 0.19.3 -- Kevin Harrington Sat, 17 Sep 2016 10:54:36 -0400 bowlerstudio (0.19.2) xenial; urgency=medium * Adding Apache XML RPC Client for accessing Odoo servers * Adding Odoo command and control * Adjusting to the new type interface * Repairing the Physics centered displays * Adding OpenCL and nativelibs4j * removing opencl for size * moving vitamins out of kernel * Assing a Firmata Link provider * Adding a connection option to the menue for firmata * Adding support for Firmata * Adding rotory and prismatic options * moving firmata linak adding into the link class as a static * Opening of creature lab should more stable * Should make opening creature lab more stable * updateing to kernel 0.23.0 -- Kevin Harrington Fri, 02 Sep 2016 14:41:46 -0400 bowlerstudio (0.19.1) xenial; urgency=medium [ Sainath Batthala ] * Documented openUrlInNewTab, speak functions in BowlerStudio.java [ Kevin Harrington ] * Update README.md * Update README.md [ Kevin Harrington ] * More stable casting of the list * adding better arduino support * Moving Physics engine into BowlerStudio * Moving the simplified cad out of the system and telling the physics engine to compute the hull directly on all the points. * 0.19.0 * using the for loop variable, duh * WOring full robot physics * updating the link slider with the links current value * should move link if NOT passive * preserving the links color * tweaking the physics engine params * The cad list should not be changed by the physics, a copy should be made * defaulting physics engine to fast mode * param tweaking for physics engine * seems to cause wild flailing now * Reverting physics configuration * Physics for walking is working but the driving explodes * load mass from robots configuration * loading objects to current object * load string list parameters as combo box * catch all UI exceptions * use the Abstract class iinterface for non specific types * loading and updating the non number parameters * Each regenerate shpould get its own exception catch * The value needs to be updated BEFORE the listener is called * Forcing the CSGCached version update here * Kernel now suports the string list parametrics for CSG's and the vitamins library for accessing lots of standrd hardware * 0.19.1 -- Kevin Harrington Sat, 13 Aug 2016 12:14:50 -0400 bowlerstudio (0.18.10) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 19:25:46 -0400 bowlerstudio (0.18.10) xenial; urgency=medium * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 19:24:53 -0400 bowlerstudio (0.18.9.1) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 19:18:28 -0400 bowlerstudio (0.18.9) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 19:11:24 -0400 bowlerstudio (0.18.9) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 18:45:43 -0400 bowlerstudio (0.18.9) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 18:44:01 -0400 bowlerstudio (0.18.9) xenial; urgency=medium * adding files to regular git * adding a file extention to the new file menue * Selecting links that hit limits * catching drive exceptions and displaying ghtem * when limit hit the limiting link should highlightitself now * both local and perminant storage is consulted for loading * make loading and unloading of the data from json a standard type * fixed the double adding of transforms * DyIO interface working with curie * updating to lates kernel -- Kevin Harrington Mon, 25 Jul 2016 17:56:29 -0400 bowlerstudio (0.18.8-1ubuntu2) xenial; urgency=medium * adding the printout when a connection fails * retry on serial port to force v4 * conecting the device not the connection to startup * making the regenerate function synchronized -- Kevin Harrington Fri, 15 Jul 2016 17:31:38 -0400 bowlerstudio (0.18.8-1ubuntu1) xenial; urgency=medium [ Kevin Harrington ] * Adding java-bowler 2.21.0 * adding the physics engine static methods back in * switching to actual login sucess checking form login file existance * fixing the window displays so the login updates it * updating to the gradle version of the kernel * use git repos when displaying files to allow for the browsing of regular github repos * 0.18.7 * configurations on no network mode not working * Loading the widgets even when the network is out [ Kevin Harrington ] [ Kevin Harrington ] [ Kevin Harrington ] [ Kevin Harrington ] -- Kevin Harrington Wed, 29 Jun 2016 09:39:56 -0400 bowlerstudio (0.18.6-1ubuntu1~33.gbp533ad1ubuntu1) xenial; urgency=medium * changing the initial release to xenial * Adding java-bowler 2.21.0 * adding the physics engine static methods back in * switching to actual login sucess checking form login file existance * fixing the window displays so the login updates it * updating to the gradle version of the kernel * use git repos when displaying files to allow for the browsing of regular github repos * 0.18.7 * configurations on no network mode not working * Loading the widgets even when the network is out -- Kevin Harrington Tue, 28 Jun 2016 10:25:47 -0400 bowlerstudio (0.18.6-1ubuntu1~33.gbp533ad1) xenial; urgency=medium ** SNAPSHOT build @533ad1e3ef178e8643a4227dd33eb510575dd4ba ** [ Kevin Harrington ] ** SNAPSHOT build @533ad1e3ef178e8643a4227dd33eb510575dd4ba ** * changing release to xenial -- Kevin Harrington Sun, 26 Jun 2016 23:34:47 -0400 bowlerstudio (0.18.6-1ubuntu1~26.gbp19eead) 0.18.6; urgency=medium ** SNAPSHOT build @19eead97c9ad3b27a90798f63afcafa2d869eec7 ** [ Kevin Harrington ] * xenial [ Kevin Harrington ] * updating the changlog * changelog * adding debian build files to build debs from gradle [ Kevin Harrington ] * ignores [ Kevin Harrington ] -- Kevin Harrington Sun, 26 Jun 2016 22:35:38 -0400 bowlerstudio (0.18.6-1) xenial; urgency=medium * Initial release -- Kevin Harrington Sat, 25 Jun 2016 15:23:12 -0400 ================================================ FILE: debian/compat ================================================ 7 ================================================ FILE: debian/control ================================================ Source: bowlerstudio Package: bowlerstudio Priority: extra Maintainer: Customer Support Architecture: all Version: 0.18.6 Depends: oracle-java8-set-default,libopencv2.4-java,libopencv2.4-jni,slic3r,jarwrapper,arduino Provides: bowlerstudio Conflicts: modemmanager,nr-rdk-java Replaces: modemmanager,nr-rdk-java Description: Robotics Development Engironment and runtime. A scripting platform for writing, designing, simulating and manufacturing robots. ================================================ FILE: debian/copyright ================================================ Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ Upstream-Name: bowlerstudio Source: Files: * Copyright: License: . # If you want to use GPL v2 or later for the /debian/* files use # the following clauses, or change it to suit. Delete these two lines Files: debian/* Copyright: 2016 Kevin Harrington License: GPL-2+ This package is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. . This package is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. . You should have received a copy of the GNU General Public License along with this program. If not, see . On Debian systems, the complete text of the GNU General Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". # Please also look if there are files or directories which have a # different copyright/license attached and list them here. # Please avoid picking licenses with terms that are more restrictive than the # packaged work, as it may make Debian's contributions unacceptable upstream. ================================================ FILE: debian/install ================================================ usr/share/bowlerstudio/BowlerStudio.jar /usr/share/bowlerstudio/ usr/share/bowlerstudio/NeuronRobotics.ico /usr/share/bowlerstudio/ usr/share/bowlerstudio/NeuronRobotics.png /usr/share/bowlerstudio/ usr/share/bowlerstudio/dyio-3.14.6.xml /usr/share/bowlerstudio/ usr/bin/bowlerstudio /usr/bin/ usr/share/bowlerstudio/NeuronRobotics.png /usr/share/themes/base/neuronrobotics/icons/ usr/share/bowlerstudio/BowlerStudio.desktop /usr/share/applications/ usr/share/bowlerstudio/81-neuronrobotics.rules /etc/udev/rules.d/ usr/share/doc/bowlerstudio/copyright /usr/share/doc/bowlerstudio/ usr/share/doc/bowlerstudio/changelog.gz /usr/share/doc/bowlerstudio/ ================================================ FILE: debian/outfile ================================================ 3.0 (quilt) ================================================ FILE: debian/rules ================================================ JAVA_HOME=/usr/lib/jvm/default-java %: dh $@ --with javahelper override_dh_auto_build: dh_auto_build -- dist override_dh_install: dh_auto_build -- package-debian dh_install override_jh_exec: exit 0 ================================================ FILE: genDeps.sh ================================================ #!/bin/bash #./gradlew showAll>alllibs.txt sort alllibs.txt |grep .jar|uniq >DEPENDENCIES_shallow.md echo "" > DEPENDENCIES.md echo "" > DEPENDENCIES_unknown.md for VARIABLE in $(cat DEPENDENCIES_shallow.md) do LOCATION=$(locate -l 1 $VARIABLE) FILE=$(unzip -l $LOCATION | grep LICENSE|grep -v "LICENSE.") stringarray=($FILE) LOCENSELOC=$(echo ${stringarray[3]}) if [ -z "$LOCENSELOC" ] then FILE=$(unzip -l $LOCATION | grep LICENSE|grep ".txt"|grep -v "documentation") stringarray=($FILE) LOCENSELOC=$(echo ${stringarray[3]}) fi if [ -z "$LOCENSELOC" ] then FILE=$(unzip -l $LOCATION | grep license|grep ".txt"|grep -v "documentation") stringarray=($FILE) LOCENSELOC=$(echo ${stringarray[3]}) fi if [ -z "$LOCENSELOC" ] then FILE=$(unzip -l $LOCATION | grep LICENSE.md) stringarray=($FILE) LOCENSELOC=$(echo ${stringarray[3]}) fi if [ -z "$LOCENSELOC" ] then FILE=$(unzip -l $LOCATION | grep license.html) stringarray=($FILE) LOCENSELOC=$(echo ${stringarray[3]}) fi if [ -z "$LOCENSELOC" ] then echo "$VARIABLE No license file" TYPE="No License " echo "$VARIABLE">> DEPENDENCIES_unknown.md else echo "Licance file to be used: $VARIABLE $LOCENSELOC" #echo "Searching $VARIABLE for $LOCENSELOC" LICENSE=$(unzip -p $LOCATION $LOCENSELOC) TYPE=$LICENSE if [ -z "$TYPE" ] then echo "$VARIABLE No license file" TYPE="No License $LOCATION" else shopt -s nocasematch; if [[ "$LICENSE" =~ "apache" ]]; then TYPE="Apache" #echo "Apache license found" elif [[ "$LICENSE" =~ "MIT License" ]]; then TYPE="MIT License" elif [[ "$LICENSE" =~ "BSD" ]]; then TYPE="BSD" elif [[ "$LICENSE" =~ "W3C" ]]; then TYPE="W3C" elif [[ "$LICENSE" =~ "CDDL" ]]; then TYPE="CDDL" else echo " $LOCATION Unknown $LICENSE" TYPE="Unknown" #exit 1 fi fi echo "$VARIABLE , $TYPE">> DEPENDENCIES.md fi done ================================================ FILE: gradle/wrapper/gradle-wrapper.properties ================================================ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ================================================ FILE: gradle.properties ================================================ rg.gradle.jvmargs=-Dprism.forceGPU=true ================================================ FILE: gradlew ================================================ #!/bin/sh # # Copyright 2015-2021 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 # ############################################################################## # # Gradle start up script for POSIX generated by Gradle. # # Important for running: # # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is # noncompliant, but you have some other compliant shell such as ksh or # bash, then to run this script, type that shell name before the whole # command line, like: # # ksh Gradle # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; # * expansions $var, ${var}, ${var:-default}, ${var+SET}, # ${var#prefix}, ${var%suffix}, and $( cmd ); # * compound commands having a testable exit status, especially case; # * various built-in commands including command, set, and ulimit. # # Important for patching: # # (2) This script targets any POSIX shell, so it avoids extensions provided # by Bash, Ksh, etc; in particular arrays are avoided. # # The "traditional" practice of packing multiple parameters into a # space-separated string is a well documented source of bugs and security # problems, so this is (mostly) avoided, by progressively accumulating # options in "$@", and eventually passing that to Java. # # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; # see the in-line comments for details. # # There are tweaks for specific operating systems such as AIX, CygWin, # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. # ############################################################################## # Attempt to set APP_HOME # Resolve links: $0 may be a link app_path=$0 # Need this for daisy-chained symlinks. while APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path [ -h "$app_path" ] do ls=$( ls -ld "$app_path" ) link=${ls#*' -> '} case $link in #( /*) app_path=$link ;; #( *) app_path=$APP_HOME$link ;; esac done # This is normally unused # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum warn () { echo "$*" } >&2 die () { echo echo "$*" echo exit 1 } >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false case "$( uname )" in #( CYGWIN* ) cygwin=true ;; #( Darwin* ) darwin=true ;; #( MSYS* | MINGW* ) msys=true ;; #( NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD=$JAVA_HOME/jre/sh/java else JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD=java if ! command -v java >/dev/null 2>&1 then die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac fi # Collect all arguments for the java command, stacking in reverse order: # * args from the command line # * the main class name # * -classpath # * -D...appname settings # * --module-path (only if needed) # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) # Now convert the arguments - kludge to limit ourselves to /bin/sh for arg do if case $arg in #( -*) false ;; # don't mess with options #( /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath [ -e "$t" ] ;; #( *) false ;; esac then arg=$( cygpath --path --ignore --mixed "$arg" ) fi # Roll the args list around exactly as many times as the number of # args, so each arg winds up back in the position where it started, but # possibly modified. # # NB: a `for` loop captures its iteration list before it begins, so # changing the positional parameters here affects neither the number of # iterations, nor the values presented in `arg`. shift # remove old arg set -- "$@" "$arg" # push replacement arg done fi # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ org.gradle.wrapper.GradleWrapperMain \ "$@" # Stop when "xargs" is not available. if ! command -v xargs >/dev/null 2>&1 then die "xargs is not available" fi # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. # # In Bash we could simply go: # # readarray ARGS < <( xargs -n1 <<<"$var" ) && # set -- "${ARGS[@]}" "$@" # # but POSIX shell has neither arrays nor command substitution, so instead we # post-process each arg (as a line of input to sed) to backslash-escape any # character that might be a shell metacharacter, then use eval to reverse # that process (while maintaining the separation between arguments), and wrap # the whole thing up as a single "set" statement. # # This will of course break if any of these variables contains a newline or # an unmatched quote. # eval "set -- $( printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | xargs -n1 | sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | tr '\n' ' ' )" '"$@"' exec "$JAVACMD" "$@" ================================================ FILE: gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @rem SPDX-License-Identifier: Apache-2.0 @rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute echo. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! set EXIT_CODE=%ERRORLEVEL% if %EXIT_CODE% equ 0 set EXIT_CODE=1 if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: jvm.json ================================================ { "Linux-x64":{ "url":"https://cdn.azul.com/zulu/bin/", "type":"tar.gz", "name":"zulu25.32.21-ca-fx-jre25.0.2-linux_x64", "jvmargs":[ "-Dprism.dirtyopts=false", "-Dprism.forceGPU=true", "-XX:MaxRAMPercentage=95", "--add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED", "--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED" ] }, "Linux-aarch64":{ "url":"https://cdn.azul.com/zulu/bin/", "type":"tar.gz", "name":"zulu25.32.21-ca-fx-jre25.0.2-linux_aarch64", "jvmargs":[ "-Dprism.dirtyopts=false", "-Dprism.order=es2", "-Dprism.verbose=true", "-Dprism.forceGPU=true", "-XX:MaxRAMPercentage=95", "--add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED", "--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED" ] }, "Windows-x64":{ "url":"https://cdn.azul.com/zulu/bin/", "type":"zip", "name":"zulu25.32.21-ca-fx-jre25.0.2-win_x64", "jvmargs":[ "-Dprism.dirtyopts=false", "-XX:MaxRAMPercentage=95", "--add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED", "--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED" ] }, "Mac-x64":{ "url":"https://cdn.azul.com/zulu/bin/", "type":"zip", "name":"zulu25.32.21-ca-fx-jre25.0.2-macosx_x64", "jvmargs":[ "-Dprism.dirtyopts=false", "-Dprism.forceGPU=true", "-XX:MaxRAMPercentage=95", "--add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED", "--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED" ] }, "Mac-aarch64":{ "url":"https://cdn.azul.com/zulu/bin/", "type":"zip", "name":"zulu25.32.21-ca-fx-jre25.0.2-macosx_aarch64", "jvmargs":[ "-Dprism.dirtyopts=false", "-Dprism.forceGPU=true", "-XX:MaxRAMPercentage=95", "--add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED", "--add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED", "--add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED", "--add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED", "--add-opens javafx.graphics/javafx.scene=ALL-UNNAMED" ] } } ================================================ FILE: libraries/.gitignore ================================================ /.project /.settings/ /.classpath ================================================ FILE: log/.gitignore ================================================ /server.log ================================================ FILE: makeJar.sh ================================================ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) export ARCH=x86_64 JVM=zulu25.32.21-ca-fx-jdk25.0.2-linux_x64 set -e ZIP=$JVM.tar.gz export JAVA_HOME=$HOME/bin/java21/ if test -d $JAVA_HOME/$JVM/; then echo "$JAVA_HOME exists." else rm -rf $JAVA_HOME mkdir -p $JAVA_HOME wget https://cdn.azul.com/zulu/bin/$ZIP tar -xvzf $ZIP -C $JAVA_HOME mv $JAVA_HOME/$JVM/* $JAVA_HOME/ fi echo "Java home set to $JAVA_HOME" ./gradlew spotlessCheck shadowJar ================================================ FILE: runMac.sh ================================================ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) export ARCH=x86_64 JVM=zulu25.32.21-ca-fx-jdk25.0.2-macosx_x64 set -e ZIP=$JVM.tar.gz export JAVA_HOME=$HOME/bin/java21/ if test -d $JAVA_HOME/$JVM/; then echo "$JAVA_HOME exists." else rm -rf $JAVA_HOME mkdir -p $JAVA_HOME curl -L https://cdn.azul.com/zulu/bin/$ZIP -o $ZIP tar -xvzf $ZIP -C $JAVA_HOME mv $JAVA_HOME/$JVM/* $JAVA_HOME/ fi echo "Java home set to $JAVA_HOME" ./gradlew --stop #rm -rf ~/.gradle/caches/ #rm -rf ~/.gradle/daemon/ ./gradlew clean build --refresh-dependencies ./gradlew shadowJar $JAVA_HOME/bin/java \ -Dprism.forceGPU=true \ -XX:MaxRAMPercentage=95 \ --add-exports javafx.graphics/com.sun.javafx.css=ALL-UNNAMED \ --add-exports javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED \ --add-exports javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED \ --add-exports javafx.base/com.sun.javafx.event=ALL-UNNAMED \ --add-exports javafx.controls/com.sun.javafx.scene.control.skin.resources=ALL-UNNAMED \ --add-exports javafx.graphics/com.sun.javafx.util=ALL-UNNAMED \ --add-exports javafx.graphics/com.sun.javafx.scene.input=ALL-UNNAMED \ --add-opens javafx.graphics/javafx.scene=ALL-UNNAMED \ -jar build/libs/BowlerStudio.jar ================================================ FILE: searchLicense.sh ================================================ #!/bin/bash for VARIABLE in $(cat DEPENDENCIES_unknown.md) do LOCATION=$(locate -l 1 $VARIABLE) echo $VARIABLE unzip -l $LOCATION | grep -i "license" done ================================================ FILE: settings.gradle ================================================ include ':libraries:bowler-script-kernel' include ':libraries:bowler-script-kernel:java-bowler' include ':libraries:bowler-script-kernel:JCSG' include ':libraries:bowler-script-kernel:GithubPasswordManager:GithubPasswordManager' rootProject.name = 'BowlerStudio' ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/AddFileToGistController.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.scripting.ArduinoLoader; import com.neuronrobotics.bowlerstudio.scripting.IScriptingLanguage; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import eu.mihosoft.vrl.v3d.JavaFXInitializer; import javafx.application.Application; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ComboBox; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.File; import java.text.Normalizer; import java.text.Normalizer.Form; import java.util.List; import java.util.regex.Pattern; import org.kohsuke.github.GHRepository; /** * Created by Ryan Benasutti on 2/6/2016. */ @SuppressWarnings("restriction") public class AddFileToGistController extends Application { @FXML public TextField filenameField; @FXML public TextField repoName; @FXML private ComboBox projects; @FXML public Button addFileButton, cancelButton; @FXML private ComboBox extension; @FXML // fx:id="langaugeIcon" private ImageView langaugeIcon; // Value injected by FXMLLoader private String extensionStr = ".groovy"; private String gitRepo; @FXML private TextArea description; @FXML private AnchorPane newProject; @FXML private AnchorPane addFile; private MenuRefreshEvent refreshevent; private boolean isArduino; private static final Pattern NONLATIN = Pattern.compile("[^\\w-]"); private static final Pattern WHITESPACE = Pattern.compile("[\\s]"); private String forcedType = null; public static String toSlug(String input) { String nowhitespace = WHITESPACE.matcher(input).replaceAll("-"); String normalized = Normalizer.normalize(nowhitespace, Form.NFD); String slug = NONLATIN.matcher(normalized).replaceAll(""); return slug.replaceAll("[^a-zA-Z0-9]", ""); } // private GHGist gistID; public AddFileToGistController(String gitRepo, MenuRefreshEvent event) { this.setGitRepo(gitRepo); // this.gistID = id; this.refreshevent = event; } @SuppressWarnings("restriction") @Override public void start(Stage primaryStage) throws Exception { isArduino = false; FXMLLoader loader = AssetFactory.loadLayout("layout/addFileToGist.fxml", true); Parent root; loader.setController(this); // This is needed when loading on MAC loader.setClassLoader(getClass().getClassLoader()); root = loader.load(); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); }); extension.getItems().clear(); if (getGitRepo() != null) { newProject.getChildren().clear(); } else { addFile.setDisable(true); } List langs = ScriptingEngine.getAllLangauges(); ObservableList options = FXCollections.observableArrayList(langs); // for (String s : options) { extension.getItems().add(s); } extension.getSelectionModel().select("Groovy"); Image icon; String asset = "Script-Tab-" + extension.getSelectionModel().getSelectedItem() + ".png"; try { icon = AssetFactory.loadAsset(asset); langaugeIcon.setImage(icon); FontSizeManager.addListener(fontNum -> { langaugeIcon.setScaleX(FontSizeManager.getImageScale()); langaugeIcon.setScaleY(FontSizeManager.getImageScale()); }); } catch (Exception e2) { // Auto-generated catch block e2.printStackTrace(); } extension.setOnAction(event -> { try { String selectedItem = extension.getSelectionModel().getSelectedItem(); setSelected(selectedItem); } catch (Exception e1) { // Auto-generated catch block e1.printStackTrace(); } }); BowlerStudio.runLater(() -> { primaryStage.setTitle("Add File to Git Repo " + getGitRepo()); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.initModality(Modality.WINDOW_MODAL); primaryStage.setResizable(true); primaryStage.show(); }); } private void setSelected(String selectedItem) throws Exception { String file = "Script-Tab-" + selectedItem + ".png"; Image loadAsset = AssetFactory.loadAsset(file); try { langaugeIcon.setImage(loadAsset); } catch (Throwable t) { com.neuronrobotics.sdk.common.Log.error(t); } String key = selectedItem; IScriptingLanguage l = ScriptingEngine.getLangaugesMap().get(key); if (l != null) { extensionStr = l.getFileExtension().get(0); } else extensionStr = ".groovy"; if (!extensionStr.startsWith(".")) { extensionStr = "." + extensionStr; } isArduino = ArduinoLoader.class.isInstance(l); setGitRepo(gitRepo); } @FXML public void onAddFile(ActionEvent event) { new Thread(() -> { BowlerStudio.runLater(() -> { Stage stage = (Stage) addFileButton.getScene().getWindow(); stage.close(); }); String filename = filenameField.getText(); if (!filename.endsWith(extensionStr)) { filename = filename + extensionStr; } String fileSlug = filename.replace(extensionStr, ""); String message = description.getText(); if (message == null || message.length() == 0) { message = filename; } if (getGitRepo() == null) { setGitRepo(GistHelper.createNewGist(filename, message, true)); } com.neuronrobotics.sdk.common.Log.error("Adding new file" + filename + " to " + getGitRepo()); try { ScriptingEngine.pull(getGitRepo()); // String defaultContents = String fullBranch = ScriptingEngine.getFullBranch(getGitRepo()); if (fullBranch == null) fullBranch = ScriptingEngine.newBranch(getGitRepo(), "main"); ScriptingEngine.getLangaugeByExtension(extensionStr).getDefaultContents(getGitRepo(), filename); ScriptingEngine.pushCodeToGit(getGitRepo(), fullBranch, filename, null, message); File nf = ScriptingEngine.fileFromGit(getGitRepo(), filename); try { BowlerStudio.createFileTab(nf); } catch (Exception ex) { ex.printStackTrace(); } refreshevent.setToLoggedIn(); } catch (Exception e) { new IssueReportingExceptionHandler().except(e); } }).start(); } @FXML public void onCancel(ActionEvent event) { BowlerStudio.runLater(() -> { Stage stage = (Stage) cancelButton.getScene().getWindow(); stage.close(); }); } public static void main(String[] args) { JavaFXInitializer.go(); BowlerStudio.runLater(() -> { Stage s = new Stage(); new Thread(() -> { String url = "https://github.com/madhephaestus/TestRepo.git"; // url = null; AddFileToGistController controller = new AddFileToGistController(url, new MenuRefreshEvent() { @Override public void setToLoggedIn() { // Auto-generated method stub } }); try { controller.start(s); // setToLoggedIn(""); } catch (Exception e) { com.neuronrobotics.sdk.common.Log.error(e); } }).start(); }); } @FXML void createProject(ActionEvent event) { BowlerStudio.runLater(() -> { newProject.setDisable(true); }); new Thread(() -> { try { String text = description.getText(); if (text == null || text.length() < 5) { text = "Project " + repoName.getText(); } String txt = repoName.getText(); String slugVer = toSlug(txt); if (!txt.contentEquals(slugVer)) { BowlerStudio.runLater(() -> { repoName.setText(slugVer); Alert alert = new Alert(javafx.scene.control.Alert.AlertType.INFORMATION); alert.setContentText("Repository Name must Valid: " + slugVer); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); BowlerStudio.runLater(() -> { newProject.setDisable(false); }); }); return; } GHRepository repository = ScriptingEngine.makeNewRepo(toSlug(repoName.getText()), text); setGitRepo(repository.getHttpTransportUrl()); BowlerStudio.runLater(() -> { addFile.setDisable(false); }); } catch (Throwable e) { // Auto-generated catch block com.neuronrobotics.sdk.common.Log.error(e); } }).start(); } public String getGitRepo() { return gitRepo; } public void setGitRepo(String gitRepo) { this.gitRepo = gitRepo; if (gitRepo != null) { String dirName = ScriptingEngine.getRepositoryCloneDirectory(gitRepo).getName(); if (filenameField != null) BowlerStudio.runLater(() -> { filenameField.setDisable(isArduino); filenameField.setText(dirName); }); } } public void setFileExtensionType(IScriptingLanguage lang) { String string = lang.getShellType(); try { setSelected(string); BowlerStudio.runLater(() -> { extension.setValue(string); extension.setDisable(true); }); } catch (Exception e) { // Auto-generated catch block com.neuronrobotics.sdk.common.Log.error(e); } } public void start(Stage s, IScriptingLanguage iScriptingLanguage) throws Exception { start(s); BowlerStudio.runLater(() -> { setFileExtensionType(iScriptingLanguage); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudio.java ================================================ package com.neuronrobotics.bowlerstudio; import javafx.scene.control.Button; import javafx.scene.control.ButtonType; //import com.neuronrobotics.kinematicschef.InverseKinematicsEngine; import com.neuronrobotics.bowlerkernel.BowlerKernelBuildInfo; import com.neuronrobotics.bowlerkernel.Bezier3d.IInteractiveUIElementProvider; import com.neuronrobotics.bowlerkernel.Bezier3d.Manipulation; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.BowlerStudioResourceFactory; import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.assets.StudioBuildInfo; import com.neuronrobotics.bowlerstudio.creature.MobileBaseCadManager; import com.neuronrobotics.bowlerstudio.creature.MobileBaseLoader; import com.neuronrobotics.bowlerstudio.scripting.DownloadManager; import com.neuronrobotics.bowlerstudio.scripting.GitHubWebFlow; import com.neuronrobotics.bowlerstudio.scripting.IApprovalForDownload; import com.neuronrobotics.bowlerstudio.scripting.IDownloadManagerEvents; import com.neuronrobotics.bowlerstudio.scripting.IURLOpen; import com.neuronrobotics.bowlerstudio.scripting.PasswordManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.bowlerstudio.scripting.ScriptingFileWidget; import com.neuronrobotics.bowlerstudio.scripting.external.GroovyEclipseExternalEditor; import com.neuronrobotics.bowlerstudio.util.FileChangeWatcher; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; //import com.neuronrobotics.imageprovider.OpenCVJNILoader; import com.neuronrobotics.javacad.JavaCadBuildInfo; import com.neuronrobotics.sdk.addons.kinematics.DHParameterKinematics; import com.neuronrobotics.sdk.addons.kinematics.FirmataLink; import com.neuronrobotics.sdk.addons.kinematics.LinkConfiguration; import com.neuronrobotics.sdk.addons.kinematics.MobileBase; import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR; import com.neuronrobotics.sdk.common.BowlerAbstractDevice; import com.neuronrobotics.sdk.common.ByteList; import com.neuronrobotics.sdk.common.DeviceManager; import com.neuronrobotics.sdk.common.IDeviceAddedListener; import com.neuronrobotics.sdk.common.Log; import com.neuronrobotics.sdk.config.SDKBuildInfo; import com.neuronrobotics.sdk.util.ThreadUtil; import eu.mihosoft.vrl.v3d.CSG; import eu.mihosoft.vrl.v3d.CSG.OptType; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabase; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabaseInstance; import javafx.application.Application; import javafx.application.Platform; import javafx.fxml.FXMLLoader; import javafx.geometry.Rectangle2D; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.PerspectiveCamera; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.TextArea; import javafx.scene.image.Image; import javafx.scene.layout.GridPane; import javafx.scene.layout.Priority; import javafx.scene.transform.Affine; import javafx.stage.Stage; import static com.neuronrobotics.bowlerstudio.scripting.DownloadManager.delim; import java.awt.Desktop; import java.awt.GraphicsEnvironment; import java.awt.SplashScreen; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.Thread.UncaughtExceptionHandler; import java.net.URI; import java.net.URL; import java.net.URLConnection; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Optional; import javax.swing.SwingUtilities; import javax.swing.UIManager; @SuppressWarnings("restriction") public class BowlerStudio extends Application { final static SplashScreen splash = null;// = SplashScreen.getSplashScreen(); private static Scene scene; private static boolean hasnetwork; private static _Console out; private static TextArea logViewRefStatic = null; private static String firstVer = ""; private static Stage primaryStage2; private static File layoutFile; private static boolean deleteFlag = false; private static IssueReportingExceptionHandler reporter = new IssueReportingExceptionHandler(); // private static String lastVersion; private static UncaughtExceptionHandler hand; @SuppressWarnings({"unchecked", "restriction"}) public static void main(String[] args) throws Exception { initializeBowlerStudio(args); launch(); } public static void go() { try { embeddedLaunch(new String[0]); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void embeddedLaunch(String[] args) throws Exception { initializeBowlerStudio(args); BowlerStudio.runLater(() -> { Stage stage = new Stage(); new BowlerStudio().start(stage); }); } public static void initializeBowlerStudio(String[] args) throws Exception { String relative = ScriptingEngine.getWorkingDirectory().getAbsolutePath(); File file = new File(relative + delim() + "bowler-workspace" + delim()); file.mkdirs(); ScriptingEngine.setWorkspace(file); File logfile = new File(file.getAbsolutePath() + delim() + "bowlerStudioLog.txt"); if (logfile.exists()) logfile.delete(); try { logfile.createNewFile(); Log.enableDebugPrint(true); Log.enableDebugPrint(); Log.setFile(logfile); Log.debug("Log file set to " + logfile.getAbsolutePath()); Log.warning("BowlerStudio Version " + StudioBuildInfo.getVersion()); Runtime.getRuntime().addShutdownHook(new Thread(() -> { Log.flush(); })); } catch (IOException e) { // TODO Auto-generated catch block Log.error(e); } CSG.setDefaultOptType(OptType.Manifold3d); DownloadManager.setSTUDIO_INSTALL("BowlerStudioInstall"); if (args.length != 0) { // Log.error("Arguments detected, starting Kernel mode."); // SplashManager.closeSplash(); BowlerKernel.runArgumentsAfterStartup(args, System.currentTimeMillis()); return; } try { makeSymLinkOfCurrentVersion(); } catch (Throwable t) { // t.printStackTrace(); Log.error("Symlink not creaded"); } net.java.games.input.ControllerEnvironment.getDefaultEnvironment(); Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); if (!StudioBuildInfo.isOS64bit()) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("32 Bit Java Detected"); alert.setHeaderText("Insuffient Ram Capibilities in 32 bit mode"); alert.setContentText("This applications uses more that 4gb of ram\nA 32 bit JVM mode detected: " + System.getProperty("os.arch")); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); System.exit(1); }); } renderSplashFrame(2, "Testing Internet"); try { final URL url = new URI("http://github.com").toURL(); final URLConnection conn = url.openConnection(); conn.connect(); conn.getInputStream(); setHasnetwork(true); } catch (Exception e) { // we assuming we have no access to the server and run off of the // cached gists. setHasnetwork(false); e.printStackTrace(); } StudioBuildInfo.setBaseBuildInfoClass(BowlerStudio.class); Manipulation.setUi(new IInteractiveUIElementProvider() { public void runLater(Runnable r) { BowlerStudio.runLater(r); } public TransformNR getCamerFrame() { return BowlerStudio.getCamerFrame(); } public double getCamerDepth() { return BowlerStudio.getCamerDepth(); } @Override public PerspectiveCamera getCamera() { return CreatureLab3dController.getEngine().getFlyingCamera().getCamera(); } }); renderSplashFrame(5, "Loging In..."); // ScriptingEngine.logout(); // switching to Web Flow auth List listOfScopes = Arrays.asList("repo", "gist", "user", "admin:org", "admin:org_hook", "workflow"); GitHubWebFlow.setOpen(new IURLOpen() { public void open(URI toOpe) { try { BowlerStudio.openExternalWebpage(toOpe.toURL()); } catch (MalformedURLException e) { // Auto-generated catch block e.printStackTrace(); } } }); PasswordManager.setListOfScopes(listOfScopes); GitHubWebFlow.setMyAPI(() -> { String line = System.getProperty("API-ID"); if (line != null) return line; return "1edf79fae494c232d4d2"; }); NameGetter mykey = new NameGetter(); GitHubWebFlow.setName(mykey); String myAssets = AssetFactory.getGitSource(); if (PasswordManager.hasNetwork()) { Log.error("Attempt to log in with disk credentials"); ScriptingEngine.waitForLogin(); if (ScriptingEngine.isLoginSuccess()) { // if (BowlerStudio.hasNetwork()) { // ScriptingEngine.setAutoupdate(true); // // } renderSplashFrame(15, "Load Configs"); try { firstVer = (String) ConfigurationDatabase.getObject("BowlerStudioConfigs", "firstVersion", StudioBuildInfo.getVersion()); } catch (Throwable t) { Log.error("Resetting the configs repo..."); // clear the configs repo firstVer = (String) ConfigurationDatabase.getObject("BowlerStudioConfigs", "firstVersion", StudioBuildInfo.getVersion()); } ConfigurationDatabase.setObject("BowlerStudioConfigs", "currentVersion", StudioBuildInfo.getVersion()); renderSplashFrame(16, "Done Load Configs"); // myAssets = (String) ConfigurationDatabase.getObject("BowlerStudioConfigs", // "assetRepo", // myAssets); renderSplashFrame(20, "DL'ing Image Assets"); Log.error("Asset Repo " + myAssets); Log.error("Asset intended ver " + StudioBuildInfo.getVersion()); ScriptingEngine.cloneRepo(myAssets, null); try { ScriptingEngine.pull(myAssets, "main"); Log.error("Studio version is the same"); } catch (Exception e) { e.printStackTrace(); ScriptingEngine.deleteRepo(myAssets); ScriptingEngine.cloneRepo(myAssets, null); } if (ScriptingEngine.checkOwner(myAssets)) { if (!ScriptingEngine.tagExists(myAssets, StudioBuildInfo.getVersion())) { Log.error("Tagging Assets at " + StudioBuildInfo.getVersion()); ScriptingEngine.tagRepo(myAssets, StudioBuildInfo.getVersion()); } } if (BowlerStudio.hasNetwork()) { renderSplashFrame(25, "Populating Menu"); } } else { renderSplashFrame(20, "DL'ing Image Assets"); ScriptingEngine.cloneRepo(myAssets, null); ScriptingEngine.pull(myAssets, "main"); } } layoutFile = AssetFactory.loadFile("layout/default.css"); if (layoutFile == null || !layoutFile.exists()) { ScriptingEngine.deleteRepo(myAssets); ScriptingEngine.cloneRepo(myAssets, null); layoutFile = AssetFactory.loadFile("layout/default.css"); } if ((Boolean) ConfigurationDatabase.get("BowlerStudioUI", "DarkMode", true)) { layoutFile = AssetFactory.loadFile("layout/darkmode.css"); } // SplashManager.setIcon(AssetFactory.loadAsset("BowlerStudioTrayIcon.png")); renderSplashFrame(50, "DL'ing Tutorials..."); // load tutorials repo Tutorial.getHomeUrl(); // Dowload and launch the Tutorial server // force the current version in to the version number // Download and Load all of the assets renderSplashFrame(60, "Vitamins..."); // load the vitimins repo so the demo is always snappy ScriptingEngine.cloneRepo("https://github.com/CommonWealthRobotics/BowlerStudioVitamins.git", null); renderSplashFrame(80, "Example Robots"); ScriptingEngine.cloneRepo("https://github.com/CommonWealthRobotics/BowlerStudioExampleRobots.git", null); ScriptingEngine.pull("https://github.com/CommonWealthRobotics/BowlerStudioExampleRobots.git"); renderSplashFrame(81, "CSG database"); CSGDatabase.setInstance(new CSGDatabaseInstance( new File(ScriptingEngine.getWorkspace().getAbsoluteFile() + "/csgDatabase.json"))); // Log.error("Loading assets "); // Log.error("Loading Main.fxml"); renderSplashFrame(82, "Set up UI"); try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); // This is a workaround for #8 and is only relavent on osx // it causes the SwingNodes not to load if not called way ahead // of time javafx.scene.text.Font.getFamilies(); } catch (Exception e) { reporter.uncaughtException(Thread.currentThread(), e); } // add a new link provider to the link factory FirmataLink.addLinkFactory(); // Log.enableInfoPrint(); renderSplashFrame(91, "DL'ing Devices..."); // ThreadUtil.wait(100); try { ensureUpdated(false, "https://github.com/CommonWealthRobotics/DHParametersCadDisplay.git", "https://github.com/CommonWealthRobotics/HotfixBowlerStudio.git", "https://github.com/CommonWealthRobotics/DeviceProviders.git", "https://github.com/OperationSmallKat/Katapult.git", "https://github.com/CommonWealthRobotics/ExternalEditorsBowlerStudio.git", "https://github.com/CommonWealthRobotics/freecad-bowler-cli.git", "https://github.com/CommonWealthRobotics/blender-bowler-cli.git"); ScriptingEngine.gitScriptRun(CSGDatabase.getInstance(), "https://github.com/CommonWealthRobotics/HotfixBowlerStudio.git", "hotfix.groovy", null); ScriptingEngine.gitScriptRun(CSGDatabase.getInstance(), "https://github.com/CommonWealthRobotics/DeviceProviders.git", "loadAll.groovy", null); renderSplashFrame(92, "Vitamin Scripts..."); HashSet urls = new HashSet<>(); for (String type : Vitamins.listVitaminTypes()) { String url = Vitamins.getScriptGitURL(type); urls.add(url); } new Thread(() -> { boolean wasState = ScriptingEngine.isPrintProgress(); // ScriptingEngine.setPrintProgress(false); for (Iterator iterator = urls.iterator(); iterator.hasNext();) { String url = iterator.next(); ensureUpdated(false, url); } ScriptingEngine.setPrintProgress(wasState); }).start(); } catch (Exception e) { e.printStackTrace(); reporter.uncaughtException(Thread.currentThread(), e); } DownloadManager.setDownloadEvents(new IDownloadManagerEvents() { @Override public void startDownload() { SplashManager.renderSplashFrame(0, "Downloading..."); } @Override public void finishDownload() { SplashManager.closeSplash(); } }); DownloadManager.setApproval(new IApprovalForDownload() { private ButtonType buttonType = null; @Override public boolean get(String name, String url) { buttonType = null; BowlerKernel.runLater(() -> { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Message"); alert.setHeaderText("Would you like add the " + name + " plugin?"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); Optional result = alert.showAndWait(); buttonType = result.get(); alert.close(); }); while (buttonType == null) { try { Thread.sleep(100); } catch (InterruptedException e) { // Auto-generated catch block e.printStackTrace(); } } return buttonType.equals(ButtonType.OK); } @Override public void onInstallFail(String url) { try { URL urlObject = new URI(url).toURL(); BowlerStudio.openExternalWebpage(urlObject); } catch (MalformedURLException e) { // Auto-generated catch block e.printStackTrace(); } catch (URISyntaxException e) { // Auto-generated catch block e.printStackTrace(); } } @Override public void notifyOfFailure(String name) { BowlerKernel.runLater(() -> { Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Message"); alert.setHeaderText("FAILED to install " + name + " plugin"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); Optional result = alert.showAndWait(); buttonType = result.get(); alert.close(); }); } }); renderSplashFrame(92, "Launching UI"); } private static class _Console extends OutputStream { private static final int LengthOfOutputLog = 5000; ByteList incoming = new ByteList(); Thread update = new Thread() { public void run() { Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); while (true) { ThreadUtil.wait(150); if (incoming.size() > 0) try { String text = incoming.asString(); incoming.clear(); if (text != null && text.length() > 0) appendText(text); text = null; } catch (Exception e) { e.printStackTrace(); } } } }; public _Console() { update.start(); } @SuppressWarnings("restriction") public void appendText(String v) { if (v.length() > LengthOfOutputLog) { v = v.substring(v.length() - LengthOfOutputLog, v.length()); } String valueOf = v; if (getLogViewRefStatic() != null) { String text = getLogViewRefStatic().getText(); if (text.length() > LengthOfOutputLog) { BowlerStudio.runLater(() -> { try { getLogViewRefStatic().deleteText(0, text.length() - LengthOfOutputLog); getLogViewRefStatic().appendText(valueOf); } catch (Throwable t) { } }); } else { BowlerStudio.runLater(() -> { getLogViewRefStatic().appendText(valueOf); }); } } // System.err.print(valueOf); } public void write(int b) throws IOException { incoming.add(b); } } public static void runLater(long delay, Runnable action) { runLater(java.time.Duration.ofMillis(delay), action); } public static void runLater(java.time.Duration delay, Runnable action) { Throwable t = new Exception("Delayed UI Thread Exception here!"); // t.printStackTrace(); new Thread() { public void run() { setName("UI Delay Thread "); try { Thread.sleep(delay.getSeconds() * 1000); } catch (InterruptedException e) { // Auto-generated catch block e.printStackTrace(); } runLater(action, t); } }.start(); } public static void runLater(Runnable r) { if (Platform.isFxApplicationThread()) try { r.run(); } catch (Throwable t) { t.printStackTrace(); } else runLater(r, new Exception("UI Thread Exception here!")); } public static void runLater(Runnable r, Throwable ex) { if (Platform.isFxApplicationThread()) try { r.run(); } catch (Throwable t) { t.printStackTrace(); } else Platform.runLater(() -> { try { r.run(); } catch (Throwable t) { t.printStackTrace(); ex.printStackTrace(); } }); } public static OutputStream getOut() { if (out == null) out = new _Console(); return out; } public static MobileBase loadMobileBaseFromGit(String id, String file) throws Exception { return MobileBaseLoader.fromGit(CSGDatabase.getInstance(), id, file); } public static void select(MobileBase base) { if (CreatureLab3dController.getEngine().isAutoHightlight()) { MobileBaseCadManager.get(CSGDatabase.getInstance(), base).selectCsgByMobileBase(base); } /* * try { * * ArrayList csg = * MobileBaseCadManager.get(base).getBasetoCadMap().get(base); * CreatureLab3dController.getEngine(). setSelectedCsg(csg.get(0)); * CreatureLab3dController.getEngine(). setSelectedCsg(csg); } catch (Exception * ex) { Log.error("Base not loaded yet"); } */ } public static void select(MobileBase base, DHParameterKinematics limb) { if (CreatureLab3dController.getEngine().isAutoHightlight()) { MobileBaseCadManager.get(CSGDatabase.getInstance(), base).selectCsgByLimb(base, limb); } /* * try { * * ArrayList limCad = * MobileBaseCadManager.get(base).getDHtoCadMap().get(limb); try { * CreatureLab3dController.getEngine() .setSelectedCsg(limCad.get(limCad.size() * - 1)); } catch (Exception ex) { // initialization has no csgs yet } * CreatureLab3dController.getEngine(). setSelectedCsg(limCad); } catch * (Exception ex) { Log.error("Limb not loaded yet"); } */ } /** * Select a provided affine that is in a given global pose * * @param startingLocation the starting pose * @param rootListener what affine to attach to */ public static void select(TransformNR startingLocation, Affine rootListener) { if (CreatureLab3dController.getEngine().isAutoHightlight()) { CreatureLab3dController.getEngine().setSelected(startingLocation, rootListener); } } /** * Select a provided affine that is in a given global pose * * @param rootListener what affine to attach to */ public static void select(Affine rootListener) { if (CreatureLab3dController.getEngine().isAutoHightlight()) { CreatureLab3dController.getEngine().setSelected(new TransformNR(), rootListener); } } public static void select(MobileBase base, LinkConfiguration limb) { if (CreatureLab3dController.getEngine().isAutoHightlight()) { MobileBaseCadManager.get(CSGDatabase.getInstance(), base).selectCsgByLink(base, limb); } /* * try { * * ArrayList limCad = * MobileBaseCadManager.get(base).getLinktoCadMap().get(limb); * CreatureLab3dController.getEngine() .setSelectedCsg(limCad.get(limCad.size() * - 1)); CreatureLab3dController.getEngine(). setSelectedCsg(limCad); } catch * (Exception ex) { Log.error("Limb not loaded yet"); } */ } public static void select(File script, int lineNumber) { if (CreatureLab3dController.getEngine().isAutoHightlight()) try { CreatureLab3dController.getEngine().setSelectedCsg(script, lineNumber); } catch (Exception ex) { Log.error("File not found"); } } /** * @param args the command line arguments * @throws Exception */ public static String getBowlerStudioBinaryVersion() throws FileNotFoundException { String latestVersionString; File currentVerFile = new File(System.getProperty("user.home") + delim() + "bin" + delim() + getInstallDirStub() + delim() + "currentversion.txt"); String s = ""; BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(currentVerFile))); String line; try { while (null != (line = br.readLine())) { s += line; } } catch (IOException e) { } latestVersionString = s.trim(); return latestVersionString; } private static void makeSymLinkOfCurrentVersion() throws Exception { String version = getBowlerStudioBinaryVersion(); File installDir = new File( System.getProperty("user.home") + delim() + "bin" + delim() + getInstallDirStub() + delim()); File link = new File(installDir.getAbsolutePath() + delim() + "latest"); File latest = new File(installDir.getAbsolutePath() + delim() + version); if (link.exists()) link.delete(); try { Files.createSymbolicLink(link.toPath(), latest.toPath()); } catch (Throwable t) { // t.printStackTrace(); // link = new File("\""+link.getAbsolutePath()+"\""); Path ret = Files.createSymbolicLink(link.toPath(), Paths.get(".", version)); Log.error("Path created " + ret); } } public static void ensureUpdated(boolean check, String... urls) { BowlerKernel.ensureUpdated(check, urls); } // private static void removeAssets(String myAssets) // throws InvalidRemoteException, TransportException, GitAPIException, // IOException, Exception { // Log.error("Clearing assets"); // ScriptingEngine.deleteRepo(myAssets); // AssetFactory.setGitSource((String) // ConfigurationDatabase.getObject("BowlerStudioConfigs", "skinRepo", myAssets), // StudioBuildInfo.getVersion()); // } public static void closeSplash() { SplashManager.closeSplash(); } public static void renderSplashFrame(int frame, String message) { SplashManager.renderSplashFrame(frame, message); } /** * open an external web page * * @param uri */ public static void openExternalWebpage(URL uri) { Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) { try { desktop.browse(uri.toURI()); } catch (Exception e) { e.printStackTrace(); } } } /** * @author Sainath * @version 1.0 * @param url - The URL of the tab that needs to be opened */ public static void openUrlInNewTab(URL url) { BowlerStudioModularFrame.getBowlerStudioModularFrame().openUrlInNewTab(url); } /** * @author Sainath * @version 1.0 * @param msg - message that needs to be spoken * @return an integer */ public static int speak(String msg) { return BowlerKernel.speak(msg); } public static ScriptingFileWidget createFileTab(File file) { return BowlerStudioModularFrame.getBowlerStudioModularFrame().createFileTab(file); } @SuppressWarnings("restriction") public static Scene getScene() { return scene; } @SuppressWarnings("restriction") public static void setScene(Scene s) { scene = s; } @SuppressWarnings("restriction") public static void clearConsole() { runLater(() -> { if (getLogViewRefStatic() != null) getLogViewRefStatic().setText(""); }); } public static boolean hasNetwork() { return hasnetwork; } public static void setHasnetwork(boolean hasnetwork) { BowlerStudio.hasnetwork = hasnetwork; } @SuppressWarnings("restriction") public static TextArea getLogViewRefStatic() { return logViewRefStatic; } public static void setLogViewRefStatic(@SuppressWarnings("restriction") TextArea logViewRefStatic) { BowlerStudio.logViewRefStatic = logViewRefStatic; } public static void setCreatureLab3d(CreatureLab3dController creatureLab3dController) { } @SuppressWarnings("restriction") @Override public void start(Stage primaryStage) { try { // do this ... Thread thread = Thread.currentThread(); if (thread.getContextClassLoader() == null) { // seriously Apple?? Log.error("ContextClassLoader Is Missing! (OSX) "); thread.setContextClassLoader(getClass().getClassLoader()); // a // valid // ClassLoader // from // somewhere // else } } catch (SecurityException e) { reporter.uncaughtException(Thread.currentThread(), e); } PsudoSplash.setParentWindow(primaryStage); Log.error("Class loader: " + Thread.currentThread().getContextClassLoader()); // new Thread(() -> { Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); try { String stylesheet = Application.STYLESHEET_MODENA;// "MODENA" or // "CASPIAN" // System.setProperty("javax.userAgentStylesheetUrl", // stylesheet); setUserAgentStylesheet(stylesheet); } catch (Exception | Error e) { reporter.uncaughtException(Thread.currentThread(), e); } // These must be changed before anything starts PrintStream ps = new PrintStream(getOut()); System.setErr(ps); Log.setMirrorStream(ps); renderSplashFrame(93, "Loading resources"); try { BowlerStudioResourceFactory.load(); } catch (Exception e1) { reporter.uncaughtException(Thread.currentThread(), e1); } primaryStage2 = primaryStage; BowlerStudioModularFrame.setPrimaryStage(primaryStage); // Initialize your logic here: all @FXML variables will have been // injected FXMLLoader mainControllerPanel; try { mainControllerPanel = AssetFactory.loadLayout("layout/BowlerStudioModularFrame.fxml"); renderSplashFrame(96, "Setting controller"); mainControllerPanel.setController(new BowlerStudioModularFrame()); // renderSplashFrame(96, "Class loader"); // mainControllerPanel.setClassLoader(BowlerStudioModularFrame.class.getClassLoader()); try { renderSplashFrame(96, "Controller load"); BowlerStudio.runLater(() -> { try { mainControllerPanel.load(); } catch (IOException e) { throw new RuntimeException(e); } }); } catch (Exception e) { reporter.uncaughtException(Thread.currentThread(), e); System.exit(5); } renderSplashFrame(96, "UI Launch..."); Parent root = mainControllerPanel.getRoot(); double sw = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode() .getWidth(); double sh = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDisplayMode() .getHeight(); Rectangle2D primaryScreenBounds = javafx.stage.Screen.getPrimary().getVisualBounds(); double scalew = primaryScreenBounds.getWidth(); double screenZoom = sw / scalew; if (FontSizeManager.getDefaultSize() == FontSizeManager.systemDefaultFontSize) { double newSize = sw / 2256.0 * (2 * FontSizeManager.systemDefaultFontSize) / screenZoom; if (newSize < FontSizeManager.systemDefaultFontSize) newSize = FontSizeManager.systemDefaultFontSize; FontSizeManager.setFontSize((int) Math.round(newSize)); Log.error("Screen " + sw + "x" + sh); } sw = primaryScreenBounds.getWidth(); sh = primaryScreenBounds.getHeight(); double w; double h; w = sw - 40; h = sh - 40; Scene scene = new Scene(root, w, h, true); setBowlerStudioCSS(scene); BowlerStudio.runLater(() -> { primaryStage.setScene(scene); Log.error("Showing main applicaiton"); primaryStage.show(); // initialize the default styles for the dock pane and // undocked // nodes using the // library's internal Default.css stylesheet // unlike other custom control libraries this allows the // user to // override them globally // using the style manager just as they can with internal // JavaFX // controls // this must be called after the primary stage is shown // https://bugs.openjdk.java.net/browse/JDK-8132900 FontSizeManager.addListener(fontNum -> { BowlerStudioController bowlerStudio = BowlerStudioController.getBowlerStudio(); bowlerStudio.setFontSize(fontNum); double tmp = FontSizeManager.getImageScale() * 9; root.setStyle("-fx-font-size: " + ((int) tmp) + "pt"); }); }); primaryStage.setOnCloseRequest(arg0 -> { // ThreadUtil.wait(100); closeBowlerStudio(); }); BowlerStudio.runLater(() -> { setTitle(null); try { Image loadAsset = new Image(PsudoSplash.getResource().toString()); primaryStage.getIcons().add(loadAsset); } catch (Exception e) { reporter.uncaughtException(Thread.currentThread(), e); } });; primaryStage.setResizable(true); DeviceManager.addDeviceAddedListener(new IDeviceAddedListener() { @Override public void onNewDeviceAdded(BowlerAbstractDevice arg0) { Log.error("Device connected: " + arg0); BowlerStudioModularFrame.getBowlerStudioModularFrame().showConectionManager(); } @Override public void onDeviceRemoved(BowlerAbstractDevice arg0) { } }); BowlerStudio.runLater(java.time.Duration.ofMillis((int) 2000), () -> { String javaVersion = System.getProperty("java.version"); String javafxVersion = System.getProperty("javafx.version"); Log.debug("Java Version : " + javaVersion); Log.debug("JavaFX Version : " + javafxVersion); Log.debug("BowlerStudio First Version: " + firstVer); Log.debug("Java-Bowler Version: " + SDKBuildInfo.getVersion()); Log.debug("Bowler-Scripting-Kernel Version: " + BowlerKernelBuildInfo.getVersion()); Log.debug("JavaCad Version: " + JavaCadBuildInfo.getVersion()); Log.debug("Welcome to BowlerStudio!"); try { File jarFile = new File(GroovyEclipseExternalEditor.getApplicationJarPath()); Log.debug("Application at " + jarFile + " is " + (jarFile.exists() ? "Found" : "Missing!")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }); closeSplash(); if (!ScriptingEngine.isLoginSuccess() || PasswordManager.isAnonMode()) BowlerStudioModularFrame.getBowlerStudioModularFrame().menueController.onLogin(null); } catch (Throwable e) { reporter.uncaughtException(Thread.currentThread(), e); } // }).start(); } public static void setTitle(String title) { if (title == null) title = StudioBuildInfo.getAppName() + " v " + StudioBuildInfo.getVersion(); if (primaryStage2 != null) primaryStage2.setTitle(title); } public static void setBowlerStudioCSS(Scene scene) { String nwfile = layoutFile.toURI().toString().replace("file:/", "file:///"); scene.getStylesheets().clear(); scene.getStylesheets().add(nwfile); Log.error("Loading CSS from " + nwfile); } public static void setToRunButton(Button b) { b.setText("Run"); b.setGraphic(AssetFactory.loadIcon("Run.png")); b.getStyleClass().clear(); b.getStyleClass().add("button-run"); b.getStyleClass().add("button"); b.setMinWidth(80); } public static void setToStopButton(Button b) { b.setText("Stop"); b.setGraphic(AssetFactory.loadIcon("Stop.png")); b.getStyleClass().clear(); b.getStyleClass().add("button"); b.getStyleClass().add("button-stop"); b.setMinWidth(80); } @SuppressWarnings("restriction") public static void closeBowlerStudio() { BowlerStudio.runLater(() -> { primaryStage2.hide(); }); new Thread() { public void run() { FileChangeWatcher.clearAll(); Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); renderSplashFrame(100, "Saving state.."); ConnectionManager.disconnectAll(); if (PasswordManager.hasNetwork()) { if (ScriptingEngine.isLoginSuccess() && !PasswordManager.isAnonMode()) ConfigurationDatabase.save(); } if (isDeleteFlag()) ScriptingEngine.deleteCache(); System.exit(0); } }.start(); } public static void printStackTrace(Throwable e) { printStackTrace(e, null); } public static void printStackTrace(Throwable e, File sourceFile) { BowlerStudioController.highlightException(sourceFile, e); } public static void println(CSG... toDisplay) { BowlerStudioController.setCsg(Arrays.asList(toDisplay)); } public static void println(ArrayList toDisplay) { BowlerStudioController.setCsg(toDisplay); } public static void print(CSG... toDisplay) { for (CSG c : Arrays.asList(toDisplay)) BowlerStudioController.addCsg(c); } public static void print(ArrayList toDisplay) { for (CSG c : toDisplay) BowlerStudioController.addCsg(c); } public static boolean isDeleteFlag() { return deleteFlag; } public static void setDeleteFlag(boolean deleteFlag) { BowlerStudio.deleteFlag = deleteFlag; } public static void exit() { closeBowlerStudio(); } public static void invokeLater(Runnable object) { RuntimeException ex = new RuntimeException("SwingUtilities called from here"); SwingUtilities.invokeLater(() -> { try { object.run(); } catch (Throwable t) { t.printStackTrace(); Log.error("Swing method that failed called from: "); ex.printStackTrace(); } }); } public static void moveCamera(TransformNR tf) { runLater(() -> { CreatureLab3dController.getEngine().moveCamera(tf); }); } public static void setCamera(TransformNR tf) { TransformNR current = getCamerFrame(); TransformNR tfupde = current.inverse().times(tf); runLater(() -> { CreatureLab3dController.getEngine().moveCamera(tfupde); }); } public static TransformNR getCamerFrame() { return CreatureLab3dController.getEngine().getFlyingCamera().getCamerFrame(); } public static double getCamerDepth() { return CreatureLab3dController.getEngine().getFlyingCamera().getZoomDepth(); } public static void zoomCamera(double increment) { runLater(() -> { CreatureLab3dController.getEngine().zoomIncrement(increment); }); } public static TransformNR getTargetFrame() { return CreatureLab3dController.getEngine().getTargetNR(); } public static void loadMobilBaseIntoUI(MobileBase base) { BowlerStudioController.getBowlerStudio().onScriptFinished(base, base, null); } public static void showExceptionAlert(Exception ex, String message) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("Error"); alert.setHeaderText(message); alert.setContentText(ex.getMessage()); StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); ex.printStackTrace(pw); String stackTrace = sw.toString(); TextArea textArea = new TextArea(stackTrace); textArea.setEditable(false); textArea.setWrapText(true); textArea.setMaxWidth(Double.MAX_VALUE); textArea.setMaxHeight(Double.MAX_VALUE); GridPane.setVgrow(textArea, Priority.ALWAYS); GridPane.setHgrow(textArea, Priority.ALWAYS); GridPane expContent = new GridPane(); expContent.setMaxWidth(Double.MAX_VALUE); expContent.add(textArea, 0, 0); alert.getDialogPane().setExpandableContent(expContent); alert.showAndWait(); } public static boolean checkValidURL(String url) { try { if ((url == null) || (url.length() < 5)) throw new NullPointerException(); if (url.startsWith("http")) new URI(url).toURL();// check that the URL string contains a valid URL else if (url.startsWith("git@")) { // assume this is a URL } } catch (MalformedURLException e) { // not a url // Log.debug("Invalid URL "+url); // e.printStackTrace(); return false; } catch (URISyntaxException e) { // not a url // Log.debug("Invalid URL "+url); // e.printStackTrace(); return false; } return true; } public static String getInstallDirStub() { return DownloadManager.getSTUDIO_INSTALL(); } public static void setInstallDirStub(String installDirStub) { DownloadManager.setSTUDIO_INSTALL(installDirStub); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudioController.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase; import com.neuronrobotics.bowlerstudio.creature.IMobileBaseUI; import com.neuronrobotics.bowlerstudio.creature.MobileBaseCadManager; import com.neuronrobotics.bowlerstudio.scripting.IScriptEventListener; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.bowlerstudio.scripting.ScriptingFileWidget; import com.neuronrobotics.bowlerstudio.tabs.LocalFileScriptTab; import com.neuronrobotics.bowlerstudio.util.FileChangeWatcher; import com.neuronrobotics.bowlerstudio.util.IFileChangeListener; import com.neuronrobotics.imageprovider.AbstractImageProvider; import com.neuronrobotics.sdk.addons.kinematics.math.RotationNR; import com.neuronrobotics.sdk.addons.kinematics.math.TransformNR; import com.neuronrobotics.sdk.common.Log; import com.neuronrobotics.sdk.util.ThreadUtil; import eu.mihosoft.vrl.v3d.CSG; import eu.mihosoft.vrl.v3d.Polygon; import eu.mihosoft.vrl.v3d.Vector3d; import eu.mihosoft.vrl.v3d.Vertex; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabase; import javafx.scene.Node; import javafx.scene.control.Tab; import javafx.scene.image.ImageView; import javafx.scene.shape.MeshView; import javafx.scene.shape.TriangleMesh; import javafx.scene.transform.Affine; import javafx.stage.Stage; //import java.awt.Color; //import java.awt.*; import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.nio.file.WatchEvent; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import java.util.Set; @SuppressWarnings("restriction") public class BowlerStudioController implements IScriptEventListener { /** * */ private ConnectionManager connectionManager; private AbstractImageProvider vrCamera; private static BowlerStudioController bowlerStudioControllerStaticReference = null; private boolean doneLoadingTutorials = false; private boolean runningExceptionHighlight = false; public BowlerStudioController() { if (getBowlerStudio() != null) throw new RuntimeException("There can be only one Bowler Studio controller"); bowlerStudioControllerStaticReference = this; size = ((Number) ConfigurationDatabase.getObject("BowlerStudioConfigs", "fontsize", 12)).intValue(); } private HashMap openFiles = new HashMap<>(); private HashMap widgets = new HashMap<>(); private int size; private static IMobileBaseUI mbui = new IMobileBaseUI() { @Override public void highlightException(File fileEngineRunByName, Throwable ex) { BowlerStudioController.highlightException(fileEngineRunByName, ex); } @Override public void setAllCSG(Collection toAdd, File source) { try { if (toAdd != null) BowlerStudioController.setCsg(new ArrayList<>(toAdd)); } catch (Throwable t) { t.printStackTrace(); } } @Override public void addCSG(Collection toAdd, File source) { // Auto-generated method stub for (CSG b : toAdd) BowlerStudioController.addCsg(b); } @Override public Set getVisibleCSGs() { return CreatureLab3dController.getEngine().getCsgMap().keySet(); } @Override public void setSelectedCsg(Collection selectedCsg) { CreatureLab3dController.getEngine().setSelectedCsg(new ArrayList<>(selectedCsg)); } @Override public void setSelected(Affine rootListener) { CreatureLab3dController.getEngine().setSelected(rootListener); } }; public void setFontSize(int size) { this.size = size; for (String key : widgets.keySet()) { widgets.get(key).setFontSize(size); } } // Custom function for creation of New Tabs. public ScriptingFileWidget createFileTab(File file) { if (openFiles.get(file.getAbsolutePath()) != null && widgets.get(file.getAbsolutePath()) != null) { BowlerStudioModularFrame.getBowlerStudioModularFrame() .setSelectedTab(openFiles.get(file.getAbsolutePath())); return widgets.get(file.getAbsolutePath()).getScripting(); } Tab fileTab = new Tab(file.getName()); openFiles.put(file.getAbsolutePath(), fileTab); try { LocalFileScriptTab t = new LocalFileScriptTab(file); new Thread() { public void run() { String gitRepo = t.getScripting().getGitRepo(); if (gitRepo != null) { String message = BowlerStudioMenu.gitURLtoMessage(gitRepo); if (gitRepo.length() < 5 || (message == null)) message = "Project " + gitRepo; if (BowlerStudio.checkValidURL(gitRepo)) { BowlerStudioMenuWorkspace.add(gitRepo, message); } } } }.start(); String gitRepoStr = t.getScripting().getGitRepo(); String[] split = gitRepoStr.split("\\."); String string = split[split.length - 2]; String[] url = string.split("/"); String slug = url[url.length - 2] + "/" + url[url.length - 1]; String key = slug + ":" + t.getScripting().getGitFile(); com.neuronrobotics.sdk.common.Log.debug("Loading local file from: " + file.getAbsolutePath() + "\n" + key); if (key.length() == 1) throw new RuntimeException("Failed to create a file key"); ArrayList files = new ArrayList<>(); files.add(gitRepoStr); files.add(t.getScripting().getGitFile()); try { if (key.length() > 3 && files.get(0).length() > 0 && files.get(1).length() > 0) {// catch degenerates ConfigurationDatabase.setObject("studio-open-file", key, files); ConfigurationDatabase.save(); } } catch (java.lang.NullPointerException ex) { // file can not be opened } fileTab.setContent(t); ImageView icon = AssetFactory .loadIcon("Script-Tab-" + ScriptingEngine.getShellType(file.getName()) + ".png"); icon.setFitHeight(30); icon.setFitWidth(30); fileTab.setGraphic(icon); fileTab.selectedProperty().addListener((obs, wasSelected, isSelected) -> { if (isSelected) { t.requestTextAreaFocus(); } }); addTab(fileTab, true); widgets.put(file.getAbsolutePath(), t); System.err.println("Open Tab " + file.getAbsolutePath()); fileTab.setOnCloseRequest(event -> { widgets.remove(file.getAbsolutePath()); openFiles.remove(file.getAbsolutePath()); ConfigurationDatabase.removeObject("studio-open-file", key); ConfigurationDatabase.save(); t.getScripting().close(); Log.debug("Closing Tab Here " + file.getAbsolutePath()); }); FileChangeWatcher watcher = FileChangeWatcher.watch(file); watcher.addIFileChangeListener(new IFileChangeListener() { @Override public void onFileDelete(File fileThatIsDeleted) { BowlerStudioModularFrame.getBowlerStudioModularFrame().closeTab(fileTab); } @Override public void onFileChange(File fileThatChanged, WatchEvent event) { } }); t.setFontSize(size); return t.getScripting(); } catch (IOException e) { // Auto-generated catch block e.printStackTrace(); } return null; } public void clearHighlits() { for (Entry set : widgets.entrySet()) { set.getValue().clearHighlits(); } } public void setHighlight(File fileEngineRunByName, int lineNumber, java.awt.Color color) { // com.neuronrobotics.sdk.common.Log.error("Highlighting line "+lineNumber+" in // "+fileEngineRunByName); if (openFiles.get(fileEngineRunByName.getAbsolutePath()) == null) { createFileTab(fileEngineRunByName); ThreadUtil.wait(100); } // BowlerStudioModularFrame.getBowlerStudioModularFrame().setSelectedTab(openFiles.get(fileEngineRunByName.getAbsolutePath())); // com.neuronrobotics.sdk.common.Log.error("Highlighting "+fileEngineRunByName+" // at line // "+lineNumber+" to color "+color); try { widgets.get(fileEngineRunByName.getAbsolutePath()).setHighlight(lineNumber, color); } catch (Throwable e) { e.printStackTrace(); } } public static void highlightException(File fileEngineRunByName, Throwable ex) { if (bowlerStudioControllerStaticReference != null) bowlerStudioControllerStaticReference.highlightExceptionLocal(fileEngineRunByName, ex); } public static void clearHighlight() { bowlerStudioControllerStaticReference.clearHighlits(); } private void highlightExceptionLocal(File fileEngineRunByName, Throwable ex) { // THis needs to gate on checking if this thread is running already if (runningExceptionHighlight) { ex.printStackTrace(); new RuntimeException("Only one exception Highlight can be called at once!").printStackTrace(); return; } new Thread() { public void run() { runningExceptionHighlight = true; setName("Highlighter thread"); if (fileEngineRunByName != null) { if (openFiles.get(fileEngineRunByName.getAbsolutePath()) == null) { createFileTab(fileEngineRunByName); } BowlerStudioModularFrame.getBowlerStudioModularFrame() .setSelectedTab(openFiles.get(fileEngineRunByName.getAbsolutePath())); try { widgets.get(fileEngineRunByName.getAbsolutePath()).clearHighlits(); } catch (java.lang.NullPointerException e) { return; } // com.neuronrobotics.sdk.common.Log.error("Highlighting "+fileEngineRunByName+" // at line // "+lineNumber+" to color "+color); StackTraceElement[] stackTrace = ex.getStackTrace(); for (StackTraceElement el : stackTrace) { try { // com.neuronrobotics.sdk.common.Log.error("Compairing // "+fileEngineRunByName.getName()+" to // "+el.getFileName()); if (el.getFileName().contentEquals(fileEngineRunByName.getName())) { widgets.get(fileEngineRunByName.getAbsolutePath()).setHighlight(el.getLineNumber(), java.awt.Color.CYAN); } } catch (Exception e) { // StringWriter sw = new StringWriter(); // PrintWriter pw = new PrintWriter(sw); // e.printStackTrace(pw); // com.neuronrobotics.sdk.common.Log.error(sw.toString()); } } if (ex.getCause() != null) { for (StackTraceElement el : ex.getCause().getStackTrace()) { try { // com.neuronrobotics.sdk.common.Log.error("Compairing // "+fileEngineRunByName.getName()+" to // "+el.getFileName()); if (el.getFileName().contentEquals(fileEngineRunByName.getName())) { widgets.get(fileEngineRunByName.getAbsolutePath()).setHighlight(el.getLineNumber(), java.awt.Color.CYAN); } } catch (Exception e) { // StringWriter sw = new StringWriter(); // PrintWriter pw = new PrintWriter(sw); // e.printStackTrace(pw); // com.neuronrobotics.sdk.common.Log.error(sw.toString()); } } } } try { if (widgets.get(fileEngineRunByName.getAbsolutePath()) != null) { String message = ex.getMessage(); // com.neuronrobotics.sdk.common.Log.error(message); if (message != null && message.contains(fileEngineRunByName.getName())) try { int indexOfFile = message.lastIndexOf(fileEngineRunByName.getName()); String fileSub = message.substring(indexOfFile); String[] fileAndNum = fileSub.split(":"); String FileNum = fileAndNum[1]; int linNum = Integer.parseInt(FileNum.trim()); widgets.get(fileEngineRunByName.getAbsolutePath()).setHighlight(linNum, java.awt.Color.CYAN); } catch (Exception e) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); com.neuronrobotics.sdk.common.Log.debug(sw.toString()); } } } catch (Exception ex1) { } try { String sw = org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(ex); com.neuronrobotics.sdk.common.Log.debug(sw.toString()); // space out the exception highlights, ensure any sub threads spawned here have // time to finish Thread.sleep(100); } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); } runningExceptionHighlight = false; } }.start(); } public void addTab(Tab tab, boolean closable) { Exception ex = new RuntimeException(); BowlerStudio.runLater(() -> { BowlerStudioModularFrame.getBowlerStudioModularFrame().addTab(tab, closable); }, ex); } public static boolean removeObject(Object p) { if (CSG.class.isInstance(p)) { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().removeObject((CSG) p); }); return true; } if (Node.class.isInstance(p) || Polygon.class.isInstance(p)) { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().clearUserNode(); }); return true; } if (Tab.class.isInstance(p)) { Tab newTab = (Tab) p; BowlerStudioModularFrame.getBowlerStudioModularFrame().closeTab(newTab); return true; } // ThreadUtil.wait(20); return false; } // private boolean removeObject(Object p) { // if (CSG.class.isInstance(p) || Node.class.isInstance(p) || // Polygon.class.isInstance(p)) { // BowlerStudio.runLater(() -> { // CreatureLab3dController.getEngine().removeObjects(); // CreatureLab3dController.getEngine().clearUserNode(); // }); // return true; // } // // ThreadUtil.wait(20); // return false; // } public static void setCsg(List toadd, File source) { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().removeObjects(); if (toadd != null) for (CSG c : toadd) { if (c != null) BowlerStudio.runLater(() -> CreatureLab3dController.getEngine().addObject(c, source, c.getColor().getOpacity(), CSGDatabase.getInstance())); } }); } public static void setCsg(List toadd) { setCsg(toadd, null); } public static void addCsg(CSG toadd) { addCsg(toadd, null); } public static void setUserNode(List toadd) { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().clearUserNode(); if (toadd != null) for (Node c : toadd) { CreatureLab3dController.getEngine().addUserNode(c); } }); } public static void addUserNode(Node toadd) { BowlerStudio.runLater(() -> { if (toadd != null) CreatureLab3dController.getEngine().addUserNode(toadd); }); } public static void setSelectedCsg(CSG obj) { CreatureLab3dController.getEngine().setSelectedCsg(obj); } public static void highlightCsg(CSG obj) { CreatureLab3dController.getEngine().setSelectedCsg(obj, true); } public static void setSelectedCsg(Vector3d v) { Affine manipulator2 = new Affine(); TransformNR poseToMove = new TransformNR(v.x, v.y, v.z, new RotationNR()); CreatureLab3dController.getEngine().focusToAffine(poseToMove, manipulator2); } public static void setSelectedCsg(TransformNR poseToMove) { Affine manipulator2 = new Affine(); CreatureLab3dController.getEngine().focusToAffine(poseToMove, manipulator2); } public static void setSelectedAffine(TransformNR poseToMove, Affine manipulator2) { CreatureLab3dController.getEngine().focusToAffine(poseToMove, manipulator2); } public static void targetAndFollow(TransformNR poseToMove, Affine manipulator2) { CreatureLab3dController.getEngine().targetAndFollow(poseToMove, manipulator2); } public static void setSelectedAffine(Affine af) { CreatureLab3dController.getEngine().focusToAffine(af); } public static void addCsg(CSG toadd, File source) { BowlerStudio.runLater(() -> { if (toadd != null) CreatureLab3dController.getEngine().addObject(toadd, source, toadd.getColor().getOpacity(), CSGDatabase.getInstance()); }); } public static void addObject(Object o, File source) { addObject(o, source, null); } public static void addObject(Object o, File source, ArrayList cache) { CreatureLab3dController.getEngine().addObject(o, source, cache); } public static MeshView createPolygonOutlineMesh(List vertices) { TriangleMesh mesh = new TriangleMesh(); // This is a simplified approach - for true line rendering in 3D, // you might want to use a more sophisticated mesh generation // or consider using external 3D libraries like FXYZ3D // Add vertices to mesh (this creates a basic wireframe approximation) for (Vertex v : vertices) { mesh.getPoints().addAll((float) v.getX(), (float) v.getY(), (float) v.getZ()); } // Add texture coordinates (required but minimal for wireframe) mesh.getTexCoords().addAll(0, 0); // Add faces (connecting consecutive vertices) for (int i = 0; i < vertices.size(); i++) { int next = (i + 1) % vertices.size(); // Create degenerate triangles for line effect mesh.getFaces().addAll(i, 0, next, 0, i, 0); } MeshView meshView = new MeshView(mesh); meshView.setDrawMode(javafx.scene.shape.DrawMode.LINE); // Wireframe mode return meshView; } public void addNode(Node o) { CreatureLab3dController.getEngine().addUserNode(o); } @SuppressWarnings({"unchecked"}) @Override public void onScriptFinished(Object result, Object Previous, File source) { Log.warning("Loading script results " + result + " previous " + Previous); // this is added in the script engine when the connection manager is // loaded clearObjects(Previous); clearObjects(result); ThreadUtil.wait(40); ArrayList cache = new ArrayList<>(); if (List.class.isInstance(result)) { List c = (List) result; for (int i = 0; i < c.size(); i++) { // Log.warning("Loading array Lists with removals " + c.get(i)); addObject(c.get(i), source, cache); } } else { addObject(result, source, cache); } if (cache.size() > 0) addObject(cache, source, null); // String git; // try { // git = ScriptingEngine.locateGitUrl(source); // if(cache.size()>0) { // if(git!=null) { // PrintBedManager manager=new PrintBedManager(git,cache); // addObject(manager.get(), source); // }else { // addObject(cache, source,null); // } // } // } catch (Exception e) { // // Auto-generated catch block // e.printStackTrace(); // addObject(cache, source,null); // } } private void clearObjects(Object o) { if (List.class.isInstance(o)) { @SuppressWarnings("unchecked") List c = (List) o; for (int i = 0; i < c.size(); i++) { clearObjects(c.get(i)); } } else { removeObject(o); } } @Override public void onScriptChanged(String previous, String current, File source) { } @Override public void onScriptError(Throwable except, File source) { // Auto-generated method stub } public void disconnect() { ConnectionManager.disconnectAll(); } public Stage getPrimaryStage() { // Auto-generated method stub return BowlerStudioModularFrame.getPrimaryStage(); } public AbstractImageProvider getVrCamera() { return vrCamera; } public void setVrCamera(AbstractImageProvider vrCamera) { this.vrCamera = vrCamera; } public static BowlerStudioController getBowlerStudio() { return bowlerStudioControllerStaticReference; } public static void setup() { // Auto-generated method stub } public static void clearCSG() { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().removeObjects(); }); } public static void clearUserNodes() { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().clearUserNode(); }); } public static void setCsg(CSG legAssembly, File cadScript) { BowlerStudio.runLater(() -> { CreatureLab3dController.getEngine().removeObjects(); if (legAssembly != null) BowlerStudio.runLater(() -> CreatureLab3dController.getEngine().addObject(legAssembly, cadScript)); }); } public static void setCsg(MobileBaseCadManager thread, File cadScript) { setCsg(thread.getAllCad(), cadScript); } public boolean isDoneLoadingTutorials() { return doneLoadingTutorials; } public void setDoneLoadingTutorials(boolean doneLoadingTutorials) { this.doneLoadingTutorials = doneLoadingTutorials; } public ConnectionManager getConnectionManager() { return connectionManager; } public void setConnectionManager(ConnectionManager connectionManager) { this.connectionManager = connectionManager; } public static IMobileBaseUI getMobileBaseUI() { return mbui; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudioFXMLController.java ================================================ package com.neuronrobotics.bowlerstudio; import java.net.URL; import java.util.ResourceBundle; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.control.SplitPane; import javafx.scene.control.TextArea; import javafx.scene.control.TitledPane; import javafx.scene.layout.AnchorPane; public class BowlerStudioFXMLController { @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="BowlerStudioMenue" private MenuBar BowlerStudioMenue; // Value injected by FXMLLoader @FXML // fx:id="CadControlsAnchor" private AnchorPane CadControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="CadTextSplit" private SplitPane CadTextSplit; // Value injected by FXMLLoader @FXML // fx:id="CommandLine" private AnchorPane CommandLine; // Value injected by FXMLLoader @FXML // fx:id="CreaturesMenu" private Menu CreaturesMenu; // Value injected by FXMLLoader @FXML // fx:id="DriveControlsAnchor" private AnchorPane DriveControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="GitHubRoot" private Menu GitHubRoot; // Value injected by FXMLLoader @FXML // fx:id="TempControlsAnchor" private AnchorPane TempControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="clearCache" private MenuItem clearCache; // Value injected by FXMLLoader @FXML // fx:id="commandLineTitledPane" private TitledPane commandLineTitledPane; // Value injected by FXMLLoader @FXML // fx:id="createNewGist" private MenuItem createNewGist; // Value injected by FXMLLoader @FXML // fx:id="editorContainer" private AnchorPane editorContainer; // Value injected by FXMLLoader @FXML // fx:id="jfx3dControls" private AnchorPane jfx3dControls; // Value injected by FXMLLoader @FXML // fx:id="logView" private AnchorPane logView; // Value injected by FXMLLoader @FXML // fx:id="logViewRef" private TextArea logViewRef; // Value injected by FXMLLoader @FXML // fx:id="logoutGithub" private MenuItem logoutGithub; // Value injected by FXMLLoader @FXML // fx:id="myGists" private Menu myGists; // Value injected by FXMLLoader @FXML // fx:id="myOrganizations" private Menu myOrganizations; // Value injected by FXMLLoader @FXML // fx:id="myRepos" private Menu myRepos; // Value injected by FXMLLoader @FXML // fx:id="overlayScrollPanel" private ScrollPane overlayScrollPanel; // Value injected by FXMLLoader @FXML // fx:id="viewContainer" private AnchorPane viewContainer; // Value injected by FXMLLoader @FXML // fx:id="watchingRepos" private Menu watchingRepos; // Value injected by FXMLLoader // Handler for MenuItem[fx:id="clearCache"] onAction @FXML void clearScriptCache(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@3d05e65e] onAction @FXML void onClose(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@6127215f] onAction @FXML void onConnect(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@1d163e1a] onAction @FXML void onConnectCHDKCamera(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@3cad92b8] onAction @FXML void onConnectCVCamera(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@542487b1] onAction @FXML void onConnectFileSourceCamera(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@4845d9d8] onAction @FXML void onConnectGamePad(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@36100c4d] onAction @FXML void onConnectHokuyoURG(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@7a7cbb68] onAction @FXML void onConnectPidSim(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@7d3d14a7] onAction @FXML void onConnectURLSourceCamera(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@68e8dfb1] onAction @FXML void onConnectVirtual(ActionEvent event) { // handle the event here } // Handler for MenuItem[fx:id="createNewGist"] onAction @FXML void onCreatenewGist(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@6bfd67ba] onAction @FXML void onLoadFile(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@41a2e40f] onAction @FXML void onLogin(ActionEvent event) { // handle the event here } // Handler for MenuItem[fx:id="logoutGithub"] onAction @FXML void onLogout(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@7e3e1a61] onAction @FXML void onMobileBaseFromFile(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@57184345] onAction @FXML void onMobileBaseFromGit(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@d523af5] onAction @FXML void onOpenGitter(ActionEvent event) { // handle the event here } // Handler for MenuItem[javafx.scene.control.MenuItem@2a1c81e] onAction @FXML void onPrint(ActionEvent event) { // handle the event here } @FXML // This method is called by the FXMLLoader when initialization is complete void initialize() { assert BowlerStudioMenue != null : "fx:id=\"BowlerStudioMenue\" was not injected: check your FXML file 'Main.fxml'."; assert CadControlsAnchor != null : "fx:id=\"CadControlsAnchor\" was not injected: check your FXML file 'Main.fxml'."; assert CadTextSplit != null : "fx:id=\"CadTextSplit\" was not injected: check your FXML file 'Main.fxml'."; assert CommandLine != null : "fx:id=\"CommandLine\" was not injected: check your FXML file 'Main.fxml'."; assert CreaturesMenu != null : "fx:id=\"CreaturesMenu\" was not injected: check your FXML file 'Main.fxml'."; assert DriveControlsAnchor != null : "fx:id=\"DriveControlsAnchor\" was not injected: check your FXML file 'Main.fxml'."; assert GitHubRoot != null : "fx:id=\"GitHubRoot\" was not injected: check your FXML file 'Main.fxml'."; assert TempControlsAnchor != null : "fx:id=\"TempControlsAnchor\" was not injected: check your FXML file 'Main.fxml'."; assert clearCache != null : "fx:id=\"clearCache\" was not injected: check your FXML file 'Main.fxml'."; assert commandLineTitledPane != null : "fx:id=\"commandLineTitledPane\" was not injected: check your FXML file 'Main.fxml'."; assert createNewGist != null : "fx:id=\"createNewGist\" was not injected: check your FXML file 'Main.fxml'."; assert editorContainer != null : "fx:id=\"editorContainer\" was not injected: check your FXML file 'Main.fxml'."; assert jfx3dControls != null : "fx:id=\"jfx3dControls\" was not injected: check your FXML file 'Main.fxml'."; assert logView != null : "fx:id=\"logView\" was not injected: check your FXML file 'Main.fxml'."; assert logViewRef != null : "fx:id=\"logViewRef\" was not injected: check your FXML file 'Main.fxml'."; assert logoutGithub != null : "fx:id=\"logoutGithub\" was not injected: check your FXML file 'Main.fxml'."; assert myGists != null : "fx:id=\"myGists\" was not injected: check your FXML file 'Main.fxml'."; assert myOrganizations != null : "fx:id=\"myOrganizations\" was not injected: check your FXML file 'Main.fxml'."; assert myRepos != null : "fx:id=\"myRepos\" was not injected: check your FXML file 'Main.fxml'."; assert overlayScrollPanel != null : "fx:id=\"overlayScrollPanel\" was not injected: check your FXML file 'Main.fxml'."; assert viewContainer != null : "fx:id=\"viewContainer\" was not injected: check your FXML file 'Main.fxml'."; assert watchingRepos != null : "fx:id=\"watchingRepos\" was not injected: check your FXML file 'Main.fxml'."; // Initialize your logic here: all @FXML variables will have been injected } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudioMenu.java ================================================ package com.neuronrobotics.bowlerstudio; /** * Sample Skeleton for "BowlerStudioMenuBar.fxml" Controller Class * You can copy and paste this code into your favorite IDE **/ import com.google.common.collect.Lists; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.scripting.IGithubLoginListener; import com.neuronrobotics.bowlerstudio.scripting.PasswordManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.bowlerstudio.tabs.LocalFileScriptTab; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; //import com.neuronrobotics.imageprovider.CHDKImageProvider; import com.neuronrobotics.nrconsole.util.FileSelectionFactory; import com.neuronrobotics.nrconsole.util.PromptForGit; import com.neuronrobotics.pidsim.LinearPhysicsEngine; import com.neuronrobotics.sdk.addons.kinematics.MobileBase; import com.neuronrobotics.sdk.pid.VirtualGenericPIDDevice; import com.neuronrobotics.sdk.util.ThreadUtil; import eu.mihosoft.vrl.v3d.CSG; import eu.mihosoft.vrl.v3d.parametrics.CSGDatabase; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.Event; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; import javafx.stage.FileChooser.ExtensionFilter; import javafx.stage.Stage; import javafx.scene.layout.*; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.NoHeadException; import org.eclipse.jgit.api.errors.WrongRepositoryStateException; import org.eclipse.jgit.errors.RevisionSyntaxException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.kohsuke.github.*; import java.awt.Desktop; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.text.Normalizer; import java.text.Normalizer.Form; import java.text.SimpleDateFormat; import java.util.*; import java.util.function.Consumer; import java.util.regex.Pattern; import java.util.stream.Collectors; public class BowlerStudioMenu implements MenuRefreshEvent, INewVitaminCallback { @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="CreaturesMenu" private Menu CreaturesMenu; // Value injected by FXMLLoader @FXML // fx:id="GitHubRoot" private Menu GitHubRoot; // Value injected by FXMLLoader @FXML // fx:id="workspacemenu" private Menu workspacemenuHandle; // Value injected by FXMLLoader @FXML // fx:id="MeneBarBowlerStudio" private MenuBar MeneBarBowlerStudio; // Value injected by FXMLLoader @FXML // fx:id="addMarlinGCODEDevice" private MenuItem addMarlinGCODEDevice; // Value injected by FXMLLoader @FXML // fx:id="addMarlinGCODEDevice" private MenuItem loadFirmata; // Value injected by FXMLLoader @FXML // fx:id="clearCache" private MenuItem clearCache; // Value injected by FXMLLoader @FXML // fx:id="createNewGist" private MenuItem createNewGist; // Value injected by FXMLLoader @FXML // fx:id="logoutGithub" private MenuItem logoutGithub; // Value injected by FXMLLoader @FXML // fx:id="myGists" private Menu myGists; // Value injected by FXMLLoader @FXML // fx:id="myOrganizations" private Menu myOrganizations; // Value injected by FXMLLoader @FXML // fx:id="myRepos" private Menu myRepos; // Value injected by FXMLLoader @FXML // fx:id="showDevicesPanel" private MenuItem showDevicesPanel; // Value injected by FXMLLoader @FXML // fx:id="showCreatureLab" private MenuItem showCreatureLab; // Value injected by FXMLLoader @FXML // fx:id="showTerminal" private MenuItem showTerminal; @FXML // fx:id="showTerminal" private Menu WindowMenu; @FXML // fx:id="watchingRepos" private Menu watchingRepos; // Value injected by FXMLLoader @FXML private Menu vitaminsMenu; @FXML private MenuItem addNewVitamin; private BowlerStudioModularFrame bowlerStudioModularFrame; private String username; private static BowlerStudioMenu selfRef = null; private File openFile; private Map myPublic; // PagedIterable gists ; private HashMap messages = new HashMap(); private static SimpleDateFormat format = new SimpleDateFormat("E 'the' dd 'in' MMM-yyyy 'at' HH:mm"); private static SimpleDateFormat formatSimple = new SimpleDateFormat("MM-dd"); private static IssueReportingExceptionHandler exp = new IssueReportingExceptionHandler(); private static final Pattern NONLATIN = Pattern.compile("[^\\w-]"); private static final Pattern WHITESPACE = Pattern.compile("[\\s]"); private HashMap vitaminTypeMenus = new HashMap(); private CreatureLab3dController creatureLab3dController; public BowlerStudioMenu(BowlerStudioModularFrame tl, CreatureLab3dController creatureLab3dController) { bowlerStudioModularFrame = tl; this.creatureLab3dController = creatureLab3dController; } @FXML public void onMobileBaseFromGist(ActionEvent event) { PromptForGit.prompt("Select a Creature From a Gist", "bcb4760a449190206170", (gitsId, file) -> { loadMobilebaseFromGist(gitsId, file); }); } public void loadMobilebaseFromGist(String id, String file) { loadMobilebaseFromGit("https://gist.github.com/" + id + ".git", file); } public MenuBar getMeneBarBowlerStudio() { return MeneBarBowlerStudio; } public void setMeneBarBowlerStudio(MenuBar meneBarBowlerStudio) { MeneBarBowlerStudio = meneBarBowlerStudio; } public void loadMobilebaseFromGit(String id, String file) { new Thread() { Exception ex = new Exception("Error Loading " + id + ":" + file); // String stacktraceFromCatch = // org.apache.commons.lang.exception.ExceptionUtils.getStackTrace(ex); public void run() { File f = null; try { f = ScriptingEngine.fileFromGit(id, file); runScriptFromGit(id, file); } catch (Throwable e) { System.err.println("Error Loading " + id + ":" + file); BowlerStudio.printStackTrace(e, f); BowlerStudio.printStackTrace(ex, f); // exp.except(ex,stacktraceFromCatch); } } private void runScriptFromGit(String id, String file) throws Exception { MobileBase mb; ScriptingEngine.pull(id); mb = (MobileBase) ScriptingEngine.gitScriptRun(CSGDatabase.getInstance(), id, file, null); if (mb != null) ConnectionManager.addConnection(mb, mb.getScriptingName()); else System.err.println("\r\n\r\nNO MOBILE BASE found at " + id + "\t" + file); } }.start(); } public void openUrlInNewTab(URL url) { bowlerStudioModularFrame.openUrlInNewTab(url); } public void setToLoggedOut() { this.username = ""; BowlerStudio.runLater(() -> { myGists.getItems().clear(); logoutGithub.disableProperty().set(true); logoutGithub.setText("Anonymous"); // ConfigurationDatabase.loginEvent(null); this.username = null; }); while (this.username != null) ThreadUtil.wait(4); } public void setToLoggedIn() { setToLoggedIn(username); } private void setToLoggedIn(final String n) { // new Exception().printStackTrace(); if (n == null) return; this.username = n; BowlerStudio.runLater(() -> { logoutGithub.disableProperty().set(false); logoutGithub.setText("Log out " + username); new Thread() { public void run() { // ConfigurationDatabase.loginEvent(username); // ConfigurationDatabase.getParamMap("workspace"); com.neuronrobotics.sdk.common.Log.debug("Login Success " + n); BowlerStudioMenuWorkspace.loginEvent(); if (!PasswordManager.hasNetwork()) return; GitHub gh = PasswordManager.getGithub(); while (gh == null || !PasswordManager.loggedIn()) { gh = PasswordManager.getGithub(); ThreadUtil.wait(200); } new Thread(() -> { openFilesInUI(); }).start(); GitHub github = gh; loadOrganizations(github); loadMyRepos(github); loadWatchingRepos(github); LoadGistMenu(github); } }.start(); }); } private void openFilesInUI() { String key = "studio-open-file"; // HashMap openGits = // ConfigurationDatabase.getParamMap("studio-open-file"); Object[] set = ConfigurationDatabase.keySet("studio-open-file").toArray(); for (int i = 0; i < set.length; i++) { try { Thread.sleep(300); } catch (InterruptedException e1) { e1.printStackTrace(); } if (String.class.isInstance(set[i])) { String s = (String) set[i]; try { @SuppressWarnings("unchecked") ArrayList repoFile = (ArrayList) ConfigurationDatabase.getObject(key, s, new ArrayList<>()); File f = ScriptingEngine.fileFromGit(repoFile.get(0), repoFile.get(1)); if (!f.exists() || (BowlerStudio.createFileTab(f) == null)) { ConfigurationDatabase.removeObject(key, s); System.err.println("Removing missing " + s); } } catch (Throwable e) { ConfigurationDatabase.removeObject(key, s); System.err.println("Error loading file " + s); } } } // HashMap openWeb = // ConfigurationDatabase.getParamMap("studio-open-web"); String webKey = "studio-open-web"; for (String s : ConfigurationDatabase.keySet(webKey)) { String repoFile = (String) ConfigurationDatabase.getObject(webKey, s, null); if (repoFile != null) try { bowlerStudioModularFrame.openUrlInNewTab(new URI(repoFile).toURL()); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } } } private void loadWatchingRepos(GitHub github) { new Thread(() -> { BowlerStudio.runLater(() -> watchingRepos.getItems().clear()); ThreadUtil.wait(20); GHMyself self; try { self = github.getMyself(); // Watched repos List watching = self.listSubscriptions().asList(); HashMap ownerMenue = new HashMap<>(); for (GHRepository g : watching) { if (ownerMenue.get(g.getOwnerName()) == null) { ownerMenue.put(g.getOwnerName(), new Menu(g.getOwnerName())); BowlerStudio.runLater(() -> { try { watchingRepos.getItems().add(ownerMenue.get(g.getOwnerName())); } catch (Exception e) { } }); } resetRepoMenue(ownerMenue.get(g.getOwnerName()), g); } } catch (IOException e1) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e1); } }).start(); } private void loadMyRepos(GitHub github) { new Thread(() -> { BowlerStudio.runLater(() -> myRepos.getItems().clear()); ThreadUtil.wait(20); // Repos I own try { GHMyself self = github.getMyself(); myPublic = self.getAllRepositories(); HashMap myownerMenue = new HashMap<>(); for (Map.Entry entry : myPublic.entrySet()) { GHRepository g = entry.getValue(); if (myownerMenue.get(g.getOwnerName()) == null) { myownerMenue.put(g.getOwnerName(), new Menu(g.getOwnerName())); BowlerStudio.runLater(() -> { String ownerName = g.getOwnerName(); if (ownerName == null) throw new RuntimeException("ownerName can not be null"); Menu e = myownerMenue.get(ownerName); if (e == null) throw new RuntimeException("Menu can not be null"); ObservableList items = myRepos.getItems(); if (items == null) throw new RuntimeException("Menue items can not be null"); items.add(e); }); } resetRepoMenue(myownerMenue.get(g.getOwnerName()), g); } } catch (Exception ex) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), ex); // i have no public repso } }).start(); } private void loadOrganizations(GitHub github) { new Thread(() -> { BowlerStudio.runLater(() -> myOrganizations.getItems().clear()); ThreadUtil.wait(20); Map orgs; try { orgs = github.getMyOrganizations(); for (Map.Entry entry : orgs.entrySet()) { // System.err.println("Org: "+org); Menu OrgItem = new Menu(entry.getKey()); GHOrganization ghorg = entry.getValue(); Map repos = ghorg.getRepositories(); for (Map.Entry entry1 : repos.entrySet()) { resetRepoMenue(OrgItem, entry1.getValue()); } BowlerStudio.runLater(() -> { myOrganizations.getItems().add(OrgItem); }); } } catch (Exception e) { PasswordManager.checkInternet(); if (PasswordManager.hasNetwork()) new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } }).start(); } private void LoadGistMenu(GitHub github) { new Thread(() -> { GHMyself myself; try { myself = github.getMyself(); System.err.println("Loading all my Gists"); BowlerStudio.runLater(() -> { myGists.getItems().clear(); }); List gists = myself.listGists().asList(); for (GHGist gist : gists) { String url = gist.getGitPushUrl(); String desc = gist.getDescription(); if (desc == null || desc.length() == 0 || desc.contentEquals("Adding new file from BowlerStudio")) { desc = gist.getFiles().keySet().toArray()[0].toString(); } String descriptionString = desc; getSelfRef().messages.put(url, "GIST: " + descriptionString); // Menu tmpGist = new Menu(desc); // setUpRepoMenue(ownerMenue.get(g.getOwnerName()), g); setUpRepoMenue(myGists, url, true, true); } } catch (IOException e) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } }).start(); } public static String gitURLtoMessage(String url) { for (int i = 0; i < 5; i++) { try { if (getSelfRef().messages.get(url) != null) break; throw new RuntimeException(); } catch (Exception e) { try { Thread.sleep(500); } catch (InterruptedException e1) { e1.printStackTrace(); } } } String string = getSelfRef().messages.get(url); if (string == null) string = url; return string; } public static void setUpRepoMenue(Menu repoMenue, String url, boolean useAddToWorkspaceItem, boolean threaded) { if (url.endsWith(".git")) setUpRepoMenue(repoMenue, url, useAddToWorkspaceItem, threaded, gitURLtoMessage(url)); } private static void resetRepoMenue(Menu repoMenue, GHRepository repo) { String url = repo.getGitTransportUrl().replace("git://", "https://"); getSelfRef().messages.put(url, repo.getFullName()); setUpRepoMenue(repoMenue, url, true, true); } public static void setUpRepoMenue(Menu repoMenue, String url, boolean useAddToWorkspaceItem, boolean threaded, String message) { Thread t = new Thread() { public void run() { // String menueMessage = repo.getFullName(); Menu orgRepo = new Menu(message); Menu orgFiles = new Menu("Files"); Menu orgCommits = new Menu("Commits"); Menu orgBranches = new Menu("Branches"); MenuItem updateRepo = new MenuItem("Update Repo..."); MenuItem addToWs = new MenuItem("Add Repo to Workspace"); addToWs.setOnAction(event -> { new Thread() { public void run() { BowlerStudioMenuWorkspace.add(url); } }.start(); }); // String url = repo.getGitTransportUrl().replace("git://", "https://"); MenuResettingEventHandler loadCommitsEvent = createLoadCommitsEvent(url, orgCommits); MenuResettingEventHandler loadBranchesEvent = createLoadBranchesEvent(url, orgBranches); MenuResettingEventHandler loadFilesEvent = createLoadFileEvent(url, orgFiles); Runnable myEvent = new Runnable() { @Override public void run() { try { // System.err.println("\n\nCommit event Detected " + url + " on branch " // + ScriptingEngine.getBranch(url)); // new RuntimeException().printStackTrace(); BowlerStudio.runLater(() -> resetMenueForLoadingFiles("Files:", orgFiles, loadFilesEvent)); BowlerStudio.runLater( () -> resetMenueForLoadingFiles("Commits:", orgCommits, loadCommitsEvent)); BowlerStudio.runLater( () -> resetMenueForLoadingFiles("Branches:", orgBranches, loadBranchesEvent)); } catch (Throwable e) { exp.uncaughtException(Thread.currentThread(), e); } } }; loadCommitsEvent.setMenuReset(myEvent); loadBranchesEvent.setMenuReset(myEvent); loadFilesEvent.setMenuReset(myEvent); updateRepo.setOnAction(event -> { new Thread() { @SuppressWarnings("restriction") public void run() { try { ScriptingEngine.pull(url, ScriptingEngine.getBranch(url)); } catch (WrongRepositoryStateException ex) { // ignore unsaved files BowlerStudio.runLater(() -> { @SuppressWarnings("restriction") Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("You have Un-Saved work, commit first"); alert.setHeaderText("You have Un-Saved work, commit first"); alert.setContentText("You have Un-Saved work, commit first"); }); } catch (Exception e) { BowlerStudioMenu.checkandDelete(url); } myEvent.run(); // selfRef.onRefresh(null); } }.start(); }); MenuItem makeRelease = new MenuItem("Make Release..."); makeRelease.setOnAction(event -> { System.err.println("Releasing " + url); BowlerStudio.runLater(() -> { Stage s = new Stage(); MakeReleaseController controller = new MakeReleaseController(url); try { controller.start(s); } catch (Exception e) { e.printStackTrace(); } myEvent.run(); // selfRef.onRefresh(null); }); }); MenuItem addFile = new MenuItem("Add file to Git Repo..."); addFile.setOnAction(event -> { System.err.println("Adding file to : " + url); BowlerStudio.runLater(() -> { Stage s = new Stage(); AddFileToGistController controller = new AddFileToGistController(url, getSelfRef()); try { controller.start(s); } catch (Exception e) { e.printStackTrace(); } myEvent.run(); // selfRef.onRefresh(null); }); }); MenuItem delete = new MenuItem("Delete Local Copy..."); delete.setOnAction(event -> { checkandDelete(url); }); ScriptingEngine.addOnCommitEventListeners(url, myEvent); orgRepo.setOnShowing(event -> { // On showing the menu, set up the rest of the handlers new Thread(myEvent).start(); }); BowlerStudio.runLater(() -> { if (useAddToWorkspaceItem) orgRepo.getItems().add(addToWs); orgRepo.getItems().addAll(updateRepo, addFile, makeRelease, orgFiles, orgCommits, orgBranches, delete); // BowlerStudio.runLater(() -> { repoMenue.getItems().add(orgRepo); // }); }); } }; if (threaded) t.start(); else t.run(); } public static void checkandDelete(String url) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Are you sure you have published all your work?"); alert.setHeaderText("This will wipe out the local cache for " + url); alert.setContentText("All files that are not published will be deleted"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { new Thread(() -> { ScriptingEngine.deleteRepo(url); BowlerStudioMenuWorkspace.remove(url); }).start(); } else { System.err.println("Nothing was deleted"); } }); } private static MenuResettingEventHandler createLoadCommitsEvent(String url, Menu orgCommits) { return new MenuResettingEventHandler() { public boolean gistFlag = false; @Override public void handle(Event event) { if (gistFlag) { System.err.println("Another thread is managing this event " + url); return;// another thread is // servicing this gist } gistFlag = true; String branchName; try { branchName = ScriptingEngine.getFullBranch(url); } catch (Exception e1) { exp.uncaughtException(Thread.currentThread(), e1); return; } System.err.println("Load Commits event " + url + " on branch " + branchName); new Thread(() -> { BowlerStudio.runLater(() -> { // removing this listener // after menue is activated // for the first time orgCommits.setOnShowing(null); gistFlag = false; }); try { ScriptingEngine.checkout(url, branchName); ScriptingEngine.openGit(url, git -> { Repository repo = git.getRepository(); // System.err.println("Commits of branch: " + branchName); // System.err.println("-------------------------------------"); ObjectId resolve = repo.resolve(branchName); if (resolve != null) { Iterable commits = git.log().add(resolve).call(); List commitsList = Lists.newArrayList(commits.iterator()); BowlerStudio.runLater(() -> { try { orgCommits.getItems() .add(new MenuItem("On Branch " + ScriptingEngine.getBranch(url))); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } orgCommits.getItems().add(new SeparatorMenuItem()); }); // RevCommit previous = null; for (RevCommit commit : commitsList) { String date = format.format(new Date(commit.getCommitTime() * 1000L)); String fullData = commit.getName() + "\r\n" + commit.getAuthorIdent().getName() + "\r\n" + date + "\r\n" + commit.getFullMessage() + "\r\n" + "---------------------------------------------------\r\n";// + // previous==null?"":getDiffOfCommit(previous,commit, repo, git); // previous = commit; String string = date + " " + commit.getAuthorIdent().getName() + " " + commit.getShortMessage(); if (string.length() > 80) string = string.substring(0, 80); // MenuItem tmp = new MenuItem(string); CustomMenuItem tmp = new CustomMenuItem(new Label(string)); Tooltip tooltip = new Tooltip(fullData); Tooltip.install(tmp.getContent(), tooltip); tmp.setOnAction(ev -> { new Thread() { public void run() { com.neuronrobotics.sdk.common.Log .error("Selecting \r\n\r\n" + fullData); String branch; try { branch = ScriptingEngine.getBranch(url); } catch (Exception e1) { branch = "newBranch"; } String dateString = formatSimple .format(new Date(commit.getCommitTime() * 1000L)); promptForNewBranch(branch + "-" + dateString, "Creating Branch From Commit:\n\n" + fullData, newBranch -> { new Thread() { public void run() { try { String slugify = slugify(newBranch); com.neuronrobotics.sdk.common.Log .error("Creating " + slugify); ScriptingEngine.setCommitContentsAsCurrent(url, slugify, commit); } catch (IOException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (GitAPIException e) { exp.uncaughtException(Thread.currentThread(), e); } } }.start(); }); } }.start(); }); BowlerStudio.runLater(() -> { orgCommits.getItems().add(tmp); }); } } }); BowlerStudio.runLater(() -> { orgCommits.hide(); BowlerStudio.runLater(() -> { orgCommits.show(); }); }); } catch (IOException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (RevisionSyntaxException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (NoHeadException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (GitAPIException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (Throwable e) { exp.uncaughtException(Thread.currentThread(), e); } }).start(); } }; } public static String slugify(String input) { String nowhitespace = WHITESPACE.matcher(input).replaceAll("-"); String normalized = Normalizer.normalize(nowhitespace, Form.NFD); String slug = NONLATIN.matcher(normalized).replaceAll("").replace('-', '_'); return slug; } private static void promptForNewBranch(String exampleName, String reasonForCreating, Consumer resultEvent) { BowlerStudio.runLater(() -> { TextInputDialog alert = new TextInputDialog(exampleName); alert.setTitle("Create New Branch"); alert.setHeaderText(reasonForCreating); alert.setContentText("Enter a new branch name: "); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(resultEvent); }); } private static MenuResettingEventHandler createLoadBranchesEvent(String url, Menu orgBranches) { return new MenuResettingEventHandler() { public boolean gistFlag = false; // EventHandler thisEvent = this; @Override public void handle(Event event) { if (gistFlag) { System.err.println("Another thread is managing this event " + url); return;// another thread is // servicing this gist } gistFlag = true; System.err.println("Load Branches event " + url); final MenuItem onBranch; try { onBranch = new MenuItem("On Branch " + ScriptingEngine.getBranch(url)); } catch (Exception e1) { exp.uncaughtException(Thread.currentThread(), e1); return; } ; new Thread(() -> { BowlerStudio.runLater(() -> { // removing this listener // after menue is activated // for the first time orgBranches.setOnShowing(null); gistFlag = false; }); MenuItem newBranchItem = new MenuItem("New Branch..."); String newBranchName = ""; try { newBranchName = ScriptingEngine.getBranch(url); } catch (Exception e1) { exp.uncaughtException(Thread.currentThread(), e1); return; } String newBranchName1 = newBranchName; String dateString = formatSimple.format(new Date()); newBranchItem.setOnAction(event1 -> { promptForNewBranch(newBranchName1 + "-" + dateString, "Create a new Branch from " + newBranchName1, newBranch -> { new Thread() { public void run() { try { String slugify = slugify(newBranch); System.err.println("Creating Branch " + slugify); ScriptingEngine.newBranch(url, slugify); getMenuReset().run(); } catch (IOException e) { exp.uncaughtException(Thread.currentThread(), e); } catch (GitAPIException e) { exp.uncaughtException(Thread.currentThread(), e); } } }.start(); }); }); BowlerStudio.runLater(() -> { try { onBranch.setText("On Branch " + ScriptingEngine.getBranch(url)); orgBranches.getItems().add(onBranch); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } orgBranches.getItems().add(new SeparatorMenuItem()); orgBranches.getItems().add(newBranchItem); orgBranches.getItems().add(new SeparatorMenuItem()); }); if (PasswordManager.hasNetwork()) try { Collection branches = ScriptingEngine.getAllBranches(url); for (Ref r : branches) { createRepoMenuItem(url, orgBranches, onBranch, r, getMenuReset()); } } catch (Throwable e) { exp.uncaughtException(Thread.currentThread(), e); } System.err.println("Refreshing menu Branches"); BowlerStudio.runLater(() -> { orgBranches.hide(); BowlerStudio.runLater(() -> { orgBranches.show(); }); }); }).start(); } }; } private static void createRepoMenuItem(String url, Menu orgBranches, final MenuItem onBranch, Ref r, Runnable menureset) { String[] name2 = r.getName().split("/"); MenuItem tmp = new MenuItem(name2[name2.length - 1]); Ref select = r; String[] name = select.getName().split("/"); String myName = name[name.length - 1]; // System.err.println("Selecting Branch\r\n"+url+" // \t\t"+myName); tmp.setOnAction(ev -> { new Thread() { public void run() { try { switchToThisNewBranch(url, onBranch, select, myName); menureset.run(); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } } private void switchToThisNewBranch(String url, final MenuItem onBranch, Ref select, String myName) throws Exception { String was = ScriptingEngine.getBranch(url); try { ScriptingEngine.checkout(url, select); } catch (org.eclipse.jgit.api.errors.CheckoutConflictException ex) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.ERROR);// line 1 alert.setTitle("CheckoutConflictException");// line 2 alert.setHeaderText("This repo is in an a dirty state");// line 3 alert.setContentText( "Please commit your changes before switching.\nAlternatly you can revert your changes.\nRepository must not have uncommitted changes before changing branches.");// line // 4 Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); // line 5 }); return; } String s = ScriptingEngine.getBranch(url); if (myName.contentEquals(s)) com.neuronrobotics.sdk.common.Log .error("Changing from " + was + " to " + myName + " is now " + s + "... Success!"); onBranch.setText("On Branch " + s); } }.start(); }); BowlerStudio.runLater(() -> { orgBranches.getItems().add(tmp); }); } @FXML public void onLoadFile(ActionEvent e) { new Thread() { public void run() { setName("Load File Thread"); if (openFile == null) openFile = ScriptingEngine.getLastFile(); openFile = FileSelectionFactory.GetFile(openFile, new ExtensionFilter("All", "*.*"), new ExtensionFilter("Groovy Scripts", "*.groovy", "*.java", "*.txt"), new ExtensionFilter("Clojure", "*.cloj", "*.clj", "*.txt", "*.clojure"), new ExtensionFilter("Python", "*.py", "*.python", "*.txt"), new ExtensionFilter("DXF", "*.dxf", "*.DXF"), new ExtensionFilter("GCODE", "*.gcode", "*.nc", "*.ncg", "*.txt"), new ExtensionFilter("Image", "*.jpg", "*.jpeg", "*.JPG", "*.png", "*.PNG"), new ExtensionFilter("STL", "*.stl", "*.STL", "*.Stl")); if (openFile == null) { return; } bowlerStudioModularFrame.createFileTab(openFile); } }.start(); } private static void resetMenueForLoadingFiles(String string, Menu orgFiles, EventHandler loadFiles) { BowlerStudio.runLater(() -> { try { BowlerStudio.runLater(() -> { orgFiles.getItems().clear(); // orgFiles.hide(); BowlerStudio.runLater(() -> { orgFiles.getItems().add(new MenuItem(string)); orgFiles.getItems().add(new SeparatorMenuItem()); orgFiles.setOnShowing(loadFiles); // BowlerStudio.runLater(() ->orgFiles.show()); }); }); } catch (Throwable t) { t.printStackTrace(); } }); } private static MenuResettingEventHandler createLoadFileEvent(String url, Menu orgFiles) { return new MenuResettingEventHandler() { public boolean gistFlag = false; @Override public void handle(Event ev) { if (gistFlag) { System.err.println("Another thread is managing this event"); return;// another thread is // servicing this gist } gistFlag = true; System.err.println("Load file event " + url); new Thread() { public void run() { setName("Load file Thread " + url); System.err.println("Loading files for " + url + " "); ArrayList listofFiles; try { listofFiles = ScriptingEngine.filesInGit(url, ScriptingEngine.getFullBranch(url), null); com.neuronrobotics.sdk.common.Log .error("Clone Done for " + url + listofFiles.size() + " files"); } catch (Exception e1) { e1.printStackTrace(); return; } // if (orgFiles.getItems().size() != 1) { // Log.warning("Bailing out of loading thread"); // return;// menue populated by // // another thread // } BowlerStudio.runLater(() -> { // removing this listener // after menue is activated // for the first time orgFiles.setOnShowing(null); gistFlag = false; }); for (String s : listofFiles) { System.err.println("Adding file: " + s); String string = s; if (s.length() > 80) s = s.substring(0, 10) + "..." + s.substring(s.length() - 70, s.length() - 1); MenuItem tmp = new MenuItem(s); tmp.setOnAction(event -> { new Thread() { public void run() { try { File fileSelected = ScriptingEngine.fileFromGit(url, string); BowlerStudio.createFileTab(fileSelected); BowlerStudioMenuWorkspace.add(url); getMenuReset().run(); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } } }.start(); }); BowlerStudio.runLater(() -> { orgFiles.getItems().add(tmp); }); } System.err.println("Refreshing menu"); BowlerStudio.runLater(() -> { orgFiles.hide(); BowlerStudio.runLater(() -> { orgFiles.show(); }); }); } }.start(); } }; } @FXML public void onConnect(ActionEvent e) { ConnectionManager.addConnection(); } @FXML public void onConnectVirtual(ActionEvent e) { ConnectionManager.addConnection(new VirtualGenericPIDDevice(10000, "virtual"), "virtual"); } @FXML public void onClose(ActionEvent e) { BowlerStudio.closeBowlerStudio(); } @FXML public void onConnectCHDKCamera(ActionEvent event) { // BowlerStudio.runLater(() -> { // try { // ConnectionManager.addConnection(new CHDKImageProvider(), "cameraCHDK"); // } catch (Exception e) { // exp.uncaughtException(Thread.currentThread(), e); // } // }); } @FXML public void onConnectCVCamera(ActionEvent event) { // BowlerStudio.runLater(() -> ConnectionManager.onConnectCVCamera()); } @FXML public void onConnectFileSourceCamera(ActionEvent event) { BowlerStudio.runLater(() -> ConnectionManager.onConnectFileSourceCamera()); } @FXML public void onConnectURLSourceCamera(ActionEvent event) { BowlerStudio.runLater(() -> ConnectionManager.onConnectURLSourceCamera()); } @FXML public void onConnectHokuyoURG(ActionEvent event) { BowlerStudio.runLater(() -> ConnectionManager.onConnectHokuyoURG()); } @FXML public void onConnectGamePad(ActionEvent event) { BowlerStudio.runLater(() -> ConnectionManager.onConnectGamePad()); } @FXML public void onLogin(ActionEvent event) { // new Exception().printStackTrace(); new Thread() { public void run() { PasswordManager.checkInternet(); setName("Login Gist Thread"); try { ScriptingEngine.logout(); while (!ScriptingEngine.isLoginSuccess() && !PasswordManager.isAnonMode()) { try { Thread.sleep(200); } catch (InterruptedException e) { exp.uncaughtException(Thread.currentThread(), e); } ScriptingEngine.login(); } } catch (IOException e) { exp.uncaughtException(Thread.currentThread(), e); } } }.start(); } @FXML public void onLogout(ActionEvent event) { new Thread(() -> { try { ScriptingEngine.logout(); } catch (IOException e) { exp.uncaughtException(Thread.currentThread(), e); } }).start(); } @FXML public void onConnectPidSim(ActionEvent event) { LinearPhysicsEngine eng = new LinearPhysicsEngine(); eng.connect(); ConnectionManager.addConnection(eng, "engine"); } @FXML public void onPrint(ActionEvent event) { } @FXML public void onMobileBaseFromFile(ActionEvent event) { new Thread() { public void run() { setName("Load Mobile Base Thread"); File openFile = FileSelectionFactory.GetFile(ScriptingEngine.getLastFile(), new ExtensionFilter("MobileBase XML", "*.xml", "*.XML")); if (openFile == null) { return; } BowlerStudio.runLater(() -> { try { MobileBase mb = new MobileBase(new FileInputStream(openFile)); ConnectionManager.addConnection(mb, mb.getScriptingName()); } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } }); } }.start(); } @FXML public void onCreatenewGist(ActionEvent event) { Stage s = new Stage(); new Thread(() -> { AddFileToGistController controller = new AddFileToGistController(null, getSelfRef()); try { controller.start(s); setToLoggedIn(username); } catch (Exception e) { e.printStackTrace(); } }).start(); } @FXML public void onOpenGitter(ActionEvent event) { String url = "https://gitter.im"; try { BowlerStudio.openUrlInNewTab(new URI(url).toURL()); } catch (MalformedURLException | URISyntaxException e) { exp.uncaughtException(Thread.currentThread(), e); } } @FXML public void clearScriptCache(ActionEvent event) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.CONFIRMATION); alert.setTitle("Are you sure you have published all your work?"); alert.setHeaderText("This will wipe out the local cache"); alert.setContentText("All files that are not published will be deleted"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); Optional result = alert.showAndWait(); if (result.get() == ButtonType.OK) { new Thread(() -> { BowlerStudio.setDeleteFlag(true); BowlerStudio.exit(); }).start(); } else { System.err.println("Nothing was deleted"); } }); } @FXML public void changeAssetRepoButtonPressed(ActionEvent event) { Stage s = new Stage(); new Thread(() -> { ChangeAssetRepoController controller = new ChangeAssetRepoController(); try { controller.start(s); } catch (Exception e) { e.printStackTrace(); } }).start(); } @FXML public void onMobileBaseFromGit(ActionEvent event) { PromptForGit.prompt("Select a Creature From a Git", "https://github.com/madhephaestus/carl-the-hexapod.git", (gitsId, file) -> { loadMobilebaseFromGit(gitsId, file); }); } @FXML void onSaveConfiguration(ActionEvent event) { System.err.println("Saving database"); new Thread() { public void run() { ConfigurationDatabase.save(); } }.start(); } public void addVitaminType(String s) { getTypeMenu(s); ArrayList sizes = Vitamins.listVitaminSizes(s); for (String size : sizes) { addSizesToMenu(size, s); } } public Menu getTypeMenu(String type) { if (vitaminTypeMenus.get(type) == null) { Menu typeMenu = new Menu(type); typeMenu.setMnemonicParsing(false); vitaminTypeMenus.put(type, typeMenu); BowlerStudio.runLater(() -> { vitaminsMenu.getItems().add(typeMenu); }); setUpSizes(typeMenu, type); } return vitaminTypeMenus.get(type); } private void setUpSizes(Menu typeMenu, String type) { MenuItem editScript = new MenuItem("Edit " + type + " Cad Generator..."); editScript.setMnemonicParsing(false); editScript.setOnAction(event -> { new Thread(() -> BowlerStudio.createFileTab(Vitamins.getScriptFile(type))).start(); }); BowlerStudio.runLater(() -> { typeMenu.getItems().add(new MenuItem("Sizes:")); typeMenu.getItems().add(new SeparatorMenuItem()); typeMenu.getItems().add(editScript); typeMenu.getItems().add(new SeparatorMenuItem()); }); } public void addSizesToMenu(String size, String type) { MenuItem sizeMenu = new MenuItem(size); sizeMenu.setMnemonicParsing(false); BowlerStudio.runLater(() -> { getTypeMenu(type).getItems().add(sizeMenu); }); sizeMenu.setOnAction(new EventHandler() { @Override public void handle(ActionEvent event) { new Thread() { public void run() { LocalFileScriptTab tab = LocalFileScriptTab.getSelectedTab(); if (tab != null) tab.insertString("CSG vitamin_" + slugify(type) + "_" + slugify(size) + " = Vitamins.get(\"" + type + "\", \"" + size + "\")\n"); } }.start(); } }); } @FXML void onRefresh(ActionEvent event) { String current = this.username;// =null; this.username = null; if (PasswordManager.loggedIn()) setToLoggedIn(current); } @FXML void onCreateNewVitamin(ActionEvent event) { try { NewVitaminWizardController.launchWizard(this); } catch (Exception e) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } } @FXML void onLoadGit(ActionEvent event) { try { // create a text input dialog BowlerStudio.runLater(() -> { TextInputDialog td = new TextInputDialog(); td.setHeaderText("Enter Git URL"); td.setResizable(true); Node root = td.getDialogPane(); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); td.getDialogPane().applyCss(); td.getDialogPane().layout(); }); td.showAndWait(); // set the text of the label String s = td.getEditor().getText(); if (s == null || s.length() < 4) { System.err.println("Cancle detected"); return; } if (s.endsWith(".git")) { System.err.println("Loading file from git " + s); new Thread(() -> { try { ArrayList f = ScriptingEngine.filesInGit(s); if (f.size() > 0) { System.err.println("Valid URL Detected"); BowlerStudioMenuWorkspace.add(s); } } catch (Exception e) { e.printStackTrace(); } }).start(); } else { System.err.println("Invalid entry " + s); onLoadGit(event); } }); } catch (Exception e) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } } @FXML void onBowlerStudioHelp(ActionEvent event) { new Thread(() -> { if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) { try { Desktop.getDesktop().browse( new URI("https://hackaday.io/project/6423-bowlerstudio-a-robotics-development-platform")); } catch (IOException e) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } catch (URISyntaxException e) { new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } } }).start(); } @FXML // This method is called by the FXMLLoader when initialization is // complete void initialize() { assert CreaturesMenu != null : "fx:id=\"CreaturesMenu\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert GitHubRoot != null : "fx:id=\"GitHubRoot\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert getMeneBarBowlerStudio() != null : "fx:id=\"MeneBarBowlerStudio\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert addMarlinGCODEDevice != null : "fx:id=\"addMarlinGCODEDevice\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert clearCache != null : "fx:id=\"clearCache\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert createNewGist != null : "fx:id=\"createNewGist\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert logoutGithub != null : "fx:id=\"logoutGithub\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert myGists != null : "fx:id=\"myGists\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert myOrganizations != null : "fx:id=\"myOrganizations\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert myRepos != null : "fx:id=\"myRepos\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert watchingRepos != null : "fx:id=\"watchingRepos\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert workspacemenuHandle != null : "fx:id=\"workspacemenuHandle\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert vitaminsMenu != null : "fx:id=\"vitaminsMenu\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; assert addNewVitamin != null : "fx:id=\"addNewVitamin\" was not injected: check your FXML file 'BowlerStudioMenuBar.fxml'."; GitHubRoot.setGraphic(AssetFactory.loadIcon("githubLogo")); setSelfRef(this); BowlerStudioMenuWorkspace.init(workspacemenuHandle); showDevicesPanel.setOnAction(event -> { bowlerStudioModularFrame.showConectionManager(); }); showCreatureLab.setOnAction(event -> { bowlerStudioModularFrame.showCreatureLab();; }); showTerminal.setOnAction(event -> { bowlerStudioModularFrame.showTerminal(); }); new Thread() { public void run() { try { File f = ScriptingEngine.fileFromGit( "https://github.com/CommonWealthRobotics/BowlerStudioExampleRobots.git", // git // repo, // change // this // if // you // fork // this // demo "exampleRobots.json"// File from within the Git repo ); MenuItem newCreatureWiz = new MenuItem("New Creature..."); newCreatureWiz.setOnAction(event -> { NewCreatureWizard.run(); }); BowlerStudio.runLater(() -> { CreaturesMenu.getItems().add(new SeparatorMenuItem()); CreaturesMenu.getItems().add(newCreatureWiz); CreaturesMenu.getItems().add(new SeparatorMenuItem()); }); @SuppressWarnings("unchecked") HashMap> map = (HashMap>) ScriptingEngine .inlineFileScriptRun(CSGDatabase.getInstance(), f, null); List entrySet = asSortedList(map.keySet()); for (String entry : entrySet) { HashMap script = map.get(entry); MenuItem item = new MenuItem(entry); item.setOnAction(event -> { String id = (String) script.get("scriptGit"); String file = (String) script.get("scriptFile"); loadMobilebaseFromGit(id, file); }); BowlerStudio.runLater(() -> { CreaturesMenu.getItems().add(item); }); } } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } } }.start(); addMarlinGCODEDevice.setOnAction(event -> { BowlerStudio.runLater(() -> ConnectionManager.onMarlinGCODE()); }); loadFirmata.setOnAction(event -> { BowlerStudio.runLater(() -> ConnectionManager.onFirmata()); }); ScriptingEngine.addIGithubLoginListener(new IGithubLoginListener() { @Override public void onLogout(String arg0) { setToLoggedOut(); } @Override public void onLogin(String arg0) { setToLoggedIn(arg0); } }); if (PasswordManager.getUsername() != null) { setToLoggedIn(PasswordManager.getUsername()); } else { setToLoggedOut(); } // WindowMenu int[] fonts = FontSizeManager.getFontOptions(); Menu fontSelect = new Menu("Font Size"); ToggleGroup toggleGroup = new ToggleGroup(); int defSize = FontSizeManager.getDefaultSize(); for (int i = 0; i < fonts.length; i++) { int myFoneNum = fonts[i]; RadioMenuItem ftmp = new RadioMenuItem(myFoneNum + " pt"); if (defSize == myFoneNum) { ftmp.setSelected(true); } else ftmp.setSelected(false); EventHandler eventHandler = (event) -> { if (ftmp.isSelected()) { FontSizeManager.setFontSize(myFoneNum); } }; ftmp.setOnAction(eventHandler); ftmp.setToggleGroup(toggleGroup); fontSelect.getItems().add(ftmp); FontSizeManager.addListener(nf -> { ftmp.setOnAction(null); if (myFoneNum == nf) { ftmp.setSelected(true); } else ftmp.setSelected(false); ftmp.setOnAction(eventHandler); }); } WindowMenu.getItems().add(fontSelect); CheckMenuItem autohighlight = new CheckMenuItem("Auto Highlight 3d Items"); autohighlight.setSelected(true); CheckMenuItem idlespin = new CheckMenuItem("Idle Spin "); idlespin.setSelected(false); CheckMenuItem showRuler = new CheckMenuItem("Show Ruler "); showRuler.setSelected(true); CheckMenuItem showCSGProgress = new CheckMenuItem("Show CSG Update"); CheckMenuItem useAdvancedSTL = new CheckMenuItem("Generate Advanced STL (Fully Manifold)"); CSG.setProgressMoniter((currentIndex, finalIndex, type, intermediateShape) -> { try { int i = currentIndex + 1; double percent = ((double) i) / ((double) finalIndex) * 100; String name = intermediateShape == null ? "" : intermediateShape.getName(); String x = name + " " + type.trim() + " " + String.format("%.1f", percent) + "% finished : " + i + " of " + finalIndex; if (showCSGProgress.isSelected()) { com.neuronrobotics.sdk.common.Log.debug(x); if (finalIndex > 50) { if (percent > 90) { SplashManager.closeSplash(); } else { SplashManager.renderSplashFrame((int) percent, x); } } else { SplashManager.closeSplash(); } } else System.err.println(x); } catch (Exception ex) { ex.printStackTrace(); } }); useAdvancedSTL.setOnAction(event -> { boolean selected = useAdvancedSTL.isSelected(); ConfigurationDatabase.setObject("MenueSettings", "CSG_Advanced_STL", selected); CSG.setPreventNonManifoldTriangles(selected); }); showCSGProgress.setOnAction(event -> { ConfigurationDatabase.setObject("MenueSettings", "printCSG", showCSGProgress.isSelected()); }); eu.mihosoft.vrl.v3d.svg.SVGLoad.getProgressDefault(); // eu.mihosoft.vrl.v3d.svg.SVGLoad.setProgressDefault(new ISVGLoadProgress() { // @Override // public void onShape(CSG newShape) { // BowlerStudioController.addCsg(newShape); // } // }); Runnable r = () -> { boolean parseBoolean = Boolean.parseBoolean(ConfigurationDatabase .getObject("MenueSettings", "CSG_Advanced_STL", CSG.isPreventNonManifoldTriangles()).toString()); CSG.setPreventNonManifoldTriangles(parseBoolean); useAdvancedSTL.setSelected(parseBoolean); showCSGProgress.setSelected(Boolean .parseBoolean(ConfigurationDatabase.getObject("MenueSettings", "printCSG", true).toString())); }; new Thread(r).start(); CreatureLab3dController.getEngine().setControls(showRuler, idlespin, autohighlight); CreatureLab3dController.getEngine().reattachMouseHandlers(); WindowMenu.getItems().addAll(showRuler, idlespin, autohighlight, showCSGProgress, useAdvancedSTL); new Thread() { public void run() { setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); try { if (vitaminsMenu == null) throw new RuntimeException("Vitamins menu was not inserted"); if (vitaminsMenu.getItems() == null) throw new RuntimeException("Vitamins menu items are null"); BowlerStudio.runLater(() -> { vitaminsMenu.getItems().add(new SeparatorMenuItem()); }); List types = Vitamins.listVitaminTypes().stream().sorted().collect(Collectors.toList()); for (String s : types) { addVitaminType(s); Vitamins.getVitaminFile(s, () -> { BowlerStudio.runLater(() -> { getTypeMenu(s).getItems().clear(); }); setUpSizes(getTypeMenu(s), s); addVitaminType(s); }, false); } } catch (Exception e) { exp.uncaughtException(Thread.currentThread(), e); } if (!PasswordManager.hasNetwork()) { new Thread(() -> { openFilesInUI(); }).start(); } } }.start(); } public static > List asSortedList(Set c) { List list = new ArrayList(c); java.util.Collections.sort(list); return list; } public static BowlerStudioMenu getSelfRef() { return selfRef; } public static void setSelfRef(BowlerStudioMenu selfRef) { BowlerStudioMenu.selfRef = selfRef; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudioMenuWorkspace.java ================================================ package com.neuronrobotics.bowlerstudio; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import org.eclipse.jgit.api.errors.WrongRepositoryStateException; import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import javafx.scene.control.Menu; @SuppressWarnings("restriction") public class BowlerStudioMenuWorkspace { private static final String key = "workspaceList"; private static String catagory = "list"; private static Menu workspaceMenu; private static final int maxMenueSize = 40; private static boolean sorting = false; private static HashMap rank = new HashMap(); private static boolean running = false; private static ArrayList> wp = null; public static void init(Menu workspacemenu) { if (workspacemenu == null) throw new RuntimeException(); workspaceMenu = workspacemenu; } public static void loginEvent() { if (running) return; running = true; rank.clear(); new Thread(() -> { if (ScriptingEngine.hasNetwork()) { wp = (ArrayList>) ConfigurationDatabase.getObject(key, catagory, new ArrayList>()); for (ArrayList entry : wp) { String o = entry.get(0); String message = entry.get(1); try { ScriptingEngine.pull(o); } catch (WrongRepositoryStateException ex) { // ignore, unsaved work } catch (Exception e) { BowlerStudioMenu.checkandDelete(o); } catch (Throwable ex) { ex.printStackTrace(); } } } updateMenu(); // // for (int i = 0; i < ConfigurationDatabase.keySet(key).size(); i++) { // try { // String o = (String) ConfigurationDatabase.keySet(key).toArray()[i]; // if (o.endsWith(".git")) { // boolean wasState = ScriptingEngine.isPrintProgress(); // ScriptingEngine.setPrintProgress(false); // com.neuronrobotics.sdk.common.Log.error("Pulling workspace " + o); // try { // ScriptingEngine.pull(o); // } catch (WrongRepositoryStateException ex) { // // ignore, unsaved work // } catch (Exception e) { // BowlerStudioMenu.checkandDelete(o); // } catch (Throwable ex) { // ex.printStackTrace(); // ConfigurationDatabase.removeObject(key, o); // // ScriptingEngine.deleteRepo(o); // // i--; // } // ScriptingEngine.setPrintProgress(wasState); // // } else { // ConfigurationDatabase.remove(key, o); // } // } catch (Exception e) { // e.printStackTrace(); // } // } // running = false; }).start(); } public static void add(String url) { add(url, BowlerStudioMenu.gitURLtoMessage(url)); } @SuppressWarnings("unchecked") public static void add(String url, String menueMessage) { if (menueMessage == null) throw new RuntimeException("Menu Message can not be " + menueMessage); if (menueMessage.length() < 2) { menueMessage = new Date().toString(); } try { if (!BowlerStudio.checkValidURL(url)) { BowlerStudio.runLater( () -> BowlerStudio.showExceptionAlert(new RuntimeException(), "URL does not exist: " + url)); return; } } catch (Exception ex) { ex.printStackTrace(); return; } for (ArrayList entry : wp) { String o = entry.get(0); if (o.contentEquals(url)) { com.neuronrobotics.sdk.common.Log.debug("Already in menu " + url); return; } } ArrayList data = new ArrayList(); data.add(url); data.add(menueMessage); wp.add(0, data); if (wp.size() >= maxMenueSize) wp.remove(wp.size() - 1); ConfigurationDatabase.save(); // // Object object = ConfigurationDatabase.getObject(key, url, null); // if (object == null) { // data = new ArrayList(); // data.add(menueMessage); // data.add(new Long(System.currentTimeMillis()).toString()); // System.err.println("Adding URL to workspace " + url); // ConfigurationDatabase.put(key, url, data); // ConfigurationDatabase.save(); // // com.neuronrobotics.sdk.common.Log.error("Workspace add: " + url); // } // data = (ArrayList) workspaceData.get(url); // data.set(1, new Long(System.currentTimeMillis()).toString()); updateMenu(); // } // @SuppressWarnings("unchecked") // public static void sort() { // if (sorting) // return; // sorting = true; // // boolean rankChanged = false; // try { // ArrayList myOptions = new ArrayList(); // // for (String o : ConfigurationDatabase.keySet(key)) { // // com.neuronrobotics.sdk.common.Log.error("Opt: "+o); // myOptions.add(o); // } // // ArrayList menu = new ArrayList<>(); // while (myOptions.size() > 0) { // int bestIndex = 0; // String besturl = (String) myOptions.get(bestIndex); // ArrayList arrayList = (ArrayList) // ConfigurationDatabase.get(key, besturl); // long newestTime = 0; // if (arrayList != null) // if (arrayList.size() > 1) { // newestTime = Long.parseLong(arrayList.get(1)); // for (int i = 0; i < myOptions.size(); i++) { // String nowurl = (String) myOptions.get(i); // long myTime = Long.parseLong(arrayList.get(1)); // if (myTime >= newestTime) { // newestTime = myTime; // besturl = nowurl; // bestIndex = i; // } // } // } else // continue; // String removedURL = (String) myOptions.remove(bestIndex); // // // clone all repos from git // try { // // ScriptingEngine.pull(removedURL); // menu.add(removedURL); // } catch (Exception e) { // // repo is broken or missing // e.printStackTrace(); // System.err.println("Removing from workspace: " + removedURL); // remove(removedURL); // } // // } // // for (int i = 0; i < menu.size(); i++) { // String url = menu.get(i); // if (rank.get(url) == null) { // rankChanged = true; // rank.put(url, i); // // com.neuronrobotics.sdk.common.Log.error("Rank firstNoted : "+url+" "+i); // } // if (rank.get(url).intValue() != i) { // rankChanged = true; // // } // rank.put(url, i); // } // if (rankChanged) { // BowlerStudio.runLater(() -> { // if (workspaceMenu.getItems() != null) // workspaceMenu.getItems().clear(); // // new Thread(() -> { // int numAdded = 0; // for (String url : menu) { // if(numAdded>=maxMenueSize) { // System.err.println("Pruning "+url+" because too big!"); // remove(url); // continue; // // } // // com.neuronrobotics.sdk.common.Log.error("Workspace : " + url); // ArrayList arrayList = (ArrayList) // ConfigurationDatabase.getObject(key, url, // new ArrayList<>()); // if (arrayList != null) // if (arrayList.size() >= 0) // try { // BowlerStudioMenu.setUpRepoMenue(workspaceMenu, url, false, false, // arrayList.get(0)); // numAdded++; // } catch (Throwable t) { // com.neuronrobotics.sdk.common.Log // .error("Error with " + url + " " + arrayList.toArray()); // t.printStackTrace(); // } // // } // sorting = false; // }).start(); // }); // } else { // sorting = false; // } // // } catch (Exception ex) { // ex.printStackTrace(); // } // if (rankChanged) { // // com.neuronrobotics.sdk.common.Log.error("Sorting workspace..."); // new Thread(() -> { // ConfigurationDatabase.save(); // }).start(); // } // } // public static HashMap getWorkspaceData() { // return ConfigurationDatabase.getParamMap("workspace"); // } private static void updateMenu() { BowlerStudio.runLater(() -> { if (workspaceMenu.getItems() != null) workspaceMenu.getItems().clear(); for (int i = 0; i < wp.size(); i++) { ArrayList entry = wp.get(i); String url = entry.get(0); String message = entry.get(1); BowlerStudioMenu.setUpRepoMenue(workspaceMenu, url, false, false, message); } }); } public static void remove(String url) { new Exception("BowlerStudiotMenuWorkspace removing URL " + url).printStackTrace(); for (int i = 0; i < wp.size(); i++) { ArrayList entry = wp.get(i); if (entry.get(0).contentEquals(url)) { wp.remove(entry); ConfigurationDatabase.save(); return; } } updateMenu(); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/BowlerStudioModularFrame.java ================================================ package com.neuronrobotics.bowlerstudio; /** * Sample Skeleton for "BowlerStudioModularFrame.fxml" Controller Class * You can copy and paste this code into your favorite IDE **/ import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.scripting.PasswordManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingFileWidget; import com.neuronrobotics.bowlerstudio.tabs.WebTab; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.image.Image; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.ResourceBundle; @SuppressWarnings("restriction") public class BowlerStudioModularFrame { @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="editorContainer" private AnchorPane editorContainer; // Value injected by FXMLLoader @FXML // fx:id="editorContainer" private AnchorPane threeDarea; @FXML // fx:id="editorContainer" private AnchorPane textAreAnchor; @FXML // fx:id="editorContainer" private AnchorPane terminalArea; @FXML // fx:id="editorContainer" private AnchorPane connectionsTabAnchor; @FXML // fx:id="editorContainer" private AnchorPane terminalTabAnchor; @FXML // fx:id="menurAnchor" private AnchorPane menurAnchor; // Value injected by FXMLLoader private Image dockImage; // private DockNode tutorialDockNode; // private DockNode connectionManagerDockNode; @FXML private TabPane dockPane; public BowlerStudioMenu menueController; // private InvalidationListener connectionManagerRemover; private CreatureLab3dController creatureLab3dController; // private DockNode creatureLab3dDockNode=null; // private InvalidationListener creatureManagerRemover; private BowlerStudioController controller; private static Stage primaryStage; private static BowlerStudioModularFrame bowlerStudioModularFrame; // private HashMap webTabs = new HashMap<>(); private HashMap isOpen = new HashMap<>(); private Terminal terminal; // private DockNode terminalDockNode; private boolean startup = false; private WebTab webtab; @FXML // This method is called by the FXMLLoader when initialization is // complete void initialize() throws Exception { bowlerStudioModularFrame = this; assert editorContainer != null : "fx:id=\"editorContainer\" was not injected: check your FXML file 'BowlerStudioModularFrame.fxml'."; assert menurAnchor != null : "fx:id=\"menurAnchor\" was not injected: check your FXML file 'BowlerStudioModularFrame.fxml'."; assert dockPane != null : "DockPain not injected"; dockImage = AssetFactory.loadAsset("BowlerStudioModularFrameIcon.png"); // final Tab newtab = new Tab(); // newtab.setText(""); // newtab.setClosable(false); // newtab.setGraphic(AssetFactory.loadIcon("New-Web-Tab.png")); String homeURL = Tutorial.getHomeUrl(); controller = new BowlerStudioController(); WebTab.setBSController(controller); dockPane.setTabClosingPolicy(TabPane.TabClosingPolicy.ALL_TABS); webtab = new WebTab("Documentation", homeURL, true); addTab(webtab, false); Node content = ConnectionManager.getConnectionManager().getContent(); connectionsTabAnchor.getChildren().add(content); AnchorPane.setTopAnchor(content, 0.0); AnchorPane.setRightAnchor(content, 0.0); AnchorPane.setBottomAnchor(content, 0.0); AnchorPane.setLeftAnchor(content, 0.0); // Initial docked setup addTutorial(); FXMLLoader WindowLoader3d; WindowLoader3d = AssetFactory.loadLayout("layout/CreatureLab.fxml"); creatureLab3dController = new CreatureLab3dController(); BowlerStudio.setCreatureLab3d(creatureLab3dController); WindowLoader3d.setController(creatureLab3dController); WindowLoader3d.setClassLoader(CreatureLab3dController.class.getClassLoader()); FXMLLoader commandLine; commandLine = AssetFactory.loadLayout("layout/Terminal.fxml"); terminal = new Terminal(); commandLine.setController(terminal); commandLine.setClassLoader(Terminal.class.getClassLoader()); FXMLLoader menueBar; menueBar = AssetFactory.loadLayout("layout/BowlerStudioMenuBar.fxml"); menueController = new BowlerStudioMenu(this, creatureLab3dController); menueBar.setController(menueController); menueBar.setClassLoader(BowlerStudioMenu.class.getClassLoader()); try { menueBar.load(); WindowLoader3d.load(); commandLine.load(); } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); throw e; } BorderPane menue = (BorderPane) menueBar.getRoot(); BorderPane threed = (BorderPane) WindowLoader3d.getRoot(); VBox cmd = (VBox) commandLine.getRoot(); threeDarea.getChildren().add(threed); AnchorPane.setTopAnchor(threed, 0.0); AnchorPane.setRightAnchor(threed, 0.0); AnchorPane.setBottomAnchor(threed, 0.0); AnchorPane.setLeftAnchor(threed, 0.0); // do { // try { // creatureLab3dDockNode = new DockNode(threed, "Creature Lab", // AssetFactory.loadIcon("CreatureLab-Tab.png")); // }catch(Exception e) { // e.printStackTrace(); // ThreadUtil.wait(100); // } // } while (creatureLab3dDockNode==null); // creatureLab3dDockNode.setPrefSize(500, 500); terminalTabAnchor.getChildren().add(cmd); AnchorPane.setTopAnchor(cmd, 0.0); AnchorPane.setRightAnchor(cmd, 0.0); AnchorPane.setBottomAnchor(cmd, 0.0); AnchorPane.setLeftAnchor(cmd, 0.0); // terminalDockNode = new DockNode(cmd, "Terminal", // AssetFactory.loadIcon("Command-Line.png")); // terminalDockNode.setPrefSize(400, 400); // Add the dock pane to the window menurAnchor.getChildren().add(menue); AnchorPane.setTopAnchor(menue, 0.0); AnchorPane.setRightAnchor(menue, 0.0); AnchorPane.setLeftAnchor(menue, 0.0); AnchorPane.setBottomAnchor(menue, 0.0); isOpen.put("showCreatureLab", false); isOpen.put("showTerminal", false); isOpen.put("showDevices", false); // focus on the tutorial to start // BowlerStudio.runLater(() -> getTutorialDockNode().requestFocus()); // connectionManagerDockNode.onMouseClickedProperty().addListener((a, b, c) -> { // com.neuronrobotics.sdk.common.Log.error("Cloick"); // }); } public void loadMobilebaseFromGit(String id, String file) { menueController.loadMobilebaseFromGit(id, file); } private void addTutorial() { // BowlerStudio.runLater(() -> getTutorialDockNode().dock(dockPane, // DockPos.LEFT)); } public void showConectionManager() { // String key = "showDevices"; // if (isOpen.get(key) == null) { // isOpen.put(key, false); // } // if (isOpen.get("showTerminal") == null) { // isOpen.put("showTerminal", false); // } // BowlerStudio.runLater(() -> { // if (!isOpen.get(key)) { // isOpen.put(key, true); // if (isOpen.get("showTerminal")) // connectionManagerDockNode.dock(dockPane, DockPos.RIGHT, terminalDockNode); // else // connectionManagerDockNode.dock(dockPane, DockPos.BOTTOM, // getTutorialDockNode()); // connectionManagerDockNode.requestFocus(); // // connectionManagerDockNode.closedProperty().addListener(new // InvalidationListener() { // @Override // public void invalidated(Observable event) { // connectionManagerDockNode.closedProperty().removeListener(this); // isOpen.put(key, false); // } // }); // // } // BowlerStudio.runLater(() -> connectionManagerDockNode.requestFocus()); // }); } public void showTerminal() { // String key = "showTerminal"; // if (isOpen.get(key) == null || getTutorialDockNode()==null // ||terminalDockNode==null) { // isOpen.put(key, false); // return; // } // if (isOpen.get("showDevices") == null) { // isOpen.put("showDevices", false); // } // if (!isOpen.get(key)) { // isOpen.put(key, true); // BowlerStudio.runLater(() -> { // // if (isOpen.get("showDevices")) // terminalDockNode.dock(dockPane, DockPos.LEFT, connectionManagerDockNode); // else // terminalDockNode.dock(dockPane, DockPos.BOTTOM, getTutorialDockNode()); // terminalDockNode.requestFocus(); // // if (ScriptingEngine.isLoginSuccess()) { // // } // // terminalDockNode.closedProperty().addListener(new InvalidationListener() { // @Override // public void invalidated(Observable event) { // terminalDockNode.closedProperty().removeListener(this); // isOpen.put(key, false); // } // }); // // BowlerStudio.runLater(() -> terminalDockNode.requestFocus()); // // }); // // } } public void showCreatureLab() { showCreatureLab(0); } public void showCreatureLab(int depth) { // String key = "showCreatureLab"; // Boolean boolean1 = isOpen.get(key); // if(boolean1!=null) // if (!boolean1) { // isOpen.put(key, true); // new Thread(() -> { // //ThreadUtil.wait(100); // // BowlerStudio.runLater(() -> { // try { // creatureLab3dDockNode.dock(dockPane, DockPos.RIGHT); // isOpen.put(key, true); // return; // } catch (NullPointerException e) { // // keep trying to open // // e.printStackTrace(); // isOpen.put(key, false); // if (depth < 2) { // showCreatureLab(depth + 1); // } else // BowlerStudio.printStackTrace(e);// fail and show // // user // } catch (Exception e) { // isOpen.put(key, false); // BowlerStudio.printStackTrace(e);// fail and show user // } // // }); // // BowlerStudio.runLater(() -> // creatureLab3dDockNode.closedProperty().addListener(new InvalidationListener() // { // @Override // public void invalidated(Observable event) { // creatureLab3dDockNode.closedProperty().removeListener(this); // isOpen.put(key, false); // } // })); // // }).start(); // } // else // BowlerStudio.runLater(() -> creatureLab3dDockNode.requestFocus()); } public static Stage getPrimaryStage() { return primaryStage; } public static void setPrimaryStage(Stage primaryStage) { BowlerStudioModularFrame.primaryStage = primaryStage; // DockNode.addStageToDockingSystem(primaryStage); // DockNode.setModifyer(new IStageModifyer() { // @Override // public void onNewStage(Stage s) { // Parent r = s.getScene().getRoot(); // FontSizeManager.addListener(fontNum->{ // BowlerStudioController.getBowlerStudio().setFontSize(fontNum); // double tmp = FontSizeManager.getImageScale()*9; // r.setStyle("-fx-font-size: "+((int)tmp)+"pt"); // }); // } // }); } public ScriptingFileWidget createFileTab(File file) { // Auto-generated method stub return controller.createFileTab(file); } public void openUrlInNewTab(URL url) { BowlerStudio.runLater(() -> { try { if (PasswordManager.getUsername() != null) { WebTab newTab = new WebTab("Web", url.toExternalForm(), false); addTab(newTab, true); } } catch (IOException | InterruptedException e) { // Auto-generated catch block e.printStackTrace(); } }); } public void closeTab(Tab newTab) { dockPane.getTabs().remove(newTab); } public void addTab(Tab newTab, boolean b) { com.neuronrobotics.sdk.common.Log.error("Loading a new tab: " + newTab.getText()); newTab.setClosable(b); dockPane.getTabs().add(newTab); } public static BowlerStudioModularFrame getBowlerStudioModularFrame() { return bowlerStudioModularFrame; } public void setSelectedTab(Tab tab) { com.neuronrobotics.sdk.common.Log.error("Selecting a new tab: " + tab.getText()); BowlerStudio.runLater(() -> { dockPane.getSelectionModel().select(tab); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/ChangeAssetRepoController.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.ConfigurationDatabase; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.stage.Modality; import javafx.stage.Stage; /** * Created by Ryan Benasutti on 2/6/2016. */ public class ChangeAssetRepoController extends Application { @FXML private TextField repoField; @FXML private Button changeRepoButton, cancelButton; public ChangeAssetRepoController() { } @SuppressWarnings("restriction") @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = AssetFactory.loadLayout("layout/changeAssetRepo.fxml", true); Parent root; loader.setController(this); // This is needed when loading on MAC loader.setClassLoader(getClass().getClassLoader()); root = loader.load(); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); }); BowlerStudio.runLater(() -> { primaryStage.setTitle("Change Asset Repository"); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.initModality(Modality.WINDOW_MODAL); primaryStage.setResizable(true); primaryStage.show(); }); } @FXML public void onChangeRepo(ActionEvent event) { String repo = repoField.getText().replaceAll("git://", "https://"); new Thread(() -> { ConfigurationDatabase.setObject("BowlerStudioConfigs", "skinRepo", repo); ConfigurationDatabase.save(); }).start(); Stage stage = (Stage) changeRepoButton.getScene().getWindow(); stage.close(); } @FXML public void onCancel(ActionEvent event) { BowlerStudio.runLater(() -> { Stage stage = (Stage) cancelButton.getScene().getWindow(); stage.close(); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/ConnectionManager.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.utils.BowlerConnectionMenu; import com.neuronrobotics.imageprovider.AbstractImageProvider; //import com.neuronrobotics.imageprovider.OpenCVImageProvider; import com.neuronrobotics.imageprovider.StaticFileProvider; import com.neuronrobotics.imageprovider.URLImageProvider; import com.neuronrobotics.sdk.addons.gamepad.BowlerJInputDevice; import com.neuronrobotics.sdk.addons.kinematics.FirmataBowler; import com.neuronrobotics.sdk.addons.kinematics.gcodebridge.GcodeDevice; import com.neuronrobotics.sdk.common.*; import com.neuronrobotics.sdk.javaxusb.UsbCDCSerialConnection; import com.neuronrobotics.sdk.network.BowlerTCPClient; import com.neuronrobotics.sdk.network.UDPBowlerConnection; import com.neuronrobotics.sdk.serial.SerialConnection; import com.neuronrobotics.sdk.ui.AbstractConnectionPanel; import com.neuronrobotics.sdk.wireless.bluetooth.BluetoothSerialConnection; import gnu.io.NRSerialPort; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.Alert.AlertType; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import javafx.stage.FileChooser; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.File; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; //import org.bytedeco.javacv.OpenCVFrameGrabber; public class ConnectionManager extends Tab implements IDeviceAddedListener, EventHandler { private static VBox rootItem; private static final ArrayList plugins = new ArrayList(); // private BowlerStudioController bowlerStudioController; String formatStr = "%1$-40s %2$-60s %3$-40s"; private static final ConnectionManager connectionManager; private static Button disconnectAll; private static HBox topLine; final static Accordion accordion = new Accordion(); static { connectionManager = new ConnectionManager(); } private Node getIcon(String s) { return new ImageView(new Image(AbstractConnectionPanel.class.getResourceAsStream(s))); } public ConnectionManager() { if (connectionManager != null) { throw new RuntimeException( "Connection manager is a static singleton, access it using ConnectionManager.getConnectionmanager()"); } setText("My Devices"); setGraphic(AssetFactory.loadIcon("My-Devices.png")); rootItem = new VBox(10); // rootItem.getColumnConstraints().add(new ColumnConstraints(30)); // column 1 // is 75 wide // rootItem. getColumnConstraints().add(new ColumnConstraints(80)); // column 2 // is 300 wide // rootItem.getColumnConstraints().add(new ColumnConstraints(100)); // column 2 // is 100 wide // rootItem.getColumnConstraints().add(new ColumnConstraints(50)); // column 2 // is 100 wide // topLine = new HBox(20); disconnectAll = new Button("Disconnect All", AssetFactory.loadIcon("Disconnect-All.png")); disconnectAll.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { disconnectAll(); } }); disconnectAll.setDisable(true); topLine.getChildren().addAll(AssetFactory.loadIcon("Connected-Devices.png"), new Text("Connected Devices"), disconnectAll); rootItem.getChildren().add(topLine); rootItem.getChildren().add(accordion); // rootItem = new CheckBoxTreeItem( String.format(" "+formatStr, // "SCRIPTING NAME","DEVICE TYPE","MAC ADDRESS"), // getIcon("images/connection-icon.png" // // "images/usb-icon.png" // )); // rootItem.setExpanded(true); // rootItem.setSelected(true); // rootItem.selectedProperty().addListener(b -> { // if (!rootItem.isSelected()) { // disconnectAll(); // } // }); setContent(rootItem); DeviceManager.addDeviceAddedListener(this); } public static void addConnection(BowlerAbstractDevice newDevice, String name) { DeviceManager.addConnection(newDevice, name); } @Override public void handle(ActionEvent event) { // Auto-generated method stub } public static ArrayList getPlugins() { return plugins; } // // public BowlerStudioController getBowlerStudioController() { // return bowlerStudioController; // } // // public void setBowlerStudioController( // BowlerStudioController bowlerStudioController) { // this.bowlerStudioController = bowlerStudioController; // } public static BowlerAbstractDevice pickConnectedDevice(@SuppressWarnings("rawtypes") Class class1) { List choices = DeviceManager.listConnectedDevice(class1); if (!choices.isEmpty()) { ChoiceDialog alert = new ChoiceDialog<>(choices.get(0), choices); alert.setTitle("Bowler Device Chooser"); alert.setHeaderText("Choose connected bowler device"); alert.setContentText("Device Name:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); if (result.isPresent()) { for (int i = 0; i < plugins.size(); i++) { if (plugins.get(i).getManager().getName().contains(result.get())) { return plugins.get(i).getManager().getDevice(); } } } } else { Alert alert = new Alert(AlertType.INFORMATION); alert.setTitle("Device not available"); alert.setHeaderText("Connect a " + class1.getSimpleName()); alert.setContentText("A device of type " + class1.getSimpleName() + " is needed"); alert.initModality(Modality.APPLICATION_MODAL); alert.show(); } return null; } // public BowlerAbstractDevice pickConnectedDevice() { // // return pickConnectedDevice(null); // } public static void disconnectAll() { // extract list int thread safe object Object[] pms = plugins.toArray(); for (int i = 0; i < pms.length; i++) { disconectAndRemoveDevice(((PluginManagerWidget) pms[i]).getManager()); // ThreadUtil.wait(50); } } // public static OpenCVImageProvider onConnectCVCamera() { // List choices = new ArrayList<>(); // choices.add("0"); // choices.add("1"); // choices.add("2"); // choices.add("3"); // choices.add("4"); // // ChoiceDialog dialog = new ChoiceDialog<>("0", choices); // dialog.setTitle("OpenCV Camera Index Chooser"); // dialog.setHeaderText("Choose an OpenCV camera"); // dialog.setContentText("Camera Index:"); // // // Traditional way to get the response value. // Optional result = dialog.showAndWait(); // // // The Java 8 way to get the response value (with lambda expression). // if (result !=null) { // String letter = result.get(); // OpenCVImageProvider p = new OpenCVImageProvider(Integer.parseInt(letter)); // String name = "camera"+letter; // addConnection(p,name); // return p; // } // return null; //// OpenCVImageProvider p = new OpenCVImageProvider(0); //// String name = "camera0"; //// application.addConnection(p,name); // // } // public static void onConnectJavaCVCamera() { // onConnectCVCamera(); // List choices = new ArrayList<>(); // try { // String[] des = OpenCVFrameGrabber.getDeviceDescriptions(); // if(des.length==0) // return; // for (String s: des){ // choices.add(s); // } // } catch (org.bytedeco.javacv.FrameGrabber.Exception // |UnsupportedOperationException e1) { // choices.add("0"); // choices.add("1"); // choices.add("2"); // choices.add("3"); // choices.add("4"); // } // // ChoiceDialog dialog = new ChoiceDialog<>(choices.get(0), choices); // dialog.setTitle("JavaCV Camera Index Chooser"); // dialog.setHeaderText("Choose an JavaCV camera"); // dialog.setContentText("Camera Index:"); // // // Traditional way to get the response value. // Optional result = dialog.showAndWait(); // // // The Java 8 way to get the response value (with lambda expression). // result.ifPresent(letter -> { // JavaCVImageProvider p; // try { // p = new JavaCVImageProvider(Integer.parseInt(letter)); // String name = "camera"+letter; // addConnection(p,name); // } catch (Exception e) { // // Auto-generated catch block // e.printStackTrace(); // } // // }); // } public static void onConnectFileSourceCamera() { BowlerStudio.runLater(() -> { }); FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Open Image File"); File f = fileChooser.showOpenDialog(BowlerStudioModularFrame.getPrimaryStage()); if (f != null) { AbstractImageProvider p = new StaticFileProvider(f); String name = "image"; addConnection(p, name); } } public static void onConnectURLSourceCamera() { TextInputDialog alert = new TextInputDialog("http://neuronrobotics.com/img/AndrewHarrington/2014-09-15-86.jpg"); alert.setTitle("URL Image Source"); alert.setHeaderText("This url will be loaded each capture."); alert.setContentText("URL "); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); if (result.isPresent()) { URLImageProvider p; try { p = new URLImageProvider(new URI(result.get()).toURL()); String name = "url"; addConnection(p, name); } catch (MalformedURLException | URISyntaxException e) { e.printStackTrace(); } } } public static void onMarlinGCODE() { Set ports = NRSerialPort.getAvailableSerialPorts(); List choices = new ArrayList<>(); if (ports.isEmpty()) return; for (String s : ports) { choices.add(s); } ChoiceDialog alert = new ChoiceDialog<>(choices.get(0), choices); alert.setTitle("GCODE Device Serial Port Chooser"); alert.setHeaderText("Supports Marlin"); alert.setContentText("GCODE Device Port:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(letter -> { GcodeDevice p = new GcodeDevice(new NRSerialPort(letter, 115200)); p.connect(); String name = "GCODE"; addConnection(p, name); }); } public static void onConnectHokuyoURG() { Set ports = NRSerialPort.getAvailableSerialPorts(); List choices = new ArrayList<>(); if (ports.isEmpty()) return; for (String s : ports) { choices.add(s); } ChoiceDialog alert = new ChoiceDialog<>(choices.get(0), choices); alert.setTitle("LIDAR Serial Port Chooser"); alert.setHeaderText("Supports URG-04LX-UG01"); alert.setContentText("Lidar Port:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(letter -> { }); } public static void onConnectGamePad() { ArrayList ca = BowlerJInputDevice.getControllers(); List choices = new ArrayList<>(); if (ca.size() == 0) return; for (String s : ca) { choices.add(s); } ChoiceDialog alert = new ChoiceDialog<>(choices.get(0), choices); alert.setTitle("JInput Game Controller Select"); alert.setHeaderText("Connect a game controller"); alert.setContentText("Controller:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(letter -> { for (String s : BowlerJInputDevice.getControllers()) { if (letter.contains(s)) { BowlerJInputDevice p = new BowlerJInputDevice(s); p.connect(); addConnection(p, p.getName()); return; } } }); } @Override public void onNewDeviceAdded(BowlerAbstractDevice newDevice) { PluginManager mp; Log.debug("Adding a " + newDevice.getClass().getName() + " with name " + newDevice.getScriptingName()); mp = new PluginManager(newDevice); BowlerAbstractConnection con = newDevice.getConnection(); Node icon = getIcon("images/connection-icon.png" // "images/usb-icon.png" ); if (SerialConnection.class.isInstance(con)) { icon = getIcon( // "images/ethernet-icon.png" "images/usb-icon.png"); } else if (UsbCDCSerialConnection.class.isInstance(con)) { icon = getIcon( // "images/ethernet-icon.png" "images/usb-icon.png"); } else if (BluetoothSerialConnection.class.isInstance(con)) { icon = getIcon( // "images/ethernet-icon.png" "images/bluetooth-icon.png"); } else if (UDPBowlerConnection.class.isInstance(con) || BowlerTCPClient.class.isInstance(con)) { icon = getIcon( // "images/ethernet-icon.png" "images/ethernet-icon.png"); } String line = String.format(formatStr, newDevice.getScriptingName(), newDevice.getClass().getSimpleName(), newDevice.getAddress()); PluginManagerWidget e = new PluginManagerWidget(mp, icon); plugins.add(e); BowlerStudio.runLater(() -> accordion.getPanes().add(e)); BowlerStudio.runLater(() -> disconnectAll.setDisable(false)); mp.setName(newDevice.getScriptingName()); // DeviceManager.addDeviceAddedListener(new IDeviceAddedListener() { // // @Override // public void onNewDeviceAdded(BowlerAbstractDevice bad) { // // Auto-generated method stub // // } // // @Override // public void onDeviceRemoved(BowlerAbstractDevice bad) { // for (int i = 0; i < plugins.size(); i++) { // PluginManager p = plugins.get(i).getManager(); // if (p.getDevice() == bad) { // DeviceManager.remove(p.getDevice()); // return; // } // } // } // }); // newDevice.addConnectionEventListener( // new IDeviceConnectionEventListener() { // @Override // public void onDisconnect(BowlerAbstractDevice source) { // // clean up after yourself... // //disconectAndRemoveDevice(mp); // // for(int i=0;i accordion.getPanes().remove(torem)); if (plugins.isEmpty()) { BowlerStudio.runLater(() -> disconnectAll.setDisable(true)); } return; } } } public static void addConnection() { Stage s = new Stage(); new Thread() { public void run() { BowlerDatagram.setUseBowlerV4(true); BowlerConnectionMenu controller = new BowlerConnectionMenu(); try { controller.start(s); } catch (Exception e) { e.printStackTrace(); } } }.start(); // DeviceManager.addConnection(); } public static ConnectionManager getConnectionManager() { return connectionManager; } public static void onFirmata() { Set ports = NRSerialPort.getAvailableSerialPorts(); List choices = new ArrayList<>(); if (ports.isEmpty()) return; for (String s : ports) { choices.add(s); } ChoiceDialog alert = new ChoiceDialog<>(choices.get(0), choices); alert.setTitle("Firmata Device Serial Port Chooser"); alert.setHeaderText("Supports Firmata"); alert.setContentText("Firmata Device Port:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // Traditional way to get the response value. Optional result = alert.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(letter -> { new Thread(() -> { System.out.print("\nConnecting Firmata..."); FirmataBowler p = new FirmataBowler(letter); p.connect(); String name = "firmata"; addConnection(p, name); System.out.print("Done!\n"); }).start(); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/CreatureLab3dController.java ================================================ package com.neuronrobotics.bowlerstudio; /** * Sample Skeleton for "CreatureLab.fxml" Controller Class * You can copy and paste this code into your favorite IDE **/ import java.net.URL; import java.util.ResourceBundle; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.threed.BowlerStudio3dEngine; import javafx.beans.value.ObservableValue; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.geometry.Bounds; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.control.ScrollPane; import javafx.scene.input.KeyEvent; import javafx.scene.layout.AnchorPane; public class CreatureLab3dController { @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="CadControlsAnchor" private AnchorPane CadControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="DriveControlsAnchor" private AnchorPane DriveControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="TempControlsAnchor" private AnchorPane TempControlsAnchor; // Value injected by FXMLLoader @FXML // fx:id="jfx3dControls" private AnchorPane jfx3dControls; // Value injected by FXMLLoader @FXML // fx:id="overlayScrollPanel" private ScrollPane overlayScrollPanel; // Value injected by FXMLLoader @FXML // fx:id="viewContainer" private AnchorPane viewContainer; // Value injected by FXMLLoader // private SubScene subScene; protected EventHandler normalKeyPessHandle = null; private static BowlerStudio3dEngine engine; public CreatureLab3dController() { setEngine(new BowlerStudio3dEngine("BowlerStudio3d")); } public void setOverlayLeft(Node content) { BowlerStudio.runLater(() -> { overlayScrollPanel.setFitToHeight(true); overlayScrollPanel.setContent(content); content.setOpacity(1); overlayScrollPanel.viewportBoundsProperty() .addListener((ObservableValue arg0, Bounds arg1, Bounds arg2) -> { // Node content = overlayScrollPanel.getContent(); // // com.neuronrobotics.sdk.common.Log.error("Resizing " + arg2); BowlerStudio.runLater(() -> { overlayScrollPanel.setFitToHeight(true); /// content.seth overlayScrollPanel.setContent(content); }); }); overlayScrollPanel.setVisible(true); }); } public void clearOverlayLeft() { BowlerStudio.runLater(() -> { overlayScrollPanel.setContent(null); overlayScrollPanel.setVisible(false); }); } public void setOverlayTop(Group content) { BowlerStudio.runLater(() -> { CadControlsAnchor.getChildren().clear(); CadControlsAnchor.getChildren().add(content); AnchorPane.setTopAnchor(content, 0.0); AnchorPane.setRightAnchor(content, 0.0); AnchorPane.setLeftAnchor(content, 0.0); AnchorPane.setBottomAnchor(content, 0.0); CadControlsAnchor.setVisible(true); }); } public void clearOverlayTop() { BowlerStudio.runLater(() -> { CadControlsAnchor.getChildren().clear(); CadControlsAnchor.setVisible(false); }); } public void setOverlayTopRight(Group content) { BowlerStudio.runLater(() -> { DriveControlsAnchor.getChildren().clear(); DriveControlsAnchor.getChildren().add(content); AnchorPane.setTopAnchor(content, 0.0); AnchorPane.setRightAnchor(content, 0.0); AnchorPane.setLeftAnchor(content, 0.0); AnchorPane.setBottomAnchor(content, 0.0); DriveControlsAnchor.setVisible(true); }); } public void clearOverlayTopRight() { BowlerStudio.runLater(() -> { DriveControlsAnchor.getChildren().clear(); DriveControlsAnchor.setVisible(false); }); } public void setOverlayBottomRight(Group content) { BowlerStudio.runLater(() -> { TempControlsAnchor.getChildren().clear(); TempControlsAnchor.getChildren().add(content); AnchorPane.setTopAnchor(content, 0.0); AnchorPane.setRightAnchor(content, 0.0); AnchorPane.setLeftAnchor(content, 0.0); AnchorPane.setBottomAnchor(content, 0.0); TempControlsAnchor.setVisible(true); }); } public void clearOverlayBottomRight() { BowlerStudio.runLater(() -> { TempControlsAnchor.getChildren().clear(); TempControlsAnchor.setVisible(false); }); } @FXML // This method is called by the FXMLLoader when initialization is complete void initialize() { assert CadControlsAnchor != null : "fx:id=\"CadControlsAnchor\" was not injected: check your FXML file 'CreatureLab.fxml'."; assert DriveControlsAnchor != null : "fx:id=\"DriveControlsAnchor\" was not injected: check your FXML file 'CreatureLab.fxml'."; assert TempControlsAnchor != null : "fx:id=\"TempControlsAnchor\" was not injected: check your FXML file 'CreatureLab.fxml'."; assert jfx3dControls != null : "fx:id=\"jfx3dControls\" was not injected: check your FXML file 'CreatureLab.fxml'."; assert overlayScrollPanel != null : "fx:id=\"overlayScrollPanel\" was not injected: check your FXML file 'CreatureLab.fxml'."; assert viewContainer != null : "fx:id=\"viewContainer\" was not injected: check your FXML file 'CreatureLab.fxml'."; clearOverlayLeft(); // Initialize your logic here: all @FXML variables will have been injected setupUi(); } private void setupUi() { BowlerStudio.runLater(() -> { getEngine().setFocusTraversable(false); getEngine().bind(viewContainer); }); BowlerStudio.runLater(() -> { Group controlsBox = getEngine().getControlsBox(AssetFactory.loadIcon("Home-Camera.png"), AssetFactory.loadIcon("Generate-Cad.png"), AssetFactory.loadIcon("Clear-Screen.png")); jfx3dControls.getChildren().add(controlsBox); getEngine().addTo(viewContainer); getEngine().handleMouse(viewContainer); }); } public static BowlerStudio3dEngine getEngine() { return engine; } public static void setEngine(BowlerStudio3dEngine engine) { CreatureLab3dController.engine = engine; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/DeviceSupportPluginMap.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.tabs.AbstractBowlerStudioTab; import com.neuronrobotics.sdk.common.BowlerAbstractDevice; import com.neuronrobotics.sdk.namespace.bcs.pid.IPidControlNamespace; public class DeviceSupportPluginMap implements PluginFactory { private Class device; private Class plugin; private PluginFactory factory = null; DeviceSupportPluginMap(Class device, Class plugin) { this.setDevice(device); this.setPlugin(plugin); } public DeviceSupportPluginMap(Class device, Class plugin, PluginFactory factory) { this.factory = factory; this.setDevice(device); this.setPlugin(plugin); } public boolean isFactoryProvided() { return factory != null; } public Class getDevice() { return device; } private void setDevice(Class device) { if (BowlerAbstractDevice.class.isAssignableFrom(device) || IPidControlNamespace.class.isAssignableFrom(device)) this.device = device; else throw new RuntimeException("Devices must subclass BowlerAbstractDevice or NonBowlerDevice"); } public Class getPlugin() { return plugin; } private void setPlugin(Class plugin) { if (AbstractBowlerStudioTab.class.isAssignableFrom(plugin)) this.plugin = plugin; else throw new RuntimeException("Plugins must subclass AbstractBowlerStudioTab"); } @Override public String toString() { return "Device: " + device.getCanonicalName() + " Plugin: " + plugin.getCanonicalName(); } @Override public AbstractBowlerStudioTab generateNewPlugin() throws ClassNotFoundException, InstantiationException, IllegalAccessException { if (factory != null) return factory.generateNewPlugin(); // This is where the new tab allocation is called return (AbstractBowlerStudioTab) Class.forName(plugin.getName()).cast(plugin.newInstance()); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/GistHelper.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.scripting.PasswordManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.sdk.util.ThreadUtil; import org.eclipse.jgit.api.errors.GitAPIException; //import org.jfree.util.Log; import org.kohsuke.github.GHGist; import org.kohsuke.github.GHGistBuilder; import org.kohsuke.github.GitHub; import java.io.IOException; /** * Created by Ryan Benasutti on 2/5/2016. */ public class GistHelper { private GistHelper() { } public static String createNewGist(String filename, String description, boolean isPublic) { // TODO: Perhaps this method should throw GitAPIException and IOException // Setup gist String defaultContents = "";// ; GitHub gitHub = PasswordManager.getGithub(); GHGistBuilder builder = gitHub.createGist(); builder.file(filename, defaultContents); builder.description(description); builder.public_(isPublic); // Make gist return createGistFromBuilder(builder, filename); } public static String addFileToGist(String filename, String content, GHGist gistID) { GitHub gitHub = PasswordManager.getGithub(); try { // Copy from old gist GHGist oldGist = gistID; GHGistBuilder builder = gitHub.createGist(); builder.description(oldGist.getDescription()); builder.public_(oldGist.isPublic()); for (String key : oldGist.getFiles().keySet()) builder.file(key, oldGist.getFiles().get(key).getContent()); // Add new file builder.file(filename, content); // Make new gist with old filename return createGistFromBuilder(builder, oldGist.getFiles().values().iterator().next().getFileName()); } catch (Exception e) { e.printStackTrace(); } return null; } private static String createGistFromBuilder(GHGistBuilder builder, String filename) { GHGist gist; try { gist = builder.create(); // String gistID = ScriptingEngine.urlToGist(gist.getHtmlUrl()); // BowlerStudio.openUrlInNewTab(new URL(gist.getHtmlUrl())); com.neuronrobotics.sdk.common.Log.error("Creating repo"); while (true) { try { ScriptingEngine.fileFromGit(gist.getGitPullUrl(), filename); break; } catch (GitAPIException e) { e.printStackTrace(); } ThreadUtil.wait(500); // Log.warn(filename + " not built yet"); } com.neuronrobotics.sdk.common.Log.error("Creating gist at " + filename); ScriptingEngine.getLangaugeByExtension(filename).getDefaultContents(gist.getGitPullUrl(), filename); return gist.getGitPullUrl(); } catch (IOException e) { e.printStackTrace(); } return null; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/INewVitaminCallback.java ================================================ package com.neuronrobotics.bowlerstudio; import javafx.scene.control.Menu; public interface INewVitaminCallback { void addVitaminType(String s); Menu getTypeMenu(String type); void addSizesToMenu(String size, String type); } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/Main.java ================================================ package com.neuronrobotics.bowlerstudio; public class Main { public static void main(String[] args) throws Exception { BowlerStudio.main(args); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/MakeReleaseController.java ================================================ package com.neuronrobotics.bowlerstudio; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; import java.util.function.UnaryOperator; //import org.kohsuke.github.GHWorkflow; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.ListView; import javafx.scene.control.TextField; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.sdk.util.ThreadUtil; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.TextFormatter.Change; import javafx.stage.Modality; import javafx.stage.Stage; import java.util.List; import javafx.scene.control.*; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.event.ActionEvent; import javafx.collections.*; import javafx.stage.Stage; @SuppressWarnings("restriction") public class MakeReleaseController extends Application { private String gitRepo; @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="bugfix" private TextField bugfix; // Value injected by FXMLLoader @FXML // fx:id="listOfTags" private ListView listOfTags; // Value injected by FXMLLoader @FXML // fx:id="major" private TextField major; // Value injected by FXMLLoader @FXML // fx:id="minor" private TextField minor; // Value injected by FXMLLoader @FXML // fx:id="releaseButton" private Button releaseButton; // Value injected by FXMLLoader @FXML // fx:id="tagName" private Label tagName; // Value injected by FXMLLoader private List tags; Stage primaryStage; @FXML void makeRelease(ActionEvent event) { String newTag = getNewTag(); new Thread(() -> { File dir = ScriptingEngine.getRepositoryCloneDirectory(gitRepo); File workflows = new File(dir.getAbsolutePath() + delim() + ".github" + delim() + "workflows"); boolean hasWorkflow = false; if (workflows.exists()) hasWorkflow = true; Object st[]; try { st = ScriptingEngine.filesInGit(gitRepo).toArray(); if (!hasWorkflow) { CreatenewWorkflow(event, newTag, st); } else { ScriptingEngine.tagRepo(gitRepo, newTag); } } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); } }).start(); BowlerStudio.runLater(() -> { primaryStage.close(); }); } private void CreatenewWorkflow(ActionEvent event, String newTag, Object[] st) { BowlerStudio.runLater(() -> { ChoiceDialog alert = new ChoiceDialog(st[0], st); alert.setTitle("Choose File From this Repo to release"); alert.setHeaderText("Select file to compile in CI"); alert.setContentText("File:"); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); // show the dialog alert.showAndWait(); String selectedItem = (String) alert.getSelectedItem(); new Thread(() -> { String filename = selectedItem.split("\\.")[0]; com.neuronrobotics.sdk.common.Log.error(selectedItem + " selected"); String fileContents; try { fileContents = ScriptingEngine.codeFromGit( "https://github.com/CommonWealthRobotics/Bowler-Script-Release-CI.git", "TEMPLATE.job")[0]; fileContents = fileContents.replaceAll("FILENAME_REPLACE", selectedItem); fileContents = fileContents.replaceAll("JOBNAME_REPLACE", filename); try { createWorkflow(event, fileContents); ThreadUtil.wait(1000); ScriptingEngine.tagRepo(gitRepo, newTag); return; } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); } } catch (Exception e1) { // Auto-generated catch block e1.printStackTrace(); } }).start(); }); } private void createWorkflow(ActionEvent event, String fileContents) throws Exception, IOException { ScriptingEngine.pushCodeToGit(gitRepo, null, ".github/workflows/bowler.yml", fileContents, "Creating workflow"); // GHWorkflow wf = getWorkflow(gitRepo); makeRelease(event); } // private GHWorkflow getWorkflow(String repoURL) throws IOException { // File repoDir = ScriptingEngine.getRepositoryCloneDirectory(repoURL); // String Project = repoDir.getParentFile().getName(); // String Repo = repoDir.getName(); // GHRepository repo = PasswordManager.getGithub().getRepository(Project + "/" + // Repo); // GHWorkflow workflow = repo.getWorkflow("bowler.yml"); // if (!workflow.getState().equals("active")) { // workflow.enable(); // } // return workflow; // } private String delim() { return System.getProperty("file.separator"); } @FXML // This method is called by the FXMLLoader when initialization is complete void initialize() { assert bugfix != null : "fx:id=\"bugfix\" was not injected: check your FXML file 'release.fxml'."; assert listOfTags != null : "fx:id=\"listOfTags\" was not injected: check your FXML file 'release.fxml'."; assert major != null : "fx:id=\"major\" was not injected: check your FXML file 'release.fxml'."; assert minor != null : "fx:id=\"minor\" was not injected: check your FXML file 'release.fxml'."; assert releaseButton != null : "fx:id=\"releaseButton\" was not injected: check your FXML file 'release.fxml'."; assert tagName != null : "fx:id=\"tagName\" was not injected: check your FXML file 'release.fxml'."; UnaryOperator filter = change -> { String text = change.getText(); if (text.matches("[0-9]*")) { return change; } return null; }; major.setTextFormatter(new TextFormatter(filter)); minor.setTextFormatter(new TextFormatter(filter)); bugfix.setTextFormatter(new TextFormatter(filter)); major.textProperty().addListener((obs, old, niu) -> { check(); }); minor.textProperty().addListener((obs, old, niu) -> { check(); }); bugfix.textProperty().addListener((obs, old, niu) -> { check(); }); releaseButton.setDisable(true); } private void check() { if (major.getText().length() == 0 || minor.getText().length() == 0 || bugfix.getText().length() == 0) { return; } String newTag = getNewTag(); for (String s : tags) { if (s.contains(newTag)) { tagName.setText("error: tag exists"); for (String Item : listOfTags.getItems()) { if (Item.contentEquals(s)) { listOfTags.getSelectionModel().select(s); } } return; } } tagName.setText(newTag); releaseButton.setDisable(false); } private String getNewTag() { return major.getText() + "." + minor.getText() + "." + bugfix.getText(); } public MakeReleaseController(String gitRepo) { this.gitRepo = gitRepo; } @SuppressWarnings("restriction") @Override public void start(Stage st) throws Exception { primaryStage = st; FXMLLoader loader = AssetFactory.loadLayout("layout/release.fxml", true); Parent root; loader.setController(this); // This is needed when loading on MAC loader.setClassLoader(getClass().getClassLoader()); root = loader.load(); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); }); tags = ScriptingEngine.getAllTags(gitRepo); for (String s : tags) { listOfTags.getItems().add(s); } if (tags.size() > 0) { String topValue = tags.get(0); String[] top = topValue.split("\\."); String majorStart = top[0]; String minorStart = top[1]; String bugStart = "" + (Integer.parseInt(top[2].split("-")[0]) + 1); major.setText(majorStart); minor.setText(minorStart); bugfix.setText(bugStart); } BowlerStudio.runLater(() -> { primaryStage.setTitle("Release for " + gitRepo); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.initModality(Modality.WINDOW_MODAL); primaryStage.setResizable(true); check(); primaryStage.show(); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/MeasurmentConfig.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; public class MeasurmentConfig { private String key; private String type; private String id; public MeasurmentConfig(String key, String type, String id) { this.type = type; this.id = id; this.setKey(key); com.neuronrobotics.sdk.common.Log.error("Adding Measurment " + key + " " + getMeasurment()); getMeasurment(); } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public String getMeasurment() { // if(configs.get(key)==null) // configs.put(key, ""); try { return Vitamins.getMeasurement(type, id, key).toString(); } catch (Exception ex) { System.out.print("\n\tGetting measurement of " + key); ex.printStackTrace(System.out); return ""; } } public void setMeasurment(String measurment) { com.neuronrobotics.sdk.common.Log.error("Setting field " + type + ", " + id + ", " + key + " to " + measurment); Vitamins.putMeasurment(type, id, key, measurment); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/MenuRefreshEvent.java ================================================ package com.neuronrobotics.bowlerstudio; public interface MenuRefreshEvent { void setToLoggedIn(); } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/MenuResettingEventHandler.java ================================================ package com.neuronrobotics.bowlerstudio; import javafx.event.Event; import javafx.event.EventHandler; public abstract class MenuResettingEventHandler implements EventHandler { private Runnable menuReset = null; public Runnable getMenuReset() { if (menuReset == null) menuReset = new Runnable() { @Override public void run() { // Auto-generated method stub } }; return menuReset; } public void setMenuReset(Runnable menuReset) { this.menuReset = menuReset; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/NameGetter.java ================================================ package com.neuronrobotics.bowlerstudio; import java.util.function.Supplier; import javax.swing.JFrame; import javax.swing.JOptionPane; public class NameGetter implements Supplier { @Override public String get() { String sec = "d842796170cb0b155f8508ab00822b72e1dfa9bf"; if (sec.contains("REPLACE")) { String line = System.getProperty("API-SECRET"); if (line != null) return line; JFrame jframe = new JFrame(); String answer = JOptionPane.showInputDialog(jframe, "Enter API secret"); jframe.dispose(); return answer; } return sec; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/NewCreatureWizard.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.scripting.IScriptingLanguage; import com.neuronrobotics.bowlerstudio.scripting.RobotHelper; import javafx.stage.Stage; public class NewCreatureWizard { public static void run() { BowlerStudio.runLater(() -> { Stage s = new Stage(); new Thread(() -> { Thread.setDefaultUncaughtExceptionHandler(new IssueReportingExceptionHandler()); AddFileToGistController controller = new AddFileToGistController(null, BowlerStudioMenu.getSelfRef()); try { controller.start(s, (IScriptingLanguage) new RobotHelper()); } catch (Exception e) { e.printStackTrace(); } }).start(); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/NewVitaminWizardController.java ================================================ package com.neuronrobotics.bowlerstudio; /** * Sample Skeleton for 'newVitaminWizard.fxml' Controller Class */ import java.net.URISyntaxException; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.ResourceBundle; import java.util.concurrent.CopyOnWriteArrayList; import java.util.stream.Collectors; import org.kohsuke.github.GHIssueState; import org.kohsuke.github.GHPullRequest; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GitHub; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.scripting.PasswordManager; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import com.neuronrobotics.bowlerstudio.vitamins.Vitamins; import eu.mihosoft.vrl.v3d.JavaFXInitializer; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.Menu; import javafx.scene.control.RadioButton; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.TextInputDialog; import javafx.scene.control.ToggleGroup; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; import javafx.scene.layout.AnchorPane; import javafx.scene.paint.Color; import javafx.scene.text.Font; import javafx.stage.Modality; import javafx.stage.Stage; public class NewVitaminWizardController extends Application { @FXML // ResourceBundle that was given to the FXMLLoader private ResourceBundle resources; @FXML // URL location of the FXML file that was given to the FXMLLoader private URL location; @FXML // fx:id="typePane" private AnchorPane typePane; // Value injected by FXMLLoader @FXML // fx:id="x1" private Font x1; // Value injected by FXMLLoader @FXML // fx:id="x2" private Color x2; // Value injected by FXMLLoader @FXML // fx:id="existingTypeRadio" private RadioButton existingTypeRadio; // Value injected by FXMLLoader @FXML // fx:id="newTypeRadio" private RadioButton newTypeRadio; // Value injected by FXMLLoader @FXML // fx:id="typeComboBox" private ComboBox typeComboBox; // Value injected by FXMLLoader @FXML // fx:id="sizePane" private AnchorPane sizePane; // Value injected by FXMLLoader @FXML // fx:id="sizeComboBox" private ComboBox sizeComboBox; // Value injected by FXMLLoader @FXML // fx:id="measurmentPane" private AnchorPane measurmentPane; // Value injected by FXMLLoader @FXML // fx:id="measurmentsTable" private TableView measurmentsTable; // Value injected by FXMLLoader @FXML private TextField newTypeNameField; @FXML private TextField newSizeField; @FXML // fx:id="nameColumn" private TableColumn nameColumn; // Value injected by FXMLLoader @FXML // fx:id="measurmentColumn" private TableColumn measurmentColumn; // Value injected by FXMLLoader @FXML // fx:id="isMotor" private CheckBox isMotor; // Value injected by FXMLLoader @FXML // fx:id="isShaft" private CheckBox isShaft; // Value injected by FXMLLoader @FXML // fx:id="editExisting" private CheckBox editExisting; // Value injected by FXMLLoader @FXML // fx:id="editExisting" private Button newMeasurmentButton; private static INewVitaminCallback callback = null; private static Stage primaryStage; private static String typeOfVitaminString = null; private static String sizeOfVitaminString = null; @FXML void onConfirmAndCreate(ActionEvent event) { sizePane.setDisable(true); measurmentPane.setDisable(true); typePane.setDisable(true); new Thread(() -> { try { if (newTypeRadio.isSelected()) { if (isShaft.isSelected()) Vitamins.setIsShaft(typeOfVitaminString); if (isMotor.isSelected()) Vitamins.setIsActuator(typeOfVitaminString); GitHub github = PasswordManager.getGithub(); String newName = typeOfVitaminString + "CadGenerator"; GHRepository gist = ScriptingEngine.makeNewRepo(newName, newName + " Generates CAD vitamins "); String gitURL = gist.getHtmlUrl().toExternalForm() + ".git"; String filename = typeOfVitaminString + ".groovy"; Vitamins.setScript(typeOfVitaminString, gitURL, filename); String measurments = ""; for (String key : Vitamins.getConfigurationRW(typeOfVitaminString, sizeOfVitaminString).keySet() .stream().sorted().collect(Collectors.toList())) { measurments += "\n def " + key + "Value = measurments." + key; } measurments += "\n\tfor(String key:measurments.keySet().stream().sorted().collect(Collectors.toList())){"; measurments += "\n\t\tprintln \"" + typeOfVitaminString + " value \"+key+\" \"+measurments.get(key);\n}"; // for(String key:Vitamins.getConfiguration( // typeOfVitaminString,sizeOfVitaminString).keySet().stream().sorted().collect(Collectors.toList())) // { // String string = key+"Value"; // measurments+="\n println \"Measurment "+string+" = \"+"+string; // } String loader = "import eu.mihosoft.vrl.v3d.parametrics.*;\n" + "import java.util.stream.Collectors;\n" + "import com.neuronrobotics.bowlerstudio.vitamins.Vitamins;\n" + "import eu.mihosoft.vrl.v3d.CSG;\n" + "import eu.mihosoft.vrl.v3d.Cube;\n" + "CSG generate(){\n" + " String type= \"" + typeOfVitaminString + "\"\n" + " if(args==null)\n" + " args=[\"" + sizeOfVitaminString + "\"]\n" + " // The variable that stores the current size of this vitamin\n" + " StringParameter size = new StringParameter( type+\" Default\"," + "args.get(0)," + "Vitamins.listVitaminSizes(type))\n" + " HashMap measurments = Vitamins.getConfiguration( type,size.getStrValue())\n" + measurments + "\n" + " // Stub of a CAD object\n" + " CSG part = new Cube().toCSG()\n" + " return part\n" + " .setParameter(size)\n" + " .setRegenerate({generate()})\n" + "}\n" + "return generate() "; ScriptingEngine.pushCodeToGit(gitURL, ScriptingEngine.getFullBranch(gitURL), filename, loader, "new CAD loader script"); new Thread(() -> BowlerStudio.createFileTab(Vitamins.getScriptFile(typeOfVitaminString))).start(); } if (isShaft.isSelected()) Vitamins.setIsShaft(typeOfVitaminString); if (isMotor.isSelected()) Vitamins.setIsActuator(typeOfVitaminString); // Vitamins.saveDatabaseForkIfMissing(typeOfVitaminString); if (newTypeRadio.isSelected()) { callback.addVitaminType(typeOfVitaminString); } else if (!editExisting.isSelected()) { callback.addSizesToMenu(sizeOfVitaminString, typeOfVitaminString); } } catch (Exception e1) { // Auto-generated catch block new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e1); } try { Vitamins.saveDatabase(typeOfVitaminString); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } try { BowlerStudio.runLater(() -> { this.primaryStage.close(); primaryStage = null; }); } catch (Exception e) { // Auto-generated catch block new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } org.kohsuke.github.GitHub github = PasswordManager.getGithub(); GHRepository repo; try { repo = github.getRepository(Vitamins.getSourcerepo() + "/Hardware-Dimensions"); String head = PasswordManager.getUsername() + ":master"; List asList = repo.queryPullRequests().state(GHIssueState.OPEN).head(head).list() .asList(); if (asList.size() == 0) { com.neuronrobotics.sdk.common.Log.error("Creating PR for " + head); GHPullRequest request = repo.createPullRequest("User Added vitamins to " + typeOfVitaminString, head, "master", "## User added vitamins", true, true); try { BowlerKernel.upenURL(request.getHtmlUrl().toURI()); } catch (URISyntaxException e) { // Auto-generated catch block e.printStackTrace(); } } else { } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }).start(); } private void saveAndFork() { try { Vitamins.saveDatabaseForkIfMissing(typeOfVitaminString, PasswordManager.getUsername()); } catch (Exception e) { // Auto-generated catch block new IssueReportingExceptionHandler().uncaughtException(Thread.currentThread(), e); } } @FXML void onConfirmSize(ActionEvent event) { if (!editExisting.isSelected()) { sizeOfVitaminString = newSizeField.getText(); if (sizeOfVitaminString.length() < 2) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.WARNING); alert.setTitle("No name specified!"); alert.setHeaderText("Names must be at least 2 charrectors long"); alert.setContentText("Try again..."); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); }); return; } String slug = BowlerStudioMenu.slugify(sizeOfVitaminString); if (!sizeOfVitaminString.contentEquals(slug)) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.WARNING); alert.setTitle("Name Format Wrong"); alert.setHeaderText("Name must be without spaces or special chars"); alert.setContentText("Changed to " + slug + " confirm to continue..."); alert.showAndWait(); BowlerStudio.runLater(() -> newSizeField.setText(slug)); }); return; } sizeOfVitaminString = slug; } else { sizeOfVitaminString = sizeComboBox.getSelectionModel().getSelectedItem(); } BowlerStudio.runLater( () -> nameColumn.setCellValueFactory(new PropertyValueFactory("key"))); BowlerStudio.runLater(() -> measurmentColumn .setCellValueFactory(new PropertyValueFactory("measurment"))); BowlerStudio.runLater(() -> measurmentColumn.setCellFactory(TextFieldTableCell.forTableColumn())); BowlerStudio.runLater(() -> measurmentsTable.getSelectionModel().cellSelectionEnabledProperty().set(true)); measurmentsTable.setEditable(true); nameColumn.setEditable(false); measurmentColumn.setEditable(true); measurmentColumn.setOnEditCommit(ev -> { final String value = ev.getNewValue() != null ? (String) ev.getNewValue() : (String) ev.getOldValue(); ((MeasurmentConfig) ev.getTableView().getItems().get(ev.getTablePosition().getRow())).setMeasurment(value); measurmentsTable.refresh(); }); if (existingTypeRadio.isSelected()) { if (!editExisting.isSelected()) { boolean exists = false; // for existing types check for existing sizes ArrayList sizes = Vitamins.listVitaminSizes(typeOfVitaminString); for (String size : sizes) { if (size.contentEquals(sizeOfVitaminString)) exists = true; } if (exists) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.WARNING); alert.setTitle("Size already Exists"); alert.setHeaderText("Name must be unique"); alert.setContentText("Rename and confirm to continue..."); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); }); return; } } new Thread(() -> { Map configsOld = Vitamins.getConfigurationRW(typeOfVitaminString, sizeComboBox.getSelectionModel().getSelectedItem()); for (String key : configsOld.keySet().stream().sorted().collect(Collectors.toList())) { setupKeyValueToTable(key, configsOld.get(key), sizeOfVitaminString); } }).start(); } if (newTypeRadio.isSelected()) { Vitamins.getConfigurationRW(typeOfVitaminString, sizeOfVitaminString); } if (Vitamins.isActuator(typeOfVitaminString) || (newTypeRadio.isSelected() && isMotor.isSelected())) { setUpVitaminDefaults(); } BowlerStudio.runLater(() -> { sizePane.setDisable(true); typePane.setDisable(true); }); // new Thread(() -> { HashMap required = new HashMap(); required.put("massKg", 0.001); required.put("source", "https://commonwealthrobotics.com"); required.put("price", 0.01); required.put("massCentroidX", 0.0); required.put("massCentroidY", 0.0); required.put("massCentroidZ", 0.0); setRequiredFields(required); BowlerStudio.runLater(() -> { measurmentPane.setDisable(false); }); // }).start(); } private void setUpVitaminDefaults() { // new Thread(() -> { HashMap required = new HashMap(); required.put("MaxTorqueNewtonmeters", 0.001); required.put("MaxFreeSpeedRadPerSec", 1); required.put("massKg", 0.001); required.put("shaftType", "dShaft"); required.put("shaftSize", "5mm"); setRequiredFields(required); // }).start(); } private void setRequiredFields(HashMap required) { // For each vitamin size in a given type for (String size : Vitamins.listVitaminSizes(typeOfVitaminString)) { Map configs = Vitamins.getConfigurationRW(typeOfVitaminString, size); // For every required key for (String key : required.keySet().stream().sorted().collect(Collectors.toList())) { // check to see if the current size has this key already if (!configs.containsKey(key)) { // enter a default value, but ensure that the key exists for downstream code setupKeyValueToTable(key, required.get(key), size); } } } } private void setupKeyValueToTable(String key, Object value, String size) { Vitamins.putMeasurment(typeOfVitaminString, size, key, value); if (size.contentEquals(sizeOfVitaminString)) BowlerStudio.runLater(() -> measurmentsTable.getItems() .add(new MeasurmentConfig(key, typeOfVitaminString, sizeOfVitaminString))); } @FXML void onConfirmType(ActionEvent event) { if (newTypeRadio.isSelected()) { typeOfVitaminString = newTypeNameField.getText(); if (typeOfVitaminString.length() < 2) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.WARNING); alert.setTitle("No name specified!"); alert.setHeaderText("Names must be at least 2 charrectors long"); alert.setContentText("Try again..."); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); }); return; } String slug = BowlerStudioMenu.slugify(typeOfVitaminString); if (!typeOfVitaminString.contentEquals(slug)) { BowlerStudio.runLater(() -> { Alert alert = new Alert(AlertType.WARNING); alert.setTitle("Name Format Wrong"); alert.setHeaderText("Name must be without spaces or special chars"); alert.setContentText("Changed to " + slug + " confirm to continue..."); Node root = alert.getDialogPane(); Stage stage = (Stage) alert.getDialogPane().getScene().getWindow(); stage.setOnCloseRequest(ev -> alert.hide()); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); alert.getDialogPane().applyCss(); alert.getDialogPane().layout(); stage.sizeToScene(); }); alert.showAndWait(); BowlerStudio.runLater(() -> newTypeNameField.setText(slug)); }); return; } typeOfVitaminString = slug; sizeComboBox.setDisable(true); editExisting.setDisable(true); sizePane.setDisable(false);// saveAndFork(); } else { typeOfVitaminString = typeComboBox.getSelectionModel().getSelectedItem(); sizePane.setDisable(false);// saveAndFork(); ArrayList sizes = Vitamins.listVitaminSizes(typeOfVitaminString); boolean hasSize = false; for (String size : sizes) { sizeComboBox.getItems().add(size); if (typeOfVitaminString != null) if (size.contentEquals(typeOfVitaminString)) { hasSize = true; } } if (sizes.size() > 0) { if (hasSize) { sizeComboBox.getSelectionModel().select(typeOfVitaminString); } else { sizeComboBox.getSelectionModel().select(sizes.get(0)); } } else { sizeComboBox.setDisable(true); editExisting.setDisable(true); editExisting.setSelected(false); } } isShaft.setSelected(Vitamins.isShaft(typeOfVitaminString)); isMotor.setSelected(Vitamins.isActuator(typeOfVitaminString)); measurmentPane.setDisable(true); typePane.setDisable(true); } @FXML void onNewMeasurment(ActionEvent event) { newMeasurmentButton.setDisable(true); TextInputDialog dialog = new TextInputDialog("lengthOfThing"); dialog.setTitle("Add new measurment to " + typeOfVitaminString); dialog.setHeaderText("This measurment will be added to all instances of the vitamin"); dialog.setContentText("New measurment name:"); // Traditional way to get the response value. Optional result = dialog.showAndWait(); // The Java 8 way to get the response value (with lambda expression). result.ifPresent(name -> { TextInputDialog dialog2 = new TextInputDialog("0.0"); dialog2.setTitle("Set value of " + name); dialog2.setHeaderText("This value will be added to all instances of the vitamin"); dialog2.setContentText(name + " = "); // Traditional way to get the response value. Optional result2 = dialog2.showAndWait(); result2.ifPresent(name2 -> { setupKeyValueToTable(name, name2, sizeOfVitaminString); for (String size : Vitamins.listVitaminSizes(typeOfVitaminString)) { Vitamins.putMeasurment(typeOfVitaminString, size, name, name2); } }); newMeasurmentButton.setDisable(false); }); } @FXML void onSelectExistingTypeMode(ActionEvent event) { newTypeNameField.setEditable(false); typeComboBox.setDisable(false); // isShaft.setDisable(true); // isMotor.setDisable(true); } @FXML void onSelectNewTypeMode(ActionEvent event) { newTypeNameField.setEditable(true); typeComboBox.setDisable(true); // isShaft.setDisable(false); // isMotor.setDisable(false); } @FXML void onEditExisting(ActionEvent event) { if (editExisting.isSelected()) { newSizeField.setEditable(false); } else { newSizeField.setEditable(true); } } @FXML void onIsMotor(ActionEvent event) { if (isMotor.isSelected()) { isShaft.setSelected(false); setUpVitaminDefaults(); } } @FXML void onIsShaft(ActionEvent event) { if (isShaft.isSelected()) isMotor.setSelected(false); } @FXML // This method is called by the FXMLLoader when initialization is complete void initialize() { assert x1 != null : "fx:id=\"x1\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert x2 != null : "fx:id=\"x2\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert existingTypeRadio != null : "fx:id=\"existingTypeRadio\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert newTypeRadio != null : "fx:id=\"newTypeRadio\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert typeComboBox != null : "fx:id=\"typeComboBox\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert sizeComboBox != null : "fx:id=\"sizeComboBox\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; assert measurmentsTable != null : "fx:id=\"measurmentsTable\" was not injected: check your FXML file 'newVitaminWizard.fxml'."; sizePane.setDisable(true); measurmentPane.setDisable(true); ToggleGroup groupForType = new ToggleGroup(); existingTypeRadio.setSelected(true); newTypeRadio.setSelected(false); existingTypeRadio.setToggleGroup(groupForType); newTypeRadio.setToggleGroup(groupForType); newTypeNameField.setEditable(false); CopyOnWriteArrayList types = Vitamins.listVitaminTypes(); for (String s : types) { typeComboBox.getItems().add(s); } if (typeOfVitaminString == null) typeComboBox.getSelectionModel().select(types.get(0)); else typeComboBox.getSelectionModel().select(typeOfVitaminString); isShaft.setDisable(false); isMotor.setDisable(false); } public static void launchWizard(INewVitaminCallback callback) throws Exception { NewVitaminWizardController.callback = callback; BowlerStudio.runLater(() -> { Stage s = new Stage(); primaryStage = s; new Thread(() -> { NewVitaminWizardController controller = new NewVitaminWizardController(); try { SplashManager.renderSplashFrame(0, "Creating personal Fork Of Vitamins"); controller.saveAndFork(); SplashManager.closeSplash(); controller.start(s); } catch (Exception e) { e.printStackTrace(); SplashManager.closeSplash(); } }).start(); }); } public static void main(String[] args) throws Exception { JavaFXInitializer.go(); NewVitaminWizardController.launchWizard(new INewVitaminCallback() { @Override public Menu getTypeMenu(String type) { com.neuronrobotics.sdk.common.Log.error("Get Vitamin Menu"); return new Menu(type); } @Override public void addVitaminType(String s) { getTypeMenu(s); ArrayList sizes = Vitamins.listVitaminSizes(s); for (String size : sizes) { addSizesToMenu(size, s); } com.neuronrobotics.sdk.common.Log.error("Add addVitaminType " + s); } @Override public void addSizesToMenu(String size, String type) { com.neuronrobotics.sdk.common.Log.error("Add addSizesToMenu " + type + " " + size); } }); } @Override public void start(Stage primaryStage) throws Exception { FXMLLoader loader = AssetFactory.loadLayout("layout/newVitaminWizard.fxml", true); Parent root; // loader.setController(this); // This is needed when loading on MAC loader.setClassLoader(getClass().getClassLoader()); root = loader.load(); FontSizeManager.addListener(fontNum -> { int tmp = fontNum - 10; if (tmp < 12) tmp = 12; root.setStyle("-fx-font-size: " + tmp + "pt"); }); BowlerStudio.runLater(() -> { primaryStage.setTitle("Edit Vitamins Wizard"); Scene scene = new Scene(root); primaryStage.setScene(scene); primaryStage.initModality(Modality.WINDOW_MODAL); primaryStage.setResizable(true); primaryStage.show(); }); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/OutputFilter.java ================================================ /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.neuronrobotics.bowlerstudio; /** * * @author Michael Hoffer <info@michaelhoffer.de> */ @FunctionalInterface public interface OutputFilter { public boolean onMatch(String s); } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/PluginFactory.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.tabs.AbstractBowlerStudioTab; public interface PluginFactory { AbstractBowlerStudioTab generateNewPlugin() throws ClassNotFoundException, InstantiationException, IllegalAccessException; } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/PluginManager.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.bowlerstudio.creature.CreatureLab; import com.neuronrobotics.bowlerstudio.tabs.*; import com.neuronrobotics.nrconsole.plugin.BowlerCam.BowlerCamController; import com.neuronrobotics.nrconsole.plugin.DyIO.Secheduler.AnamationSequencer; import com.neuronrobotics.nrconsole.plugin.bootloader.BootloaderPanel; import com.neuronrobotics.pidsim.LinearPhysicsEngine; import com.neuronrobotics.pidsim.PidLab; import com.neuronrobotics.sdk.addons.gamepad.BowlerJInputDevice; import com.neuronrobotics.sdk.addons.kinematics.FirmataBowler; import com.neuronrobotics.sdk.addons.kinematics.MobileBase; import com.neuronrobotics.sdk.bootloader.NRBootLoader; import com.neuronrobotics.sdk.bowlercam.device.BowlerCamDevice; import com.neuronrobotics.sdk.common.BowlerAbstractDevice; import com.neuronrobotics.sdk.common.DMDevice; import com.neuronrobotics.sdk.common.Log; import com.neuronrobotics.sdk.dyio.DyIO; import com.neuronrobotics.sdk.util.ThreadUtil; import javafx.event.Event; import javafx.event.EventHandler; import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.cell.CheckBoxTreeCell; import javafx.scene.layout.VBox; import javafx.scene.text.Text; import java.util.ArrayList; //import com.neuronrobotics.nrconsole.plugin.DyIO.DyIOConsole; public class PluginManager { private BowlerAbstractDevice dev; private static ArrayList deviceSupport = new ArrayList<>(); private ArrayList liveTabs = new ArrayList<>(); // add tabs to the support list based on thier class // adding additional classes here will show up in the default // tabs list for objects of that type static { // DyIO addPlugin(new DeviceSupportPluginMap(DyIO.class, AnamationSequencer.class)); // Ipid // Image s // addPlugin(new DeviceSupportPluginMap(AbstractImageProvider.class, // CameraTab.class)); // addPlugin(new DeviceSupportPluginMap(AbstractImageProvider.class, // SalientTab.class)); // Bootloader addPlugin(new DeviceSupportPluginMap(NRBootLoader.class, BootloaderPanel.class)); // BowlerBoard Specific // addPlugin(new DeviceSupportPlugginMap(BowlerBoardDevice.class, //none yet)); // AbstractKinematicsNR // addPlugin(new DeviceSupportPluginMap(AbstractKinematicsNR.class, // JogKinematicsDevice.class)); // addPlugin(new DeviceSupportPluginMap(AbstractKinematicsNR.class, // AdvancedKinematicsController.class)); // addPlugin(new DeviceSupportPluginMap(AbstractKinematicsNR.class, // DhLab.class)); addPlugin(new DeviceSupportPluginMap(MobileBase.class, CreatureLab.class)); // NRPrinter // Bowler Cam addPlugin(new DeviceSupportPluginMap(BowlerCamDevice.class, BowlerCamController.class)); // LinearPhysicsEngine addPlugin(new DeviceSupportPluginMap(LinearPhysicsEngine.class, PidLab.class)); // Firmata addPlugin(new DeviceSupportPluginMap(FirmataBowler.class, FirmataTab.class)); // game controller addPlugin(new DeviceSupportPluginMap(BowlerJInputDevice.class, CalibrateGameControl.class)); } public PluginManager(BowlerAbstractDevice dev) { this.dev = dev; if (!dev.isAvailable()) throw new RuntimeException("Device is not reporting available " + dev.getClass().getSimpleName()); } public static void addPlugin(DeviceSupportPluginMap newMap) { for (int i = 0; i < deviceSupport.size(); i++) { try { if (deviceSupport.get(i).getDevice() == newMap.getDevice() && deviceSupport.get(i).getPlugin() == newMap.getPlugin()) { com.neuronrobotics.sdk.common.Log.error("Removing duplicate plugin: " + deviceSupport.remove(i)); } } catch (Exception e) { e.printStackTrace(); } } Log.debug("Adding Plugin " + newMap); deviceSupport.add(newMap); } public void setName(String name) { dev.setScriptingName(name); } public String getName() { return dev.getScriptingName(); } public BowlerAbstractDevice getDevice() { return dev; } private AbstractBowlerStudioTab generateTab(DeviceSupportPluginMap c) throws ClassNotFoundException, InstantiationException, IllegalAccessException { for (AbstractBowlerStudioTab t : liveTabs) { if (c.getPlugin().isInstance(t)) { // tab already exists, wake it up and return it t.onTabReOpening(); return t; } } AbstractBowlerStudioTab t = c.generateNewPlugin(); t.setDevice(dev); liveTabs.add(t); return t; } public void setTree(TreeItem item) { } public BowlerStudioController getBowlerStudioController() { return BowlerStudioController.getBowlerStudio(); } public Node getBowlerBrowser() { CheckBoxTreeItem rpc = new CheckBoxTreeItem<>("Bowler RPC"); TreeView treeView = new TreeView<>(rpc); treeView.setCellFactory(CheckBoxTreeCell.forTreeView()); return treeView; } public ArrayList getPlugins() { ArrayList plugins = new ArrayList<>(); VBox pluginLauncher = new VBox(20); for (DeviceSupportPluginMap c : deviceSupport) { if (c.getDevice().isInstance(dev)) { Button launcher; try { launcher = new Button(c.getPlugin().getSimpleName(), AssetFactory.loadIcon("Plugin-Icon.png")); } catch (RuntimeException e) { launcher = new Button(c.getPlugin().getSimpleName()); } launcher.setTooltip( new javafx.scene.control.Tooltip("Launch plugin to " + c.getPlugin().getSimpleName())); try {// These tabs are the select few to autoload when a device of theis type is // connected if (BootloaderPanel.class == c.getPlugin() || CreatureLab.class == c.getPlugin()) { if (getBowlerStudioController() != null) { com.neuronrobotics.sdk.common.Log.error("Auto loading " + c.getPlugin().getSimpleName()); Log.warning("Attempting Autoloading " + c); // if(CreatureLab.class !=c.getPlugin()) launchTab(c, launcher); // else // generateTab(c);// dont add the creature lab it uses the overlays } } else { Log.warning("Not autoloading " + c); } } catch (Exception e) { // Auto-generated catch block e.printStackTrace(); } Button l = launcher; launcher.setOnAction(b -> { launchTab(c, l); }); pluginLauncher.getChildren().add(launcher); } } String simpleName = dev.getClass().getSimpleName(); if (DMDevice.class.isInstance((dev))) { simpleName = ((DMDevice) dev).getWrapped().getClass().getSimpleName(); } Text text = new Text("\n" + simpleName + "\n"); TitledPane info = new TitledPane("Device Info", text); TitledPane protocol = new TitledPane("Bowler Protocol", getBowlerBrowser()); TitledPane pluginsPane = new TitledPane("Plugins", pluginLauncher); info.setGraphic(AssetFactory.loadIcon("Info.png")); protocol.setGraphic(AssetFactory.loadIcon("BowlerStudio.png")); pluginsPane.setGraphic(AssetFactory.loadIcon("Plugins.png")); plugins.add(info); if (dev.getConnection() != null) plugins.add(protocol); plugins.add(pluginsPane); return plugins; } private void launchTab(DeviceSupportPluginMap c, Button launcher) { new Thread() { public void run() { Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); setName("Launching " + c.getPlugin().getSimpleName()); try { AbstractBowlerStudioTab t = generateTab(c); // allow the threads to finish before adding ThreadUtil.wait(150); if (t.getContent() == null) { com.neuronrobotics.sdk.common.Log.error("ERROR tab failed to load!"); return; } getBowlerStudioController().addTab(t, true); t.setOnCloseRequest(new EventHandler() { @Override public void handle(Event arg0) { com.neuronrobotics.sdk.common.Log.error("PM is Closing " + t.getText()); t.onTabClosing(); BowlerStudio.runLater(() -> launcher.setDisable(false)); } }); BowlerStudio.runLater(() -> { launcher.setDisable(true); }); com.neuronrobotics.sdk.common.Log.error("Launching " + c.getPlugin().getSimpleName()); } catch (Exception e1) { // Auto-generated catch block e1.printStackTrace(); } } }.start(); } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/PluginManagerWidget.java ================================================ package com.neuronrobotics.bowlerstudio; import com.neuronrobotics.bowlerstudio.assets.AssetFactory; import com.neuronrobotics.sdk.common.Log; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Accordion; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.control.TitledPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import java.util.ArrayList; public class PluginManagerWidget extends TitledPane { private PluginManager manager; private TextField deviceName = new TextField(); private Button disconnectTHis; final Accordion accordion = new Accordion(); public PluginManagerWidget(PluginManager m, Node graphic) { HBox content = new HBox(20); content.setPadding(new Insets(0, 20, 10, 20)); this.manager = m; ArrayList plugins = manager.getPlugins(); accordion.getPanes().addAll(plugins); disconnectTHis = new Button("Disconnect " + manager.getName(), AssetFactory.loadIcon("Disconnect-Device.png")); disconnectTHis.setOnMousePressed(event -> { new Thread() { public void run() { Thread.currentThread().setUncaughtExceptionHandler(new IssueReportingExceptionHandler()); setName("disconnect plugins"); Log.warning("Disconnect button for " + manager.getName() + " pressed"); getManager().getDevice().disconnect(); } }.start(); }); setGraphic(AssetFactory.loadIcon("Bowler-Device-In-Manager.png")); deviceName.setOnAction(event -> { getManager().setName(deviceName.getText()); setText(manager.getName()); disconnectTHis.setText("Disconnect " + manager.getName()); }); BowlerStudio.runLater(() -> deviceName.setText(manager.getName())); content.setHgrow(accordion, Priority.ALWAYS); content.getChildren().addAll(graphic, disconnectTHis, deviceName, accordion); setContent(content); setText(manager.getName()); } public PluginManager getManager() { return manager; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/PsudoSplash.java ================================================ package com.neuronrobotics.bowlerstudio; import java.net.URISyntaxException; //import java.awt.AlphaComposite; //import java.awt.BorderLayout; //import java.awt.Color; //import java.awt.Dimension; //import java.awt.EventQueue; //import java.awt.Graphics; //import java.awt.Graphics2D; //import java.awt.RenderingHints; //import java.awt.image.BufferedImage; //import java.io.IOException; import java.net.URL; // //import javax.imageio.ImageIO; //import javax.swing.JFrame; //import javax.swing.JPanel; //import javax.swing.SwingUtilities; //import javax.swing.UIManager; //import javax.swing.UnsupportedLookAndFeelException; import com.neuronrobotics.bowlerstudio.assets.FontSizeManager; import com.neuronrobotics.bowlerstudio.assets.StudioBuildInfo; import com.neuronrobotics.bowlerstudio.scripting.DownloadManager; import com.neuronrobotics.bowlerstudio.scripting.GitLogProgressMonitor; import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine; import eu.mihosoft.vrl.v3d.JavaFXInitializer; import javafx.scene.paint.Color; import javafx.application.Platform; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; public class PsudoSplash implements GitLogProgressMonitor { // Static configuration private static int versionX = 65; private static int versionY = 45; private static int messageX = 65; private static int messageY = 260; private static int logY = 120; private static int logX = 15; private static PsudoSplash singelton = null; private static URL resource = PsudoSplash.class.getResource("splash.png"); private static URL dockIcon; private static Color TextColor = Color.WHITE; // Class Variables private long timeOfLastUpdate = 0; private String message = ""; private String log1 = ""; private String log2 = ""; private Stage popupStage; private ImageView imageView; private Scene popupScene; private AnchorPane popupRoot; private Label verL = new Label(); private Label logL1 = new Label(); private Label logL2 = new Label(); private Label mesL = new Label(); private double setWidth; private double scale; private static Stage parentWindow = null; public static boolean isInitialized() { return singelton != null; } public static PsudoSplash get() { if (singelton == null) singelton = new PsudoSplash(); if (!singelton.isVisibleSplash()) { Platform.runLater(() -> { if (singelton != null) singelton.showPopup(); }); // new Exception("Opening Splash").printStackTrace(); } return singelton; } public static void close() { if (singelton != null) singelton.closeSplashLocal(); singelton = null; } @Override public void onLogUpdate(String update, Exception e) { String[] s = update.split("\n"); log1 = s[0]; log2 = ""; if (s.length > 1) { for (int i = 1; i < s.length; i++) { log2 += s[i] + " "; } } if (isVisibleSplash()) updateSplash(); } public static int getVersionX() { return versionX; } public static void setVersionX(int x) { versionX = x; } public static int getVersionY() { return versionY; } public static void setVersionY(int y) { versionY = y; } private PsudoSplash() { Platform.runLater(() -> { try { setPopupStage(new Stage(StageStyle.TRANSPARENT)); } catch (IllegalStateException ex) { JavaFXInitializer.go(); setPopupStage(new Stage(StageStyle.TRANSPARENT)); } // Always show on top // popupStage.setAlwaysOnTop(true); popupRoot = new AnchorPane(); // Load your image String path; try { path = resource.toURI().toString(); } catch (URISyntaxException e) { e.printStackTrace(); close(); return; } com.neuronrobotics.sdk.common.Log.debug("Loading splash image: " + path); Image image = new Image(path); imageView = new ImageView(image); double height = image.getHeight(); double width = image.getWidth(); setWidth = 500; scale = setWidth / width; double calculatedHeight = scale * height; imageView.setFitWidth(setWidth); imageView.setFitHeight(calculatedHeight); // Add the image to the popup root popupRoot.getChildren().add(imageView); popupRoot.getChildren().add(verL); popupRoot.getChildren().add(mesL); popupRoot.getChildren().add(logL1); popupRoot.getChildren().add(logL2); popupScene = new Scene(popupRoot); popupScene.setFill(null); // Make scene background transparent getPopupStage().setScene(popupScene); // Optional: Allow the popup to be dragged final double[] xOffset = {0}; final double[] yOffset = {0}; popupRoot.setOnMousePressed(event -> { xOffset[0] = event.getSceneX(); yOffset[0] = event.getSceneY(); getPopupStage().setAlwaysOnTop(false); if (event.getClickCount() == 2) { close(); } }); popupRoot.setOnMouseDragged(event -> { getPopupStage().setX(event.getScreenX() - xOffset[0]); getPopupStage().setY(event.getScreenY() - yOffset[0]); }); try { // CADoodle-Icon.png if (dockIcon != null) { Image loadAsset = new Image(dockIcon.toString()); getPopupStage().getIcons().add(loadAsset); } } catch (Exception e) { e.printStackTrace(); } if (parentWindow == null) { // Use NONE modality to prevent the window from becoming disabled getPopupStage().initModality(Modality.NONE); getPopupStage().setAlwaysOnTop(true); } else { getPopupStage().initOwner(parentWindow); getPopupStage().initModality(Modality.WINDOW_MODAL); } updateSplash(); }); try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } FontSizeManager.addListener(fontNum -> { double tmp = FontSizeManager.getImageScale() * 14; mesL.setStyle("-fx-font-size: " + ((int) tmp) + "pt"); logL1.setStyle("-fx-font-size: " + ((int) tmp) + "pt"); logL2.setStyle("-fx-font-size: " + ((int) tmp) + "pt"); verL.setStyle("-fx-font-size: " + ((int) tmp) + "pt"); }); } private void showPopup() { Stage popupStage2 = getPopupStage(); if (popupStage2 != null) popupStage2.show(); } public static boolean isVisibleSplash() { if (singelton == null) return false; if (singelton.getPopupStage() == null) return false; return singelton.getPopupStage().isShowing(); } private void closeSplashLocal() { BowlerStudio.runLater(() -> { Stage popupStage2 = getPopupStage(); if (popupStage2 != null) popupStage2.hide(); setPopupStage(null); }); if (!Platform.isFxApplicationThread()) try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } void updateSplash() { if (System.currentTimeMillis() - timeOfLastUpdate < 100) { return; } timeOfLastUpdate = System.currentTimeMillis(); if (popupScene != null) { // com.neuronrobotics.sdk.common.Log.debug("Updating Splash // "+imageView.getFitWidth()); Platform.runLater(() -> { // popupStage.setAlwaysOnTop(false); popupScene.setFill(null); popupScene.getStylesheets().clear(); // Explicitly set an empty style popupRoot.setStyle("-fx-background-color: transparent;"); logL1.setLayoutX(logX * scale); logL1.setLayoutY(logY * scale); logL2.setLayoutX((logX + 30) * scale); logL2.setLayoutY((logY + 40) * scale); mesL.setLayoutX(messageX * scale); mesL.setLayoutY(messageY * scale); verL.setLayoutX(versionX * scale); verL.setLayoutY(versionY * scale); logL1.setTextFill(TextColor); logL2.setTextFill(TextColor); mesL.setTextFill(TextColor); verL.setTextFill(TextColor); logL1.setText(log1); logL2.setText(log2); mesL.setText(message); verL.setText(StudioBuildInfo.getVersion()); }); // Make scene background transparent } } public String getMessage() { return message; } public void setMessage(String message) { if (message.length() > 45) { this.message = message.subSequence(0, 45).toString(); // new RuntimeException().printStackTrace(); } else this.message = message; ScriptingEngine.addLogListener(this); DownloadManager.addLogListener(this); log1 = ""; log2 = ""; } public static URL getResource() { return resource; } public static void setResource(URL r) { resource = r; } public static Color getTextColor() { return TextColor; } public static void setTextColor(Color textColor) { TextColor = textColor; } public static int getMessageX() { return messageX; } public static void setMessageX(int messageX) { PsudoSplash.messageX = messageX; } public static int getMessageY() { return messageY; } public static void setMessageY(int messageY) { PsudoSplash.messageY = messageY; } public static int getLogY() { return logY; } public static void setLogY(int logY) { PsudoSplash.logY = logY; } public static int getLogX() { return logX; } public static void setLogX(int logX) { PsudoSplash.logX = logX; } public static void setTrayIcon(URL resource2) { PsudoSplash.setDockIconResource(resource2); } public static URL getDockIconResource() { return dockIcon; } public static void setDockIconResource(URL resource2) { PsudoSplash.dockIcon = resource2; } public static Stage getParentWindow() { return parentWindow; } public static void setParentWindow(Stage pw) { parentWindow = pw; } public Stage getPopupStage() { return popupStage; } public void setPopupStage(Stage popupStage) { this.popupStage = popupStage; } } ================================================ FILE: src/main/java/com/neuronrobotics/bowlerstudio/RedirectableStream.java ================================================ /* * RedirectableStream.java * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2009–2012 Steinbeis Forschungszentrum (STZ Ölbronn), * Copyright (c) 2006–2012 by Michael Hoffer * * This file is part of Visual Reflection Library (VRL). * * VRL is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * as published by the Free Software Foundation. * * see: http://opensource.org/licenses/LGPL-3.0 * file://path/to/VRL/src/eu/mihosoft/vrl/resources/license/lgplv3.txt * * VRL is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * This version of VRL includes copyright notice and attribution requirements. * According to the LGPL this information must be displayed even if you modify * the source code of VRL. Neither the VRL Canvas attribution icon nor any * copyright statement/attribution may be removed. * * Attribution Requirements: * * If you create derived work you must do three things regarding copyright * notice and author attribution. * * First, the following text must be displayed on the Canvas: * "based on VRL source code". In this case the VRL canvas icon must be removed. * * Second, the copyright notice must remain. It must be reproduced in any * program that uses VRL. * * Third, add an additional notice, stating that you modified VRL. In addition * you must cite the publications listed below. A suitable notice might read * "VRL source code modified by YourName 2012". * * Note, that these requirements are in full accordance with the LGPL v3 * (see 7. Additional Terms, b). * * Publications: * * M. Hoffer, C.Poliwoda, G.Wittum. Visual Reflection Library - * A Framework for Declarative GUI Programming on the Java Platform. * Computing and Visualization in Science, 2011, in press. */ package com.neuronrobotics.bowlerstudio; import java.io.OutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; import java.util.logging.Level; import java.util.logging.Logger; import javafx.application.Platform; import javafx.scene.control.TextArea; /** * * @author Michael Hoffer info@michaelhoffer.de */ public class RedirectableStream extends PrintStream { public static PrintStream ORIGINAL_SOUT = System.out; public static PrintStream ORIGINAL_SERR = System.err; private final List