Source

adapter/AdapterDesite_30_32.js

/**
 * $Id: AdapterDesite.js 9694 2026-01-09 22:05:48Z jochen.hanff $
 */

'use strict'

import { IModelViewer } from "./IModelViewer.js";
import { DESITE_COMMON } from "./AdapterDesite.js";
import { ApiResponse } from "../tools/ApiResponse.js";



/**
 * @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));

        // console.log("DOMAINS:")
        // console.log( this.eDomain )

    }

    async getSelectedObjectIds(domains) {
                        
        let idlist = []
        
        for( const domain of domains ) {
            // console.log( `get selected of ${domain}`)
            const ids = await desiteAPI.getSelectedElements(domain); 
            idlist.push(...ids);            
        }

        return new ApiResponse(200, idlist );

    }
    
    async getObjectIds(domains) {
        
        let idlist = []
        
        for( const domain of domains ) {
            console.log( `get all of ${domain}`)
            const ids = await desiteAPI.getAllElements(domain); 
            idlist.push(...ids);            
        }

        return new ApiResponse(200, idlist );

    }
    

    //!ptKeyStr in pname und ptype
    async setPropertyValue(objid, ptKeyStr, value) {
        // return desiteAPI.setPropertyValue(objid, pname, ptype, value)
        return new ApiResponse(200, await desiteAPI.setPropertyValue(objid, ptKeyStr.split('##')[0], ptKeyStr.split('##')[1] , value) );
    }

    //!ptKeyStr in pname und ptype
    async getPropertyValue(objid, ptKeyStr) {
        // return desiteAPI.getPropertyValue(objid, pname, ptype)
        return new ApiResponse(200, await desiteAPI.getPropertyValue(objid, ptKeyStr.split('##')[0] , ptKeyStr.split('##')[1] ) );
    }

    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);
                })
        }
    }

    // SMART SETS
    
    async createSmartSet( parentId, name, objectIds, options = null) {
        
        console.log( ` ### DESITE 30,32 <createSmartSet( ${parentId} )> `)
        console.log("objects: " + JSON.stringify(objectIds) )
        
        console.log( `options: `)
        console.log( JSON.stringify(options) )

        // {
        //     "filter": {
        //         "skip_openings": true,
        //          "skip_assembly_parts": false,
        //          "visible_only": false
        //     },
        //     "group_by": {
        //         "propertytypes": [
        //             "ifcEntity##xs:string",
        //             "cnVolume##xs:double"
        //         ],
        //         "options": {
        //                  "decimal_precision": 4,
        //                  "case_sensitive": true,
        //                  "skip_null_values": true,
        //                  "interval_size": 5.0,
        //                  "interval_offset": 0.0,
        //                  "date_grouping": "week"
        //         }
        //     },

        const smartset_id = await desiteAPI.createSelectionSet(	name, parentId )

        let idlist = []
        
        // first get objects from domains if any domain is in objectIds ...
        let ids = (await this.getObjectIds(objectIds)).data
        idlist = [...idlist , ...ids]
        
        // the get child ids of objects in objjectIds ...
        ids = (await this.getChildIds(objectIds)).data
        idlist = [...idlist , ...ids]

        console.log( `#obj : ${idlist.length}` )

        let proplist = []

        if( options ) {
            let l = options.group_by?.propertytypes
            if ( l ) { proplist = l }
        }

        console.log( `props = ${proplist}` )
        
        let sets = {}

        for ( const id of idlist ) {
            sets = await this.getSets( id, sets , proplist, 0 , options )
        }

        // for ( const id of idlist ) {
            
        //     // console.log( `-> ID : ${id}`)
            
        //     for( const p of proplist ) {

        //         let propvalue = await desiteAPI.getPropertyValue( id , p.split('##')[0] , p.split('##')[1] , true )
                
        //         let set = []

        //         if( propvalue in sets ) {
                    
        //             set = sets[propvalue]

        //         } else {
                    
        //             set = {
        //                 'sets'      : {},
        //                 'objects'   : []
        //             }
                    
        //             sets[propvalue] = set
        //             console.log( `val = ${propvalue}`)
        //         }

        //         set.objects.push( id )

        //     }

        // }
        
        await this.resolveSets( smartset_id , sets )
       
        return new ApiResponse(200, smartset_id );

    }

    async getSets( id , sets , proplist , idx , options ) {
        
        const p = proplist[idx]
        
        let propvalue = await this.getSetValue( id , p , options )
        
        let set = null

        if (propvalue in sets) {

            set = sets[propvalue]

        } else {

            set = {
                'name'      : propvalue,
                'sets'      : {},
                'objects'   : []
            }

            sets[propvalue] = set
            
            console.log(`val = ${propvalue}`)

        }
        
        if ( idx < proplist.length-1 ) {
            await this.getSets( id , set.sets , proplist , idx+1 , options )
        } else {
            set.objects.push( id )
        }

        return sets

    }
    
    async resolveSets( parent_set_id , sets ) {

        console.log( '### <resolveSets()> ')

        for( const v in sets ) {
                        
            let set = sets[v]

            // console.log( `resolve set : v = ${v} `)
            // console.log( set.name )

            const smartset_id_child = await desiteAPI.createSelectionSet( v , parent_set_id )
            
            await this.addObjectsToSmartSet( smartset_id_child , set.objects , false )
            await this.resolveSets( smartset_id_child , set.sets )

        }

    }

    async getSetValue( id , prop , options ) {

        let propvalue = await desiteAPI.getPropertyValue(id, prop.split('##')[0], prop.split('##')[1], true)
        return propvalue

    }

    async addObjectsToSmartSet(smartSetId, objIds, includeChildren) {
        // todo consider param includeChildren ...
        
        let  countadded = 0
        
        if ( objIds && objIds.length > 0 ) {
             countadded = await desiteAPI.addToSelectionSetGeometry(smartSetId, objIds.join(';'))
        }        
        
        // console.log( `added : ${countadded} `)
        
        return new ApiResponse(200, countadded );

    }


    // GEOMETRY

    async getPickedPoint() {
        
        const p = await desiteAPI.getPickedPoint()   
        // console.log( "picked: " + JSON.stringify(p) )     
        
        // get model coordinates ...

        // const pglobal = p['p']
        // const pintern = p['ip']

        let picked = {
            'intern'    : p['ip'],
            'coordinates' : p['p']
        }

        // console.log( "picked: " + JSON.stringify(pglobal) )     
        return new ApiResponse(200, picked );
        
    }            

}


/**
 *  @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" )
    }

}