Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations Danlap on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

NXOpen .Net - MeasureBodies performace very poor

Status
Not open for further replies.

lharrison

New member
Oct 19, 2011
52
I've been working on a program to compute minimum part boxes, as well the the overall part volume/area/weight. The GRIP function (ANLSIS/SOLID) that pulled volume/area/weight was fairly quick, but the current MeasureBodies and AskPartProps3d speed is glacial!

Complex parts with many holes and swept features can take as long as 5 minutes to analyze, while the similar GRIP function completes in a fraction of this. Is there any reason behind this? I've tried reducing the accuracy of the MeasureBodies to as low as 0.1, but it still performs poorly and values that in accurate defeat the purpose of the measurements.

Bruce
 
Replies continue below

Recommended for you

Try the following journal. I run code like this often on small to mid size injection molded parts. Some parts make extensive use of freeform modeling techniques and I have yet to see anything take longer than 30 seconds or so.

Code:
[COLOR=blue]Option[/color] [COLOR=blue]Strict[/color] [COLOR=blue]Off[/color]  
[COLOR=blue]Imports[/color] System  
[COLOR=blue]Imports[/color] NXOpen  
[COLOR=blue]Imports[/color] NXOpen.UF  
[COLOR=blue]Imports[/color] NXOpenUI  

[COLOR=blue]Module[/color] NXJournal  

[COLOR=blue]Sub[/color] Main  

[COLOR=blue]Dim[/color] theSession [COLOR=blue]As[/color] Session [COLOR=blue]=[/color] Session.GetSession()  
[COLOR=blue]Dim[/color] ufs [COLOR=blue]As[/color] UFSession [COLOR=blue]=[/color] UFSession.GetUFSession()  
[COLOR=blue]Dim[/color] workPart [COLOR=blue]As[/color] Part [COLOR=blue]=[/color] theSession.Parts.Work  
[COLOR=blue]Dim[/color] displayPart [COLOR=blue]As[/color] Part [COLOR=blue]=[/color] theSession.Parts.Display  

[COLOR=blue]Dim[/color] bbox(5) [COLOR=blue]as[/color] [COLOR=blue]double[/color]  
[COLOR=blue]Dim[/color] dblAcc_Value(11) [COLOR=blue]as[/color] [COLOR=blue]double[/color]  
[COLOR=blue]Dim[/color] dblMass_Props(46) [COLOR=blue]as[/color] [COLOR=blue]double[/color]  
[COLOR=blue]Dim[/color] dblStats(12) [COLOR=blue]as[/color] [COLOR=blue]double[/color]  
[COLOR=blue]dim[/color] strOutput [COLOR=blue]as[/color] [COLOR=blue]string[/color]  

	  
	Dim solid1 [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] SelectSolid()  
	If solid1 [COLOR=blue]Is[/color] [COLOR=blue]Nothing[/color] [COLOR=blue]Then[/color]  
		Return  
	End [COLOR=blue]If[/color]  
	  
	Dim tagList(0) [COLOR=blue]As[/color] NXOpen.Tag  
	tagList(0) [COLOR=blue]=[/color] solid1.Tag  


	  [COLOR=green]'get volume[/color]
	dblAcc_Value(0)=.999  
	  [COLOR=green]'AskMassProps3d(in_Tags(),in_num_objs,in_type,in_units,in_density,in_accuracy,in_accuracy_values(),out_mass_props(),out_stats())[/color]
	ufs.Modl.AskMassProps3d(tagList,1,1,1,.0375,1,dblAcc_Value,dblMass_Props,dblStats)  
	strOutput [COLOR=blue]=[/color] "Surface Area: " [COLOR=blue]&[/color] dblMass_Props(0) [COLOR=blue]&[/color] vbcrlf  
	strOutput [COLOR=blue]=[/color] strOutput [COLOR=blue]&[/color] "Volume: " [COLOR=blue]&[/color] dblMass_Props(1) [COLOR=blue]&[/color] vbcrlf  
	strOutput [COLOR=blue]=[/color] strOutput [COLOR=blue]&[/color] "Mass: " [COLOR=blue]&[/color] dblMass_Props(2) [COLOR=blue]&[/color] vbcrlf  
	strOutput [COLOR=blue]=[/color] strOutput [COLOR=blue]&[/color] "COG: " [COLOR=blue]&[/color] dblMass_Props(3) [COLOR=blue]&[/color] ", " [COLOR=blue]&[/color] dblMass_Props(4) [COLOR=blue]&[/color] ", " [COLOR=blue]&[/color] dblMass_Props(5) [COLOR=blue]&[/color] vbcrlf  
	strOutput [COLOR=blue]=[/color] strOutput [COLOR=blue]&[/color] "Density: " [COLOR=blue]&[/color] dblMass_Props(46)  
	msgbox (strOutput, vbokonly)  

	  [COLOR=green]'get solid body bounding box extents[/color]
	ufs.Modl.AskBoundingBox(solid1.Tag,bbox)  
	msgbox ("min X: " [COLOR=blue]&[/color] bbox(0) [COLOR=blue]&[/color] " max X: " [COLOR=blue]&[/color] bbox(3) [COLOR=blue]&[/color] vbcrlf _  
		& "min Y: " [COLOR=blue]&[/color] bbox(1) [COLOR=blue]&[/color] " max Y: " [COLOR=blue]&[/color] bbox(4) [COLOR=blue]&[/color] vbcrlf _  
		& "min Z: " [COLOR=blue]&[/color] bbox(2) [COLOR=blue]&[/color]  " max Z: " [COLOR=blue]&[/color] bbox(5) [COLOR=blue]&[/color] vbcrlf [COLOR=blue]&[/color] vbcrlf [COLOR=blue]&[/color] _  
		"X dim: " [COLOR=blue]&[/color] bbox(3) [COLOR=blue]-[/color] bbox(0) [COLOR=blue]&[/color] vbcrlf [COLOR=blue]&[/color] _  
		"Y dim: " [COLOR=blue]&[/color] bbox(4) [COLOR=blue]-[/color] bbox(1) [COLOR=blue]&[/color] vbcrlf [COLOR=blue]&[/color] _  
		"Z dim: " [COLOR=blue]&[/color] bbox(5) [COLOR=blue]-[/color] bbox(2), vbokonly)  

End [COLOR=blue]Sub[/color]  

[COLOR=green]'**********************************************************[/color]
[COLOR=blue]Public[/color] [COLOR=blue]Function[/color] SelectSolid() [COLOR=blue]As[/color] Body  
	  
	Dim ui [COLOR=blue]As[/color] UI [COLOR=blue]=[/color] ui.GetUI  
	Dim message [COLOR=blue]As[/color] [COLOR=blue]String[/color] [COLOR=blue]=[/color] "Select solid body"  
	Dim title [COLOR=blue]As[/color] [COLOR=blue]String[/color] [COLOR=blue]=[/color] "Selection"  
	  
	Dim scope [COLOR=blue]As[/color] Selection.SelectionScope [COLOR=blue]=[/color] Selection.SelectionScope.WorkPart  
	Dim keepHighlighted [COLOR=blue]As[/color] [COLOR=blue]Boolean[/color] [COLOR=blue]=[/color] [COLOR=blue]False[/color]  
	Dim includeFeatures [COLOR=blue]As[/color] [COLOR=blue]Boolean[/color] [COLOR=blue]=[/color] [COLOR=blue]True[/color]  
	Dim selectionAction [COLOR=blue]As[/color] Selection.SelectionAction [COLOR=blue]=[/color] Selection.SelectionAction.ClearAndEnableSpecific  
	Dim selectionMask_array(1) [COLOR=blue]As[/color] Selection.MaskTriple  
	Dim selectedObject [COLOR=blue]As[/color] NXObject [COLOR=blue]=[/color] [COLOR=blue]Nothing[/color]  
	Dim cursor [COLOR=blue]As[/color] Point3d  
	  
		With selectionMask_array(0)  
			.Type [COLOR=blue]=[/color] UFConstants.UF_solid_type  
			.Subtype [COLOR=blue]=[/color] 0  
			.SolidBodySubtype [COLOR=blue]=[/color] UFConstants.UF_UI_SEL_FEATURE_SOLID_BODY  
			  [COLOR=green]'.SolidBodySubtype = 36[/color]
		End [COLOR=blue]With[/color]  
		  
        ui.SelectionManager.SelectObject(message, title, scope, _  
                                         selectionAction, includeFeatures, _  
                                         keepHighlighted, selectionMask_array, _  
                                         selectedObject, cursor)  
	  
		Dim solid [COLOR=blue]As[/color] Body [COLOR=blue]=[/color] CType(selectedObject, Body)  
	  
		If solid [COLOR=blue]Is[/color] [COLOR=blue]Nothing[/color] [COLOR=blue]Then[/color]  
			Return [COLOR=blue]Nothing[/color]  
		End [COLOR=blue]If[/color]  
	  
		Return solid  
	  
End [COLOR=blue]Function[/color]  
[COLOR=green]'*******************[/color]
End [COLOR=blue]Module[/color]


 
Thanks for the script to compare my code against. I was using a near copy of what you put down, but couldn't figure out the low performance. Turns out that I had my material density set to 0, which is what caused the massive performance hit. I switched it to 0.0375 as you had, and performance increased ten-fold.

Thanks for the help! Here's the function i was using(its in c#) for anyone referencing this.

public void GetPartProps(NXObject NO)
{
double[] acc_value = new double[11];
double[] mass_props = new double[47];
double[] stats = new double[13];
acc_value[0] = 0.9;

Tag[] NOtag = new Tag[1] { NO.Tag };

_UFSession.Modl.AskMassProps3d(NOtag, 1, 1, 1, 0.0375, 1, acc_value, mass_props, stats);

//access mass_props[] to retrieve values
}
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor