If I may ask, what do you plan to use the thickness and solid information for? If you are planning on creating mesh on a midsurface(s) that use the thickness of the orignial solid, the option to "Assign Mesh Attributes" could be what you're looking for.
From here, select your midsurfaces you'd like to mesh, assign or create your material, choose "No" when prompted to 'Consolidate Properties By Thickness?', then create your mesh using Mesh > Geometry > Surface. Select the Midsurfaces you'd like to mesh again and make sure "0..Use Meshing Attributes" is the Property.
Use the drop down next to the 'View Style' button and turn on "Thickness/Cross Section" to view the mesh sized to the orignial solid.
The API method you need is feSurfaceMidAttrib. You will need to have a material ID available for this as well as a single surface ID or a set of surfaces. For example:
The HTML Clipboard
Sub Main Dim App As femap.model Set App = feFemap() Dim rc As femap.zReturnCode Dim midsurfaces As femap.Set Set midsurfaces = App.feSet 'Select Midsurfaces for Assignment of Mesh Attributes rc = midsurfaces.Select ( FT_SURFACE, True, "Select Midsurfaces for Assigning Attributes" ) If rc <> FE_OK Then End End If 'Select Material for Midsurfaces Properties Dim matID As Long rc = App.feSet.SelectID ( FT_MATL, "Select Material for Midsurfaces", matID ) If rc <> FE_OK Then End End If rc = App.feSurfaceMidAttrib ( midsurfaces.ID, matID ) If rc <> FE_OK Then App.feAppMessage ( FCM_ERROR, ("Surface" + Str$(msID ) + " was not generated by midsurfacing methods, skipping" ) ) End If App.feViewRegenerate ( 0 ) End Sub
I hope I am able to explain what I would like to achieve.
These two solids are adjacent to each other. After creating their midsurface there is now a gap between them as shown below.
The final step would then be to extend the orange surface to the blue surface, non-manifold add the surfaces together before meshing.
I am trying to write a script that would be able to detect adjacent solids (within a tolerance) and extend the respective midsurfaces to each other and would appreciate any help in pointing me towards the right direction.
Give the API below a try. It utilizes the built-in Femap command "Connect > Automatic" and uses the curves and surfaces found within a specified tolerance to perform a curve > extend.
Sub Main Dim App As femap.model Set App = feFemap() Dim s As femap.Set Set s = App.feSet Dim connectSet As femap.Set Set connectSet = App.feSet Dim tol As Double App.feGetReal("Enter Tolerance", 1E-15, 1000, tol) connectType = 2 AngularTolerance = 1.0 SearchAggressiveness = 3 ' If you would prefer to select surfaces individually, comment out "s.AddAll( FT_SOLID )" and uncomment "s.Select(FT_SOLID,True,"Select for Automatic Extend")" s.Clear s.AddAll( FT_SOLID ) 's.Select(FT_SURFACE,True,"Select for Automatic Extend") connectSet.AddAll(FT_CONNECTION) check = connectSet.Count App.feConnectAuto2(s.ID, connectType, tol, AngularTolerance, SearchAggressiveness, False, True, 0, True) App.feViewRegenerate ( 0 ) connectSet.Clear connectSet.AddAll(FT_CONNECTION) test = connectSet.Count 'check that new connectors have been made before proceeding to ExtendToSurfaceSub If test <= check Then MsgBox "Surfaces Not Identified, Lowering Tolerance value may help",vbExclamation,"Error" Exit All End If ExtendToSurface() End Sub Sub ExtendToSurface() Dim App As femap.model Set App = feFemap() Dim rc As femap.zReturnCode Dim MasterSurfSet As femap.Set Set MasterSurfSet = App.feSet Dim SlaveSurfSet As femap.Set Set SlaveSurfSet = App.feSet Dim nullVariant(10) As Variant 'the feSurfaceExtend function requires input of this data type despite no value being used Dim nullDouble As Double 'the feSurfaceExtend function requires input of this data type despite no value being used Dim connectorMaster As femap.Connection Set connectorMaster = App.feConnection Dim connectRegion As femap.ConnectionRegion Set connectRegion = App.feConnectionRegion Dim connectorSet As femap.Set Set connectorSet = App.feSet connectorSet.AddAll(FT_CONNECTION) connectorSet.Reset While connectorSet.Next connectorMaster.Get(connectorSet.CurrentID) master = connectorMaster.Contact(0) slave = connectorMaster.Contact(1) MasterSurfSet.Clear MasterSurfSet.AddRule(master,FGD_SURFACE_ONREGION) 'If the surface does not match the solid... SurfaceOfMaster = MasterSurfSet.First MasterSurfSet.Clear MasterSurfSet.AddRule(SurfaceOfMaster,FGD_SOLID_BYSURFACE) SolidOfMaster = MasterSurfSet.First SlaveSurfSet.Clear SlaveSurfSet.AddRule(slave,FGD_CURVE_ONREGION) CurveOfSlave = SlaveSurfSet.First 'feSurfaceExtend, through the API, requires extending to a SOLID rc = App.feSurfaceExtend(-CurveOfSlave,0,0,SolidOfMaster,nullVariant,nullDouble) If rc <> FE_OK Then App.feAppMessage(FCM_ERROR,"Problem Extending Curve to Solid, Please Check Selection") End If connectorMaster.Delete(connectorSet.CurrentID) connectRegion.Delete(master) connectRegion.Delete(slave) Wend App.feViewRegenerate( 0 ) End Sub
Play with the tolerance to capture all the gaps you need.
In addition to this, there is the ability in the Meshing Toolbox that you may find useful. The option "Surface Auto Curve" within Geometry Editing will extend surfaces by curves on a stitched or non-manifold body to a surface.
This API does indeed work very well! The idea of using connectors to determine neighbouring solids is brilliant and I would have thought of it. Cheers!