При встраивании Autodesk viewer в модальное окно интерфейс viewer оказывается за рамками окна

Прошу помочь победить проблему с которой бьюсь уже не один месяц! Autodesk viewer улетает далеко за пределы модального окна bootstrap 5.3

введите сюда описание изображения введите сюда описание изображения

<?php foreach ($models as $model): ?>
<div class="modal fade" id="staticBackdrop-<?=$model['id']?>" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-<?=$model['id']?>" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-<?=$model['id']?>">
          <?= htmlspecialchars($model['name']) ?>
        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-<?=$model['id']?>" data-model-urn="<?= htmlspecialchars($model['urn']) ?>"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<?php endforeach; ?>
<script>
document.addEventListener('DOMContentLoaded', function() {
    console.log('DOMContentLoaded event fired');

    $('[id^=staticBackdrop-]').on('shown.bs.modal', function () {
        console.log('Modal window shown');

        var canvasId = $(this).find('div[id^=forgeViewer-]').attr('id');
        var canvas = document.getElementById(canvasId);

        if (!canvas) {
            console.error('Canvas element not found');
            return;
        }

        canvas.parentElement.classList.add("viewer-container"); 

        canvas.style.width = '100%';
        canvas.style.height = '100%';

        console.log('Canvas dimensions set on modal open:', canvas.style.width, canvas.style.height);

        async function initializeViewer() {
            try {
                const token = '<?=$adesk_token?>';

                if (!token) {
                    console.error('Failed to fetch token');
                    return;
                }

                var options = {
                    env: 'AutodeskProduction2',
                    api: 'streamingV2',
                    getAccessToken: (onTokenReady) => {
                        console.log('AccessToken fetched:', token);
                        onTokenReady(token, 3600);
                    }
                };

                var viewerConfig = {
                    disabledExtensions: { measure: false, viewCubeUi: true },
                    loadingIconImage: 'https://developer.api.autodesk.com/viewingservice/v1/viewers/v7/viewer/loading.gif',
                };

                console.log('Initializing Autodesk.Viewing');
                Autodesk.Viewing.Initializer(options, function() {
                    console.log('Autodesk.Viewing.Initializer started');

                    var viewer = new Autodesk.Viewing.GuiViewer3D(canvas, viewerConfig);
                    window.viewer = viewer;
                    var startedCode = viewer.start();
                    console.log('Viewer started with code:', startedCode);
viewer.setTheme('light-theme');
viewer.resize();

                    if (startedCode > 0) {
                        console.error('Failed to create a Viewer: WebGL not supported.');
                        return;
                    }

                    var documentId = canvas.dataset.modelUrn;
                    if (!documentId) {
                        console.error('Model URN is not defined');
                        return;
                    }
                    
                    

                    
                    
                    
                    console.log('Loading document:', documentId);

                    Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);

                    console.log('Initialization complete');
                });

                function onDocumentLoadSuccess(viewerDocument) {
                    console.log('Document load success');

                    var defaultModel = viewerDocument.getRoot().getDefaultGeometry();
                    console.log('Default model obtained:', defaultModel);

                    viewer.loadDocumentNode(viewerDocument, defaultModel, onLoadModelSuccess, onLoadModelError);
                    console.log('Loading default model');
                }

                function onDocumentLoadFailure(errorCode) {
                    console.error('Failed fetching Forge manifest with error code:', errorCode);
                }

                function onLoadModelSuccess() {
                    console.log('Model loaded successfully');
                }

                function onLoadModelError(errorCode) {
                    console.error('Error loading model with error code:', errorCode);
                }

                $('.btn-close, .btn-secondary').on('click', function(event) {
                    console.log('Close button clicked');
                    $('#staticBackdrop-' + canvasId.split('-')[1]).modal('hide');
                    viewer.tearDown();
                    viewer.finish();

                    viewer.navigation.setZoomTowardsPivot(100, true);
                    viewer.navigation.setPivotPoint(viewer.model.getBoundingBox().center().clone());
                });
            } catch (error) {
                console.error('Error initializing viewer:', error);
            }
        }

        initializeViewer();
    });
});
</script>

HTML код из контекстного меню

<!-- Модальные окна -->
<div class="modal fade" id="staticBackdrop-1" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-1" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-1">
          Усадьба Риф И-1        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-1" data-model-urn="urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXlfcHJvamVjdHMvJUQwJTk4MTEuZHdmeA"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-2" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-2" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-2">
          Усадьба Риф И-2        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-2" data-model-urn="urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXlfcHJvamVjdHMvJUQwJTk4MjIuZHdmeA"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-3" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-3" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-3">
          Усадьба Риф И-3        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-3" data-model-urn="urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXlfcHJvamVjdHMvJUQwJTk4MzMzLmR3Zng"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-4" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-4" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-4">
          Усадьба Риф И-4        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-4" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-10" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-10" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-10">
          Усадьба Риф И-5        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-10" data-model-urn="urn:dXJuOmFkc2sub2JqZWN0czpvcy5vYmplY3Q6bXlfcHJvamVjdHMvJUQwJTk4LTUuZHdmeA"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-5" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-5" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-5">
          Ресторанно-развлекательный комплекс &quot;Морской круиз&quot;        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-5" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-6" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-6" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-6">
          Аква-парк &quot;Жемчужина Рифа&quot;        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-6" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-7" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-7" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-7">
          Здание администрации ЖРК &quot;Риф&quot;        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-7" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-8" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-8" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-8">
          Таун хаус для проживания персонала        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-8" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<div class="modal fade" id="staticBackdrop-9" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel-9" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen">
    <div class="modal-content">
      <div class="modal-header">
        <h1 class="modal-title fs-5" id="staticBackdropLabel-9">
          Магазин &quot;Дары Тритона&quot; с вертолетной площадкой на кровле        </h1>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Закрыть"></button>
      </div>
      <div class="modal-body">
        <div id="forgeViewer-9" data-model-urn="urn:placeholder"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Закрыть</button>
      </div>
    </div>
  </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
    console.log('DOMContentLoaded event fired');

    $('[id^=staticBackdrop-]').on('shown.bs.modal', function () {
        console.log('Modal window shown');

        var canvasId = $(this).find('div[id^=forgeViewer-]').attr('id');
        var canvas = document.getElementById(canvasId);

        if (!canvas) {
            console.error('Canvas element not found');
            return;
        }

        canvas.parentElement.classList.add("viewer-container"); 

        canvas.style.width = '100%';
        canvas.style.height = '100%';

        console.log('Canvas dimensions set on modal open:', canvas.style.width, canvas.style.height);

        async function initializeViewer() {
            try {
                const token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6IlhrUFpfSmhoXzlTYzNZS01oRERBZFBWeFowOF9SUzI1NiIsInBpLmF0bSI6ImFzc2MifQ.eyJzY29wZSI6WyJjb2RlOmFsbCIsImRhdGE6d3JpdGUiLCJkYXRhOnJlYWQiLCJidWNrZXQ6Y3JlYXRlIiwiYnVja2V0OmRlbGV0ZSIsImJ1Y2tldDpyZWFkIl0sImNsaWVudF9pZCI6IlRtbXNMc1dMZzNpVDdYcHRhS2NQUWJGc1lQSmIxekk1RVBTR25NaUpOZkRDYnRHeSIsImlzcyI6Imh0dHBzOi8vZGV2ZWxvcGVyLmFwaS5hdXRvZGVzay5jb20iLCJhdWQiOiJodHRwczovL2F1dG9kZXNrLmNvbSIsImp0aSI6ImMxa2RSUFVFNzdaS1RmREZjT0g0SGFuM2Y4WXNWd1ExMmp2dmRGbFpkcXFsWU5ybWVkVlI3aDBERWRubWdVdFEiLCJleHAiOjE3NDg2ODIyNTB9.K260XkPkW3vPCc50xE119yLbiOgooMPorYWVMzKJq-S3FdR7EdO14xHMunRuq52AdpvC3ODI1SZNHbEDJX8GCTAIEZ9HHAiH512LQttQBC4f4MWOpFq7DB1_aLfhNdbihjCYZpMAr9FVi8wSA1Y56tj-0Vla_b7Io_RB1DM6MYXgYI_UDajr8uDpBVlrfyUM14zuYNDKV-ijwzJij124QboQhko4Z34HM7yk-Z1k6LOdBcgrO0CoCdiIaAKJvZTQng3aIC0E7KUQA5aExuaAtOGpS5U_mQPYDZlx7El-QbwuA8JB2qc3sxFkXSiihmXmYNki4NbT_FJU2ChM80Fi0g';

                if (!token) {
                    console.error('Failed to fetch token');
                    return;
                }

                var options = {
                    env: 'AutodeskProduction2',
                    api: 'streamingV2',
                    getAccessToken: (onTokenReady) => {
                        console.log('AccessToken fetched:', token);
                        onTokenReady(token, 3600);
                    }
                };

                var viewerConfig = {
                    disabledExtensions: { measure: false, viewCubeUi: true },
                    loadingIconImage: 'https://developer.api.autodesk.com/viewingservice/v1/viewers/v7/viewer/loading.gif',
                };

                console.log('Initializing Autodesk.Viewing');
                Autodesk.Viewing.Initializer(options, function() {
                    console.log('Autodesk.Viewing.Initializer started');

                    var viewer = new Autodesk.Viewing.GuiViewer3D(canvas, viewerConfig);
                    window.viewer = viewer;
                    var startedCode = viewer.start();
                    console.log('Viewer started with code:', startedCode);
viewer.setTheme('light-theme');
viewer.resize();

                    if (startedCode > 0) {
                        console.error('Failed to create a Viewer: WebGL not supported.');
                        return;
                    }

                    var documentId = canvas.dataset.modelUrn;
                    if (!documentId) {
                        console.error('Model URN is not defined');
                        return;
                    }
                    
                    

                    
                    
                    
                    console.log('Loading document:', documentId);

                    Autodesk.Viewing.Document.load(documentId, onDocumentLoadSuccess, onDocumentLoadFailure);

                    console.log('Initialization complete');
                });

                function onDocumentLoadSuccess(viewerDocument) {
                    console.log('Document load success');

                    var defaultModel = viewerDocument.getRoot().getDefaultGeometry();
                    console.log('Default model obtained:', defaultModel);

                    viewer.loadDocumentNode(viewerDocument, defaultModel, onLoadModelSuccess, onLoadModelError);
                    console.log('Loading default model');
                }

                function onDocumentLoadFailure(errorCode) {
                    console.error('Failed fetching Forge manifest with error code:', errorCode);
                }

                function onLoadModelSuccess() {
                    console.log('Model loaded successfully');
                }

                function onLoadModelError(errorCode) {
                    console.error('Error loading model with error code:', errorCode);
                }

                $('.btn-close, .btn-secondary').on('click', function(event) {
                    console.log('Close button clicked');
                    $('#staticBackdrop-' + canvasId.split('-')[1]).modal('hide');
                    viewer.tearDown();
                    viewer.finish();

                    viewer.navigation.setZoomTowardsPivot(100, true);
                    viewer.navigation.setPivotPoint(viewer.model.getBoundingBox().center().clone());
                });
            } catch (error) {
                console.error('Error initializing viewer:', error);
            }
        }

        initializeViewer();
    });
});
</script>
введите сюда код

Ответы (1 шт):

Автор решения: Борис Пелевин

Разобрался, оказалось забыл прописать CSS стили Autodesk viewer.

<link rel="stylesheet" href="https://developer.api.autodesk.com/modelderivative/v2/viewers/7.*/style.min.css" type="text/css">
→ Ссылка