ADSK Forge Viewer отображает мой 3D DWG как только 2D - PullRequest
0 голосов
/ 10 апреля 2020

Я создаю веб-приложение и использую средство просмотра Forge для отображения своих моделей, но когда я загружаю и преобразовываю 3D DWG-модель в svf для просмотра, я вижу только 2D. Это 3D DWG модель, но зритель отображает ее только как 2D модель. Что-то мне не хватает в программе просмотра. html код? Кажется, я не могу найти, где ошибка.

viewer. html (используется из примера проекта на github)

<!DOCTYPE html>
<html>

<head>
  <title>Autodesk Forge: 3D Viewer App Sample</title>

  <meta http-equiv="cache-control" content="max-age=0" />
  <meta http-equiv="cache-control" content="no-cache" />
  <meta http-equiv="expires" content="0" />
  <meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
  <meta http-equiv="pragma" content="no-cache" />
  <!-- Third Party package -->
  <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
  <!-- Autodesk Forge Viewer files (IMPORTANT) -->
  <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>
    /** Just simple CSS styling to make this page a little nicer **/
    body {
      margin: 0;
      padding: 0;
    }
  </style>
</head>

<body>
  <!-- The Viewer will be instantiated here -->
  <div id="MyViewerDiv"></div>
  <!-- Custom script -->
  <script>
    var viewer;
    var options = {
      env: "AutodeskProduction",
      api: "derivativeV2", // TODO: for models uploaded to EMEA change this option to 'derivativeV2_EU'
      getAccessToken: getForgeToken
    };
    var documentId = "urn:" + getUrlParameter("urn");
    console.log(documentId);

    // Run this when the page is loaded
    Autodesk.Viewing.Initializer(options, function onInitialized() {
      // Find the element where the 3d viewer will live.
      var htmlElement = document.getElementById("MyViewerDiv");
      if (htmlElement) {
        // Create and start the viewer in that element
        viewer = new Autodesk.Viewing.GuiViewer3D(htmlElement);
        viewer.start();
        // Load the document into the viewer.
        Autodesk.Viewing.Document.load(
          documentId,
          onDocumentLoadSuccess,
          onDocumentLoadFailure
        );
      }
    });

    /**
     * Autodesk.Viewing.Document.load() success callback.
     * Proceeds with model initialization.
     */
    function onDocumentLoadSuccess(doc) {
      // Load the default viewable geometry into the viewer.
      // Using the doc, we have access to the root BubbleNode,
      // which references the root node of a graph that wraps each object from the Manifest JSON.
      var viewable = doc.getRoot().getDefaultGeometry();
      if (viewable) {
        viewer
          .loadDocumentNode(doc, viewable)
          .then(function (result) {
            console.log("Viewable Loaded!");
          })
          .catch(function (err) {
            console.log("Viewable failed to load.");
            console.log(err);
          });
      }
    }

    /**
     * Autodesk.Viewing.Document.load() failure callback.
     */
    function onDocumentLoadFailure(viewerErrorCode) {
      console.error(
        "onDocumentLoadFailure() - errorCode: " + viewerErrorCode
      );
      jQuery("#MyViewerDiv").html(
        "<p>Translation in progress... Please try refreshing the page.</p>"
      );
    }

    // Get Query string from URL,
    // we will use this to get the value of 'urn' from URL
    function getUrlParameter(name) {
      console.log("Made it here 2");
      console.log(name);
      name = name.replace(/[[]/, "\\[").replace(/[\]]/, "\\]");
      var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
      var results = regex.exec(location.search);
      return results === null
        ? ""
        : decodeURIComponent(results[1].replace(/\+/g, " "));
    }

    // Get public access token for read only,
    // using ajax to access route /api/forge/oauth/public in the background
    function getForgeToken(callback) {
      console.log("Made it here");
      jQuery.ajax({
        url: "/api/forge/oauth2/public",
        success: function (res) {
          callback(res.access_token, res.expires_in);
        }
      });
    }
  </script>
</body>

</html>

Node JS Код для перевода и отправки в зритель

const express = require("express");
const Axios = require("axios");
const bodyParser = require("body-parser");
const cors = require("cors");
let config = require("./config");
let mainFunc = require("./BP-s3oss");

//Express Server
let app = express();
// let router = express.Router();

app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(__dirname + "/www"));


app.get("/api/s3Data/:bucket", async (req, res) => {
  let bucket = req.params.bucket;
  let object = decodeURIComponent(req.query.object);


  //Log to console
  console.log(config.forge.forge_bucket + " " + object);

  //Comment KWard: Add in Error check if unsuccessful

  try {
    //Main Function
    let main = await mainFunc(bucket, object);

    //Initialize Process
    res.redirect("/api/forge/s3toOSS/" + config.forge.forge_bucket + "/" + encodeURIComponent(object));

  } catch (error) {
    res.status(500).send('Something bad Happened!');
  }

});

//Start Express Server on Port 3000
app.set("port", 3000);
var server = app.listen(app.get("port"), function () {
  console.log("Server listening on port " + server.address().port);
});

//-------------------------------------------------------------------
// Configuration for your Forge account
// Initialize the 2-legged OAuth2 client, and
// set specific scopes
//-------------------------------------------------------------------
var FORGE_CLIENT_ID = config.forgecredentials.client_id;
var FORGE_CLIENT_SECRET = config.forgecredentials.client_secret;
var access_token = "";
var scopes = "data:read data:write data:create bucket:create bucket:read";
const querystring = require("querystring");

//Route /AWStoFORGE/OSS
app.get("/api/forge/s3toOSS/:bucket/:object", async (req, res) => {
  let bucket = req.params.bucket;
  let object = req.params.object;

  console.log(bucket + " " + object);

  res.redirect("/api/forge/oauth" + "/" + encodeURIComponent(object));
});

// Route /api/forge/oauth
app.get("/api/forge/oauth/:object", function (req, res) {
  let objectKey = req.params.object;
  Axios({
    method: "POST",
    url: "https://developer.api.autodesk.com/authentication/v1/authenticate",
    headers: {
      "content-type": "application/x-www-form-urlencoded"
    },
    data: querystring.stringify({
      client_id: FORGE_CLIENT_ID,
      client_secret: FORGE_CLIENT_SECRET,
      grant_type: "client_credentials",
      scope: scopes
    })
  })
    .then(function (response) {
      // Success
      access_token = response.data.access_token;
      console.log("Successful Authentication");
      res.redirect(
        "/api/forge/datamanagement/bucket/getobject" + "/" + encodeURIComponent(objectKey)
      );
    })
    .catch(function (error) {
      // Failed
      console.log(error);
      res.send("Failed to authenticate");
    });
});

// Route /api/forge/oauth2/public
app.get("/api/forge/oauth2/public", function (req, res) {
  // Limit public token to Viewer read only
  Axios({
    method: "POST",
    url: "https://developer.api.autodesk.com/authentication/v1/authenticate",
    headers: {
      "content-type": "application/x-www-form-urlencoded"
    },
    data: querystring.stringify({
      client_id: FORGE_CLIENT_ID,
      client_secret: FORGE_CLIENT_SECRET,
      grant_type: "client_credentials",
      scope: "viewables:read"
    })
  })
    .then(function (response) {
      // Successs
      res.json({
        access_token: response.data.access_token,
        expires_in: response.data.expires_in
      });
    })
    .catch(function (error) {
      // Failed
      console.log(error);
      res.status(500).json(error);
    });
});

const bucketKey = config.forge.forge_bucket;

const policyKey = "persistent"; // Never Expires

// For converting the source into a Base64-Encoded string
var Buffer = require("buffer").Buffer;
String.prototype.toBase64 = function () {
  // Buffer is part of Node.js to enable interaction with octet streams in TCP streams,
  // file system operations, and other contexts.
  return new Buffer(this).toString("base64");
};

app.get("/api/forge/datamanagement/bucket/getobject/:objectKey", function (
  req,
  res
) {
  let objectVal = req.params.objectKey;
  console.log(bucketKey);
  console.log(objectVal);
  Axios({
    method: "GET",
    url:
      "https://developer.api.autodesk.com/oss/v2/buckets/" +
      encodeURIComponent(bucketKey) +
      "/objects/" +
      encodeURIComponent(objectVal) +
      "/details",
    maxContentLength: 104857780,
    headers: {
      Authorization: "Bearer " + access_token,
      "content-type": "application/json"
    }
  })
    .then(function (response) {
      //Success
      console.log("Object Retrieved from Forge OSS");
      var urn = response.data.objectId.toBase64();
      res.redirect("/api/forge/modelderivative/" + encodeURIComponent(urn));
    })
    .catch(function (error) {
      //Failed
      console.log(error);
      res.send("Failed to get objectId from OSS.");
    });
});

// Route /api/forge/modelderivative
app.get("/api/forge/modelderivative/:urn", function (req, res) {
  var decodeURN = decodeURIComponent(req.params.urn)
  var urn = decodeURN;
  var format_type = "svf";
  var format_views = ["2d", "3d"];
  // console.log(urn);
  Axios({
    method: "POST",
    url: "https://developer.api.autodesk.com/modelderivative/v2/designdata/job",
    headers: {
      "content-type": "application/json",
      Authorization: "Bearer " + access_token
    },
    data: JSON.stringify({
      input: {
        urn: urn
      },
      output: {
        formats: [
          {
            type: format_type,
            views: format_views
          }
        ]
      }
    })
  })
    .then(function (response) {
      // Success
      console.log("Redirected to Viewer HTML");
      res.redirect("/viewer.html?urn=" + urn);
      // res.send(urn);
    })
    .catch(function (error) {
      // Failed
      console.log(error);
      res.send("Error at Model Derivative job.");
    });
});

1 Ответ

0 голосов
/ 10 апреля 2020

Проверьте, является ли вид по умолчанию вашей модели 2D, который вы видите при загрузке вида по умолчанию с помощью:

 var viewable = doc.getRoot().getDefaultGeometry();

Вы можете загрузить определенный c вид через DocumentBrowser расширение:

const viewer = new Autodesk.Viewing.GuiViewer3D(document.body.children[0],{extensions:['Autodesk.DocumentBrowser']})
Autodesk.Viewing.Document.load('urn:urn', doc=> {
viewer.start()
viewer.loadDocumentNode(doc,doc.getRoot().getDefaultGeometry())
//…

enter image description here

Или укажите запрос, чтобы найти видимый (например, 3D) документ и загрузить его:

Autodesk.Viewing.Document.load('urn:urn', doc=> {

const viewable = doc.getRoot().search({'role':'3d'})[0] //name of viewable for instance
viewer.start()
viewer.loadDocumentNode(doc,viewable)
//...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...