При использовании VertexBufferReader с GeometryCallback - как я узнаю, когда будет выполнено перечисление?
Я разбираю 2D DWG на основе геометрии. линии, полилинии, простые вещи. На основе /questions/41175280/kak-preobrazovat-koordinatyi-zritelya-obratno-v-koordinatyi-sapr/41175286#41175286 я использую функцию enumGeomsForObject VertexBufferReader для получения отрезков и вершин линий. Это отдельные обратные вызовы для всех сегментов пути. Результаты приходят по порядку из того, что я вижу - но как узнать, когда перечисление завершено? С помощью закрытых полилиний можно определить, что конечная точка последнего сегмента близка к начальной точке первого сегмента. Но это не сработает для открытых полигонов...
1 ответ
С моим опытом, VertexBufferReader#enumGeomsForObject
является синхронной функцией, и я не вижу асинхронных кодов в реализации VertexBufferReader
, Таким образом, вы можете передать контейнер данных в обратный вызов, 2-й из 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 );