/******************************************************************************* * This file is part of Goko. * * Goko is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Goko 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 Goko. If not, see <http://www.gnu.org/licenses/>. *******************************************************************************/ /* * This file is part of Goko. * * Goko is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Goko 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 Goko. If not, see <http://www.gnu.org/licenses/>. */ package org.goko.core.rs274ngcv3; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.goko.core.common.exception.GkException; import org.goko.core.common.exception.GkTechnicalException; import org.goko.core.rs274ngcv3.config.RS274Preference; import org.goko.core.rs274ngcv3.parser.GCodeToken; public class RS274 { public final static String MOTION_MODE_RAPID = "g0"; public final static String MOTION_MODE_RAPID_EXTENDED = "g00"; public final static String MOTION_MODE_CONTROLLED = "g1" ; public final static String MOTION_MODE_CONTROLLED_EXTENDED = "g01" ; public final static String MOTION_MODE_ARC_CW = "g2" ; public final static String MOTION_MODE_ARC_CW_EXTENDED = "g02" ; public final static String MOTION_MODE_ARC_CCW = "g3" ; public final static String MOTION_MODE_ARC_CCW_EXTENDED = "g03" ; public static String getTokenLetter(GCodeToken token){ return StringUtils.substring(token.getValue(), 0,1); } public static boolean isUniqueTokenByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException{ return findUniqueTokenByLetter(letter, lstTokens) != null; } public static GCodeToken findUniqueTokenByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException{ GCodeToken uniqueToken = null; for (GCodeToken token : lstTokens) { if(StringUtils.equalsIgnoreCase(letter, getTokenLetter(token))){ if(uniqueToken != null){ throw new GkTechnicalException("Multiple GCode word with letter "+letter+" found in token list."); } uniqueToken = token; } } return uniqueToken; } public static GCodeToken removeUniqueTokenByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException{ GCodeToken uniqueToken = null; for (GCodeToken token : lstTokens) { if(StringUtils.equalsIgnoreCase(letter, getTokenLetter(token))){ if(uniqueToken != null){ throw new GkTechnicalException("Multiple GCode word with letter "+letter+" found in token list."); } uniqueToken = token; } } if(uniqueToken != null){ lstTokens.remove(uniqueToken); } return uniqueToken; } public static GCodeToken getUniqueTokenByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException{ GCodeToken uniqueToken = findUniqueTokenByLetter(letter, lstTokens); if(uniqueToken == null){ throw new GkTechnicalException("No token for letter "+letter+" found in "+lstTokens); } return uniqueToken; } public static List<GCodeToken> findTokenByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException{ List<GCodeToken> tokens = new ArrayList<GCodeToken>(); for (GCodeToken token : lstTokens) { if(StringUtils.equalsIgnoreCase(getTokenLetter(token), letter)){ tokens.add(token); } } return tokens; } public static boolean isToken(String strToken, Collection<GCodeToken> lstTokens)throws GkException{ return findToken(strToken, lstTokens) != null; } public static GCodeToken removeToken(String strToken, Collection<GCodeToken> lstTokens)throws GkException{ GCodeToken token = findToken(strToken, lstTokens); if(token != null){ lstTokens.remove(token); } return token; } public static GCodeToken findToken(String strToken, Collection<GCodeToken> lstTokens)throws GkException{ GCodeToken uniqueToken = null; for (GCodeToken token : lstTokens) { if(StringUtils.equalsIgnoreCase(strToken,token.getValue())){ if(uniqueToken != null){ throw new GkTechnicalException("Multiple GCode word "+strToken+" found in token list."); } uniqueToken = token; } } return uniqueToken; } public static String getTokenValue(GCodeToken token) { return StringUtils.substring(token.getValue(), 1); } public static String getTokenValueByLetter(String letter, Collection<GCodeToken> lstTokens) throws GkException { return getTokenValue( getUniqueTokenByLetter(letter, lstTokens) ); } public static BigDecimal buildBigDecimal(String value) throws GkException{ BigDecimal bigDecimal = new BigDecimal(value); if(RS274Preference.getInstance().isDecimalTruncateEnabled()){ int decimalCount = RS274Preference.getInstance().getDecimalCount(); if(bigDecimal.scale() > decimalCount){ bigDecimal = bigDecimal.setScale(decimalCount,RoundingMode.DOWN); } } return bigDecimal; } public static String toString(List<GCodeToken> lstTokens) { StringBuffer buffer = new StringBuffer(); if(CollectionUtils.isNotEmpty(lstTokens)){ for (GCodeToken gCodeToken : lstTokens) { buffer.append(gCodeToken.getValue()); buffer.append(" "); } } return buffer.toString(); } }