157 lines
4.5 KiB
TypeScript
157 lines
4.5 KiB
TypeScript
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;
|
||
}
|