при использовании VertexBufferReader с GeometryCallback - как я узнаю, когда будет выполнено перечисление? - PullRequest
0 голосов
/ 11 февраля 2019

Я анализирую геометрию 2D DWG.линии, полилинии, простые вещи.Основываясь на https://stackoverflow.com/a/50693640/2337681, я использую функцию enumGeomsForObject VertexBufferReader для получения отрезков и вершин.Это отдельные обратные вызовы для всех сегментов пути.Результаты приходят по порядку из того, что я вижу - но как узнать, когда перечисление завершено?С помощью закрытых полилиний можно определить, что конечная точка последнего сегмента близка к начальной точке первого сегмента.Но это не сработает для открытых полигонов ...

1 Ответ

0 голосов
/ 11 февраля 2019

Исходя из моего опыта, VertexBufferReader#enumGeomsForObject является синхронной функцией, и я не вижу асинхронных кодов в реализации VertexBufferReader.Таким образом, вы можете передать контейнер данных обратному вызову, второму методу enumGeomsForObject, чтобы сохранить нужные вам данные.

Вот мой тестовый код и GeometryCallback.data последнего перечисления (console.log( 'enuming node fragments', gc.data );) совпадает с данными результата console.log( 'enumed node fragments', gc.data );

function GeometryCallback(viewer) {
    this.viewer = viewer;
    this.data = [];
}

GeometryCallback.prototype.onLineSegment = function(x1, y1, x2, y2, vpId) {
   console.log( 'On Line segment', this.data );
   this.data.push({
        type: 'Line segment',
        x1, y1, x2, y2, vpId
  });
}

GeometryCallback.prototype.onCircularArc = function(cx, cy, start, end, radius, vpId) {
  console.log( 'On Circular arc', this.data );
  this.data.push({
        type: 'CircularArc',
        cx, cy, start, end, radius, vpId
  });
};

GeometryCallback.prototype.onEllipticalArc = function(cx, cy, start, end, major, minor, tilt, vpId) {
 console.log( 'On Elliptical arc', this.data );
 this.data.push({
        type: 'EllipticalArc',
        cx, cy, start, end, major, minor, tilt, vpId
 });
};

var it = NOP_VIEWER.model.getData().instanceTree;
var gc = new GeometryCallback();
var dbId = NOP_VIEWER.getSelection()[0];
it.enumNodeFragments( dbId, function( fragId ) {
    var m = NOP_VIEWER.impl.getRenderProxy(NOP_VIEWER.model, fragId);
    var vbr = new Autodesk.Viewing.Private.VertexBufferReader(m.geometry, NOP_VIEWER.impl.use2dInstancing);
    vbr.enumGeomsForObject(dbId, gc);

    console.log( 'enuming node fragments', gc.data );
});

console.log( 'enumed node fragments', gc.data );
...