吾生有涯 学海无涯
析模有界 知识无界

STAR CCM+二次开发|02 Macro录制

内容纲要

本文以一个简单的案例描述STAR CCM+中Macro的录制过程。

1 案例描述

本案例演示以下过程:

  1. 利用STAR CCM+录制一段创建几何模型的脚本
  2. 开发一个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进行草图拉伸
  • 在弹出的参数设置界面中,设置拉伸长度Distant1m,,如下图所示
  • 点击按钮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 CurvesDefault,如下图所示,点击OK按钮确认操作
  • 更改模型树节点名称Default为wall,default 2为inlet,default 3为outlet
  • 右键选择模型树节点Geometry >Part > Body 1,选择菜单Assign Parts to Regions...
  • 在弹出的菜单中,进行如下图所示选择,点击ApplyClose按钮确认并关闭对话框
  • 结束宏的录制,至此几何创建完毕。

此时可以用文本编辑器打开之前创建的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清理时注意:

  1. 通常情况下与Scene及view相关的行都可以直接删掉,这些都是用于显示的语句
  2. 源代码中不能出现任何中文字符,因为在STAR CCM+中运行时会识别不出来而报错,注释中也不允许有中文字符
  3. 在清理Macro时,可以采用注释的方式测试删除后的效果,避免误删

可看下面的演示视频。


(完)

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《STAR CCM+二次开发|02 Macro录制》
文章链接:https://www.topcfd.cn/35074/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册