国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

在Forge Viewer上顯示自訂義屬性

seasonley / 1919人閱讀

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

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

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

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

const propPanel = viewer.getPropertyPanel( true );

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

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

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

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( "無法從服務器獲取屬性" ) );
            
               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 );

二、使用自定義屬性面板

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

在來我們透過繼承 Autodesk.Viewing.Extensions.ViewerPropertyPanel 來創(chuàng)建自個的屬性面板(使用 ES2017 的語法,部份代碼來自 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( "無法從服務器獲取屬性" ) );
            
               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();
       }
    }
}

透過撰寫括展讓自定義屬性窗取代自帶的:

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

以上希望對各為小伙伴有幫助~

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/89251.html

相關文章

  • 訂義 Forge Viewer ModelStructurePanel 的交互行為

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

    xialong 評論0 收藏0
  • Forge Viewer 里加入訂義

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

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

    摘要:前陣子有些圈的朋友們都在詢問同一個問題要怎么在的自帶右鍵菜單上添加自定義項目或是只顯示自訂義項目以下將針對在自帶右鍵菜單上添加自定義項目和只顯示自訂義項目的右鍵菜單進行說明。 前陣子有些 Autodesk Forge 圈的朋友們都在詢問同一個問題『要怎么在 Viewer 的自帶右鍵菜單上添加自定義項目或是只顯示自訂義項目』~ 以下將針對『在自帶右鍵菜單上添加自定義項目』和『只顯示自訂義...

    Harriet666 評論0 收藏0
  • Forge Viewer 里展示/隱藏構件材質(zhì)

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

    Dean 評論0 收藏0
  • Autodesk Forge Viewer 信息本地化技術分析

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

    littleGrow 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<