Source

adapter/AdapterDesite.js

/**
 * $Id: AdapterDesite.js 9009 2025-10-15 09:03:33Z alexander.rensch $
 */

'use strict'

import { IModelViewer } from "./IModelViewer.js";

////////////////////////////////////////////////////////
///   DESITE
////////////////////////////////////////////////////////

export const eDomain = Object.freeze({
    GEO: "geo",
    ACT: "act",
    BOQ: "boq",
    DOC: "doc",
    TYP: "typ",
    ISS: "iss",
    RES: "res",
    BST: "bst",
    CST: "cst",     // custom
    ALL: "all"
});


/**
 * @category Model Viewer
 * @ignore
 * @classdesc Encapsulate functions common for all DESITE versions.
 */
export class DESITE_COMMON extends IModelViewer {

    constructor(t, n, v ) {
        super(t, n, v )       
    }

    async loginUser(cb , user = null ) {

        let url = window.location // .href
        let auth_target_ = new URL(url.protocol + url.host + "/cn_login")

        console.log(`auth : ${auth_target_}`)

        //
        // check if user and token are stored in local storage
        // if so, return user/token, otherwise forwarrd to
        // webpage ./cn_login

        let u = window.localStorage.getItem('user')
        let t = window.localStorage.getItem('token')

        if( user != undefined ) {
        
            if( u != user ) {
                t = null
            }
            
            u = user

        }
        
        if (t == undefined) {

            let queryString = window.location.search;
            let urlParams = new URLSearchParams(queryString);

            urlParams.set('redirect', window.location) // window.location.href ???

            if (typeof _default_userid_ != 'undefined') {
                urlParams.set('userid', _default_userid_) // window.location.href ???
            }

            let target = auth_target_

            target.search = urlParams.toString()

            window.location = target

        } else {
            return cb({
                'status': 200,
                'data': {
                    'userid': u,
                    'token': t
                }
            })
        }

    }
     
    async logoutUser(cb ) {
        window.localStorage.removeItem('token')
        window.localStorage.removeItem('user')
        window.location.reload()
        return cb({
            'status' : 200
        })
    }

     async restoreProjectContext( cb ) {
        return ({
            'status' : 501 
        })
    }

    saveProjectContext( cb ) {
        return ({
            'status' : 501 
        })
    }


    /**
     *
     */
    #selectionChanged = {
        connect(func) {
            return desiteAPI.selectionChanged.connect(func)
        },
        disconnect(func) {
            return desiteAPI.selectionChanged.disconnect(func)
        }
    }
    /**
     *
     */
    #selectionChangedByDomain = {
        connect(func) {
            return desiteAPI.selectionChangedByDomain.connect(func)
        },
        disconnect(func) {
            return desiteAPI.selectionChangedByDomain.disconnect(func)
        }
    }

    get modelViewerName() { return "DESITE" }
    get selectionChanged() { return this.#selectionChanged; }
    get selectionChangedByDomain() { return this.#selectionChangedByDomain; }

    showHomeView() {
        return desiteAPI.showHomeView()
    }
    getProjectDirectory() {
        return desiteAPI.getProjectDirectory()
    }

    saveProject() {
        return desiteAPI.saveProject()
    }

    openLink(url, useDesktopService) {
        return desiteAPI.openLink(url, useDesktopService)
    }

    //!ptKeyStr in pname und ptype
    colorCodeObjects(objIds, ptKeyStr, intervalSize) {
        return desiteAPI.colorCodeObjects(objIds, propertyName, propertyDatatype, intervalSize)
    }

    resetMaterials(updateUI) {
        return desiteAPI.resetMaterials(updateUI)
    }

    readTextFileAsString(filePath, codec) {
        return desiteAPI.readTextFileAsString(filePath, codec)
    }

    moveFile(fnFrom, nTo) {
        return desiteAPI.moveFile(fnFrom, nTo)
    }

    writeFile(filePath, content, encoding) {
        return desiteAPI.writeFile(filePath, content, encoding)
    }
}

/**
 * @category Model Viewer
 * @ignore
 * @classdesc Encapsulate functions common for DESITE versions 3.0 and 3.2. Not indended to be importable.
 */
export class DESITE_COMMON_30_32 extends DESITE_COMMON {

    constructor(t,n,v) {
        super(t,n,v)        
        desiteAPI.selectionChanged.connect(this.onSelectionChanged.bind(this));
        desiteAPI.visibilityChanged.connect(this.onVisibilityChanged.bind(this));
    }

    getSelectedElements(domain) {
        return desiteAPI.getSelectedElements(domain)
    }

    getAllElements(domain) {
        return desiteAPI.getAllElements(domain)
    }

    //!ptKeyStr in pname und ptype
    setPropertyValue(objid, ptKeyStr, value) {
        return desiteAPI.setPropertyValue(objid, pname, ptype, value)
    }

    //!ptKeyStr in pname und ptype
    getPropertyValue(objid, ptKeyStr) {
        return desiteAPI.getPropertyValue(objid, pname, ptype)
    }

    getMaterial(matId) {
        return desiteAPI.getMaterial(matId)
    }

    getAsJSON(objId) {
        return desiteAPI.getAsJSON(objId)
    }

    //!ptKeyStr in pname und ptype
    getPropertyValuesByObjectList(ptKeyStr, checkInherited, objectIdList, maxValues, domains, getNullValues) {
        return desiteAPI.getPropertyValuesByObjectList(propertyName, propertyDatatype, checkInherited, objectIdList, maxValues, domains, getNullValues)
    }

    getPropertyValuesByObject(objId, filterpattern) {
        return desiteAPI.getPropertyValuesByObject(objId, filterpattern)
    }

    checkRegExp(value, pattern) {
        return desiteAPI.checkRegExp(value, pattern)
    }

    setVisible(objIds, flagOnOff, exclusively) {
        let domainPromises = objIds.map(objId => desiteAPI.getDomainByElement(objId));

        return Promise.all(domainPromises)
            .then(domains => {
                let uniqueDomains = [...new Set(domains)];
                if (flagOnOff) {
                    if (exclusively) {
                        return desiteAPI.showElementsOnly(objIds, uniqueDomains)
                    } else {
                        return desiteAPI.showElements(objIds, true, uniqueDomains)
                    }
                } else {
                    return desiteAPI.hideElements(objIds, true, uniqueDomains)
                }
            })

    }

    setSelected(objIds, flagOnOff, exclusively) {
        if (exclusively) {
            let domainPromises = objIds.map(objId => desiteAPI.getDomainByElement(objId));

            return Promise.all(domainPromises)
                .then(domains => {
                    let uniqueDomains = [...new Set(domains)];

                    return desiteAPI.clearSelection(true, uniqueDomains);
                })
                .then(() => {
                    return desiteAPI.selectElements(objIds, flagOnOff, uniqueDomains);
                });
        } else {
            let domainPromises = objIds.map(objId => desiteAPI.getDomainByElement(objId));

            return Promise.all(domainPromises)
                .then(domains => {
                    let uniqueDomains = [...new Set(domains)];

                    return desiteAPI.selectElements(objIds, flagOnOff, uniqueDomains);
                })
        }
    }

}

/**
 * @category Model Viewer
 * @ignore
 * @classdesc Encapsulate functions common for DESITE version 3.4 and VDC-Manager 4.0. Not indended to be importable.
 */
export class DESITE_COMMON_34_40 extends DESITE_COMMON {

    constructor(t,n,v) {
        super(t,n,v)
    }

    /**
    * Mapping of IDs in Desite versions >= 3.4
    */
    getSelectedElements(domain) {
        return desiteAPI.getSelectedElements(domain)
            .then(objectIdListNotExternal => {
                return desiteAPI.mapToExternalIDs(objectIdListNotExternal);
            })
            .then(mapped => {
                return Object.values(mapped);
            });
    }


    getAllElements(domain) {
        return desiteAPI.getAllElements(domain)
            .then(objectIdListNotExternal => {
                return desiteAPI.mapToExternalIDs(objectIdListNotExternal);
            })
            .then(mapped => {
                return Object.values(mapped);
            });
    }

    //!ptKeyStr in pname und ptype
    setPropertyValue(objid, ptKeyStr, value) {
        return desiteAPI.mapFromExternalIDs(objid)
            .then(mapped => {

                const objidNotExternalArray = Object.values(mapped)
                    .flat()
                    .filter(Boolean);

                if (!objidNotExternalArray || objidNotExternalArray.length === 0) {
                    throw new Error(`No DESITE ID found for external ID: ${objid}`);
                }

                const objidNotExternal = objidNotExternalArray[0];

                return desiteAPI.setPropertyValue(objidNotExternal, pname, ptype, value);
            });
    }

    //!ptKeyStr in pname und ptype
    getPropertyValue(objid, ptKeyStr) {
        return desiteAPI.mapFromExternalIDs(objid)
            .then(mapped => {

                const objidNotExternalArray = Object.values(mapped)
                    .flat()
                    .filter(Boolean);

                if (!objidNotExternalArray || objidNotExternalArray.length === 0) {
                    throw new Error(`No DESITE ID found for external ID: ${objid}`);
                }

                const objidNotExternal = objidNotExternalArray[0];

                return desiteAPI.getPropertyValue(objidNotExternal, pname, ptype);
            });
    }

    getAsJSON(objid) {
        return desiteAPI.mapFromExternalIDs(objid)
            .then(mapped => {

                const objidNotExternalArray = Object.values(mapped)
                    .flat()
                    .filter(Boolean);

                if (!objidNotExternalArray || objidNotExternalArray.length === 0) {
                    throw new Error(`No DESITE ID found for external ID: ${objid}`);
                }

                const objidNotExternal = objidNotExternalArray[0];

                return desiteAPI.getAsJSON(objidNotExternal)
            });

    }

    //!ptKeyStr in pname und ptype
    getPropertyValuesByObjectList(ptKeyStr, checkInherited, objectIdList, maxValues, domains, getNullValues) {
        return desiteAPI.mapFromExternalIDs(objectIdList)
            .then(mapped => {

                const objectIdListNotExternal = Object.values(mapped)
                    .flat()
                    .filter(Boolean);

                if (objectIdListNotExternal.length === 0) {
                    throw new Error(`No DESITE IDs found for given external IDs: ${JSON.stringify(objectIdList)}`);
                }

                return desiteAPI.getPropertyValuesByObjectList(
                    propertyName,
                    propertyDatatype,
                    checkInherited,
                    objectIdListNotExternal,
                    maxValues,
                    domains,
                    getNullValues
                );
            });
    }


    getPropertyValuesByObject(objid, filterpattern) {
        return desiteAPI.mapFromExternalIDs(objid)
            .then(mapped => {

                const objidNotExternalArray = Object.values(mapped)
                    .flat()
                    .filter(Boolean);

                if (!objidNotExternalArray || objidNotExternalArray.length === 0) {
                    throw new Error(`No DESITE ID found for external ID: ${objid}`);
                }

                const objidNotExternal = objidNotExternalArray[0];

                return desiteAPI.getPropertyValuesByObject(objidNotExternal, filterpattern)
            });

    }

    setAllVisible(repaint, domains) {
        return desiteAPI.setAllElementsVisible(true, domains)
    }

    setVisible(objIds, flagOnOff, exclusively) {
        if (exclusively) {
            let domainPromises = objIds.map(objId => desiteAPI.getDomainByElement(objId));

            return Promise.all(domainPromises)
                .then(domains => {
                    let uniqueDomains = [...new Set(domains)];

                    return desiteAPI.setAllElementsVisible(false, uniqueDomains);
                })
                .then(() => {
                    return desiteAPI.setElementsVisible(true, objIds);
                });
        } else {
            return desiteAPI.setElementsVisible(flagOnOff, objIds);
        }
    }

    setSelected(objIds, flagOnOff, exclusively) {
        if (exclusively) {
            let domainPromises = objIds.map(objId => desiteAPI.getDomainByElement(objId));

            return Promise.all(domainPromises)
                .then(domains => {
                    let uniqueDomains = [...new Set(domains)];

                    return desiteAPI.setAllElementsSelected(flagOnOff, uniqueDomains);
                })
                .then(() => {
                    return desiteAPI.setElementsSelected(flagOnOff, objIds);
                });
        } else {
            return desiteAPI.setElementsSelected(flagOnOff, objIds);
        }
    }


    /**
     * Different return JSON than DESITE 3.2
     */
    getMaterial(matId) {
        return desiteAPI.getMaterialData(matId)
    }

    checkRegExp(value, pattern) {
        try {
            const regex = new RegExp(pattern);
            return regex.test(value);
        } catch (e) {
            return false;
        }
    }


}


/**
 *  @category Model Viewer
 *  @classdesc
 *      Implements the interface to model viewer.
 *      Overwrites functions for DESITE 3.0.
 *
 *  @extends {IModelViewer}
 *
 */
export class AdptDESITE_30 extends DESITE_COMMON_30_32 {

    constructor( ctx ){
        super( "DESITE_30", "DESITE", "3.0" )
    }

}

/**
 *  @category Model Viewer
 *
 *  @classdesc
 *      Implements the interface to model viewer.
 *      Overwrites functions for DESITE 3.2.
 *
 *  @extends {IModelViewer}
 *
 */
export class AdptDESITE_32 extends DESITE_COMMON_30_32 {

    constructor(){
        super( "DESITE_32", "DESITE", "3.2" )
    }

}

/**
 *  @category Model Viewer
 *
 *  @classdesc
 *      Implements the interface to model viewer.
 *      Overwrites functions for DESITE 3.4.
 *
 *  @extends {IModelViewer}
 *
 */
export class AdptDESITE_34 extends DESITE_COMMON_34_40 {

    constructor(){
        super( "DESITE_34", "DESITE", "3.4" )
        desiteAPI.selectionChanged.connect(this.onSelectionChanged)
        desiteAPI.visibilityChanged.connect(this.onVisibilityChanged)
    }

}

/**
 *  @category Model Viewer
 *
 *  @classdesc
 *      Model Viewer Adapter. <br>
 *      Implements the interface to model viewer.
 *      Overwrites functions for VDC 4.0.
 *
 *  @extends {IModelViewer}
 *
 */
export class AdptVDC_40 extends DESITE_COMMON_34_40 {

    constructor( ){
        super( "DESITE_40", "DESITE", "4.0" )
        vdcApp.selectionChanged.connect(this.onSelectionChanged)
        vdcApp.visibilityChanged.connect(this.onVisibilityChanged)
    }

}

// ##########################################################################

/**
 *
 *  @category Model Viewer
 *
 */
export class DesiteAdapterServices {

    constructor() {
    }

    /**
     *  Create instance of correct DESITE version API class
     *
     *  @returns {Promise<IModelViewer>} Adapter instrance
     *
     */
    static async createAdapter() {

        let desiteVersionString = await desiteAPI.getVersionAsString()

        this.recognizedModelViewerVersion = desiteVersionString

        let parts = desiteVersionString.split('.');

        for (let i = 0; i < parts.length; i++) {
            if (i === 0) {
                parts[i] = parts[i];
            } else {
                parts[i] = parts[i].padStart(1, '0');
            }
        }

        let desiteVersionNumber = parseInt(parts.join(''));

        if (desiteVersionNumber >= 400) {
            console.log(`VDC Manager Version:`, desiteVersionNumber)
        } else {
            console.log(`DESITE Version:`, desiteVersionNumber)
        }

        if (desiteVersionNumber >= 400) {
            const adpt = new AdptVDC_40();
            return adpt
        } else if (desiteVersionNumber >= 340) {
            const adpt = new AdptDESITE_34();
            return adpt
        } else if (desiteVersionNumber >= 320) {
            const adpt = new AdptDESITE_32();
            return adpt
        } else if (desiteVersionNumber >= 300) {
            
            const adpt = new AdptDESITE_30();
    
            // desiteMD.setFooterVisible(false);
            // desiteMD.setHeaderVisible(false);
 
            // desiteAPI.selectionChanged.connect( adpt.onSelectionChanged )

            return adpt

        }
    }

}