abfab3d.io.input.AttributedMeshReader.java Source code

Java tutorial

Introduction

Here is the source code for abfab3d.io.input.AttributedMeshReader.java

Source

/*****************************************************************************
 *                        Shapeways, Inc Copyright (c) 2012
 *                               Java Source
 *
 * This source is licensed under the GNU LGPL v2.1
 * Please read http://www.gnu.org/copyleft/lgpl.html for more information
 *
 * This software comes with the standard NO WARRANTY disclaimer for any
 * purpose. Use it at your own risk. If there's a problem you get to fix it.
 *
 ****************************************************************************/

package abfab3d.io.input;

import abfab3d.core.DataSource;
import abfab3d.core.Transformer;
import abfab3d.core.AttributedTriangleCollector;
import abfab3d.core.AttributedTriangleProducer;
import abfab3d.core.VecTransform;
import org.apache.commons.io.FilenameUtils;

import java.io.File;
import java.io.InputStream;
import java.util.HashSet;

import static abfab3d.core.Output.printf;

/**
 * Reads triangle mesh from a file/stream into various formats.  Supports attribute loading of color and multimaterial
 * files.
 *
 * Currently supported are x3db, x3d, x3dv
 *
 * @author Alan Hudson
 */
public class AttributedMeshReader extends BaseMeshReader implements AttributedTriangleProducer, Transformer {

    private String m_path;
    private InputStream m_is;
    private String m_format;
    private String m_baseURL;
    private VecTransform m_transform;
    private AttributedTriangleProducer m_producer;
    private DataSource m_attributeCalc;
    private int m_dataDimension = -1;
    private boolean m_initialized = false;

    public AttributedMeshReader(String path) {
        m_path = path;

        File f = new File(m_path);

        if (f.isDirectory()) {
            // got a directory, need to find the main file
            File[] files = f.listFiles();
            int len = files.length;
            String main = null;

            for (int i = 0; i < len; i++) {
                String ext = FilenameUtils.getExtension(files[i].getName());
                if (supportedExt.contains(ext)) {
                    if (main != null) {
                        throw new IllegalArgumentException(
                                "Zip contains multiple main file.  First: " + main + " Second: " + files[i]);
                    }

                    main = files[i].getAbsolutePath();
                }
            }

            if (main == null) {
                throw new IllegalArgumentException("Zip does not contain a supported main file");
            }
            m_path = main;

            printf("main file: %s\n", m_path);
        }

        m_format = FilenameUtils.getExtension(m_path);
    }

    /**
     * Load stream versions.  For the STL path we only support binary STL
     *
     * @param is
     * @param format
     */
    public AttributedMeshReader(InputStream is, String baseURL, String format) {
        m_is = is;
        m_format = format;
        m_baseURL = baseURL;
    }

    public boolean getAttTriangles(AttributedTriangleCollector out) {

        initialize();

        boolean ret_val = m_producer.getAttTriangles(out);

        return ret_val;
    }

    protected void createReader() {

        if (m_format.equalsIgnoreCase(EXT_STL)) {
            if (m_is != null) {
                m_producer = new STLReader(m_is);
            } else {
                m_producer = new STLReader(m_path);
            }
        } else if (m_format.equalsIgnoreCase(EXT_X3DB) || m_format.equalsIgnoreCase(EXT_X3D)
                || m_format.equalsIgnoreCase(EXT_X3DV) || m_format.equalsIgnoreCase(EXT_WRL)) {

            if (m_is != null) {
                m_producer = new AttributedX3DReader(m_is, m_baseURL);
            } else {
                m_producer = new AttributedX3DReader(m_path);
            }
        }

        if (m_producer == null)
            throw new IllegalArgumentException("Unsupported format: " + m_format + " path: " + m_path);

        if (m_producer instanceof AttributedX3DReader) {
            m_dataDimension = ((AttributedX3DReader) m_producer).getDataDimension();
            m_attributeCalc = ((AttributedX3DReader) m_producer).getAttributeCalculator();
        } else {
            m_dataDimension = 3;
        }

    }

    public void setTransform(VecTransform trans) {
        m_transform = trans;
    }

    public void initialize() {

        if (m_initialized)
            return;

        if (m_producer == null) {
            createReader();
        }

        if (m_producer != null && m_producer instanceof Transformer) {

            ((Transformer) m_producer).setTransform(m_transform);

        }

        m_initialized = true;
    }

    /**
     * Get the attribute calculator.  Must be called after getTriangles2 call.
     * @return
     */
    public DataSource getAttributeCalculator() {

        initialize();

        return m_attributeCalc;
    }

    /**
     * Returns how many data channels this file contains.  
     */
    public int getDataDimension() {

        initialize();

        return m_dataDimension;
    }
}