В SDK Autodesk Viewer SDK, как мне получить векторы для выбранного элемента из локально загруженного PDF?Javascript

Форум по Javascript
Ответить Пред. темаСлед. тема
Anonymous
 В SDK Autodesk Viewer SDK, как мне получить векторы для выбранного элемента из локально загруженного PDF?

Сообщение Anonymous »

Я разработал приложение POC для загрузки PDF в Autodesk giviewer3d , и, используя пользовательское расширение, нарисуйте Polygonpath s и PolylinePath s через PDF . Мое расширение простое, он добавляет панель инструментов и управляет активными инструментами, так что только один инструмент Edit2d активен одновременно. Кнопки панели инструментов, которые я добавил, по существу переключайте или переключается между ними.
У меня есть разгибание измерения, и я могу установить калибровку, это переносится на расширение Edit2d и позволяет мне иметь правильные значения при получении одного из притяженных форм и выполнения getarea () с помощью
Обратите внимание, что это грубое представление о настройке. В действительности у меня есть зритель, связанный в классе, называемый apsviewermanager , и у меня есть экземпляр, назначенный объекту окна. APSViewerManager поддерживает загрузку из PDF , которая загружается из другого API или загрузку из APS API . Я постараюсь разделить вещи до минимума того, что необходимо для «локальной» PDF загрузки.

Код: Выделить всё

const url = "some-url" // in reality this is pointing to a get endpoint on an external api that returns the pdf content
const page = 1 // you can only load 1 pdf page at a time

const localManager = this; // this is an instance of the APSViewerManager

const options = {
accessToken: "",
useCredentials: false
env: 'Local'
}

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

const htmlDiv = document.querySelector(localManager.containerSelector);
localManager.viewer = new Autodesk.Viewing.GuiViewer3D(htmlDiv);

attachViewerEvents.call(localManager); // I have my events handling setup in a separate module called as if part of the APSViewerManager

const startedCode = localManager.viewer.start(null, options);

if (startedCode >  0) {
localManager.report_error('Failed to create Viewer', {startCode: startedCode});
return;
}

// setup the edit2d extension from 'Autodesk.Edit2d'
localManager.edit2d = await localManager.viewer.loadExtension('Autodesk.Edit2D', {enableArcs: true});

// setup the inhouse extension to add edit2d controls as toolbar buttons + inhouse functionality consuming edit2d
localManager.rlb2dTakeOff = await localManager.viewer.loadExtension(
'RLB2DTakeOffExtension',
{
manager: localManager,
filename: localManager.shapesFilename,
}
);

// setup for loading the pdf extension from 'Autodesk.PDF'
await localManager.viewer.loadExtension('Autodesk.PDF')

// URL parameter page will override value passed to loadModel
localManager.viewer.loadModel(url, {page: page});

});

< /code>

Задача заключается в том, что у меня есть dbid < /code> из события выбора, я не могу запросить базу данных свойств, используя этот идентификатор.const dbid = 2900 //the dbid for a wall I selected on the pdf - obtained from viewer selection event
const db = apsViewerManager.viewer.model.getPropertyDb();

db.getProperties2(
dbid,
function(x){
console.log("Promise resolved")
console.dir(x)
},
function(x){
console.log("Promise rejected")
console.dir(x)
}
)
< /code>
Обещание отвергает, и у меня остался следующий объект: < /p>
{
"err": undefined,
"instanceTree": null,
"maxTreeDepth": 0
}
< /code>
Я подумал, что, может быть, мой DB был фрагментирован-я не совсем уверен, что это значит, но я вижу свойства в объекте DB, полном «фрагментов».const frags = apsViewerManager.viewer.model.getFragmentList();
console.dir(frags);
result:
Изображение
I wanted to try the following script to retrieve the props from there:

I am not sure the exact source об этом комбинации сценария, но я вижу, что она была получена из этого блога APS: https://aps.autodesk.com/blog/working-2 ... азноviewer = apsViewerManager.viewer;

viewer.addEventListener(
Autodesk.Viewing.SELECTION_CHANGED_EVENT,
function () {
const tree = viewer.model.getInstanceTree();
const frags = viewer.model.getFragmentList();

function listFragmentProperties(fragId) {
console.log('Fragment ID:', fragId);
// Get IDs of all objects linked to this fragment
const objectIds = frags.getDbIds(fragId);
console.log('Linked object IDs:', objectIds);
// Get the fragment's world matrix
let matrix = new THREE.Matrix4();
frags.getWorldMatrix(fragId, matrix);
console.log('World matrix:', JSON.stringify(matrix));
// Get the fragment's world bounds
let bbox = new THREE.Box3();
frags.getWorldBounds(fragId, bbox);
console.log('World bounds:', JSON.stringify(bbox));
}

if (tree) { // Could be null if the tree hasn't been loaded yet
const selectedIds = viewer.getSelection();
for (const dbId of selectedIds) {
const fragIds = [];
tree.enumNodeFragments(
dbId,
listFragmentProperties,
false
);
}
}
else {
console.log("No tree!");
}
}
);
< /code>
К сожалению, дерево всегда ноль, поэтому мой браузер выплевывает «Нет дерева!» Выбранная стена (линия) в pdf.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ement-from
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Javascript»