Приветствую! Есть чертёж dwg, блоки в котром созланы при помощи какого-то неизвестного мне плагина. Задача распарсить dxf файл, созданный из этого проекта.
В блоках задан extrusion direction, поэтому при парсинге применяю транспормацию, чтобы спроецировать координаты на WCS. Однако, некоторые болоки имеют отрицательные координаты, и нужно применять трансформацию поворота на 180. Проблема в том, что если пользователь в проекте задаст такому блоку вручную поворот 0, то в dxf всё равно экспартируются отрицательные координаты, но не будет возможности определить, нужно ли применять поворот.
Я пробовал загружать dxf в онлайн просмотрщики, там всё корректно, значит все данные для чтения есть в dxf, но я не могу их найти. В блоках нет дополнительных данных (XData). Прошу помочь. Спасибо.
пример двух блоков, которые в проекте находятся рядом, но в dxf координаты сильно отличаются:
INSERT
5
2373
330
22CF
100
AcDbEntity
8
PVcase PV Modules (full frames)
62
144
420
31909
100
AcDbBlockReference
2
tracker_Polar3str_27-1_vsun_545W
10
-728277.4518200205
20
-1637328.460656199
30
27037.59836921752
210
0.0
220
0.0163012101279391
230
0.9998671264464917
0
INSERT
5
241B
330
22CF
100
AcDbEntity
8
PVcase PV Modules (full frames)
62
144
420
31909
100
AcDbBlockReference
2
tracker_Polar3str_27-1_vsun_545W
10
728266.3538200205
20
1637700.246742568
30
22970.76064187255
210
0.0
220
0.013818207801289
230
0.9999045240087479
0
ENDBLK
вот код, которым пробую определить координаты блока:
function transformDxfPointToWCS(point:DxfCoordinate3d, localNormal: DxfCoordinate3d, rotation:number): Vector3 {
let localPoint = new Vector3(
point.x,
point.y,
point.z
);
const N = new Vector3(localNormal.x, localNormal.y, localNormal.z);
if(N.x===0 && N.y===0 && N.z===1){
return localPoint;
}
const zAxis = N.clone().normalize();
const arbitraryVector = new Vector3(1, 0, 0);
let xAxis = arbitraryVector
.clone()
.sub(zAxis.clone().multiplyScalar(arbitraryVector.dot(zAxis)))
.normalize();
const yAxis = Vector3.crossVectors(zAxis, xAxis).normalize();
const basisMatrix = new Matrix4().makeBasis(xAxis, yAxis, zAxis);
const rotationMatrix = new Matrix4().makeRotationZ(rotation);
const resultMatrix = new Matrix4().multiplyMatrices(basisMatrix, rotationMatrix,);
const projectedPoint = localPoint.clone().applyMatrix4(resultMatrix);
return projectedPoint;
}
В проекте всё находится рядом: