TkAstral3D/packages/sdk/lib/dxf/parser/ParseHelpers.ts
2025-10-04 23:36:07 +08:00

157 lines
4.5 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import AUTO_CAD_COLOR_INDEX from './AutoCadColorIndex';
import ExtendedDataParser from './ExtendedDataParser';
import DxfArrayScanner, { IGroup } from './DxfArrayScanner';
import { IEntity, IPoint } from './entities/geomtry';
/**
* 返回给定AutoCad颜色索引值的对应color值
* @return {Number} color value as a number
*/
export function getAcadColor(index: number) {
return AUTO_CAD_COLOR_INDEX[index];
}
/**
* 解析2D或3D坐标、矢量或点。完成后扫描器保持在坐标的最后一组上。
* @param {*} scanner
*/
export function parsePoint(scanner: DxfArrayScanner) {
const point = {} as IPoint;
// 重读第一个坐标的组
scanner.rewind();
let curr = scanner.next();
let code = curr.code;
point.x = curr.value as number;
code += 10;
curr = scanner.next();
if (curr.code != code)
throw new Error('Expected code for point value to be ' + code +
' but got ' + curr.code + '.');
point.y = curr.value as number;
code += 10;
curr = scanner.next();
if (curr.code != code) {
// Only the x and y are specified. Don't read z.
scanner.rewind(); // Let the calling code advance off the point
return point;
}
point.z = curr.value as number;
return point;
}
/**
* 某些实体可能包含由组101开始的嵌入对象。实体结束前的所有其他数据不应被解释为实体属性。该特性没有相关文档。
* @param scanner
*/
export function skipEmbeddedObject(scanner: DxfArrayScanner) {
/* 确保正确启动组. */
scanner.rewind()
let curr = scanner.next()
if (curr.code !== 101) {
throw new Error("Bad call for skipEmbeddedObject()")
}
do {
curr = scanner.next()
} while (curr.code !== 0)
scanner.rewind()
}
/**
* 尝试解析所有实体通用的代码。如果组由此函数处理则返回true。
* @param {*} entity - the entity currently being parsed
* @param {*} curr - the current group being parsed
* @param scanner
*/
export function checkCommonEntityProperties(entity: IEntity, curr:IGroup, scanner:DxfArrayScanner) {
let xdataParser;
while (curr.code >= 1000) {
if (!xdataParser) {
xdataParser = new ExtendedDataParser()
}
if (xdataParser.Feed(curr)) {
xdataParser.Finish(entity)
xdataParser = null;
} else {
curr = scanner.next()
}
}
if (xdataParser) {
xdataParser.Finish(entity);
scanner.rewind();
return true;
}
switch (curr.code) {
case 0:
entity.type = curr.value as string;
break;
case 5:
entity.handle = curr.value as number;
break;
case 6:
entity.lineType = curr.value as string;
break;
case 8: // Layer name
entity.layer = curr.value as string;
break;
case 48:
entity.lineTypeScale = curr.value as number;
break;
case 60:
entity.visible = curr.value === 0;
break;
case 62: // Acad Index Color. 0 inherits ByBlock. 256 inherits ByLayer. Default is bylayer
entity.colorIndex = curr.value as number;
entity.color = getAcadColor(Math.abs(curr.value as number));
break;
case 67:
// 不存在或0表示图元位于模型空间中。
// 1 表示图元位于图纸空间中(可选)
entity.inPaperSpace = curr.value !== 0;
break;
case 100:
//ignore
break;
case 101: // Embedded Object in ACAD 2018.
// See https://ezdxf.readthedocs.io/en/master/dxfinternals/dxftags.html#embedded-objects
while (curr.code != 0) {
curr = scanner.next();
}
scanner.rewind();
break;
case 330:
entity.ownerHandle = curr.value as string;
break;
case 347:
entity.materialObjectHandle = curr.value as number;
break;
case 370:
//From https://www.woutware.com/Forum/Topic/955/lineweight?returnUrl=%2FForum%2FUserPosts%3FuserId%3D478262319
// An integer representing 100th of mm, must be one of the following values:
// 0, 5, 9, 13, 15, 18, 20, 25, 30, 35, 40, 50, 53, 60, 70, 80, 90, 100, 106, 120, 140, 158, 200, 211.
// -3 = STANDARD, -2 = BYLAYER, -1 = BYBLOCK
entity.lineweight = curr.value as 0| 5| 9| 13| 15| 18| 20| 25| 30| 35| 40| 50| 53| 60| 70| 80| 90| 100| 106| 120| 140| 158| 200| 211|-3|-2|-1;
break;
case 420: // TrueColor Color
entity.color = curr.value as number;
break;
case 1000:
entity.extendedData = entity.extendedData || {};
entity.extendedData.customStrings = entity.extendedData.customStrings || [];
entity.extendedData.customStrings.push(curr.value as string);
break;
case 1001:
entity.extendedData = entity.extendedData || {};
entity.extendedData.applicationName = curr.value as string;
break;
default:
return false;
}
return true;
}