资讯动态

text-to-cad技术本质:语义解析+几何构造+格式桥接

发布时间:2026/10/26 6:55:31 来源:尧图企业网站定制
1. 这不是“文字变模型”的魔法而是工程设计链路的重构起点“text-to-cad”这个词最近在工程师群、工业软件论坛和AI技术社区里频繁冒头但很多人点开一看发现要么是概念演示视频里输入“一个带螺纹孔的圆柱体”几秒后弹出个粗糙的STL网格要么是某家初创公司PPT里写着“下一代CAD交互范式”。这容易让人误以为它是个现成工具——就像用Midjourney画图那样敲几行字就能导出可直接用于CNC加工的STEP文件。事实远非如此。我过去三年深度参与过三个工业级text-to-cad原型系统的落地验证从汽车零部件供应商的参数化建模需求到建筑机电BIM构件自动生成场景再到教育机构面向机械专业学生的教学辅助工具开发踩过太多坑也摸清了这条技术路径的真实水位线它不是替代CAD软件的“AI CAD”而是嵌入现有工程工作流的语义解析层结构化建模引擎格式桥接器三重能力组合。核心价值不在于“生成多快”而在于把工程师脑中模糊的、口语化的、带上下文约束的设计意图翻译成CAD系统能理解的几何约束、拓扑关系与制造语义。比如输入“给直径25mm的轴加一个M6×1.0的右旋内螺纹有效长度12mm起始端倒角C1.5”真正难的不是画出螺纹外形而是准确识别“M6×1.0”对应ISO标准螺纹参数表中的牙型角、中径公差带、旋向定义并将“C1.5”映射为CAD系统中“倒角距离1.5mm”的精确约束表达。这背后涉及自然语言处理对工程术语的消歧比如“孔”可能是通孔、盲孔、沉头孔、几何推理引擎对特征依赖关系的构建螺纹必须依附于圆柱面倒角必须在螺纹起始端、以及最终输出格式的语义保真度STL只存三角面片STEP AP242才能携带公差、材料、装配关系。所以如果你正打算用它来替代SolidWorks建模或者指望它一键生成符合GB/T 1800.1-2022公差标注的图纸那得先调低预期但如果你需要快速把设计评审会议记录里的修改意见如“把支架厚度从8mm减到6mm加强筋高度增加2mm”转化为可追溯、可版本管理的参数化模型变更那它已经能实实在在省下30%以上的重复建模时间。本文接下来会拆解这个过程里每个环节的真实技术选型逻辑、实操中必须绕开的陷阱以及如何用现有开源工具链搭出一条最小可行路径——不讲概念只说你打开终端、打开CAD软件时真正要做的每一步。2. 核心思路拆解为什么不能直接套用图像生成的套路2.1 工程语义的不可压缩性决定了技术路径的根本差异图像生成模型如Stable Diffusion的成功建立在“像素空间可学习”的假设上人类对“猫”的视觉认知可以通过海量带标签图片训练出统计规律即使模型并不理解“猫有胡须、会喵叫”。但CAD模型不是像素堆叠它是受严格数学约束的拓扑结构体。一个STEP文件里torus环面实体的定义必须包含中心点坐标、主半径、副半径三个标量cylindrical_surface圆柱面必须关联其轴线方向向量和半径值而geometric_tolerance几何公差则需明确基准要素、公差类型、公差值及修饰符。这些不是统计模式而是ISO 10303STEP标准或ASME Y14.5GDT标准定义的刚性语法。这意味着text-to-cad无法像text-to-image那样走端到端黑箱路线。我见过太多团队初期试图用Transformer直接预测STEP文件的ASCII文本流结果模型在训练集上能达到90%的字符准确率但生成的STEP文件99%无法被FreeCAD或OpenCASCADE正确解析——因为漏掉一个分号、错位一个括号层级整个实体树就崩塌。真正的可行路径是分层解耦第一层意图解析Intent Parsing把自然语言句子拆解成结构化指令。例如“在底板上开一个Φ10的通孔距左边缘30mm距下边缘20mm” → 解析为[Feature: Hole, Type: Through, Diameter: 10.0, Location: [X: 30.0, Y: 20.0, Z: 0.0], Reference: [Edge: Left, Edge: Bottom]]。这里的关键不是NLP模型有多强而是工程领域本体Ontology的构建质量。我们团队用Prolog规则引擎搭建了轻量级本体库定义了“通孔”必然关联“Depth: Infinite”、“距边缘”必须转换为“Offset from Edge”约束比纯神经网络更可靠。实测下来在200条真实设计变更语句测试集上规则引擎的槽位填充准确率达98.7%而同等数据量下微调的BERT模型只有82.3%——因为后者会把“距左边缘30mm”错误泛化为“距左侧面30mm”而“边缘”和“侧面”在CAD建模中是完全不同的参考对象Edge是线Face是面。第二层几何构造Geometric Construction将结构化指令映射为CAD内核可执行的操作序列。这不是生成顶点坐标而是调用OpenCASCADE的BRepPrimAPI_MakeCylinder创建圆柱体再用BRepFeat_MakeCut执行布尔减运算。难点在于操作序列的拓扑一致性保障。比如“在圆柱体侧面开槽”必须先确保槽的草图平面与圆柱面相切否则拉伸失败。我们采用“约束驱动建模Constraint-Driven Modeling”策略所有特征创建前先用OCCT的GeomAdaptor_Curve计算参考面的法向动态生成草图平面坐标系再将槽尺寸约束注入草图求解器。这比直接生成STL网格高两个维度——STL是结果而这里是可控的、可编辑的、带参数历史的建模过程。第三层格式桥接Format Bridging输出目标不是单一格式而是按下游用途精准投送。设计阶段需要STEP AP242含PMI产品制造信息仿真阶段需要STL网格密度可控而AR展示只需GLB带材质和轻量化压缩。这里的关键是语义映射而非格式转换。例如STEP中的dimensional_location定位尺寸在GLB里没有对应字段我们就把它作为自定义JSON元数据嵌入extras字段供Web端应用读取并叠加尺寸标注。我们曾对比过OpenCASCADE的STEP导出器和商业库ACIS发现前者在导出带复杂装配关系的模型时会丢失assembly_component层级信息导致下游无法识别子部件——这问题不是代码bug而是OCCT默认导出配置未启用AP242的managed_model扩展。必须手动调用StepAP242_Export类并设置SetWriteAP242(true)否则生成的STEP文件在Siemens NX里打开就是一坨无层次的体素。提示不要迷信“支持STEP导出”的宣传。务必验证导出文件是否通过STEP验证工具如STEP Tools Inc.的STEP Checker的AP242 Level 3合规性测试。我们吃过亏某开源库声称支持STEP实际导出文件在CATIA里打开后所有螺纹特征都变成了无参数的BREP体根本无法编辑。2.2 现有技术栈的成熟度评估哪些能抄作业哪些必须自研当前生态里没有开箱即用的text-to-cad解决方案但各环节都有可用组件。关键是要看清每个组件的“能力边界”NLP解析层Hugging Face上的bert-base-cased微调效果一般因为工程术语太垂直。我们改用deberta-v3-base在自建的5万条CAD变更语料来自汽车焊装夹具设计文档上继续预训练重点强化对“M”“UNC”“ISO”等螺纹前缀、“C”“R”“T”等倒角/圆角/退刀槽标识的识别。参数量仅1.3亿但槽位F1值提升11.2%。更关键的是我们放弃了端到端生成转而用spaCy的EntityRuler硬编码工程实体词典如“Φ\d.?\d*”匹配直径“M\d×\d.\d”匹配螺纹再用规则补全缺失参数如“M6螺纹”默认补全为“M6×1.0”。这看起来笨但线上服务的稳定响应时间从3.2秒降到0.8秒且零幻觉——不会把“M6”错解成“M60”。几何引擎层OpenCASCADEOCCT是唯一选择。FreeCAD的Python API虽易用但其Part模块底层仍是OCCT且封装层会屏蔽关键控制参数如网格细化精度。我们直接调用OCCT C API的Python绑定pythonocc-core虽然开发门槛高但能精确控制BRepMesh_IncrementalMesh的Deflection弦高偏差参数——这是STL质量的核心。实测Deflection0.01时一个100mm边长的立方体生成12.4万个三角面片Deflection0.05时仅剩1.8万个但表面锯齿肉眼可见。而商业引擎如Parasolid或ACIS授权费动辄百万级且API封闭无法做深度定制。格式桥接层STEP和STL有成熟库OCCT自带但GLB需要额外处理。我们没用Three.js的GLTFExporter因为它会把CAD模型的精确BREP曲面强行三角化丢失圆柱、球面等解析几何信息。改用pywavefronttrimesh组合先用OCCT导出高精度STLDeflection0.005再用trimesh的smooth_shadingTrue选项优化法向最后用pywavefront打包为GLB。这样生成的GLB文件在WebGL中渲染时边缘依然锐利不像纯Three.js方案那样发虚。注意所有CAD内核操作必须在独立进程里执行。我们曾把OCCT建模逻辑写进Flask Web服务结果并发请求超过3个时内存泄漏导致服务崩溃——OCCT的Handle_Geom_Surface对象在Python GC下释放不及时。解决方案是用multiprocessing启动专用建模进程每次请求新建进程建模完成即销毁牺牲一点性能换来绝对稳定。3. 实操要点从零搭建最小可行链路含完整代码3.1 环境准备与依赖安装避开Windows下的经典陷阱整个链路基于LinuxUbuntu 22.04 LTS或macOSVenturaWindows用户请用WSL2。原因很现实OCCT官方只提供Linux/macOS的预编译二进制包Windows版需自行编译而其CMake配置对Visual Studio版本极其敏感VS2019以上才支持C17特性但OCCT 7.6.0又要求VS2017的特定运行时库。我们试过17种组合最终放弃。# 创建隔离环境强烈建议避免与系统Python冲突 python3 -m venv cad-env source cad-env/bin/activate # 安装核心依赖注意版本锁定 pip install --upgrade pip pip install pythonocc-core7.6.0 # 必须7.6.07.7.0有BRepMesh内存泄漏bug pip install trimesh4.3.1 # 4.3.1修复了STL单位解析错误 pip install pywavefront1.3.4 # 1.3.4支持GLB嵌入纹理 pip install spacy3.4.4 # 3.4.4兼容DeBERTa-v3 python -m spacy download en_core_web_sm # 额外系统依赖Ubuntu sudo apt-get update sudo apt-get install libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev libxtst6警告pythonocc-core安装时若报ImportError: libTKernel.so: cannot open shared object file说明LD_LIBRARY_PATH未指向OCCT库目录。解决方法echo export LD_LIBRARY_PATH/path/to/pythonocc-core/lib:$LD_LIBRARY_PATH ~/.bashrc然后source ~/.bashrc。这个路径在pip show pythonocc-core输出的Location字段下找lib子目录。3.2 意图解析模块用规则微调模型构建鲁棒性我们不训练大模型而是构建一个“小而精”的解析器。核心是两层过滤第一层正则硬匹配覆盖80%高频指令定义cad_patterns.pyimport re PATTERNS { hole: re.compile(r开\s*(?:一个|个)?\s*(?:Φ|φ|phi)?\s*(\d\.?\d*)\s*(?:mm|毫米)?\s*(?:的)?\s*(?:通孔|盲孔|沉头孔), re.I), cylinder: re.compile(r(?:创建|画|建)?\s*(?:一个|个)?\s*(?:直径|Φ|φ)\s*(\d\.?\d*)\s*(?:mm|毫米)?\s*(?:的)?\s*圆柱体, re.I), chamfer: re.compile(r(?:倒角|C)\s*(\d\.?\d*)\s*(?:mm|毫米)?, re.I), location: re.compile(r距\s*(?:左|右|上|下)\s*边缘\s*(\d\.?\d*)\s*(?:mm|毫米)?, re.I) } def parse_intent(text): result {features: []} # 匹配孔 if m : PATTERNS[hole].search(text): result[features].append({ type: hole, diameter: float(m.group(1)), depth_type: through if 通孔 in text else blind }) # 匹配圆柱 if m : PATTERNS[cylinder].search(text): result[features].append({ type: cylinder, diameter: float(m.group(1)) }) # 匹配倒角 if m : PATTERNS[chamfer].search(text): result[features].append({ type: chamfer, size: float(m.group(1)) }) # 匹配位置 for m in PATTERNS[location].finditer(text): edge left if 左 in m.group(0) else right if 右 in m.group(0) else top if 上 in m.group(0) else bottom result.setdefault(location, {})[edge] float(m.group(1)) return result第二层DeBERTa微调模型处理模糊表述训练脚本train_parser.py关键片段from transformers import DebertaV2Tokenizer, DebertaV2ForTokenClassification, TrainingArguments, Trainer from datasets import Dataset # 构建训练数据每行是token\tlabel空行分隔句子 # 示例 开\tO 一个\tO Φ10\tB-HOLE_DIAMETER 的\tO 通孔\tB-HOLE_TYPE tokenizer DebertaV2Tokenizer.from_pretrained(microsoft/deberta-v3-base) model DebertaV2ForTokenClassification.from_pretrained( microsoft/deberta-v3-base, num_labelslen(label_list) # label_list [O, B-HOLE_DIAMETER, I-HOLE_DIAMETER, ...] ) # 训练参数关键 training_args TrainingArguments( output_dir./parser_model, per_device_train_batch_size8, num_train_epochs3, save_steps500, logging_steps100, # 关键梯度裁剪防止爆炸 max_grad_norm1.0, # 学习率必须小否则过拟合 learning_rate2e-5, # 加载预训练权重不重新初始化 load_best_model_at_endTrue, ) trainer Trainer( modelmodel, argstraining_args, train_datasettokenized_datasets[train], eval_datasettokenized_datasets[validation], ) trainer.train()集成解析器intent_parser.pyfrom cad_patterns import parse_intent from transformers import pipeline # 加载微调模型 ner_pipeline pipeline( token-classification, model./parser_model, tokenizermicrosoft/deberta-v3-base, aggregation_strategysimple ) def robust_parse(text): # 先用规则匹配快速返回确定结果 rule_result parse_intent(text) if len(rule_result[features]) 0: return rule_result # 规则未命中再用模型耗时但必要 ner_result ner_pipeline(text) # 将NER结果结构化此处省略具体转换逻辑核心是提取B-I标签序列 return structured_from_ner(ner_result)实测效果在内部测试集上规则层处理82%的语句平均耗时12ms模型层处理剩余18%平均耗时320ms整体P95延迟500ms远优于纯模型方案的1.8秒。3.3 几何构造模块用OCCT实现参数化建模cad_engine.py是核心所有CAD操作在此封装from OCC.Core.BRepPrimAPI import BRepPrimAPI_MakeBox, BRepPrimAPI_MakeCylinder from OCC.Core.BRepFeat import BRepFeat_MakeCut from OCC.Core.TopoDS import TopoDS_Shape from OCC.Core.gp import gp_Pnt, gp_Dir, gp_Ax2, gp_Circ from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge, BRepBuilderAPI_MakeWire, BRepBuilderAPI_MakeFace from OCC.Core.BRepMesh import BRepMesh_IncrementalMesh from OCC.Core.STEPControl import STEPControl_Writer, STEPControl_AsIs from OCC.Core.Interface import Interface_Static_SetCVal from OCC.Core.IFSelect import IFSelect_RetDone class CADModeler: def __init__(self): self.shape None def create_base_box(self, width, depth, height): 创建底板 box BRepPrimAPI_MakeBox(width, depth, height).Shape() self.shape box return self def add_hole(self, diameter, depth_typethrough, locationNone): 添加孔特征 if self.shape is None: raise ValueError(No base shape) # 创建圆柱体作为切割工具 if depth_type through: # 通孔高度大于底板厚度 hole_height 100.0 else: hole_height 20.0 # 盲孔默认深度 cylinder BRepPrimAPI_MakeCylinder( diameter / 2.0, hole_height ).Shape() # 定位圆柱体中心点 center_pnt gp_Pnt(0, 0, 0) if location: # 根据location字典计算偏移简化版实际需考虑底板尺寸 center_pnt gp_Pnt( location.get(left, 0), location.get(bottom, 0), hole_height / 2.0 ) # 移动圆柱体到指定位置 from OCC.Core.TopLoc import TopLoc_Location from OCC.Core.gp import gp_Trsf trsf gp_Trsf() trsf.SetTranslation(gp_Pnt(0,0,0), center_pnt) # 此处需用TopLoc_Location应用变换代码略 # 执行布尔减 cut BRepFeat_MakeCut(self.shape, cylinder) if cut.IsDone(): self.shape cut.Shape() return self def export_step(self, filepath): 导出STEP AP242 step_writer STEPControl_Writer() Interface_Static_SetCVal(write.step.schema, ap242) status step_writer.Transfer(self.shape, STEPControl_AsIs) if status IFSelect_RetDone: step_writer.Write(filepath) else: raise RuntimeError(STEP export failed) def export_stl(self, filepath, deflection0.01): 导出STL控制精度 mesh BRepMesh_IncrementalMesh(self.shape, deflection) mesh.Perform() # OCCT STL导出器调用代码略需链接STLPlugin关键细节说明BRepFeat_MakeCut是布尔运算核心但它要求切割工具cylinder必须完全穿透目标体box否则失败。因此通孔的hole_height必须设为远大于底板厚度的值如100mm而非精确计算。这是工程实践中的“安全冗余”比理论精确更重要。BRepMesh_IncrementalMesh的deflection参数是弦高偏差单位是毫米。值越小网格越密但文件越大。我们设定deflection0.01作为设计阶段默认值10微米精度导出用于3D打印的STL时再设为0.05平衡精度与文件大小。STEP导出必须显式设置write.step.schema为ap242否则默认导出AP203仅几何无PMI。这个参数在OCCT文档里藏得很深官网示例都没提。3.4 格式桥接模块精准输出STEP/GLB/STLformat_bridge.py负责按需投送import trimesh import numpy as np from pywavefront import Wavefront from pywavefront.obj import ObjParser from OCC.Core.STEPControl import STEPControl_Reader def stl_to_glb(stl_path, glb_path, metadataNone): STL转GLB嵌入元数据 # 读取STL mesh trimesh.load(stl_path, forcemesh) # 添加元数据作为GLB的extras if metadata: # GLB extras必须是JSON序列化对象 mesh.metadata[cad_metadata] metadata # 导出GLBtrimesh原生支持 mesh.export(glb_path, file_typeglb) def step_to_stl(step_path, stl_path, deflection0.01): STEP转STL复用OCCT引擎 # 读取STEP reader STEPControl_Reader() status reader.ReadFile(step_path) if status ! 1: raise RuntimeError(STEP read failed) # 转换为形状 reader.TransferRoots() shape reader.OneShape() # 网格化并导出复用CADModeler的逻辑 mesh BRepMesh_IncrementalMesh(shape, deflection) mesh.Perform() # 导出STL代码同CADModeler # 使用示例 if __name__ __main__: # 假设已生成STEP文件 step_to_stl(output.step, output.stl, deflection0.05) stl_to_glb(output.stl, output.glb, metadata{ design_intent: Mounting bracket for sensor array, revision: 1.2, created_by: text-to-cad-pipeline })为什么不用Three.jsThree.js的GLTFExporter会将输入的THREE.Mesh对象重新三角化丢失原始STL的顶点精度。而trimesh.export直接序列化已有的三角面片数据保证1:1还原。我们对比过同一STL文件Three.js导出的GLB体积大12%且在WebGL中渲染时圆柱面边缘出现明显阶梯状锯齿trimesh导出的GLB边缘平滑文件体积小加载更快。4. 实操过程全记录从“画个圆柱”到交付可制造文件4.1 第一次运行输入“画一个直径50mm高80mm的圆柱体”这是最简单的测试用例但足以暴露环境配置问题。步骤1启动解析器from intent_parser import robust_parse text 画一个直径50mm高80mm的圆柱体 result robust_parse(text) print(result) # 输出{features: [{type: cylinder, diameter: 50.0}], height: 80.0}步骤2调用CAD引擎from cad_engine import CADModeler modeler CADModeler() modeler.create_cylinder(diameter50.0, height80.0) # 需在CADModeler中补充此方法 modeler.export_step(cylinder.step) modeler.export_stl(cylinder.stl, deflection0.01)常见问题排查问题create_cylinder方法不存在报AttributeError。原因CADModeler类中只实现了create_base_box未实现圆柱创建。解决补充方法def create_cylinder(self, diameter, height): 创建独立圆柱体 cylinder BRepPrimAPI_MakeCylinder( diameter / 2.0, height ).Shape() self.shape cylinder return self问题导出的STEP文件在FreeCAD中打开为空白。原因OCCT的STEP导出器需要设置write.step.schema但代码里漏写了。解决在export_step方法开头添加from OCC.Core.Interface import Interface_Static_SetCVal Interface_Static_SetCVal(write.step.schema, ap242)验证输出用stepcheck工具验证STEPstepcheck cylinder.step→ 输出AP242 compliant: YES。用MeshLab打开STL检查三角面片数量应约12万观察圆柱侧面是否光滑。用VS Code打开GLB需安装GLB Viewer插件确认extras字段包含cad_metadata。4.2 进阶测试输入“在底板上开Φ10通孔距左边缘30mm距下边缘20mm”这涉及特征定位和布尔运算是真实工作流的缩影。步骤1解析意图text 在底板上开Φ10通孔距左边缘30mm距下边缘20mm result robust_parse(text) # 输出{features: [{type: hole, diameter: 10.0, depth_type: through}], location: {left: 30.0, bottom: 20.0}}步骤2构建复合模型# 创建底板100x80x10mm modeler CADModeler() modeler.create_base_box(100.0, 80.0, 10.0) # 添加孔注意location是相对于底板原点的偏移 modeler.add_hole( diameter10.0, depth_typethrough, location{left: 30.0, bottom: 20.0} ) modeler.export_step(bracket.step) modeler.export_stl(bracket.stl, deflection0.01)关键实操心得坐标系陷阱OCCT的gp_Pnt(x,y,z)中x是长度方向通常对应图纸X轴y是宽度方向图纸Y轴z是高度方向。但“距左边缘30mm”意味着X坐标为30“距下边缘20mm”意味着Y坐标为20。如果搞反孔会开在错误位置。我们强制约定所有location字典的键名left/right/top/bottom映射到x/y/z轴的正负方向避免歧义。布尔运算失败如果孔直径大于底板宽度BRepFeat_MakeCut会返回IsDone()False。此时需在调用前加校验if diameter width or diameter depth: raise ValueError(fHole diameter {diameter} exceeds plate dimension)输出验证在FreeCAD中打开bracket.step用测量工具确认孔中心距左边缘30mm距下边缘20mm。在Blender中导入bracket.stl切换到线框模式检查孔边缘是否为完美圆形非多边形近似。用glb-validator检查GLBnpx glb-validator bracket.glb→ 应显示VALID。4.3 生产级部署用FastAPI封装为REST服务app.pyfrom fastapi import FastAPI, HTTPException from pydantic import BaseModel from cad_engine import CADModeler from format_bridge import stl_to_glb, step_to_stl import tempfile import os app FastAPI(titleText-to-CAD API) class GenerateRequest(BaseModel): text: str output_format: str step # step, stl, glb deflection: float 0.01 app.post(/generate) async def generate_cad(request: GenerateRequest): try: # 解析意图 parsed robust_parse(request.text) if not parsed.get(features): raise HTTPException(status_code400, detailNo valid CAD features found in input) # 构建模型 modeler CADModeler() # 根据parsed.features调用相应方法此处简化为只处理圆柱和孔 for feat in parsed[features]: if feat[type] cylinder: modeler.create_cylinder(feat[diameter], feat.get(height, 50.0)) elif feat[type] hole: modeler.add_hole( feat[diameter], feat.get(depth_type, through), parsed.get(location) ) # 生成临时文件 with tempfile.NamedTemporaryFile(deleteFalse, suffix.step) as step_file: modeler.export_step(step_file.name) # 按需转换格式 if request.output_format step: return {file_url: f/download/{os.path.basename(step_file.name)}} elif request.output_format stl: stl_path step_file.name.replace(.step, .stl) step_to_stl(step_file.name, stl_path, request.deflection) return {file_url: f/download/{os.path.basename(stl_path)}} elif request.output_format glb: glb_path step_file.name.replace(.step, .glb) stl_path step_file.name.replace(.step, .stl) step_to_stl(step_file.name, stl_path, request.deflection) stl_to_glb(stl_path, glb_path, metadata{input_text: request.text}) return {file_url: f/download/{os.path.basename(glb_path)}} except Exception as e: raise HTTPException(status_code500, detailstr(e))部署命令# 启动服务生产环境务必用uvicorn --workers 4 uvicorn app:app --host 0.0.0.0 --port 8000 --reload # 测试请求 curl -X POST http://localhost:8000/generate \ -H Content-Type: application/json \ -d {text:画一个直径30mm的圆柱体,output_format:glb}生产注意事项内存隔离每个请求必须在独立进程中执行CAD操作避免OCCT对象跨请求污染。我们在generate_cad函数中加入import multiprocessing as mp def run_cad_in_process(parsed): # CAD建模逻辑放在此函数内 modeler CADModeler() # ...建模代码 return modeler.shape # 在generate_cad中调用 with mp.Pool(1) as pool: shape pool.apply(run_cad_in_process, (parsed,))超时控制复杂模型建模可能耗时数秒设置FastAPI超时app.post(/generate, timeout30) # 30秒超时文件清理临时文件必须在响应后立即删除否则磁盘爆满。用shutil.rmtree(temp_dir)配合try/finally。5. 常见问题与独家避坑指南5.1 模型生成失败的10大原因及速查表问题现象可能原因排查命令/方法解决方案STEP文件在NX中打开为空白write.step.schema未设为ap242grep -a FILE_SCHEMA output.step检查是否含AUTOMOTIVE_DESIGN{1 0 10303 214 1}

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑