Source: swcad-js-calcs/src/geometry/reinforcement/index.js

"use strict"

/**
 * Reinforcement layout for basic geometries (rectangle, triangle, ellipse)
 * @namespace reinforcement
 * @memberof calcs.geometry
 * @author R. J. Salvador
 * @version 1.0.0
 * @requires jscad v2, swcad-js v0.11.8
 */

const profReinforcementsInit = ({ jscad, swcadJs }) => {
    const {
        math,
    } = swcadJs.calcs

    const {
        standards,
    } = swcadJs.data


    //==============================================================================


    /**
     * Builds default values and opts for the model
     * @param {*} opts 
     * @returns default values and opts
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const modelDefaults = () => {
        /** Specific value declarations */
        const defaultValues = {
            dims: {
                size: [
                    math.inchesToMm(2),
                    math.inchesToMm(4),
                    math.inchesToMm(1),
                ],
            },
            points: {
                centre: [0, 0, 0]
            },
            types: {
                default: standards.types.TYPE_DEFAULT,
                alt: standards.types.TYPE_ALT,
            },
        }

        /** Options used by SW models */
        const standardOpts = {
            type: defaultValues.types.default.id,
            scale: 1,
            interfaceThickness: standards.INTERFACE_THICKNESS,
            fitGap: standards.FIT_GAP,
        }

        /** Computed values for option defaults */
        const defaultOpts = {
            ...standardOpts,
            size: defaultValues.dims.size,
        }

        return {
            opts: defaultOpts,
            vals: defaultValues,
        }
    }

    /**
     * Builds default values and opts for the model
     * @param {*} opts 
     * @returns default values and opts
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const rectangleDefaults = () => {
        /** Specific value declarations */
        const defaultValues = {
            opts: {
                reinforcementPatterns: ['x', 'cross', 'diamond', 'full'],
            },
            dims: {
                size: [40, 50],
            },
            points: {
                centre: [0, 0]
            },
            typeDetails: {
                default: standards.types.TYPE_DEFAULT,
                alt: standards.types.TYPE_ALT,
            }
        }


        /* ----------------------------------------
         * Options / Properties -- Input Handling
         * ------------------------------------- */

        /** Computed values for option defaults */
        const defaultOpts = {
            size: defaultValues.dims.size,
            reinforcementPattern: defaultValues.opts.reinforcementPatterns[0],
            interfaceThickness: standards.INTERFACE_THICKNESS,
            fitGap: standards.FIT_GAP,
            type: 'default',
            scale: 1,
        }

        return {
            opts: defaultOpts,
            vals: defaultValues,
        }
    }


    //------------------------------------------------------------------------------


    /**
     * Initializes options with user input
     * @param {*} opts 
     * @returns model properties
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const modelOpts = (opts) => {
        const defaults = modelDefaults()

        // User options
        const {
            size = defaults.opts.size,
            type = defaults.opts.type,
            scale = defaults.opts.scale,
            interfaceThickness = defaults.opts.interfaceThickness,
            fitGap = defaults.opts.fitGap,
        } = opts

        const stdOpts = {
            type,
            scale,
            interfaceThickness,
            fitGap,
        }

        const initOpts = {
            size,
            ...stdOpts,
        }


        return initOpts
    }

    /**
     * Initializes options with user input
     * @param {*} opts 
     * @returns model properties
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const rectangleOpts = (opts) => {
        const defaults = rectangleDefaults()

        // User options
        const {
            size = defaults.opts.size,
            reinforcementPattern = defaults.opts.reinforcementPattern,
            interfaceThickness = defaults.opts.interfaceThickness,
            fitGap = defaults.opts.fitGap,
            type = defaults.opts.type,
            scale = defaults.opts.scale,
        } = opts

        const stdOpts = {
            size,
            reinforcementPattern,
            interfaceThickness,
            fitGap,
            type,
            scale,
        }

        const initOpts = {
            size,
            ...stdOpts,
        }

        return initOpts
    }


    //------------------------------------------------------------------------------


    /**
     * Builds model properties from the given opts
     * @param {*} opts 
     * @returns model properties
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const modelProps = (opts) => {
        const defaults = modelDefaults()

        const {
            size,
            type,
            scale,
            interfaceThickness,
            fitGap,
        } = opts

        /* ----------------------------------------
        * Prop calculations
        * ------------------------------------- */

        const width = size[0]
        const depth = size[1]
        const height = size[2]

        /* ----------------------------------------
        * Preparing Model Properties, Dimensions
        * ------------------------------------- */

        /** Constant values for model */
        const modelConstants = {
        }

        /** Derived user options for the model */
        const modelOpts = {
            type,
            scale,
        }

        /** Various dimensions for model */
        const modelDims = {
            size,
            interfaceThickness,
            fitGap,
            width,
            depth,
            height,
        }

        /** Various key points for model */
        const modelPoints = {
            centre: defaults.vals.points.centre,
        }

        /** Components used by model */
        const modelComponents = {
        }

        /* ---------------------------------------------
        *  Model Properties
        * ----------------------------------------------
        * Properties accessible to all model functions.
        * --------------------------------------------- */

        const modelProperties = {
            metadata: {
                id: '9999',
                name: 'New Model',
                project: 'New Project',
                author: 'Somebody Somewhere',
                organization: 'Salvador Workshop',
                client: null,
            },
            constants: modelConstants,
            opts: modelOpts,
            dims: modelDims,
            points: modelPoints,
            components: modelComponents,
        }


        return modelProperties
    }

    const rectangleProps = (opts) => {
        const defaults = rectangleDefaults()

        const {
            size,
            reinforcementPattern,
            interfaceThickness,
            fitGap,
            type,
            scale,
        } = opts

        /* ----------------------------------------
        * Prop calculations
        * ------------------------------------- */

        const width = size[0]
        const length = size[1]

        const midX = width / 2
        const midY = length / 2
        const midpoint = [midX, midY]

        const corners = [
            [0, 0],
            [width, 0],
            [width, length],
            [0, length],
        ]

        const midpoints = [
            [midX, 0],
            [width, midY],
            [midX, length],
            [0, midY],
        ]

        const outline = [
            [
                corners[0],
                corners[1],
            ],
            [
                corners[1],
                corners[2],
            ],
            [
                corners[2],
                corners[3],
            ],
            [
                corners[3],
                corners[0],
            ],
        ]

        const diagBraces = [
            [
                corners[0],
                corners[2],
            ],
            [
                midpoint,
                corners[1],
            ],
            [
                midpoint,
                corners[3],
            ],
        ]

        const crossBraces = [
            [
                midpoints[0],
                midpoints[2],
            ],
            [
                midpoints[1],
                midpoints[3],
            ],
        ]

        const midBraces = [
            [
                midpoints[0],
                midpoints[1],
            ],
            [
                midpoints[1],
                midpoints[2],
            ],
            [
                midpoints[2],
                midpoints[3],
            ],
            [
                midpoints[3],
                midpoints[0],
            ],
        ]

        let dots = []
        let lines = []
        let primaryLines = []
        let secondaryLines = []

        switch (reinforcementPattern) {
            case 'full':
                primaryLines = [
                    ...crossBraces,
                ]
                secondaryLines = [
                    ...midBraces,
                    ...diagBraces,
                ]
                lines = [
                    ...primaryLines,
                    ...secondaryLines,
                ]
                break;
            case 'diamond':
                primaryLines = [
                    ...crossBraces,
                ]
                secondaryLines = [
                    ...midBraces,
                ]
                lines = [
                    ...primaryLines,
                    ...secondaryLines,
                ]
                break;
            case 'cross':
                primaryLines = [
                    ...crossBraces,
                ]
                secondaryLines = [
                    ...diagBraces,
                ]
                lines = [
                    ...primaryLines,
                    ...secondaryLines,
                ]
                break;
            case 'x':
            default:
                primaryLines = [
                    ...diagBraces,
                ]
                secondaryLines = []
                lines = [
                    ...primaryLines,
                    ...secondaryLines,
                ]
                break;
        }

        /* ----------------------------------------
        * Preparing Model Properties, Dimensions
        * ------------------------------------- */

        /** Derived user options for the model */
        const modelOpts = {
            reinforcementPattern,
        }

        /** Various dimensions for model */
        const modelDims = {
            size,
            width,
            length,
        }

        /** Various key points for model */
        const modelPoints = {
            corners,
            lines,
            primaryLines,
            secondaryLines,
            centre: midpoint,
            outline,
            midpoints,
            braces: {
                cross: crossBraces,
                diagonal: diagBraces,
                mid: midBraces,
            },
        }


        /* ---------------------------------------------
        *  Model Properties
        * ----------------------------------------------
        * Properties accessible to all model functions.
        * --------------------------------------------- */

        const modelProperties = {
            metadata: {
                id: '9999',
                name: 'New Model',
                project: 'New Project',
                author: 'Somebody Somewhere',
                organization: 'Salvador Workshop',
                client: null,
            },
            opts: modelOpts,
            dims: modelDims,
            points: modelPoints,
        }


        return modelProperties
    }


    //------------------------------------------------------------------------------


    /**
     * New Model 2
     * @param {*} opts 
     * @returns Modelling data
     * @memberof calcs.geometry.reinforcement
     * @access private
     */

    const reinforcedTriangle = (opts) => {
        const defaults = modelDefaults()
        const initOpts = modelOpts(opts)
        const modelProperties = modelProps(initOpts)

        const data = {
            points: null
        }

        return data
    }

    /**
     * New Model 1
     * @param {*} opts 
     * @returns Modelling data
     * @memberof calcs.geometry.reinforcement
     */
    const reinforcedRectangle = (opts) => {
        const defaults = rectangleDefaults()
        const initOpts = rectangleOpts(opts)
        const modelProperties = rectangleProps(initOpts)

        const data = {
            opts: modelProperties.opts,
            dims: modelProperties.dims,
            points: modelProperties.points,
        }

        return data
    }

    /**
     * ...
     * @param {*} opts 
     * @returns Modelling data
     * @memberof calcs.geometry.reinforcement
     * @access private
     */
    const reinforcedEllipse = (opts) => {
        const defaults = modelDefaults()
        const initOpts = modelOpts(opts)
        const modelProperties = modelProps(initOpts)

        const data = {
            points: null
        }

        return data
    }

    return {
        defaults: modelDefaults,
        props: modelProps,
        reinforcedTriangle,
        reinforcedRectangle,
        reinforcedEllipse,
    }
}

module.exports = {
    init: profReinforcementsInit
}