成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

在Forge Viewer上顯示自訂義屬性

seasonley / 1926人閱讀

摘要:最近有的小伙伴們都在詢(xún)問(wèn)要怎么在里顯示自訂義屬性,要做到這個(gè)是挺容易的。在來(lái)我們透過(guò)繼承來(lái)創(chuàng)建自個(gè)的屬性面板使用的語(yǔ)法,部份代碼來(lái)自的無(wú)法從服務(wù)器獲取屬性透過(guò)撰寫(xiě)括展讓自定義屬性窗取代自帶的以上希望對(duì)各為小伙伴有幫助參考

最近有 Autodesk Forge 的小伙伴們都在詢(xún)問(wèn)要怎么在 Viewer 里顯示自訂義屬性,要做到這個(gè)是挺容易的。目前有兩種方式可以做到這個(gè)效果,一種是直接添加自定屬性到 Viewer 自帶的屬性面板上,另一種是使用自定義屬性面板,其作法如下所示:

一、添加自定屬性到 Viewer 自帶的屬性面板上:

要添加自定義屬性到自帶的屬性面板上前必需先獲取屬性面板的實(shí)體:

const propPanel = viewer.getPropertyPanel( true );

透過(guò) propPanel.addProperty() 添加自訂義屬性,例如:

propPanel.addProperty( "所屬房名", "課廳", "其他" );

一般我們不會(huì)這樣直接調(diào)用這些方法,而是將它寫(xiě)到一個(gè) Viewer 擴(kuò)展里,其范例如下 (使用 ES2017 的語(yǔ)法):

class CustomProperyPanelExt extends Autodesk.Viewing.Extension {
    constructor( viewer, options ) {
        super( viewer, options );
        
        this.onSelectionChanged = this.onSelectionChanged.bind( this );
    }
    
    getRemoteProps( dbId ) {
        return new Promise(( resolve, reject ) => {
            fetch( `http://127.0.0.1/api/props/${ dbId }`, {
                method: "get",
                headers: new Headers({
                    "Content-Type": "application/json"
                })
            })
            .then( ( response ) => {
                if( response.status === 200 ) {
                  return response.json();
                } else {
                  return reject( new Error( response.statusText ) );
                }
            })
            .then( ( data ) => {
               if( !data ) return reject( new Error( "無(wú)法從服務(wù)器獲取屬性" ) );
            
               return resolve( data );
            })
            .catch( ( error ) => reject( new Error( error ) ) );
        });
    }
    
    async onSelectionChanged( event ) {
        if( !event.selections || event.selections.length <= 0
            || !event.selections[0].dbIdArray
            || event.selections[0].dbIdArray.length <= 0 ) return;
        
        const dbId = event.selections[0].dbIdArray[0];
        const propPanel = this.viewer.getPropertyPanel( true );
        
        try {
          const props = await this.getRemoteProps( dbId );

          for( let i = 0; i < props.length; i++ ) {
              const prop = props[i];
              propPanel.addProperty( prop.name, prop.value, prop.category );
          }
        } catch( error ) {
            console.error( 
        }
    }
    
    load() {
        this.viewer.addEventListener(
            Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT,
            this.onSelectionChanged
        );
        return true;
    }
    
    unload() {
        this.viewer.removeEventListener(
            Autodesk.Viewing.AGGREGATE_SELECTION_CHANGED_EVENT,
            this.onSelectionChanged
        );
        return true;
    }
}
Autodesk.Viewing.theExtensionManager.registerExtension( "Autodesk.ADN.CustomPropsPanel", CustomProperyPanelExt );

二、使用自定義屬性面板

使用這個(gè)方法是創(chuàng)建一個(gè)自定義的屬性面板,并透過(guò) viewer.setPropertyPanel() 取代Viewer 自帶的屬性面板。

在來(lái)我們透過(guò)繼承 Autodesk.Viewing.Extensions.ViewerPropertyPanel 來(lái)創(chuàng)建自個(gè)的屬性面板(使用 ES2017 的語(yǔ)法,部份代碼來(lái)自 Forge Viewer 的 viewer3D.js):

class CustomPropsPanel extends Autodesk.Viewing.Extensions.ViewerPropertyPanel {
    constructor( viewer ) {
        super( viewer );
    }
    
    getRemoteProps( dbId ) {
        return new Promise(( resolve, reject ) => {
            fetch( `http://127.0.0.1/api/props/${ dbId }`, {
                method: "get",
                headers: new Headers({
                    "Content-Type": "application/json"
                })
            })
            .then( ( response ) => {
                if( response.status === 200 ) {
                  return response.json();
                } else {
                  return reject( new Error( response.statusText ) );
                }
            })
            .then( ( data ) => {
               if( !data ) return reject( new Error( "無(wú)法從服務(wù)器獲取屬性" ) );
            
               return resolve( data );
            })
            .catch( ( error ) => reject( new Error( error ) ) );
        });
    }
    
    async setNodeProperties( dbId ) {
        this.propertyNodeId = dbId;
        
        if( !this.viewer ) return;
        
        try {
            const reuslt = await this.getRemoteProps( dbId );

            this.setTitle( reuslt.Name, { localizeTitle: true } );
            this.setProperties( reuslt.properties );
            this.highlight( this.viewer.searchText );
    
            this.resizeToContent();
    
            if( this.isVisible() ) {
                const toolController = this.viewer.toolController,
                mx = toolController.lastClickX,
                my = toolController.lastClickY,
                panelRect = this.container.getBoundingClientRect(),
                px = panelRect.left,
                py = panelRect.top,
                pw = panelRect.width,
                ph = panelRect.height,
                canvasRect = this.viewer.canvas.getBoundingClientRect(),
                cx = canvasRect.left,
                cy = canvasRect.top,
                cw = canvasRect.width,
                ch = canvasRect.height;
        
                if( (px <= mx && mx < px + pw) && (py <= my && my < py + ph) ) {
                    if( (mx < px + (pw / 2)) && (mx + pw) < (cx + cw) ) {
                       this.container.style.left = Math.round( mx - cx ) + "px";
                       this.container.dockRight = false;
                    } else if( cx <= (mx - pw) ) {
                       this.container.style.left = Math.round( mx - cx - pw ) + "px";
                       this.container.dockRight = false;
                    } else if( (mx + pw) < (cx + cw) ) {
                       this.container.style.left = Math.round( mx - cx ) + "px";
                       this.container.dockRight = false;
                    } else if( (my + ph) < (cy + ch) ) {
                       this.container.style.top = Math.round( my - cy ) + "px";
                       this.container.dockBottom = false;
                    } else if( cy <= (my - ph) ) {
                       this.container.style.top = Math.round( my - cy - ph ) + "px";
                       this.container.dockBottom = false;
                    }
               }
          }
       } catch( error ) {
           this.showDefaultProperties();
       }
    }
}

透過(guò)撰寫(xiě)括展讓自定義屬性窗取代自帶的:

class CustomProperyPanelExt extends Autodesk.Viewing.Extension {
    constructor( viewer, options ) {
        super( viewer, options );
    }

    load() {
        this.viewer.setPropertyPanel( new CustomPropsPanel( viewer ) );
        return true;
    }
    
    unload() {
        return true;
    }
}
Autodesk.Viewing.theExtensionManager.registerExtension( "Autodesk.ADN.CustomPropsPanel", CustomProperyPanelExt );

以上希望對(duì)各為小伙伴有幫助~

參考:https://github.com/Autodesk-F...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89251.html

相關(guān)文章

  • 訂義 Forge Viewer ModelStructurePanel 的交互行為

    摘要:在官方釋出版的同時(shí)發(fā)布了新版本的,這個(gè)面版已被整個(gè)重新改寫(xiě),這次更新也加入一些新的交互行為,下面我們將會(huì)稍作解釋。 這禮拜的小技巧是關(guān)于如何以不加入太多的 JavaScript 的方式自訂義 ModelStructurePanel 的交互行為,這個(gè)小技巧受到這篇問(wèn)與答的啟發(fā):Prevent zoom in Forge viewer when clicking in Model Brow...

    xialong 評(píng)論0 收藏0
  • Forge Viewer 里加入訂義線(xiàn)

    摘要:可能有許多原因你想在里加入自訂義的線(xiàn)型,例如顯示線(xiàn)框幾何視覺(jué)化包圍箱或者其他你想帶給使用者的視覺(jué)回饋。下面是我傳寫(xiě)的一個(gè)例子,他可以在選重構(gòu)件后在場(chǎng)景里用自定義線(xiàn)型描繪它的包圍箱,在線(xiàn)示例可以參考這里 showImg(https://segmentfault.com/img/bVVaUx?w=1794&h=930); 這篇文章的原著是 Autodesk AND 的 Philippe L...

    zilu 評(píng)論0 收藏0
  • 自定義 Forge Viewer 右鍵菜單(Context Menu)

    摘要:前陣子有些圈的朋友們都在詢(xún)問(wèn)同一個(gè)問(wèn)題要怎么在的自帶右鍵菜單上添加自定義項(xiàng)目或是只顯示自訂義項(xiàng)目以下將針對(duì)在自帶右鍵菜單上添加自定義項(xiàng)目和只顯示自訂義項(xiàng)目的右鍵菜單進(jìn)行說(shuō)明。 前陣子有些 Autodesk Forge 圈的朋友們都在詢(xún)問(wèn)同一個(gè)問(wèn)題『要怎么在 Viewer 的自帶右鍵菜單上添加自定義項(xiàng)目或是只顯示自訂義項(xiàng)目』~ 以下將針對(duì)『在自帶右鍵菜單上添加自定義項(xiàng)目』和『只顯示自訂義...

    Harriet666 評(píng)論0 收藏0
  • Forge Viewer 里展示/隱藏構(gòu)件材質(zhì)

    摘要:對(duì)于大多數(shù)的模型文檔都可以透過(guò)服務(wù)提取轉(zhuǎn)換在里渲染構(gòu)件外觀時(shí)所需的材質(zhì)及貼圖。所以我們可以透過(guò)它遍歷所有材質(zhì),找出我們想隱藏貼圖的那些材質(zhì),將它的顏色設(shè)置為灰色,同時(shí)也可以透過(guò)它將隱藏貼圖的材質(zhì)回復(fù)。 這篇文章來(lái)自 Autodesk ADN 的梁曉冬,以下以我簡(jiǎn)稱(chēng)。 對(duì)于大多數(shù)的模型文檔都可以透過(guò) Autodesk Forge Model Derivative 服務(wù)提取、轉(zhuǎn)換在 Vie...

    Dean 評(píng)論0 收藏0
  • Autodesk Forge Viewer 信息本地化技術(shù)分析

    摘要:默認(rèn)情況下,是英文環(huán)境,調(diào)取的是的資源其實(shí)無(wú)需翻譯。但是,如前面提到的,語(yǔ)言包只是包含了部分常規(guī)字串的翻譯,如果遇到?jīng)]有包含的常規(guī)字串怎么辦呢例如,本例中的語(yǔ)言包并沒(méi)有對(duì),進(jìn)行翻譯,所以即使切換了語(yǔ)言,它們?nèi)耘f是英文。 注:本文是個(gè)人調(diào)試分析所得,非官方文檔,請(qǐng)酌情選用參考。文中分析的數(shù)據(jù)由https://extract.autodesk.io轉(zhuǎn)換下載而來(lái)。 談到信息本地化,個(gè)人覺(jué)得包...

    littleGrow 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<