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

167 lines
6.8 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 DxfArrayScanner, { IGroup } from '../DxfArrayScanner';
import * as helpers from '../ParseHelpers';
import IGeometry, { IEntity, IPoint } from './geomtry';
export interface IAttribEntity extends IEntity {
scale: number;
textStyle: 'STANDARD' | string;
text: string;
tag: string;
prompt: string;
startPoint: IPoint;
endPoint: IPoint;
thickness: number;
textHeight: number;
rotation: number;
lineSpacingFactor: number;
fillBoxScale: number;
annotationHeight: number;
obliqueAngle: number;
invisible: boolean;
constant: boolean;
verificationRequired: boolean;
preset: boolean;
horizontalJustification: number;
verticalJustification: number;
backgroundFillColor: string;
attachmentPoint: number;
lineSpacing: number;
backgroundFillSetting: string;
extrusionDirection: IPoint;
lockPositionFlag: number;
hardPointerId: number;
}
export default class Attrib implements IGeometry{
public ForEntityName = 'ATTRIB' as const;
public parseEntity(scanner: DxfArrayScanner, curr: IGroup) {
const entity = {
type: curr.value,
scale: 1,
textStyle: 'STANDARD',
} as IAttribEntity;
curr = scanner.next();
while (!scanner.isEOF()) {
// 0 为图元类型 (MTEXT),不写入,此处当作 Attrib解析
if (curr.code === 0) {
break;
}
switch (curr.code) {
case 1:
// 字符串本身
entity.text = curr.value as string;
break;
case 2:
// 属性标签(字符串;不能包含空格)
entity.tag = curr.value as string;
break;
case 3:
// 附加文字(始终在长度为 250 个字符的数据块中)(可选)
entity.prompt = curr.value as string;
break;
case 7:
// DXFX 值APP三维矢量文字样式名如果未提供则为 STANDARD可选
entity.textStyle = curr.value as string;
break;
case 10: // 文字起点(在 OCS 中)
entity.startPoint = helpers.parsePoint(scanner);
break;
case 11: //X 轴方向矢量(在 WCS 中)
entity.endPoint = helpers.parsePoint(scanner);
break;
case 39:
// 厚度(可选;默认值 = 0
entity.thickness = curr.value as number;
break;
case 40:
// 文字高度
entity.textHeight = curr.value as number;
break;
case 41:
// X 相对缩放比例(宽度)(可选;默认值 = 1。使用拟合类型的文字时该值也将进行调整。
entity.scale = curr.value as number;
break;
case 44:
// 多行文字的行距比例(可选):
// 要应用的行距的默认百分比(五分之三)。
// 有效值的范围从 0.25 到 4.00
entity.lineSpacingFactor = curr.value as number;
break;
case 45:
// 填充框大小(可选):
// 确定文字周围的边框大小。
entity.fillBoxScale = curr.value as number;
break;
case 46:
// 定义注释高度
entity.annotationHeight = curr.value as number;
break;
case 50:
//文字旋转角度(可选;默认值 = 0
entity.rotation = curr.value as number;
break;
case 51:
// 倾斜角(可选;默认值 = 0
entity.obliqueAngle = curr.value as number;
break;
case 63:
//背景填充颜色(可选):
// 组码 90 为 1 时要用于背景填充的颜色。
entity.backgroundFillColor = curr.value as string
break;
case 70:
entity.invisible = !!((curr.value as number) & 0x01);
entity.constant = !!((curr.value as number) & 0x02);
entity.verificationRequired = !!((curr.value as number) & 0x04);
entity.preset = !!((curr.value as number) & 0x08);
break;
case 71:
//附着点:
// 1 = 左上2 = 中上3 = 右上
// 4 = 左中5 = 正中6 = 右中
// 7 = 左下8 = 中下9 = 右下
entity.attachmentPoint = curr.value as number;
break;
case 72:
// 文字水平对正类型(可选;默认值 = 0
entity.horizontalJustification = curr.value as number;
break;
case 73:
// 字段长度(可选;默认值 = 0当前未使用
entity.lineSpacing = curr.value as number;
break;
case 74:
// 垂直文字对正类型(可选;默认值 = 0
entity.verticalJustification = curr.value as number;
break;
case 90:
// 背景填充设置:
// 0 = 背景填充关闭
// 1 = 使用背景填充颜色
// 2 = 使用图形窗口颜色作为背景填充颜色
entity.backgroundFillSetting = curr.value as string;
break;
case 210:
// 拉伸方向。仅当图元的拉伸方向与 WCS 的 Z 轴不平行时才出现(可选;默认值 = 0, 0, 1
entity.extrusionDirection = helpers.parsePoint(scanner);
break;
case 280:
// 锁定位置标志。锁定块参照中属性的位置
entity.lockPositionFlag = curr.value as number;
break;
case 340:
// 次要属性或属性定义的硬指针 ID
entity.hardPointerId = curr.value as number;
break;
default:
helpers.checkCommonEntityProperties(entity, curr, scanner);
break;
}
curr = scanner.next();
}
return entity;
}
}