ITADN
CADmium-Co/CADmium
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

[!CAUTION] 此仓库已停止维护。不接受任何 PR 或 issue。

CADmium

本项目旨在从零开始创建一款新的 CAD 程序。它体积小巧,可在 Web 浏览器中运行,源代码免费公开在 Github 上。

传统 CAD 程序耗费了数千年(原文如此,指大量集体工程时间)的集体工程时间才发展到如今的水平,因此本程序在功能广度上永远无法与之竞争。但 CADmium 旨在以不到 10% 的工作量覆盖 80% 最常见的 CAD 使用场景。目前我们面向的是只想为 3D 打印机设计一个小部件的家庭爱好者,而非想要设计汽车或飞机的公司,尽管后者未来也会实现。

如果你在寻找:

  • 一个简单、现代、参数化的 CAD 界面,且可在浏览器中运行
  • 能够将实体导出为 .step、.obj 或 .cadmium(一种由本项目发明的基于 json 的 CAD 格式)
  • 能够将草图导出为 .svg 或 .dxf
  • 无需互联网连接即可工作

那么这个项目可能适合你!

状态:早期原型。该工具尚未达到 MVP 阶段,但正在公开开发中。请不要将此分享到 HN 或 Reddit 或类似平台。 哈哈,我想那艘船已经开走了]!

总体计划

演示:我们目前正朝着首个演示版本 V0.0.1 冲刺。这是我们决定构建和发布流程的良好初步练习。

在那之后,我们将再进行几次演示(V0.0.*)版本发布,不断聚合功能,直到它感觉相当可用为止。

Alpha: 当我们感觉已经达成一个人们可能真正想要使用的 MVP 时,就是发布 Alpha 版本(V0.1.0)并主动向用户征求反馈的时候了。我们将利用这些反馈进行更多改进,如有必要,重新设计某些部分以实现出色的工作流。

除此之外,我们拭目以待!

技术

底层的边界表示引擎是 truck,它使用 rust 编写,且不依赖于任何遗留的 b-rep 引擎。

借助 truck,我们编写了一个名为 cadmium 的小型 rust 库,它提供了用于项目、工作区、草图、拉伸和约束的结构体。我们的目标是,对于偏好代码优先 CAD 的用户,这个 rust 库提供与 UI 相同的所有功能。该库能够将项目保存和加载到磁盘上的 json 文件。我们还构建了一组 javascript 绑定,以便整个项目可以编译为 wasm 并在浏览器中运行。

UI 使用 SvelteKitTailwind 构建。它托管在 Github Pages 上。我们使用 three.js 进行渲染,在此情况下,其底层使用 WebGL。我们使用 Threlte 以声明式方式管理场景图。

原生构建使用 Tauri,这是一个基于 Rust 的、围绕操作系统特定的原生 webview 的封装,允许我们从同一代码库构建原生应用。

许可证

本软件依据 Elastic License 2.0 提供。简而言之,您可以随意使用本软件,但不得将其作为服务提供给第三方。

运行代码

如果您只是想试用一下,点击此处 查看在线 Web 演示。

要在本地使用 pnpm workspace 和 turbo 进行构建:

git clone https://github.com/Cadmium-Co/CADmium.git
cd CADmium
pnpm install
pnpm dev

原生构建

# Development
pnpm tauri dev

# Generate binaries and installers
pnpm tauri build

Tauri 可以使用以下命令为原生构建生成图标](https://tauri.app/v1/guides/features/icons/):

pnpm tauri icon applications/web/public/cadmium_logo_min.svg

工具配置

pnpm

我们使用 pnpm 来管理 monorepo。请按照此处说明进行安装:https://pnpm.io/installation#using-a-standalone-script

如果你是 node 新手,可以使用 pnpm 来管理 nodejs:

# https://pnpm.io/cli/env#use
pnpm env use --global 20

rust

首先使用 rustup 安装 rust:https://rustup.rs

然后安装 wasm-pack

cargo install wasm-pack

运行测试

pnpm test

Playwright 用于 e2e 测试。您可能会被提示输入一条命令来安装它。

对于 manjaro/archlinux 用户,它可能会报告缺少依赖项。在 manjaro 上,缺少的依赖项已得到解决 感谢此评论:

yay -S aur/enchant1.6 aur/icu66 aur/libwebp052

仅监视 vitest 单元测试:

cd applications/web
pnpm test:unit -w

rust

要构建并运行 Rust 测试:

cargo test

rust 示例

使用 rust 代码的简单示例可在 packages/cadmium/examples 中找到

使用以下命令运行简单的 rust 示例:

cargo run --example project_simple_extrusion

将生成 example.obj 文件和 example.step 输出文件,.step 文件可在 CAD 查看器中查看。

git blame

为了忽略仅用于格式更改的提交,以保留正确的作者信息,请设置你的本地 git 配置:

git config blame.ignoreRevsFile .git-blame-ignore-revs

贡献

我们正在积极寻找贡献者!请加入 Discord 来帮忙!

尤其是,我们需要在以下领域获得帮助:

设计: 该工具必须看起来和用起来都令人愉悦,而我们并非设计师。我们非常乐意接受以下形式的贡献:

  • 关于如何让不同元素看起来和行为更好的建议、模型或 tailwindcss 示例
  • 特别是,帮助挑选一个效果好且独特的调色板
  • 帮助研究如何实现深色模式

Rust: 这是我们在 Rust 中的第一个项目。我们需要经验丰富的 Rustaceans 的帮助来:

  • 研究如何更好地组织 rust 代码
  • 指出我在语言使用上的任何明显问题(到目前为止,我们完全避免了 Lifetimes、Traits、Rc、RefCell 等,这可能阻碍了进展)

Svelte: 这是我们使用 Svelte 的第一个项目。我们非常希望有经验丰富的眼睛来:

  • 审查基本结构,并告诉我们是否犯了任何重大错误
  • 在 Svelte 5 发布时帮助我们迁移

如果你觉得你愿意并且能够帮助,请加入 我们的 discord

许可证常见问题

你们使用什么许可证?

我们使用 Elastic License v2.0

该许可证的条款是什么?

你可以对代码做任何你想做的事,除了将其作为服务提供给第三方。

为什么你们使用该许可证而不是 MIT、GPL 等?

因为我们不希望 Autodesk、Siemens、Dassault 或 PTC 克隆我们的代码,更改标志,并将其作为他们的产品之一提供。

我能为我的家人托管一个 CADmium 实例吗?

可以。

我能为我的公司托管一个 CADmium 实例供内部使用吗?

可以。

我能为我的公司托管一个 CADmium 实例,作为免费服务提供给我的客户吗?

不可以。

我能为我的公司托管一个 CADmium 实例,作为付费服务提供给我的客户吗?

不可以。

如果你们在某个时间点决定停止开发 CADmium,项目将会/可能发生什么?

我们会将许可证转换为 MIT、GPL 或类似的东西。

如果我 fork 该项目并进行修改(重新品牌化或添加新功能),我可以自己托管它吗?

可以,只要你的 fork 仅由你或你的公司使用。你不被允许将你的 fork 作为服务托管给第三方。

我必须发布我的 fork 吗?

不。

V0.0.1 发布(演示版)的即时待办事项

用于跟踪进度的 Github 项目在这里

  • 草图
    • 实现一个独立的 2D 一阶约束求解器
    • 将该新求解器集成到 sketch.rs 中
    • 能够在实体的面上创建草图
    • 能够在 UI 中创建和修改约束
    • 实体:直线、矩形、圆、圆弧、2D 圆角
    • 约束:水平、垂直、平行、垂直、长度、半径、重合,可能还有其他几个
  • 拉伸
    • 配置拉伸以创建新实体或从现有实体中减去
    • 模式:新建、添加、切割
    • 控制:深度、偏移
    • 能够一次拉伸多个面(来自一个草图),同时不拉伸草图中的每个面
  • 旋转
    • 与拉伸相同
  • 布尔
    • 并集、交集、差集
  • 项目
    • 能够重命名项目
    • 能够删除步骤
    • 将 ctrl + s 绑定到 .cadmium 导出,将 ctrl + o 绑定到 .cadmium 导入
  • 单位
    • 明确整个文件使用毫米单位
  • 文件
    • 保存和加载 CADmium 文件
    • 导出为 STEP、OBJ、STL、SVG、DXF
  • 营销
    • 演示如何制作的 Youtube 视频:
      • 一个简单的立方体
      • 一个带螺丝孔的板
      • 一些相当复杂的东西 像这个