aardio 文档
aardio 范例: 带孔零件示例源码
import com.sldWorks;
import JSON;
// 可通过 loadcodex(此文件,{template=...;outputDir=...;version=2025;material=...}) 传入配置。
// 示例:完全定义的草图 → 拉伸 → 按法向找顶面 → 通孔切除 → 材料 → 自定义属性 → 尺寸表 → 改尺寸 → 图像 → 保存。
var config=...;
if(config===null) config={};
assert(type(config)=="table","配置参数必须是表。");
var sw,err=com.sldWorks(false,config.version);
assert(sw,err);
// 这是中文 SOLIDWORKS 2025 的示例位置。其他安装请修改或传入 template。
var template=config.template : "%ProgramData%\SOLIDWORKS\SOLIDWORKS 2025\templates\gb_part.prtdot";
var runName=tostring(time(),"%Y%m%d-%H%M%S") + "-" + time.tick();
var outDir=io.createDir(config.outputDir : io.getSpecial(0x1c,"aardio\sldWorks\plate",runName));
assert(outDir,"不能创建输出目录。");
var width,height,thickness,radius=0.100,0.060,0.020,0.010; // 米
var doc,newError=sw.NewDoc(1,template);
assert(doc,newError);
doc.SetTitle2("AA_Plate_" + runName);
var previousErrorDialog=doc.ShowFeatureErrorDialog;
doc.ShowFeatureErrorDialog=false;
// 1. 基准面:按类型取第一个基准面,不依赖本地化名称。
var plane;
for i,feature in sw.eachFeature(doc){
if(feature.GetTypeName2()=="RefPlane"){plane=feature;break;}
}
assert(plane,"模板中没有基准面。");
// 2. 完全定义的矩形草图:两个尺寸 + 角点与原点重合。NewSketch 负责进入/退出并按 IsSame 找回草图特征。
var profile,sketchError=sw.NewSketch(doc,plane,function(sketchManager,doc){
var segments=sketchManager.CreateCornerRectangle(0,0,0,width,height,0);
assert(#segments==4,"矩形创建失败。");
var bottom,left,corner;
for i,segment in segments {
var start,finish=segment.GetStartPoint2(),segment.GetEndPoint2();
if(math.abs(start.Y)<1e-9 && math.abs(finish.Y)<1e-9){
bottom=segment;
corner=math.abs(start.X)<1e-9 ? start : finish;
}
if(math.abs(start.X)<1e-9 && math.abs(finish.X)<1e-9) left=segment;
}
assert(bottom && left && corner,"没有找到矩形的底边或左边。");
// swInputDimValOnCreate 为 true 时 AddDimension2 会弹出输入框阻塞自动化,临时关闭后恢复。
var previousToggle=sw.GetUserPreferenceToggle(10/*_swInputDimValOnCreate*/);
sw.SetUserPreferenceToggle(10,false);
var ok,failure=call(function(){
doc.ClearSelection2(true);
assert(bottom.Select4(false,com.nothing()),"选择底边失败。");
var display=doc.AddDimension2(width/2,-0.015,0);
assert(display,"宽度尺寸创建失败。");
assert(display.GetDimension2(0).SetSystemValue3(width,1,com.nothing())==0,"宽度尺寸赋值失败。");
doc.ClearSelection2(true);
assert(left.Select4(false,com.nothing()),"选择左边失败。");
display=doc.AddDimension2(-0.015,height/2,0);
assert(display,"高度尺寸创建失败。");
assert(display.GetDimension2(0).SetSystemValue3(height,1,com.nothing())==0,"高度尺寸赋值失败。");
});
sw.SetUserPreferenceToggle(10,previousToggle);
assert(ok,failure);
// 角点与原点重合:原点用类型 + 坐标选择,不依赖“原点/Origin”名称。
doc.ClearSelection2(true);
assert(corner.Select4(false,com.nothing()),"选择角点失败。");
assert(sw.SelectByPoint(doc,"EXTSKETCHPOINT",0,0,0,true),"选择原点失败。");
doc.SketchAddConstraints("sgCOINCIDENT");
return true;
},"AA_Profile");
assert(profile,sketchError);
var profileInfo=sw.GetSketchInfo(doc,profile);
assert(profileInfo.fullyDefined,"草图未完全定义:" + profileInfo.constrainedStatusName);
// 3. 拉伸 20 mm。
var block,blockCode=sw.Extrude(doc,profile,{depth=thickness;name="AA_Block"});
assert(block,blockCode);
assert(blockCode==0,"拉伸特征报告错误码:" + blockCode);
assert(sw.RebuildDoc(doc));
var blockMass,massError=sw.GetMassProperties(doc);
assert(blockMass,massError);
assert(math.abs(blockMass.volume-width*height*thickness)<1e-10,"长方体体积不符。");
// 4. 用法向找顶面(+Z),再用面上的点选择它并画圆。
var faces,facesError=sw.GetFaces(doc);
assert(faces,facesError);
var top;
for i,face in faces {
if(face.isPlane && face.normal[3]>0.99) top=face;
}
assert(top,"没有找到法向 +Z 的顶面。");
var holeProfile,holeError=sw.NewSketch(doc,{x=top.point[1];y=top.point[2];z=top.point[3]},function(sketchManager){
assert(sketchManager.CreateCircleByRadius(width/2,height/2,0,radius),"圆创建失败。");
return true;
},"AA_HoleProfile");
assert(holeProfile,holeError);
var hole,holeCode=sw.Extrude(doc,holeProfile,{cut=true;endCondition="throughAll";name="AA_Hole"});
assert(hole,holeCode);
assert(holeCode==0,"切除特征报告错误码:" + holeCode);
assert(sw.RebuildDoc(doc));
var holeMass=sw.GetMassProperties(doc);
var expectedVolume=width*height*thickness-math.pi*radius*radius*thickness;
assert(math.abs(holeMass.volume-expectedVolume)<1e-10,"带孔体积不符。");
assert(#sw.GetFaces(doc)==7,"带孔长方体应有 7 个面。");
// 5. 材料:材料名随安装语言变化,先从材料库读取再应用,用质量变化验证。
var materials,materialsError=sw.GetMaterials();
assert(materials,materialsError);
var chosen;
for i,item in materials {
if(config.material ? item.name==config.material : string.find(item.name,"^1060")){chosen=item;break;}
}
assert(chosen,"材料库中没有找到目标材料。");
var material,materialError=sw.SetMaterial(doc,chosen.name,"solidworks materials.sldmat");
assert(material,materialError);
var materialMass=sw.GetMassProperties(doc);
assert(math.abs(materialMass.mass-holeMass.volume*chosen.density)<1e-6,"质量与材料密度不符。");
// 6. 自定义属性。
assert(sw.SetCustomProperty(doc,"Description","AA plate with hole"));
assert(sw.SetCustomProperty(doc,"PartNo",runName));
var properties=sw.GetCustomProperties(doc);
// 7. 尺寸表与尺寸修改:厚度 20 → 30 mm,用体积验证。
var dimensions,truncated=sw.GetDimensions(doc,"AA_Block");
assert(dimensions && #dimensions==3,"拉伸特征应列出 3 个尺寸(深度 + 草图宽高)。");
var change,changeError=sw.SetDimension(doc,"D1@AA_Block",0.030);
assert(change,changeError);
var finalMass=sw.GetMassProperties(doc);
var finalVolume=width*height*0.030-math.pi*radius*radius*0.030;
assert(math.abs(finalMass.volume-finalVolume)<1e-10,"改厚度后的体积不符。");
var features=sw.GetFeatures(doc);
for i,feature in features {
assert(feature.code==0,"特征报告问题:" + feature.name + " / " + feature.code);
}
// 8. 图像:view 参数指定等轴测并缩放到适合。
doc.ShowFeatureErrorDialog=previousErrorDialog;
var image,imageError=sw.CaptureView(io.joinpath(outDir,"plate.png"),doc,960,720,"isometric");
assert(image,imageError);
// 9. 保存(唯一基名),输出反馈。
var modelPath=io.joinpath(outDir,"plate-" + runName + ".SLDPRT");
var saved,saveError,saveWarning=sw.SaveAs(modelPath,,,,doc);
assert(saved && saveError==0,"保存零件失败,错误码:" + saveError);
var report={
app=sw.GetAppInfo();
modelPath=modelPath;
document=sw.GetDocInfo(doc);
profile=profileInfo;
volumes={block=blockMass.volume;hole=holeMass.volume;final=finalMass.volume};
material=material;
mass=materialMass.mass;
properties=properties;
dimensions=dimensions;
change=change;
faces=#faces;
features=features;
image=image;
saveWarning=saveWarning;
};
assert(JSON.save(io.joinpath(outDir,"feedback.json"),report,true),"不能保存反馈 JSON。");
print("模型与反馈已输出到",outDir);
return report;
Markdown 格式