Я осмотрелся и не смог найти никакой информации по этой теме... возможно, потому, что я не могу точно повторить свою проблему в поисковой системе.
Я пытаюсь взять необработанные данные линии из dxf, отсортировать их по квадратам, найти центр каждого квадрата, пронумеровать центр и распечатать результат в pdf.
У меня есть структура данных, похожая на следующую:
[
[{x: 50, y:50}, {x:52, y:52}],
[{x: 52, y:52}, {x:54, y:54}],
[{x: 54, y:54}, {x:56, y:56}]...
]
Эти координаты получаются при разборе dxf с помощью dxf-parser, который возвращает массив объектов, описывающих путь линии. Четыре из них образуют квадрат, который я сегментирую с помощью
function chunkArrayInGroups(arr, size) {
let result = [];
let pos = 0;
while (pos < arr.length) {
result.push(arr.slice(pos, pos + size));
pos += size;
}
return result;
}
((Размер = 4))
По большей части это ведет себя так, как предполагалось, за исключением того, что эти координаты были созданы с началом в центре экрана. Библиотека PDF, которую я использую для создания окончательного документа, не использует ту же систему координат. Я считаю, что это начинается в левом верхнем углу страницы. Это привело к тому, что все мои отрицательные значения ((все, что слева от центра модели)) обрезали страницу.
Чтобы исправить это, я перебираю массив и собираю «0 — все значения x и y» в новый массив, максимальное значение которого я нахожу, чтобы получить свое смещение. Я добавляю это смещение к своим значениям x, прежде чем подключать их к своему создателю PDF для рисования линий.
Я не уверен, чем это вызвано, но на выходе получается «стиль Да Винчи», как я люблю его называть, он повернут на 180 градусов и написан задом наперед. Я думал, что добавление некоторого значения в каждую ячейку решит негативную проблему... и это произошло, но данные по-прежнему относятся к центральному происхождению. Есть ли способ переопределить эти данные для работы с этой библиотекой или есть какая-то другая библиотека, в которой я могу отображать эти данные, а также добавлять текст в определенных местах, как того требует мой случай. Я хотел бы продолжать использовать эту библиотеку, как я использую ее для других частей моей программы, но я открыт для новых и более эффективных идей.
Я ценю ваше время и опыт!
Как это должно выглядеть
Da Vinci'fied Результат
Копия кода:
const PDFDocument = require('pdfkit');
const doc = new PDFDocument({ autoFirstPage: true })
const DxfParser = require('dxf-parser')
let fileText = fs.readFileSync('fulltest.dxf', { encoding: 'utf-8' })
let data = []
let data2 = []
let data3 = []
let shiftx = []
let shifty = []
let factor = 5
var parser = new DxfParser();
let i = 0
doc.pipe(fs.createWriteStream('test.pdf'));
try {
var dxf = parser.parseSync(fileText);
let array = dxf.entities
array.forEach(line => {
if (line.layer === "Modules") {
data.push(line.vertices)
}
if (line.layer === "Buildings") {
data2.push(line.vertices)
}
if (line.layer === "Setbacks") {
data3.push(line.vertices)
}
let segment = line.vertices
segment.forEach(point => {
shiftx.push(0 - point.x)
shifty.push(0 - point.y)
})
})
let shift = biggestNumberInArray(shiftx)
console.log(shift)
data = chunkArrayInGroups(data, 4)
data.forEach(module => {
let midx = []
let midy = []
module.forEach(line => {
let oldx = (line[1].x + shift) * factor
let oldy = (line[1].y + shift) * factor
let newx = (line[0].x + shift) * factor
let newy = (line[0].y + shift) * factor
doc
.moveTo(oldx, oldy)
.lineTo(newx, newy)
.stroke()
midx.push(oldx + (newx - oldx) / 2)
midy.push(oldy + (newy - oldy) / 2)
})
let centerx = (midx[0] + (midx[2] - midx[0]) / 2)
let centery = (midy[0] + (midy[2] - midy[0]) / 2)
let z = (i + 1).toString()
doc
.fontSize(10)
.text(z, centerx-5, centery-5)
i++
})
data2.forEach(line => {
let oldx = (line[0].x + shift) * factor
let oldy = (line[0].y + shift) * factor
let newx = (line[1].x + shift) * factor
let newy = (line[1].y + shift) * factor
doc
.moveTo(oldx, oldy)
.lineTo(newx, newy)
.stroke()
})
data3.forEach(line => {
let oldx = (line[0].x + shift) * factor
let oldy = (line[0].y + shift) * factor
let newx = (line[1].x + shift) * factor
let newy = (line[1].y + shift) * factor
doc
.moveTo(oldx, oldy)
.lineTo(newx, newy)
.stroke('red')
})
doc.end();
} catch (err) {
return console.error(err.stack);
}
function biggestNumberInArray(arr) {
const max = Math.max(...arr);
return max;
}
function chunkArrayInGroups(arr, size) {
let result = [];
let pos = 0;
while (pos < arr.length) {
result.push(arr.slice(pos, pos + size));
pos += size;
}
return result;
}