chili调试笔记14 画线 页面布置 线条导出dxf

发布于:2025-05-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

2025-05-08 09-05-06 llm画线

页面布置

 

 

 

 expand有自己的格式

删了就会按照子元素格式 

 

不加px无效

没有指定尺寸设置100%无效

怎么把线条导出dxf

@command({
    name: "file.export",
    display: "command.export",
    icon: "icon-export",
})
export class Export extends CancelableCommand {
    @Property.define("file.format")
    public get formats() {
        return this.getPrivateValue("formats", this.initCombobox());
    }
    public set formats(value: Combobox<string>) {
        this.setProperty("formats", value);
    }

    private initCombobox() {
        const box = new Combobox<string>();
        box.items.push(...this.application.dataExchange.exportFormats());
        return box;
    }

    protected async executeAsync() {
        const nodes = await this.selectNodesAsync();
        if (!nodes || nodes.length === 0) {
            PubSub.default.pub("showToast", "toast.select.noSelected");
            return;
        }

        PubSub.default.pub(
            "showPermanent",
            async () => {
                const format = this.formats.selectedItem;
                if (format === undefined) return;

                const data = await this.application.dataExchange.export(format, nodes);
                if (!data) return;

                PubSub.default.pub("showToast", "toast.downloading");
                download(data, `${nodes[0].name}${format}`);
            },
            "toast.excuting{0}",
            I18n.translate("command.export"),
        );
    }

 

 

❓ 问题 3:缺少 TABLES 段定义图层等信息

如果你没有定义图层(Layer),某些软件可能会忽略你的图形。


✅ 推荐解决方案:补充 HEADER 和 TABLES 段落

下面是一个 完整且经过验证可以在 FreeCAD 中正常打开的 DXF 示例,基于你提供的线条数据:

 

dxf模板            不能用

0
SECTION
2
HEADER
9
$ACADVER
1
AC1027
9
$INSUNITS
70
4
0
ENDSEC

0
SECTION
2
TABLES
0
TABLE
2
LAYER
70
     1
0
LAYER
2
0
70
     0
62
     7
6
CONTINUOUS
0
ENDTAB
0
TABLE
2
LTYPE
70
     1
0
LTYPE
2
CONTINUOUS
70
     0
3
Solid line
72
    65
73
     0
40
0.0
0
ENDTAB
0
ENDSEC

0
SECTION
2
BLOCKS
0
BLOCK
8
0
2
*MODEL_SPACE
70
     0
10
0.0
20
0.0
30
0.0
100
AcDbBlockBegin
3
*MODEL_SPACE
1

0
ENDBLK
100
AcDbBlockEnd
0
ENDSEC

0
SECTION
2
ENTITIES
{{entities}}
0
ENDSEC

0
SECTION
2
OBJECTS
0
DICTIONARY
5
F000
330
0
100
AcDbDictionary
3
ACAD_GROUP
350
F001
0
DICTIONARY
5
F001
330
F000
100
AcDbDictionary
0
ENDSEC

0
EOF

让ai打工 

放弃了,用三方库

cnpm install three-dxf

// three-dxf.d.ts
declare module 'three-dxf' {
    class Point3D {
        x: number;
        y: number;
        z: number;

        constructor(x: number, y: number, z?: number);
    }

    class Drawing {
        header: {
            setVersion(version: string): void;
            setUnit(unit: string): void;
        };

        addLayer(name: string, options?: any): void;
        addLine(start: Point3D, end: Point3D): void;
        toString(): string;
    }

    export { Drawing, Point3D };
}

 

freecad打不开别的打开了

cnpm install @tarikjabiri/dxf

@tarikjabiri/dxf CDN by jsDelivr - A CDN for npm and GitHub

   private async  handleDxfExport(nodes: VisualNode[]): Promise<string[]> {
        // 创建一个新的 DXF 文档
        const d = new DxfDocument();
      
        for (const node of nodes) {
            if (node instanceof LineNode) {
                const start = node.start;
                const end = node.end;
    
                // 创建线段并设置起点和终点
                const line = new Line(
                     { x: start.x, y: start.y, z: Math.abs(start.z) < 1e-9 ? 0 : start.z },
                     { x: end.x, y: end.y, z: Math.abs(end.z) < 1e-9 ? 0 : end.z }
            );
    
       
           
    
                // 添加到文档的实体集合中
                d.entities.modelSpace.addEntity(line);
            }
        }
    
       const fullDxfContent= d.stringify(); // 转换为字符串
        // 返回分割成行的数组,每行后加上换行符
        return fullDxfContent.split('\n').map(line => line + '\n');
    }

 

2年前的了,用python写吧

python直接写本地freecad可以打得开发回网页就打不开

import ezdxf
import tempfile
import os


def draw_lines_and_get_dxf(lines):
    """
    根据给定的线段列表绘制直线,并返回 DXF 文档的字符串格式。

    :param lines: 线段列表,每个线段由起点和终点组成,格式为 [{"start": {"x": x1, "y": y1, "z": z1}, "end": {"x": x2, "y": y2, "z": z2}}, ...]
    :return: DXF 文档的字符串表示
    """
    # 创建一个新的 DXF 文档
    doc = ezdxf.new('R2010')
    msp = doc.modelspace()

    # 遍历每条线段并绘制直线
    for line in lines:
        print(line)
        start = (line["start"]["x"], line["start"]["y"], line["start"]["z"])
        end = (line["end"]["x"], line["end"]["y"], line["end"]["z"])
        msp.add_line(start, end)
   
    # 保存到临时文件
    with tempfile.NamedTemporaryFile(suffix=".dxf", delete=False) as temp_file:
        doc.saveas(temp_file.name)
     
        temp_file_path = temp_file.name
    # 创建保存目录
    save_dir = './run/dxf'
    os.makedirs(save_dir, exist_ok=True)

    # 另存为指定路径
    save_path = os.path.join(save_dir, 'output.dxf')
    doc.saveas(save_path)
    # 读取文件内容
    with open(temp_file_path, "r") as file:
        dxf_content = file.read()

    # 删除临时文件
    os.remove(temp_file_path)

    return dxf_content

打不开的:

打得开的

浪费了一下午发现是freecad打不开中文命名的文档

不是卡中文可能@tarikjabiri/dxf包就能用了

2025-05-08 16-59-41 linenode导出dxf


网站公告

今日签到

点亮在社区的每一天
去签到