内容纲要
本文以一个简单的案例描述STAR CCM+中Macro的录制过程。
1 案例描述
本案例演示以下过程:
-
利用STAR CCM+录制一段创建几何模型的脚本 -
开发一个GUI界面,实现几何模型参数化建模
2 建立模型
本案例模型在STAR CCM+中创建。
-
启动STAR CCM+,新建一个simulation -
选择菜单 File → Macro → Start Recording
,或点击工具栏Start Recording
按钮,在打开的文件保存对话框中指定保存的宏文件为createGeometry.java
-
右键选择树形节点Geometry > 3D-CAD Model,选择New打开几何创建界面,如下图所示
-
在几何操作模块中,右键选择节点Features > XY,选择菜单Create Sketch在XY平面上创建草图
-
在草图中创建一个半径0.01m的圆,如下图所示
-
关闭草图面板返回至模型操作,鼠标右键选择树形节点Sketch 1,选择弹出菜单Extrude进行草图拉伸
-
在弹出的参数设置界面中,设置拉伸长度Distant为1m,,如下图所示
-
点击按钮Close 3D-CAD关闭建模面板 -
右键选择模型树节点Geometry > 3D-CAD Models > 3D-CAD Model 1,选择菜单New Geometry Part,在弹出对话框中采用默认参数,点击OK按钮关闭对话框。
-
右键选择树节点Geometry > Parts > Body 1> Surfaces > Default,选择菜单Split By Part Curves...
-
在弹出的对话框中,选择Part Curves为Default,如下图所示,点击OK按钮确认操作
-
更改模型树节点名称Default为wall,default 2为inlet,default 3为outlet -
右键选择模型树节点Geometry >Part > Body 1,选择菜单Assign Parts to Regions...
-
在弹出的菜单中,进行如下图所示选择,点击Apply及Close按钮确认并关闭对话框
-
结束宏的录制,至此几何创建完毕。
此时可以用文本编辑器打开之前创建的createGeometry.java文件,查看里面所记录的内容。删掉其中一些没有用的语句,并对程序进行重构整理,该整理成函数的整理成函数,该参数化的参数化。这里要参数化的变量很少,只有半径和长度两个物理量。
注意:由于每一步操作均会生成java语句,因此为避免生成过多没用的语句,建议在正式录制之前多练习几遍,务求尽可能少一些无用操作,尤其是一些视图操作。
”
操作录制完毕后,可以打开录制生成的Java代码,删除其中的一些无效操作(如重复操作、视图操作等),并进行测试。
经过删减后的Java代码如下:
// Simcenter STAR-CCM+ macro: createGeometry.java
// Written by Simcenter STAR-CCM+ 18.02.008
package macro;
import java.util.*;
import star.common.*;
import star.base.neo.*;
import star.vis.*;
import star.cadmodeler.*;
public class createGeometry extends StarMacro {
public void execute() {
execute0();
}
private void execute0() {
Simulation simulation_0 = getActiveSimulation();
Scene scene_0 = simulation_0.getSceneManager().createScene("3D-CAD View");
scene_0.initializeAndWait();
CadModel cadModel_0 = simulation_0.get(SolidModelManager.class).createSolidModel(scene_0);
cadModel_0.resetSystemOptions();
scene_0.openInteractive();
scene_0.setAdvancedRenderingEnabled(false);
// draw sketch
CanonicalSketchPlane canonicalSketchPlane_0 = ((CanonicalSketchPlane) cadModel_0.getFeature("XY"));
Sketch sketch_0 = cadModel_0.getFeatureManager().createSketch(canonicalSketchPlane_0);
cadModel_0.allowMakingPartDirty(false);
cadModel_0.getFeatureManager().startSketchEdit(sketch_0);
Units units_0 = simulation_0.getUnitsManager().getPreferredUnits(Dimensions.Builder().length(1).build());
// radius = 0.01
CircleSketchPrimitive circleSketchPrimitive_0 = sketch_0.createCircle(new DoubleVector(new double[]{0.0, 0.0}), 0.130384048104053);
RadiusDimension radiusDimension_0 = sketch_0.createRadiusDimension(circleSketchPrimitive_0, 0.01, units_0);
//extrude sketch_0
ExtrusionMerge extrusionMerge_0 = cadModel_0.getFeatureManager().createExtrusionMerge(sketch_0);
extrusionMerge_0.getDistance().setValueAndUnits(1.0, units_0);
cadModel_0.getFeatureManager().execute(extrusionMerge_0);
star.cadmodeler.Body cadmodelerBody_0 = ((star.cadmodeler.Body) extrusionMerge_0.getBody(circleSketchPrimitive_0));
cadModel_0.createParts(new NeoObjectVector(new Object[]{cadmodelerBody_0}), new NeoObjectVector(new Object[]{}), true, false, 1, false, false, 3, "SharpEdges", 30.0, 2, true, 1.0E-5, false);
// split Default wall
SolidModelPart solidModelPart_0 = ((SolidModelPart) simulation_0.get(SimulationPartManager.class).getPart("Body 1"));
PartSurface partSurface_0 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default"));
PartCurve partCurve_0 = ((PartCurve) solidModelPart_0.getPartCurveManager().getPartCurve("Default"));
solidModelPart_0.getPartSurfaceManager().splitPartSurfacesByPartCurves(new NeoObjectVector(new Object[]{partSurface_0}), new NeoObjectVector(new Object[]{partCurve_0}));
partSurface_0.setPresentationName("wall");
PartSurface partSurface_1 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default 2"));
partSurface_1.setPresentationName("inlet");
PartSurface partSurface_2 = ((PartSurface) solidModelPart_0.getPartSurfaceManager().getPartSurface("Default 3"));
partSurface_2.setPresentationName("outlet");
// assign region
simulation_0.getRegionManager().newRegionsFromParts(new NeoObjectVector(new Object[]{solidModelPart_0}), "OneRegionPerPart", null, "OneBoundaryPerPartSurface", null, RegionManager.CreateInterfaceMode.BOUNDARY, "OneEdgeBoundaryPerPart", null);
}
}
Macro清理时注意:
-
通常情况下与Scene及view相关的行都可以直接删掉,这些都是用于显示的语句 -
源代码中不能出现任何中文字符,因为在STAR CCM+中运行时会识别不出来而报错,注释中也不允许有中文字符 -
在清理Macro时,可以采用注释的方式测试删除后的效果,避免误删
可看下面的演示视频。
(完)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册