[C# SolidWorks API] メッシュを生成する
有限要素法による数値シミュレーションを行うためには,対象を有限個の小さな要素に分割する必要があります.この作業が,メッシュ生成です.
平均要素サイズと節点間距離の許容値を設定して,メッシュ生成を行う方法を見ていきましょう.
実行例
下の左図にような立方体に対して,メッシュを生成したものが右図です.
右図のようなメッシュを表示するためには,プログラムを実行後に,スタディのメッシュを右クリックしてメッシュ表示を選択してください.
コード
全体のコードを確認しておきましょう.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; // for SolidWorks API using SolidWorks.Interop.cosworks; using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; // for Debuging using System.Diagnostics; namespace swMesh { class Program { // SolidWorks APIにアクセスするためのメンバ SldWorks.ISldWorks swApp; // Simulation APIにアクセスするためのメンバ ICosmosWorks COSMOSWORKS = null; // 部品(Part),図面(Drawing),アセンブリ(Assembly)の各ドキュメントにアクセスするためのメンバ IModelDoc2 model = default(ModelDoc2); // Simlation スタディにアクセスするためのメンバ ICWStudy study = default(CWStudy); void startSW() { swApp = new SldWorks.SldWorks(); Debug.Assert(swApp != null); swApp.Visible = true; } void createCube(double length) { string partTemplate = swApp.GetUserPreferenceStringValue((int)swUserPreferenceStringValue_e.swDefaultTemplatePart); if ((partTemplate != null) && (partTemplate != "")) { model = (IModelDoc2)swApp.NewDocument( partTemplate, // テンプレートファイルの場所 (int)swDwgPaperSizes_e.swDwgPaperA2size, // ドキュメントのサイズ(A4やA2など) 0.0, 0.0); // 正方形を描く ISketchManager sketchMan = model.SketchManager; sketchMan.InsertSketch(true); sketchMan.CreateCornerRectangle(0, 0, 0, length, length, 0); // 正方形を押し出す IFeatureManager featMan = model.FeatureManager; featMan.FeatureExtrusion3( true, false, false, (int)swEndConditions_e.swEndCondBlind, (int)swEndConditions_e.swEndCondBlind, length, 0.0, false, false, false, false, 0.0, 0.0, false, false, false, false, true, false, false, (int)swStartConditions_e.swStartSketchPlane, 0.0, false ); } else { Console.WriteLine("There is no part template available. Please check your options and make sure there is a part template selected, or select a new part template."); } } void loadSimulationAddIn() { string path_to_cosworks_dll = swApp.GetExecutablePath() + @"\Simulation\cosworks.dll"; int errors = swApp.LoadAddIn(path_to_cosworks_dll); checkStatus("Load cosworks.dll: ", errors); string addInName = "SldWorks.Simulation"; CwAddincallback COSMOSObject = (CwAddincallback)swApp.GetAddInObject(addInName); Debug.Assert(COSMOSObject != null); COSMOSWORKS = (ICosmosWorks)COSMOSObject.CosmosWorks; Debug.Assert(COSMOSWORKS != null); } void createStudy(string name, int type) { ICWModelDoc actDoc = (ICWModelDoc)COSMOSWORKS.ActiveDoc; Debug.Assert(actDoc != null); ICWStudyManager studyMgr = (ICWStudyManager)actDoc.StudyManager; Debug.Assert(studyMgr != null); int errors = 0; study = (ICWStudy)studyMgr.CreateNewStudy3(name, type, 0, out errors); checkStatus("createStudy", errors); } void createStaticStudy(string name) { createStudy(name, (int)swsAnalysisStudyType_e.swsAnalysisStudyTypeStatic); } void createMesh() { double averageGlobalElementSize = 0; double tolerance = 0; ICWMesh mesh = (ICWMesh)study.Mesh; Debug.Assert(mesh != null); mesh.Quality = (int)swsMeshQuality_e.swsMeshQualityDraft; mesh.GetDefaultElementSizeAndTolerance(0, out averageGlobalElementSize, out tolerance); int errorCode = study.CreateMesh(0, averageGlobalElementSize, tolerance); checkStatus("createMesh", errorCode); } // エラーが発生したときに,発生したメソッド名とエラーコードを表示するためのメソッド public static void checkStatus(string methodName, int code) { int success = 0; if (code != success) { Console.WriteLine(methodName + ": " + code); } } static void Main(string[] args) { var p = new Program(); Console.WriteLine("Starting SolidWorks"); p.startSW(); Console.WriteLine("Creating a Cube"); double length = 0.1; p.createCube(length); Console.WriteLine("Loading Simulation AddIn"); p.loadSimulationAddIn(); Console.WriteLine("Creating Static Study"); string studyName = "StaticStudy"; p.createStaticStudy(studyName); Console.WriteLine("Creating Mesh"); p.createMesh(); } } } |
解説
メッシュを生成するためのメソッドcreateMeshを詳しく見ていきましょう.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
void createMesh() { ICWMesh mesh = (ICWMesh)study.Mesh; double averageGlobalElementSize = 0; double tolerance = 0; mesh.Quality = mesh.Quality = (int)swsMeshQuality_e.swsMeshQualityHigh; mesh.GetDefaultElementSizeAndTolerance(0, out averageGlobalElementSize, out tolerance); int errorCode = study.CreateMesh(0, averageGlobalElementSize, tolerance); checkStatus("createMesh", errorCode); } mesh.GetDefaultElementSizeAndTolerance(0, out averageGlobalElementSize, out tolerance); int errorCode = study.CreateMesh(0, averageGlobalElementSize, tolerance); checkStatus("createMesh", errorCode); } |
3行目
メッシュを生成するためのオブジェクトを取得しています.
ICWMesh
8行目
メッシュの品質を指定しています.
Quality
メッシュの品質は,swsMeshQuality_eで指定します.DraftかHighが指定できます.
9行目
要素サイズと節点間距離の許容値を取得しています.
void GetDefaultElementSizeAndTolerance(
System.int NUnits, // 単位指定 swsLinearUnit_e
out System.double DElementSize, // 平均要素サイズの既定値(戻り値として利用)
out System.double DTolerance // 節点間距離の許容値(戻り値として利用)
// 節点間距離が許容値よりも小さい場合には,
// 1つの節点にまとめられる
)
既定値の決定方法については,メッシュパラメータの項目を参照してください.
11行目
要素サイズと節点間距離の許容値を指定して,メッシュを生成しています.
System.int CreateMesh(
System.int NUnits, // 単位指定 swsLinearUnit_e
System.double NElementSize, // 平均要素サイズ
System.double NTolerance // 節点間距離の許容値
)
まとめ
APIを使ってメッシュを生成する方法を説明しました.
メッシュを生成するためのメソッドcreateMeshを定義しました.
作成したプログラムの動作を確認しました.
Post Thumbnail by -Reji