How to capture the model mass information?
Rohith Patchigolla
Member, Moderator, Employee Posts: 212
✭✭✭✭
in Structures
After extracting the mid-surface in SpaceClaim, has multiple “Face Thickness” under one component (as shown below figure). When importing into Mechanical, the mass information cannot be read, but calculations can still be performed normally. If the model has one “Face Thickness” per component, the mass information would be displayed normally.
How can the mass information be captured for below model?
Tagged:
0
Best Answer
-
I tried to extract this using Python Code object with "After Object Changed" callback at Model level (RMB on Model --> Insert --> Python Code).
Please the below scripts for "Script" tab and "Property Provider" tab.
Script part:
def after_object_changed(this, object_changed, property_name):# Do not edit this line import units import materials geometry_unit = ExtAPI.DataModel.Project.Model.Analyses[0].GeoData.Unit ActiveMechanicalUnitSystem = ExtAPI.Application.ActiveUnitSystem if ActiveMechanicalUnitSystem.ToString() == "StandardMKS": convertTo_unit = 'DS_SOLV_MKS' elif ActiveMechanicalUnitSystem.ToString() in ["StandardNMMton", "StandardNMM", "StandardNMMdat"]: convertTo_unit = 'DS_SOLV_NMM' elif ActiveMechanicalUnitSystem.ToString() == "StandardCGS": convertTo_unit = 'DS_SOLV_CGS' elif ActiveMechanicalUnitSystem.ToString() == "StandardUMKS": convertTo_unit = 'DS_SOLV_UMKS' allBodies = [child for child in DataModel.GetObjectsByType(DataModelObjectCategory.Body) if child.ObjectState.ToString() != "Suppressed"] total_mass = 0 total_volume = 0 for body in allBodies: bodyMass = body.Mass.Value bodyVolume = body.Volume.Value total_mass = total_mass + bodyMass total_volume = total_volume + bodyVolume allFaceThicknessObj = [child for child in DataModel.GetObjectsByType(DataModelObjectCategory.Thickness) if child.ObjectState.ToString() != "Suppressed"] substract_volume_total = 0 volume_faceThickness_total = 0 mass_faceThickness_total = 0 mass_substract_total = 0 for obj in allFaceThicknessObj: substract_volume = 0 volume_faceThickness = 0 mass_faceThickness = 0 mass_substract = 0 thicknessData = obj.ThicknessField.Output.GetDiscreteValue(0).Value faceIdsScoped = obj.Location.Ids for faceId in faceIdsScoped: face = DataModel.GeoData.GeoEntityById(faceId) faceArea = Quantity(face.Area,'m m') faceAreaActiveUnit = faceArea.ConvertToUnitSystem(convertTo_unit, "Area") volume_faceThickness = volume_faceThickness + faceAreaActiveUnit.Value*thicknessData faceBody = face.Bodies[0] treebody=ExtAPI.DataModel.Project.Model.Geometry.GetBody(faceBody) if treebody.ObjectState.ToString() != "Suppressed": faceBodyThickness = Quantity(faceBody.Thickness, 'm') else: faceBodyThickness = Quantity(0, 'm') faceBodyThicknessActiveUnit = faceBodyThickness.ConvertToUnitSystem(convertTo_unit, "Length") substract_volume = substract_volume + faceAreaActiveUnit.Value*faceBodyThicknessActiveUnit.Value treebody=ExtAPI.DataModel.Project.Model.Geometry.GetBody(faceBody) bodyMat = treebody.Material myMat = DataModel.GetObjectsByName(bodyMat)[0] engineeringData = myMat.GetEngineeringDataMaterial() myDens = materials.GetMaterialPropertyByName(engineeringData,'Density') DensUnit = myDens['Density'][0] DensVal = myDens['Density'][1] if treebody.ObjectState.ToString() != "Suppressed": myDens = Quantity(DensVal,DensUnit) else: myDens = Quantity(0,DensUnit) myDens_ActiveUnit = myDens.ConvertToUnitSystem(convertTo_unit, "Density") mass_faceThickness = mass_faceThickness + myDens_ActiveUnit.Value*volume_faceThickness mass_substract = mass_substract + myDens_ActiveUnit.Value*faceAreaActiveUnit.Value*faceBodyThicknessActiveUnit.Value substract_volume_total = substract_volume_total + substract_volume volume_faceThickness_total = volume_faceThickness_total + volume_faceThickness mass_faceThickness_total = mass_faceThickness_total + mass_faceThickness mass_substract_total = mass_substract_total + mass_substract Total_Volume_New = total_volume + volume_faceThickness_total - substract_volume_total Total_Mass_New = total_mass + mass_faceThickness_total - mass_substract_total this.GetCustomPropertyByPath("Outputs/Mass").Value = Total_Mass_New this.GetCustomPropertyByPath("Outputs/Volume").Value = Total_Volume_New
Property Provider part:
def reload_props(): this.PropertyProvider = None provider = Provider() group = provider.AddGroup("Outputs") double_prop1 = group.AddProperty("Mass", Control.Double) double_prop1.CanParameterize = True double_prop1.ParameterType = ParameterType.Output double_prop2 = group.AddProperty("Volume", Control.Double) double_prop2.CanParameterize = True double_prop2.ParameterType = ParameterType.Output this.PropertyProvider = provider from Ansys.ACT.Mechanical.AdditionalProperties import PropertyProviderAdapter from Ansys.ACT.Mechanical.AdditionalProperties import * from mech_templates import property_templates property_templates.set_ext_api(ExtAPI) class Provider(Ansys.ACT.Interfaces.Mechanical.IPropertyProvider): def IsValid(self, prop): if(isinstance(prop, DoubleProperty)): return prop.ValidRange[0] <= prop.Value and prop.ValidRange[1] >= prop.Value return True def IsReadOnly(self, prop): return False def IsVisible(self, prop): return True def SetValue(self, prop, val): return val def GetValue(self, prop, val): return val prop_list = [] prop_map = {} prop_groups = set() class __AnsGroup(): provider = None def __init__(self,name=None, provider=None): self.name = name self.provider = provider def __AddScopingProperty(self, name): scoping_prop = property_templates.ScopingProperty(name, self.name) for prop in scoping_prop.GetGroupedProps(): self.provider.AddProperty(prop) return scoping_prop.GetGroupedProps() def AddProperty(self, name=None, prop_control=None, module_name=None): if(prop_control == "Scoping" and module_name == "property_templates"): return self.__AddScopingProperty(name) prop_mod_globals = None if(module_name != None): if(module_name not in globals()): raise Exception("Unknown module : " + module_name) prop_mod_globals = globals()[module_name].get_globals() else: prop_mod_globals = globals() prop_class_name = str(prop_control) + "Property" if(prop_class_name not in prop_mod_globals): raise Exception("Unknown property class : " + prop_class_name) prop = prop_mod_globals[prop_class_name](self.name + "/" + name, self.name) if(prop == None): raise Exception("Issue while creating the property instance.") prop.IsValidCallback = self.provider.IsValid prop.IsReadOnlyCallback = self.provider.IsReadOnly prop.IsVisibleCallback = self.provider.IsVisible prop.GetValueCallback = self.provider.GetValue prop.SetValueCallback = self.provider.SetValue prop.DisplayName = name self.provider.AddProperty(prop) return prop def __init__(self): pass def GetProperties(self): return [self.prop_map[propName] for propName in self.prop_list] def AddGroup(self, name=None): if name in self.prop_groups: raise Exception("Group with name " + name + " already exists, please use a unique group name.") self.prop_groups.add(name) return self.__AnsGroup(name, self) def AddProperty(self, prop): if(prop.Name in self.prop_map): raise Exception("Property name must be unique, property with name '" + prop.Name + "' already exisits.") self.prop_list.append(prop.Name) self.prop_map[prop.Name] = prop reload_props()
0