你好,我在工作中遇到一个问题,现在希望通过ilogic实现对部件所有引用的零件进行XYZ三方向的长度测量,目前尝试过如下代码,但是发现偏差比较大,
'check this file is an assembly Dim doc As Document = ThisApplication.ActiveDocument If doc.DocumentType = kPartDocumentObject Then MessageBox.Show("这个规则只能在部件环境下运行!", "错误") Return End If ' Get the active assembly. Dim oAsmDoc As AssemblyDocument oAsmDoc = ThisApplication.ActiveDocument ' Get the assembly component definition. Dim oAsmDef As AssemblyComponentDefinition oAsmDef = oAsmDoc.ComponentDefinition ' Get all of the leaf occurrences of the assembly. Dim oLeafOccs As ComponentOccurrencesEnumerator oLeafOccs = oAsmDef.Occurrences.AllLeafOccurrences Dim NameList As New ArrayList() ' Iterate through the occurrences and collect the name. Dim oOcc As ComponentOccurrence Dim modX As Double Dim modY As Double Dim modZ As Double For Each oOcc In oLeafOccs Try otester =Parameter(oOcc.Name, "滚轮内径") '获取模型的外形尺寸 modX = (oOcc.RangeBox.MaxPoint.X - oOcc.RangeBox.MinPoint.X) * 10 modY = (oOcc.RangeBox.MaxPoint.Y - oOcc.RangeBox.MinPoint.Y ) * 10 modZ = (oOcc.RangeBox.MaxPoint.Z - oOcc.RangeBox.MinPoint.Z) * 10 'Round to 0 modXr = Round(Abs(modX), 0) modYr = Round(Abs(modY), 0) modZr = Round(Abs(modZ), 0) minB=MinOfMany(modXr,modYr,modZr) maxB=MaxOfMany(modXr,modYr,modZr) iProperties.Value(oOcc.Name, "Custom", "最大")=maxB iProperties.Value(oOcc.Name, "Custom", "最小")=minB Catch End Try Next
滚轮外径是实际尺寸是正确值,而通过上方代码得到的最大值出入很大,厚度尺寸没问题。
后来在零件环境下发现利用ilogic中的测量的代码得到的结果就非常正确,
iProperties.Value("Custom", "xx")=Measure.ExtentsLength iProperties.Value("Custom", "YY")=Measure.ExtentsWidth iProperties.Value("Custom", "ZZ")=Measure.ExtentsHeight
问题:如何在部件中去利用Measure.ExtentsLength这个代码去测量所有引用的零件的尺寸。
已解决! 转到解答。
@Anonymous, 你好!直接调用API的速度比较快,不只省去了添加和删除iLogic规则的过程,还少了一层调用关系。但是直接用Occurrence.RangeBox可能会有因为坐标系不统一而导致的返回值有误差的情况。可以试一下用Occurrence.Definition.RangeBox来代替。
modX,modY和modZ稍作修改如下:
SyntaxEditor Code Snippet
modX = (oOcc.Definition.RangeBox.MaxPoint.X - oOcc.Definition.RangeBox.MinPoint.X) * 10 modY = (oOcc.Definition.RangeBox.MaxPoint.Y - oOcc.Definition.RangeBox.MinPoint.Y ) * 10 modZ = (oOcc.Definition.RangeBox.MaxPoint.Z - oOcc.Definition.RangeBox.MinPoint.Z) * 10
谢谢提供模型。请问您所说的结果有出入,是什么意思呢?精度的出入吗?
如果是想限制精度的话,试试稍改一下代码。如果不是的话,麻烦详细描述一下哪个值有问题,期望值和实际值分别是什么。
SyntaxEditor Code Snippet
iProperties.Value(oOcc.Name,"Custom", "XX")=Round( (oOcc.Definition.RangeBox.MaxPoint.X - oOcc.Definition.RangeBox.MinPoint.X) * 10,3) iProperties.Value(oOcc.Name,"Custom", "YY")= Round((oOcc.Definition.RangeBox.MaxPoint.Y - oOcc.Definition.RangeBox.MinPoint.Y ) * 10, 3) iProperties.Value(oOcc.Name,"Custom", "ZZ")= Round((oOcc.Definition.RangeBox.MaxPoint.Z - oOcc.Definition.RangeBox.MinPoint.Z) * 10 ,3)
非常感谢您的耐心解答!
您可以打开模型查看91800000000883.ipt,请看下图,其中标注的就是最终想要的尺寸值,
而通过ilogic获得的是XX,YY,ZZ尺寸,对应上图的d16,d17,误差值都超过了8mm,主要原因我是清楚的,因为这个零件的坐标系与模型的轮廓是倾斜的。能否通过修改代码去测量得到d16和d17的尺寸。
如果我描述的不够清楚的话,您也可以通过电话联系我,153-5987-2691,非常感谢!
你好!我看到问题了,确实是由于模型和自身零件的坐标系不统一所导致的。我用模型的rangebox画了个Box,能清晰看到倾斜的引起的误差。在这种情况下,我们不能用rangebox来计算这个模型,只能把它拎出来单独考虑。考虑到您只是想要得到三个参数的值,我换了一种思路,直接拿零件中的参数值来传给XX,YY和ZZ,如果XX,YY和ZZ的顺序有变,请修改拿参数的序号,代码如下:
SyntaxEditor Code Snippet
'check this file is an assembly Dim doc As Document = ThisApplication.ActiveDocument If doc.DocumentType = kPartDocumentObject Then MessageBox.Show("这个规则只能在部件环境下运行!", "错误") Return End If ' Get the active assembly. Dim oAsmDoc As AssemblyDocument oAsmDoc = ThisApplication.ActiveDocument ' Get the assembly component definition. Dim oAsmDef As AssemblyComponentDefinition oAsmDef = oAsmDoc.ComponentDefinition ' Get all of the leaf occurrences of the assembly. Dim oLeafOccs As ComponentOccurrencesEnumerator oLeafOccs = oAsmDef.Occurrences.AllLeafOccurrences Dim NameList As New ArrayList() ' Iterate through the occurrences and collect the name. Dim oOcc As ComponentOccurrence For Each oOcc In oLeafOccs Try ' otester =Parameter(oOcc.Name, "滚轮内径") '获取模型的外形尺寸 If oOcc.Name.Contains("91800000000883") Then iProperties.Value(oOcc.Name, "Custom", "XX") =Round( (oOcc.Definition.Parameters.ReferenceParameters.item(2).value) * 10,3) iProperties.Value(oOcc.Name,"Custom", "YY")= Round((oOcc.Definition.Parameters.ReferenceParameters.item(1).value) * 10,3) iProperties.Value(oOcc.Name, "Custom", "ZZ") = Round((oOcc.Definition.Parameters.ReferenceParameters.item(3).value) * 10,3) Else iProperties.Value(oOcc.Name,"Custom", "XX")= Round( (oOcc.Definition.RangeBox.MaxPoint.X - oOcc.Definition.RangeBox.MinPoint.X) * 10,3) iProperties.Value(oOcc.Name,"Custom", "YY")= Round((oOcc.Definition.RangeBox.MaxPoint.Y - oOcc.Definition.RangeBox.MinPoint.Y ) * 10,3) iProperties.Value(oOcc.Name, "Custom", "ZZ") = Round((oOcc.Definition.RangeBox.MaxPoint.Z - oOcc.Definition.RangeBox.MinPoint.Z) * 10 ,3) End If Catch End Try Next
是对特定的drawing文件吗? 可以用iLogic的event trigger来实现。
1. 在工程文档中新建一个iLogic 规则,写入如下代码:
SyntaxEditor Code Snippet
ThisDoc.Document.BrowserPanes.Item("Model").TopNode.BrowserNodes("图纸名").BrowserNodes.Item("视图名").Expanded = True
2. 打开iLogic的event trigger对话框,把此规则拖到“After Open Document”的事件中。
请问您用的是inventor什么版本?如果是inventor 2018.1, 则把规则拖到ThisDocument面板下的"After Open Document"事件中。
Inventor 从2018.1开始支持Global event trigger,如此可对所有的工程文件进行设置。只需要根据需要改动一下iLogic规则代码使其更通用,然后把此规则添加为外部规则,拖到到Event Trigger对话框中的Drawings面板下,则会对所有drawings通用此规则。此处需注意,使用Global的的Event Trigger,需要先设置外部规则的文件路径。如果没有设置过,对话框中会有提示,如下图。
非常感谢您的帮助,工程图的问题已经解决了
以下这段代码,如果我想要在零件中运行需要怎么修改呢,谢谢!
iProperties.Value(oOcc.Name, "Custom", "XX") =Round( (oOcc.Definition.Parameters.ReferenceParameters.item(2).value) * 10,3) iProperties.Value(oOcc.Name,"Custom", "YY")= Round((oOcc.Definition.Parameters.ReferenceParameters.item(1).value) * 10,3) iProperties.Value(oOcc.Name, "Custom", "ZZ") = Round((oOcc.Definition.Parameters.ReferenceParameters.item(3).value) * 10,3)