Как получить координаты XYZ из выбранного компонента в программе просмотра - PullRequest
0 голосов
/ 07 января 2020

var viewer;
	var options = {
	    env: 'AutodeskProduction',
	    api: 'derivativeV2',  // for models uploaded to EMEA change this option to 'derivativeV2_EU'
	    getAccessToken: function(onTokenReady) {
	        var token = 'eyJhbGciOiJIUzI1NiIsImtpZCI6Imp3dF9zeW1tZXRyaWNfa2V5In0.eyJjbGllbnRfaWQiOiJUN0dBbWViNGgzVU04bE1wUm10MTJHT2M1dXYzRkI4aCIsImV4cCI6MTU3ODQ2Mzc4Nywic2NvcGUiOlsidmlld2FibGVzOnJlYWQiXSwiYXVkIjoiaHR0cHM6Lyp9hdXRvZGVzay5jb20vYXVkL2p3dGV4cDYwIiwianRpIjoiRE1jWTVDVUVqNmo5QkdjM0F2N1VFN1NKdWZvZ0dQV1pIbUlrdUJPTEIzczJ4Ym1YakpnVVZyZzZVZnZhZDA3UyJ9.j3T1cThwAs9p8LNasuR7S8WXlGqR1lU6kX-RY8XW5QU';
	        var timeInSeconds = 36000; // Use value provided by Forge Authentication (OAuth) API
	        onTokenReady(token, timeInSeconds);
	    }
	};

	Autodesk.Viewing.Initializer(options, function() {

	    var htmlDiv = document.getElementById('forgeViewer');
	    viewer = new Autodesk.Viewing.Private.GuiViewer3D(htmlDiv);
	    //viewer = new Autodesk.Viewing.Private.GuiViewer3D(htmlDiv);
	    var startedCode = viewer.start();
	    if (startedCode > 0) {
	        console.error('Failed to create a Viewer: WebGL not supported.');
	        return;
	    }

	    console.log('Initialization complete, loading a model next...');

	});

	var documentId = 'urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6dDdnYW1ljYjRoM3VtOGxtcHJtdDEyZ29jNXV2M2ZiOGhfdHV0b3JpYWxfYnVja2V0L1QwMDZfMTktQVJDLVpaLVlZWS1NMy1XRC0wMDUxLnJ2dA';
	Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);

	function onDocumentLoadSuccess(viewerDocument) {
	    var defaultModel = viewerDocument.getRoot().getDefaultGeometry();
	    viewer.loadDocumentNode(viewerDocument, defaultModel);
	}

	function onDocumentLoadFailure() {
	    console.error('Failed fetching Forge manifest');
	}

	$(document ).ready(function() {
		$viewer = jQuery('#forgeViewer');
		
		// After a mouse click on 3D viewport, populate X/Y/Z of the intersection
	    $viewer.on('click', function(ev) {
            
	        if(viewer.getSelection()){
	        	
                mainviewer = new Autodesk.Viewing.GuiViewer3D(  document.getElementById('forgeViewer') );

                // Other codes ...
                const selSet = mainviewer.getSelection();
                const targetElem = selSet[0];

                const model = mainviewer.model;
                const instanceTree = model.getData().instanceTree;
                const fragList = model.getFragmentList();

                let bounds = new THREE.Box3();

                instanceTree.enumNodeFragments( dbId, ( fragId ) => {
                    let box = new THREE.Box3();
                    fragList.getWorldBounds( fragId, box );
                    bounds.union( box );
                }, true );

                const position = bounds.center();

            }
        })
	       
	});
 
<head>
    <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1, user-scalable=no" />
    <meta charset="utf-8">
    <script src="js/jquery-2.2.4.js"></script>
    <link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css" type="text/css">
    <script src="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/viewer3D.min.js"></script>
    
    <style>
        body {
            margin: 0;
        }
        #forgeViewer {
            width: 100%;
            height: 100%;
            margin: 0;
            background-color: #F0F8FF;
        }
       
    </style>
</head>
<body>
    <div id="forgeViewer"></div>
<div>
</body>

Я попытался const bounds = document.getElementById ('forgeViewer'). GetBoundingClientRect (); для получения границ, но он возвращает мне х = 0 и у = 0 для любого выбранного компонента в программе просмотра. Я использую только chrome, не знаю, почему он здесь не работает .... любой другой способ получения кордикатов На самом деле я намереваюсь показать всплывающее окно для выбранного компонента, чтобы добавить некоторые пользовательские данные.

1 Ответ

1 голос
/ 08 января 2020

Упомянутый вами фрагмент кода предназначен только для HTML DOM. Он даст вам прямоугольный элемент DOM элемента DOM с идентификатором forgeViewer и не может быть использован для извлечения информации из мира 3D / 2d зрителя. Пожалуйста, используйте API для просмотра.

const viewer = new Autodesk.Viewing.GuiViewer3D(  document.getElementById('forgeViewer') );

// Other codes ...

const selSet = viewer.getSelection();
const targetElem = selSet[0];

const model = viewer.model;
const instanceTree = model.getData().instanceTree;
const fragList = model.getFragmentList();

let bounds = new THREE.Box3();

instanceTree.enumNodeFragments( dbId, ( fragId ) => {
    let box = new THREE.Box3();
    fragList.getWorldBounds( fragId, box );
    bounds.union( box );
}, true );

const position = bounds.center(); //!<<< This is the selected object's position in the viewer world
...