Skip to content

Commit ddaf7cb

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents 371afd0 + 2412086 commit ddaf7cb

File tree

5 files changed

+609
-13
lines changed

5 files changed

+609
-13
lines changed

.ops/deploy/backend/base/backend.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ metadata:
8080
app.kubernetes.io/component: backend
8181
annotations:
8282
nginx.ingress.kubernetes.io/rewrite-target: /$2
83+
nginx.ingress.kubernetes.io/proxy-body-size: 1024m
8384
spec:
8485
ingressClassName: nginx
8586
rules:

frontend/pc-tool/src/components/Tool/Setting.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@
324324
let options = {} as any;
325325
switch (type) {
326326
case 'pointSize':
327-
options.pointSize = config.pointSize * 10;
327+
options.pointSize = config.pointSize;
328328
break;
329329
case 'colorType':
330330
options.colorMode = config.pointColorMode || 0;
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
import {
2+
str2ab,
3+
ab2str,
4+
parseHeader,
5+
getPointsFromTextData,
6+
getPointsFromDataView,
7+
setWithTypeToDataView,
8+
} from './lib';
9+
10+
export type DataType = 'ascii' | 'binary';
11+
export type Type = 'F' | 'I' | 'U';
12+
export type SizeType = 1 | 2 | 4 | 8;
13+
14+
export interface IConfig {
15+
fields: string[];
16+
data: DataType;
17+
size: SizeType[];
18+
type: Type[];
19+
count: number[];
20+
offset: number[];
21+
width: number;
22+
height: number;
23+
viewpoint: number[];
24+
rowSize: number;
25+
points: number;
26+
version: string;
27+
raw: string;
28+
}
29+
30+
export default class PCDFile {
31+
// header
32+
version = 0.7;
33+
fields: IConfig['fields'] = [];
34+
size: IConfig['size'] = [];
35+
type: IConfig['type'] = [];
36+
count: IConfig['count'] = [];
37+
offset: IConfig['offset'] = [];
38+
width = 1;
39+
height = 0;
40+
points = 0;
41+
rowSize = 0;
42+
viewpoint: IConfig['viewpoint'] = [0, 0, 0, 1, 0, 0, 0];
43+
//
44+
data: DataType = 'binary';
45+
isList = false;
46+
pointsDataList: number[] = [];
47+
pointsDataMap: Record<string, number[]> = {};
48+
littleEndian = true;
49+
constructor(pointsData: number[] | Record<string, number[]>, config: Partial<IConfig>) {
50+
const fields = config.fields || [];
51+
this.fields = fields;
52+
this.data = config.data || 'binary';
53+
54+
let length = 0;
55+
if (Array.isArray(pointsData)) {
56+
this.isList = true;
57+
this.pointsDataList = pointsData;
58+
length = Math.floor(this.pointsDataList.length / fields.length);
59+
} else {
60+
this.isList = false;
61+
this.pointsDataMap = pointsData;
62+
length = this.pointsDataMap[fields[0]].length;
63+
}
64+
65+
this.points = length;
66+
this.height = length;
67+
68+
this.size = config.size ? config.size : fields.map((e) => 4);
69+
this.type = config.type ? config.type : fields.map((e) => 'F');
70+
this.count = fields.map((e) => 1);
71+
72+
const offset = [] as number[];
73+
let rowSize = 0;
74+
fields.forEach((e, index) => {
75+
offset.push(rowSize);
76+
rowSize += this.size[index];
77+
});
78+
this.offset = offset;
79+
this.rowSize = rowSize;
80+
}
81+
82+
static parse(buffer: ArrayBuffer, fieldFilter?: string[], littleEndian = true) {
83+
// let chunkData = ab2str(new Uint8Array(buffer));
84+
const chunkData = ab2str(new Uint8Array(buffer, 0, Math.min(buffer.byteLength, 1000)));
85+
const header = parseHeader(chunkData);
86+
87+
let dataMap = {} as Record<string, number[]>;
88+
if (header.data === 'ascii') {
89+
const textData = ab2str(new Uint8Array(buffer));
90+
const pcdData = textData.substring(header.raw.length);
91+
dataMap = getPointsFromTextData(pcdData, header, fieldFilter);
92+
} else if (header.data === 'binary') {
93+
const dataview = new DataView(buffer, header.raw.length);
94+
dataMap = getPointsFromDataView(dataview, header, fieldFilter, littleEndian);
95+
} else {
96+
throw 'only support ascii or binary format';
97+
}
98+
99+
if (Object.keys(dataMap).length === 0) throw 'no point data';
100+
101+
return new PCDFile(dataMap, header);
102+
}
103+
104+
getHeader(name: string) {
105+
let value = this[name];
106+
name = name.toUpperCase();
107+
if (Array.isArray(value)) value = value.join(' ');
108+
return `${name} ${value}`;
109+
}
110+
111+
getHeaderInfo() {
112+
const version = '# .PCD v.7 - Point Cloud Data file format';
113+
const headers = [
114+
version,
115+
this.getHeader('fields'),
116+
this.getHeader('size'),
117+
this.getHeader('type'),
118+
this.getHeader('count'),
119+
this.getHeader('width'),
120+
this.getHeader('height'),
121+
this.getHeader('viewpoint'),
122+
this.getHeader('points'),
123+
this.getHeader('data'),
124+
];
125+
126+
return headers.join('\n');
127+
}
128+
129+
getDataBuffer() {
130+
let header = this.getHeaderInfo();
131+
if (this.data === 'ascii') {
132+
let textData = header;
133+
textData += this.getPointAsciiData();
134+
return str2ab(textData);
135+
} else {
136+
// binary
137+
header += '\n';
138+
const bufferSize = header.length + this.points * this.rowSize;
139+
const arrayBuffer = new ArrayBuffer(bufferSize);
140+
141+
// write header
142+
const headerView = new Uint8Array(arrayBuffer, 0, header.length);
143+
for (let i = 0; i < header.length; i++) {
144+
headerView[i] = header.charCodeAt(i);
145+
}
146+
147+
// write data
148+
const dataview = new DataView(arrayBuffer, header.length);
149+
this.setPointsToDataView(dataview);
150+
151+
return arrayBuffer;
152+
}
153+
}
154+
155+
getPointAsciiData() {
156+
const { pointsDataList, pointsDataMap, isList, points, fields } = this;
157+
let textData = '';
158+
for (let i = 0; i < points; i++) {
159+
textData += '\n';
160+
if (isList) {
161+
textData += fields.map((e, j) => pointsDataList[i * fields.length + j]).join(' ');
162+
} else {
163+
textData += fields.map((e, j) => pointsDataMap[e][i]).join(' ');
164+
}
165+
}
166+
return textData;
167+
}
168+
169+
setPointsToDataView(dataview: DataView) {
170+
const { pointsDataList, pointsDataMap, isList, points, fields } = this;
171+
const littleEndian = this.littleEndian;
172+
for (let i = 0; i < points; i++) {
173+
for (let j = 0; j < fields.length; j++) {
174+
const type = this.type[j];
175+
const size = this.size[j];
176+
let data;
177+
if (isList) {
178+
data = pointsDataList[i * fields.length + j];
179+
} else {
180+
data = pointsDataMap[fields[j]][i];
181+
}
182+
183+
const offset = i * this.rowSize + this.offset[j];
184+
setWithTypeToDataView(dataview, offset, littleEndian, type, size, data);
185+
}
186+
}
187+
}
188+
}

0 commit comments

Comments
 (0)