社区
Inventor 产品技术应用讨论区
欢迎访问欧特克Inventor论坛!分享知识,发帖提问,浏览Inventor热帖
取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

如何在部件环境下利用ilogic实现对所有引用的零件进行XYZ三方向的长度测量

22 条回复22
已解决
回复
1 条消息(共 23 条)
Anonymous
334777 次查看, 22 条回复

如何在部件环境下利用ilogic实现对所有引用的零件进行XYZ三方向的长度测量

你好,我在工作中遇到一个问题,现在希望通过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这个代码去测量所有引用的零件的尺寸。

 

22 条回复22
2 条消息(共 23 条)
chenj
回复: Anonymous

你可以上网找一个批处理iLogic规则的工具,我试过,非常好用!

工具界面如下图所示:

QQ截图20180601132217.png

3 条消息(共 23 条)
Anonymous
回复: chenj

非常感谢,但是我不想把代码写到零件去,所以想知道在部件中该如何做,

也就是在部件中如何使用下面这个代码去测量零件的尺寸2018-06-01_14-03-43.png

4 条消息(共 23 条)
chenj
回复: Anonymous

在批处理工具的右下角,可以设置运行后删除规则,这样iLogic规则就不会写到零件中了。

5 条消息(共 23 条)
Anonymous
回复: chenj

你好,非常感谢你的建议,尝试过了,确实可以实现我的需求,唯一感到不足的是效率太低,我用这个更改8个零件费时3分钟,我的部件中有几百个零件,太慢了,但是如果用ilogic的遍历函数的话,8个零件只要1秒就可以完成,所以从效率角度出发,还是希望可以通过

6 条消息(共 23 条)
JaneFan
回复: Anonymous

@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 

 




Jane Fan
Inventor QA Engineer
7 条消息(共 23 条)
Anonymous
回复: JaneFan

非常感谢您的回复,已经解决了我的问题,爱心

如果我的零件不是与坐标系平齐的话,能否同样实现测量的目的,如图2018-06-11_10-29-34.jpg

8 条消息(共 23 条)
JaneFan
回复: Anonymous

应该也是可以的,Occurrence.Definition.RangeBox的返回值是基于occurrence的零件本身的坐标系,不考虑在顶层部件里面的放置方位。




Jane Fan
Inventor QA Engineer
9 条消息(共 23 条)
Anonymous
回复: JaneFan

你好,我现在的这些辊轮全部是通过多实体生成的,所以在部件中的零件如果是斜的,零件本身的坐标系就是斜的

10 条消息(共 23 条)
Anonymous
回复: JaneFan

你好,如果我通过自定义的方式建立了零件的UCS,通过对上面代码的修改能否实现对坐标系倾斜的零件进行测量呢?谢谢

11 条消息(共 23 条)
JaneFan
回复: Anonymous

如果我理解正确的话,虽然零件和部件的坐标系不一致,但是零件和零件自身的坐标系还是一致的。如果这样的话,用之前修改的代码是可以实现测量的。




Jane Fan
Inventor QA Engineer
12 条消息(共 23 条)
Anonymous
回复: JaneFan

1.jpg2.jpg3.jpg

如图所示,883的文件最后的测量结果是有出入的,因为他的模型创建的时候是倾斜的

13 条消息(共 23 条)
Anonymous
回复: JaneFan

已添加附件,之前的代码也放到附件中

14 条消息(共 23 条)
JaneFan
回复: Anonymous

谢谢提供模型。请问您所说的结果有出入,是什么意思呢?精度的出入吗?

如果是想限制精度的话,试试稍改一下代码。如果不是的话,麻烦详细描述一下哪个值有问题,期望值和实际值分别是什么。

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)

 




Jane Fan
Inventor QA Engineer
15 条消息(共 23 条)
Anonymous
回复: JaneFan

非常感谢您的耐心解答!

您可以打开模型查看91800000000883.ipt,请看下图,其中标注的就是最终想要的尺寸值,

3.jpg

而通过ilogic获得的是XX,YY,ZZ尺寸,对应上图的d16,d17,误差值都超过了8mm,主要原因我是清楚的,因为这个零件的坐标系与模型的轮廓是倾斜的。能否通过修改代码去测量得到d16和d17的尺寸。

2.jpg

如果我描述的不够清楚的话,您也可以通过电话联系我,153-5987-2691,非常感谢!

16 条消息(共 23 条)
JaneFan
回复: Anonymous

你好!我看到问题了,确实是由于模型和自身零件的坐标系不统一所导致的。我用模型的rangebox画了个Box,能清晰看到倾斜的引起的误差。在这种情况下,我们不能用rangebox来计算这个模型,只能把它拎出来单独考虑。考虑到您只是想要得到三个参数的值,我换了一种思路,直接拿零件中的参数值来传给XX,YY和ZZ,如果XX,YY和ZZ的顺序有变,请修改拿参数的序号,代码如下:

22png.pngSyntaxEditor 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

 




Jane Fan
Inventor QA Engineer
17 条消息(共 23 条)
Anonymous
回复: JaneFan

非常感谢,完美的解决了问题。

能否帮我解决一下另一个问题吗?

需求:如何通过ilogic在打开工程图后自动展开浏览器中的视图,如图所示2018-06-21_12-51-01.jpg

 

18 条消息(共 23 条)
JaneFan
回复: Anonymous

是对特定的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,需要先设置外部规则的文件路径。如果没有设置过,对话框中会有提示,如下图。

Untitled.png




Jane Fan
Inventor QA Engineer
19 条消息(共 23 条)
Anonymous
回复: JaneFan

非常感谢您的帮助,工程图的问题已经解决了

以下这段代码,如果我想要在零件中运行需要怎么修改呢,谢谢!

	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)
		

 

20 条消息(共 23 条)

请问这个方法是要在零件本身标记好所需的尺寸然后再提取出来?有没有方法在非坐标系下建立的模型提取长宽高尺寸而不需要另外标注尺寸?

找不到想要的内容?向社区提问或分享您的知识。

到论坛发帖  

”